From 564ba090e9f693d367ff3dab1bb6da5b13e6d619 Mon Sep 17 00:00:00 2001 From: Haris khan Date: Tue, 14 May 2019 19:33:53 +0800 Subject: [PATCH 01/10] dmFIx --- src/lib/directives/resizer.ts | 2 +- src/lib/properties/df.property.component.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/directives/resizer.ts b/src/lib/directives/resizer.ts index 035a761..44658c1 100644 --- a/src/lib/directives/resizer.ts +++ b/src/lib/directives/resizer.ts @@ -105,7 +105,7 @@ export class ResizerDirective implements OnInit, OnDestroy { constructor(private element: ElementRef, @Inject(DOCUMENT) private document: any) { } - private startDrag() { + startDrag() { this.dragInProgress = true; } diff --git a/src/lib/properties/df.property.component.html b/src/lib/properties/df.property.component.html index a975af7..dca1bca 100644 --- a/src/lib/properties/df.property.component.html +++ b/src/lib/properties/df.property.component.html @@ -26,7 +26,7 @@ Date: Thu, 13 Jun 2019 00:08:00 +0800 Subject: [PATCH 02/10] fix for aot compilation --- src/lib/properties/df.property.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/properties/df.property.component.html b/src/lib/properties/df.property.component.html index dca1bca..dbf123c 100644 --- a/src/lib/properties/df.property.component.html +++ b/src/lib/properties/df.property.component.html @@ -26,11 +26,11 @@ From 85862621b69e34f7cfa55d1448add81317bf4fca Mon Sep 17 00:00:00 2001 From: hakhan88 Date: Thu, 13 Jun 2019 00:15:36 +0800 Subject: [PATCH 03/10] update package lock --- package-lock.json | 10068 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 10068 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ccf7900 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10068 @@ +{ + "name": "spring-flo", + "version": "0.8.9", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular/animations": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.10.tgz", + "integrity": "sha512-WgklBWYKy8LVlugMJ8XgBB4whNiMng8vY6mpaYhza064nsrQXK+ua1anSOGMGlmCI/5i4EgaycTS05XD/C+Kkw==", + "dev": true, + "requires": { + "tslib": "1.10.0" + } + }, + "@angular/common": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.10.tgz", + "integrity": "sha512-FyiVUhV1MaRogXmVKsw6CMXqWZHsiYMdK651absXtGqWZn6and0jiUwEM9LbV4HRpLbB7F6gwqCvT5Ft8xpzeg==", + "dev": true, + "requires": { + "tslib": "1.10.0" + } + }, + "@angular/compiler": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.10.tgz", + "integrity": "sha512-sRuH+UDogzAHpagorHfj2rbF8HWGEJGsFUn5TGq1vyWA37ALuu/zkemufIcgET16lTiBEvVn7/Oz9Am+JTlGrg==", + "dev": true, + "requires": { + "tslib": "1.10.0" + } + }, + "@angular/compiler-cli": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.10.tgz", + "integrity": "sha512-L/mksAkpb8kywYlHlXi5mAyUNNiSHZpoTV+P2t3nNGmqyXuad92TvdZMCO34TYUyGyFz9AVH2qc6LciY9ipQTA==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "2.1.6", + "convert-source-map": "1.6.0", + "dependency-graph": "0.7.2", + "magic-string": "0.25.2", + "minimist": "1.2.0", + "reflect-metadata": "0.1.13", + "shelljs": "0.8.1", + "source-map": "0.6.1", + "tslib": "1.10.0", + "yargs": "9.0.1" + } + }, + "@angular/core": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.10.tgz", + "integrity": "sha512-u2IKaq4G1wpq5w1AI0Q7jnsKuSfR4WDsBLnwtjTIjde1YDqA0n0dYwqrvWzLK6SbzSWjlrAXx0hrz5SlDchmqA==", + "dev": true, + "requires": { + "tslib": "1.10.0" + } + }, + "@angular/forms": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.10.tgz", + "integrity": "sha512-fQccon0Yuni13QJt16npSRlkitPZBLXfWXDFwCEybo/QqtSar3BOJAQFW2yqokrfW5lbO5VDFJ7Pj2dDyBXEAA==", + "dev": true, + "requires": { + "tslib": "1.10.0" + } + }, + "@angular/platform-browser": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.10.tgz", + "integrity": "sha512-78r527d0Nw0svkDw2SBr58H3VEH5VAvn+r+q7NLqIqD8jsOMf8CMztUCDs+h02HhEHveCXWI5EtFXxWepB6wFg==", + "dev": true, + "requires": { + "tslib": "1.10.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.10.tgz", + "integrity": "sha512-ZTJL7iIEL3yDgJLx5/a2wfKsxe0ZHEUSibtbRQNpn35ZI0G9QN7ezbTOqj2+/QGvaY8Y1JeoYCeJrMzaUxDxGg==", + "dev": true, + "requires": { + "tslib": "1.10.0" + } + }, + "@angular/platform-server": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-7.2.10.tgz", + "integrity": "sha512-LkjntWRS05ilYXt0oO+92FALAeruebWlqNVd/hR8T8dsmFMQQyK/aBDw+DBbPceIjwxyhpJd8+CuGmR+pGXvwQ==", + "dev": true, + "requires": { + "domino": "2.1.3", + "tslib": "1.10.0", + "xhr2": "0.1.4" + } + }, + "@types/backbone": { + "version": "1.3.42", + "resolved": "https://registry.npmjs.org/@types/backbone/-/backbone-1.3.42.tgz", + "integrity": "sha512-sg6WhUW1RorO/Yc0yKqVhekBlweLbQqJciHr70FYL4Z8IFhcZngyXaYdfq8MCv/Rf/Nry5Sbsl9jWGzUN+2Zbg==", + "dev": true, + "requires": { + "@types/jquery": "3.3.4", + "@types/underscore": "1.8.18" + } + }, + "@types/codemirror": { + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.64.tgz", + "integrity": "sha512-nmgOTLuPD7/ypQ1LUP4yJZDCXZ1FB+P5ZbAhxwT2cnret+ukFIaMwRsrR6beknzGDaZPbzIrtzHaKRGmw8i5FQ==", + "dev": true + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/jasmine": { + "version": "2.5.36", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.36.tgz", + "integrity": "sha1-bYBLeaV+k4DXZqJoDpNiwX2VVtI=", + "dev": true + }, + "@types/jquery": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.4.tgz", + "integrity": "sha512-KqgLNDh8oTl43/2B78S7tjwPnOxPtP9wQsLptbuQCmMwqH5QuPZOk36RsNgbs3mnq/3SCyG1l/GJmhKk5Dg68g==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.123", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", + "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==", + "dev": true + }, + "@types/node": { + "version": "6.0.46", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.46.tgz", + "integrity": "sha1-jZ5IVygx8FsRzEx5N1TUNDchnWI=", + "dev": true + }, + "@types/underscore": { + "version": "1.8.18", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.8.18.tgz", + "integrity": "sha512-mXQ8u416FWMPjp2zWrcVmOZtzKQM6IeyVcuE+RGF/04JLBrMjfnmNKn74VN8fIkFzU97TpzkP0ny0p0h65eC7w==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "abbrev": { + "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 + }, + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "2.1.24", + "negotiator": "0.6.1" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "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" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.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.3" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "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.10", + "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.1.0" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "argparse": { + "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.3" + } + }, + "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-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "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 + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "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 + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "4.17.11" + } + }, + "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 + }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "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 + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "2.0.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "3.1.0" + } + }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "backbone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz", + "integrity": "sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk=", + "requires": { + "underscore": "1.9.1" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "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.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "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.2" + } + }, + "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.2" + } + }, + "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.2" + } + }, + "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-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "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 + }, + "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.18" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "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.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "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.1" + } + } + } + }, + "browser-sync": { + "version": "2.26.7", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.7.tgz", + "integrity": "sha512-lY3emme0OyvA2ujEMpRmyRy9LY6gHLuTr2/ABxhIm3lADOiRXzP4dgekvnDrQqZ/Ec2Fz19lEjm6kglSG5766w==", + "dev": true, + "requires": { + "browser-sync-client": "2.26.6", + "browser-sync-ui": "2.26.4", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "2.0.1", + "chokidar": "2.1.6", + "connect": "3.6.6", + "connect-history-api-fallback": "1.6.0", + "dev-ip": "1.0.1", + "easy-extender": "2.3.4", + "eazy-logger": "3.0.2", + "etag": "1.8.1", + "fresh": "0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "1.15.2", + "immutable": "3.8.2", + "localtunnel": "1.9.2", + "micromatch": "3.1.10", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "2.4.0", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.1.1", + "ua-parser-js": "0.7.17", + "yargs": "6.4.0" + }, + "dependencies": { + "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" + } + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "1.3.3", + "utils-merge": "1.0.1" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "1.3.7", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "3.1.0", + "engine.io-parser": "2.1.3", + "ws": "3.3.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "3.1.0", + "engine.io-parser": "2.1.3", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "3.3.3", + "xmlhttprequest-ssl": "1.5.5", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "1.0.3" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.3", + "statuses": "1.3.1", + "unpipe": "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.1.0", + "pinkie-promise": "2.0.1" + } + }, + "http-proxy": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", + "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "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.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "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 + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "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.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "3.1.0", + "engine.io": "3.2.1", + "has-binary2": "1.0.3", + "socket.io-adapter": "1.1.1", + "socket.io-client": "2.1.1", + "socket.io-parser": "3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "3.1.0", + "engine.io-client": "3.2.1", + "has-binary2": "1.0.3", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.2", + "ultron": "1.1.1" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "yargs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "browser-sync-client": { + "version": "2.26.6", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.6.tgz", + "integrity": "sha512-mGrkZdNzttKdf/16I+y+2dTQxoMCIpKbVIMJ/uP8ZpnKu9f9qa/2CYVtLtbjZG8nsM14EwiCrjuFTGBEnT3Gjw==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "1.1.3", + "rxjs": "5.5.12" + }, + "dependencies": { + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + } + } + }, + "browser-sync-ui": { + "version": "2.26.4", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz", + "integrity": "sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "1.6.0", + "immutable": "3.8.2", + "server-destroy": "1.0.1", + "socket.io-client": "2.2.0", + "stream-throttle": "0.1.3" + }, + "dependencies": { + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "engine.io-client": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz", + "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "3.1.0", + "engine.io-parser": "2.1.3", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "6.1.4", + "xmlhttprequest-ssl": "1.5.5", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "1.0.3" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "socket.io-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", + "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "3.1.0", + "engine.io-client": "3.3.2", + "has-binary2": "1.0.3", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.3.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "3.1.0", + "isarray": "2.0.1" + } + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + } + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "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 + }, + "builtin-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", + "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "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.3.0", + "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" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.0.0.tgz", + "integrity": "sha1-iw+Q1Evl4oG5A7mIc0m5JZXvB/I=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.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.3", + "braces": "2.3.2", + "fsevents": "1.2.9", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.1", + "normalize-path": "3.0.0", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1", + "upath": "1.1.2" + } + }, + "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.1", + "static-extend": "0.1.2" + }, + "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.6" + } + } + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.1" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codemirror-minified": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/codemirror-minified/-/codemirror-minified-5.44.0.tgz", + "integrity": "sha512-8bc9cFRSYH2e4Oxke7JlskBpZwRa9ELw8Q8vx4Gfn1R7IVwOuoYv0pEVQpvAMavGXCnWWdO5Ft/XGzrqo151qw==" + }, + "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.1" + } + }, + "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 + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "4.17.11" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "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 + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "1.0.0", + "dot-prop": "3.0.0" + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "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 + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "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.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "concurrently": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.0.1.tgz", + "integrity": "sha512-D8UI+mlI/bfvrA57SeKOht6sEpb01dKk+8Yee4fbnkk1Ue8r3S+JXoEdFZIpzQlXJGtnxo47Wvvg/kG4ba3U6Q==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "date-fns": "1.30.1", + "lodash": "4.17.11", + "read-pkg": "4.0.1", + "rxjs": "6.2.2", + "spawn-command": "0.0.2-1", + "supports-color": "4.5.0", + "tree-kill": "1.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "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.5", + "path-key": "2.0.1", + "semver": "5.7.0", + "shebang-command": "1.2.0", + "which": "1.3.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.5", + "get-stream": "4.1.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "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-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" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "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 + }, + "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" + } + }, + "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" + } + }, + "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.3", + "mimic-fn": "2.1.0", + "p-is-promise": "2.1.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 + }, + "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.3.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.2.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.2.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 + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "2.5.0", + "parse-json": "4.0.0", + "pify": "3.0.0" + } + }, + "rxjs": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", + "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "dev": true, + "requires": { + "tslib": "1.10.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" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "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.1.0", + "decamelize": "1.2.0", + "find-up": "3.0.0", + "get-caller-file": "1.0.3", + "os-locale": "3.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "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.3.1", + "decamelize": "1.2.0" + } + } + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "1.3.3", + "utils-merge": "1.0.1" + } + }, + "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 + }, + "connect-logger": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/connect-logger/-/connect-logger-0.0.1.tgz", + "integrity": "sha1-TZmZeKHSC7RgjnzUNNdBZSJVF0s=", + "dev": true, + "requires": { + "moment": "2.24.0" + } + }, + "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" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "conventional-changelog": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz", + "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==", + "dev": true, + "requires": { + "conventional-changelog-angular": "1.6.6", + "conventional-changelog-atom": "0.2.8", + "conventional-changelog-codemirror": "0.3.8", + "conventional-changelog-core": "2.0.11", + "conventional-changelog-ember": "0.3.12", + "conventional-changelog-eslint": "1.0.9", + "conventional-changelog-express": "0.3.6", + "conventional-changelog-jquery": "0.1.0", + "conventional-changelog-jscs": "0.1.0", + "conventional-changelog-jshint": "0.3.8", + "conventional-changelog-preset-loader": "1.1.8" + } + }, + "conventional-changelog-angular": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", + "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz", + "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz", + "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-core": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz", + "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==", + "dev": true, + "requires": { + "conventional-changelog-writer": "3.0.9", + "conventional-commits-parser": "2.1.7", + "dateformat": "3.0.3", + "get-pkg-repo": "1.4.0", + "git-raw-commits": "1.3.6", + "git-remote-origin-url": "2.0.0", + "git-semver-tags": "1.3.6", + "lodash": "4.17.11", + "normalize-package-data": "2.5.0", + "q": "1.5.1", + "read-pkg": "1.1.0", + "read-pkg-up": "1.0.1", + "through2": "2.0.5" + }, + "dependencies": { + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "conventional-changelog-ember": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz", + "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz", + "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-express": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz", + "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", + "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jscs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", + "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz", + "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", + "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", + "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "conventional-commits-filter": "1.1.6", + "dateformat": "3.0.3", + "handlebars": "4.1.2", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.11", + "meow": "4.0.1", + "semver": "5.7.0", + "split": "1.0.1", + "through2": "2.0.5" + }, + "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 + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "4.2.0", + "decamelize-keys": "1.1.0", + "loud-rejection": "1.6.0", + "minimist": "1.2.0", + "minimist-options": "3.0.2", + "normalize-package-data": "2.5.0", + "read-pkg-up": "3.0.0", + "redent": "2.0.0", + "trim-newlines": "2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "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" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.5.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", + "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", + "dev": true, + "requires": { + "is-subset": "0.1.1", + "modify-values": "1.0.1" + } + }, + "conventional-commits-parser": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", + "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", + "dev": true, + "requires": { + "JSONStream": "1.3.5", + "is-text-path": "1.0.1", + "lodash": "4.17.11", + "meow": "4.0.1", + "split2": "2.2.0", + "through2": "2.0.5", + "trim-off-newlines": "1.0.1" + }, + "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 + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "4.2.0", + "decamelize-keys": "1.1.0", + "loud-rejection": "1.6.0", + "minimist": "1.2.0", + "minimist-options": "3.0.2", + "normalize-package-data": "2.5.0", + "read-pkg-up": "3.0.0", + "redent": "2.0.0", + "trim-newlines": "2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "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" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.5.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "conventional-recommended-bump": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-0.3.0.tgz", + "integrity": "sha1-6Dnej1fLtDRFyLSWdAHeBkTEJdg=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "conventional-commits-filter": "1.1.6", + "conventional-commits-parser": "1.3.0", + "git-latest-semver-tag": "1.0.2", + "git-raw-commits": "1.3.6", + "meow": "3.7.0", + "object-assign": "4.1.1" + }, + "dependencies": { + "conventional-commits-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-1.3.0.tgz", + "integrity": "sha1-4ye1MZThp61dxjR57pCZpSsCSGU=", + "dev": true, + "requires": { + "JSONStream": "1.3.5", + "is-text-path": "1.0.1", + "lodash": "4.17.11", + "meow": "3.7.0", + "split2": "2.2.0", + "through2": "2.0.5", + "trim-off-newlines": "1.0.1" + } + }, + "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 + } + } + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "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-js": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", + "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 + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.5", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "dagre": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.2.tgz", + "integrity": "sha512-TEOOGZOkCOgCG7AoUIq64sJ3d21SMv8tyoqteLpX+UsUsS9Qw8iap4hhogXY4oB3r0bbZuAjO0atAilgCmsE0Q==", + "requires": { + "graphlib": "2.1.5", + "lodash": "4.17.11" + } + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "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 + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "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 + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "1.2.0", + "map-obj": "1.0.1" + } + }, + "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 + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.4" + } + }, + "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.2" + } + }, + "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.2" + } + }, + "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" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "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 + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "1.0.1", + "ent": "2.2.0", + "extend": "3.0.2", + "void-elements": "2.0.1" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "1.3.1", + "entities": "1.1.2" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.1" + } + }, + "domino": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.3.tgz", + "integrity": "sha512-EwjTbUv1Q/RLQOdn9k7ClHutrQcWGsfXaRQNOnM/KgK4xDBoLFEcIRFuBSxAx13Vfa63X029gXYrNFrSy+DOSg==", + "dev": true + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.1", + "domelementtype": "1.3.1" + } + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "4.17.11" + } + }, + "eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "dev": true, + "requires": { + "tfunk": "3.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "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" + } + }, + "engine.io": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "0.11.23", + "through": "2.3.8" + } + }, + "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 + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "estree-walker": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "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 + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" + }, + "dependencies": { + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "0.1.1" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "0.1.1", + "repeat-string": "0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "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.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "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.6" + } + }, + "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.1" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.4" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.1.1", + "repeat-element": "1.1.3", + "repeat-string": "1.6.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "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" + } + }, + "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.6" + } + } + } + }, + "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.3" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "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.2" + } + }, + "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.1" + } + }, + "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.2" + } + }, + "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.2" + } + }, + "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" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "0.1.1", + "color-support": "1.1.3", + "parse-node-version": "1.0.1", + "time-stamp": "1.1.0" + } + }, + "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-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 + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + }, + "dependencies": { + "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 + } + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "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.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.1" + } + } + } + }, + "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-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "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" + } + }, + "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.1.10", + "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.1" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.2" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "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.2" + } + }, + "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 + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.8", + "mime-types": "2.1.24" + } + }, + "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 + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "1.0.0" + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "jsonfile": "3.0.1", + "universalify": "0.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.14.0", + "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 + }, + "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.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": 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 + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": 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.3.5" + } + }, + "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.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "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" + } + }, + "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.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.2", + "yallist": "3.0.3" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.3.5" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": 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.1", + "iconv-lite": "0.4.24", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.3.0", + "nopt": "4.0.1", + "npm-packlist": "1.4.1", + "npmlog": "4.1.2", + "rc": "1.2.8", + "rimraf": "2.6.3", + "semver": "5.7.0", + "tar": "4.4.8" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "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.6" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "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.2", + "os-tmpdir": "1.0.2" + } + }, + "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.5", + "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.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "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 + }, + "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, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "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.5", + "minizlib": "1.2.1", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.2", + "yallist": "3.0.3" + } + }, + "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" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" + }, + "dependencies": { + "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 + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "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-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "2.7.1", + "meow": "3.7.0", + "normalize-package-data": "2.5.0", + "parse-github-repo-url": "1.4.1", + "through2": "2.0.5" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "git-latest-semver-tag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/git-latest-semver-tag/-/git-latest-semver-tag-1.0.2.tgz", + "integrity": "sha1-BhEwy/QnQRHMa+RhKz/zptk+JmA=", + "dev": true, + "requires": { + "git-semver-tags": "1.3.6", + "meow": "3.7.0" + } + }, + "git-raw-commits": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", + "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "dev": true, + "requires": { + "dargs": "4.1.0", + "lodash.template": "4.4.0", + "meow": "4.0.1", + "split2": "2.2.0", + "through2": "2.0.5" + }, + "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 + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "4.2.0", + "decamelize-keys": "1.1.0", + "loud-rejection": "1.6.0", + "minimist": "1.2.0", + "minimist-options": "3.0.2", + "normalize-package-data": "2.5.0", + "read-pkg-up": "3.0.0", + "redent": "2.0.0", + "trim-newlines": "2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "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" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.5.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "1.0.0", + "pify": "2.3.0" + } + }, + "git-semver-tags": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", + "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", + "dev": true, + "requires": { + "meow": "4.0.1", + "semver": "5.7.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 + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "4.2.0", + "decamelize-keys": "1.1.0", + "loud-rejection": "1.6.0", + "minimist": "1.2.0", + "minimist-options": "3.0.2", + "normalize-package-data": "2.5.0", + "read-pkg-up": "3.0.0", + "redent": "2.0.0", + "trim-newlines": "2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "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" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.5.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "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.2" + }, + "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.1" + } + } + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "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.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" + } + }, + "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.3", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.1" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "1.0.1" + } + }, + "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 + }, + "graphlib": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.5.tgz", + "integrity": "sha512-XvtbqCcw+EM5SqQrIetIKKD+uZVNQtDPD1goIg7K73RuRZtVI5rYMdcCVSHm/AS1sCBZ7vt0p5WgXouucHQaOA==", + "requires": { + "lodash": "4.17.11" + } + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.2.0", + "liftoff": "2.5.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-inline-ng2-template": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-inline-ng2-template/-/gulp-inline-ng2-template-5.0.1.tgz", + "integrity": "sha512-s+Im6A4IFx4ek9qpu1vnKeL9lYHlGNGuoteDvobe56O6w5Nk4jjuOQAqIrpmCpk8bT18XieLEqZe8oe5fDXRhw==", + "dev": true, + "requires": { + "async": "2.6.2", + "clone": "2.1.2", + "es6-templates": "0.2.3", + "extend": "3.0.2", + "isarray": "2.0.4", + "plugin-error": "1.0.1", + "source-map": "0.7.3", + "through2": "2.0.5", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "isarray": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", + "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.3", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.5", + "vinyl": "0.5.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.2" + } + }, + "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.1", + "optimist": "0.6.1", + "source-map": "0.6.1", + "uglify-js": "3.3.23" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "6.10.0", + "har-schema": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "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-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "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.1" + } + }, + "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.6" + } + } + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "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" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.1", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-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", + "toidentifier": "1.0.0" + } + }, + "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.1.2", + "follow-redirects": "1.7.0", + "requires-port": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.16.1" + } + }, + "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" + } + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "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 + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "1.0.0", + "is-windows": "1.0.2" + } + }, + "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.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.13.1" + } + }, + "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.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "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.1.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-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "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-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", + "dev": true, + "requires": { + "generate-function": "2.3.1", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.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.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "3.3.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "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-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "1.0.0" + } + }, + "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-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "1.9.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.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 + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "1.2.0" + } + }, + "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 + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jasmine-core": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.5.2.tgz", + "integrity": "sha1-b2G9eQYeJ/Q+b5NV5Es8bKtv8pc=", + "dev": true + }, + "jointjs": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jointjs/-/jointjs-2.2.1.tgz", + "integrity": "sha512-2Tu/n97P/Vc6esibSQzdTuNn3IpQsloDUm2mBgbujocthrVPBNx3EYD4UzpbfkFMk5bku8sxSmA1bXZ0KxgXog==", + "requires": { + "backbone": "1.3.3", + "dagre": "0.8.2", + "graphlib": "2.1.5", + "jquery": "3.3.1", + "lodash": "4.17.11" + }, + "dependencies": { + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" + } + } + }, + "jquery": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.1.1.tgz", + "integrity": "sha1-NHwcIcfgBBFeCk2jLOzgQfrTyKM=", + "dev": true + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "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.10", + "esprima": "4.0.1" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jshint": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz", + "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==", + "dev": true, + "requires": { + "cli": "1.0.1", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "4.17.11", + "minimatch": "3.0.4", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + }, + "dependencies": { + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "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": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "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 + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "karma": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.5.0.tgz", + "integrity": "sha1-nEwU8EAL7ywEyOjmv/WTcQJcwAk=", + "dev": true, + "requires": { + "bluebird": "3.5.5", + "body-parser": "1.19.0", + "chokidar": "1.7.0", + "colors": "1.3.3", + "combine-lists": "1.0.1", + "connect": "3.7.0", + "core-js": "2.6.5", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.1", + "graceful-fs": "4.1.15", + "http-proxy": "1.17.0", + "isbinaryfile": "3.0.3", + "lodash": "3.10.1", + "log4js": "0.6.38", + "mime": "1.6.0", + "minimatch": "3.0.4", + "optimist": "0.6.1", + "qjobs": "1.2.0", + "range-parser": "1.2.1", + "rimraf": "2.6.1", + "safe-buffer": "5.1.2", + "socket.io": "1.7.3", + "source-map": "0.5.7", + "tmp": "0.0.31", + "useragent": "2.3.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.3" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.3", + "fsevents": "1.2.9", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "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.6" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.0.0.tgz", + "integrity": "sha1-wnkMWjKxVXfQ//Wk1aJwOztDnCU=", + "dev": true, + "requires": { + "fs-access": "1.0.1", + "which": "1.3.1" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "1.11.0" + } + }, + "karma-html-reporter": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/karma-html-reporter/-/karma-html-reporter-0.2.7.tgz", + "integrity": "sha1-/XPanxrJn9W6+zCc8HCUIYjnumM=", + "dev": true, + "requires": { + "lodash": "2.2.1", + "mu2": "0.5.21" + }, + "dependencies": { + "lodash": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.2.1.tgz", + "integrity": "sha1-ypNf0UqzwMhyq6zxmLnNpQFECGc=", + "dev": true + } + } + }, + "karma-jasmine": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.0.tgz", + "integrity": "sha1-IuTAa/mhguUpTR9wXjczgRuBCs8=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true, + "requires": { + "karma-jasmine": "1.1.0" + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "3.0.2", + "findup-sync": "2.0.0", + "fined": "1.2.0", + "flagged-respawn": "1.0.1", + "is-plain-object": "2.0.4", + "object.map": "1.0.1", + "rechoir": "0.6.2", + "resolve": "1.11.0" + } + }, + "limiter": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.4.tgz", + "integrity": "sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==", + "dev": true + }, + "lite-server": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/lite-server/-/lite-server-2.4.0.tgz", + "integrity": "sha512-Vo06tHpXrqm37i6T7tVdq5PSbrFmvQRw64+dlFXdh1tltv6KCvpE+xzXz2+x6KWJ8ja+GgwSy4P13GUWyhaDHQ==", + "dev": true, + "requires": { + "browser-sync": "2.26.7", + "connect-history-api-fallback": "1.6.0", + "connect-logger": "0.0.1", + "lodash": "4.17.11", + "minimist": "1.2.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "localtunnel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.2.tgz", + "integrity": "sha512-NEKF7bDJE9U3xzJu3kbayF0WTvng6Pww7tzqNb/XtEARYwqw7CKEX7BvOMg98FtE9es2CRizl61gkV3hS8dqYg==", + "dev": true, + "requires": { + "axios": "0.19.0", + "debug": "4.1.1", + "openurl": "1.1.1", + "yargs": "6.6.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "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.2" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.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 + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "semver": "4.3.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "magic-string": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", + "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", + "dev": true, + "requires": { + "sourcemap-codec": "1.4.4" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "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-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "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.1" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.5.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "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 + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "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.2", + "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.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "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": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "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.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "is-plain-obj": "1.1.0" + } + }, + "mitt": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.3.tgz", + "integrity": "sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==", + "dev": true + }, + "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 + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mu2": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/mu2/-/mu2-0.5.21.tgz", + "integrity": "sha1-iIqPD9kOsc/anbgUdvbhmcyeWNM=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": 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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "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 + }, + "ngx-bootstrap": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/ngx-bootstrap/-/ngx-bootstrap-2.0.5.tgz", + "integrity": "sha512-IduTVb78RDVlrz2+bn6GXK/REfM/RsRnz/AENwmrgTOg1AtvahJ9qANxXRNn33Kv9GJmkOYy/MhD3DyzeMb16w==", + "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-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "1.0.12", + "glob": "7.1.1", + "graceful-fs": "4.1.15", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.88.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.2", + "which": "1.3.1" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.8", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.3", + "har-validator": "5.1.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.24", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-sass": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz", + "integrity": "sha512-QFHfrZl6lqRU3csypwviz2XLgGNOoWQbo2GOvtsfQqOfL4cy1BtWnhx/XUeAO9LT3ahBzSRXcEO6DdvAH9DzSg==", + "dev": true, + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.3", + "get-stdin": "4.0.1", + "glob": "7.1.1", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.1", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.14.0", + "node-gyp": "3.8.0", + "npmlog": "4.1.2", + "request": "2.79.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.1", + "true-case-path": "1.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "4.1.5", + "which": "1.3.1" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "1.2.1" + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "requires": { + "glob": "7.1.1", + "lodash": "4.17.11", + "minimatch": "3.0.4" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "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.7.1", + "resolve": "1.11.0", + "semver": "5.7.0", + "validate-npm-package-license": "3.0.4" + } + }, + "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.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "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 + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "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.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "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.6" + } + }, + "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.6" + } + } + } + }, + "object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", + "dev": true + }, + "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.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "1.0.0", + "make-iterator": "1.0.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.1" + }, + "dependencies": { + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "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": "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.3.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 + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "1.0.0", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.2" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "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 + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "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-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-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "1.1.0", + "arr-diff": "4.0.0", + "arr-union": "3.1.0", + "extend-shallow": "3.0.2" + } + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "1.0.8" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "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 + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "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 + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", + "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", + "dev": true + }, + "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.4.1", + "once": "1.4.0" + } + }, + "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 + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "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 + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.4" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "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" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.5.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "readable-stream": { + "version": "2.3.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.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "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.15", + "micromatch": "3.1.10", + "readable-stream": "2.3.6" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "3.1.3", + "private": "0.1.8", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.11.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "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 + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.8.0", + "caseless": "0.11.0", + "combined-stream": "1.0.8", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.24", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.6", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.4.3", + "uuid": "3.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.8", + "mime-types": "2.1.24" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.20.0", + "is-my-json-valid": "2.20.0", + "pinkie-promise": "2.0.1" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.16.1" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "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": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "dev": true, + "requires": { + "path-parse": "1.0.6" + } + }, + "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.2", + "global-modules": "1.0.0" + } + }, + "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 + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "2.6.9", + "minimatch": "3.0.4" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.1" + } + }, + "rollup": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.62.0.tgz", + "integrity": "sha512-mZS0aIGfYzuJySJD78znu9/hCJsNfBzg4lDuZGMj0hFVcYHt2evNRHv8aqiu9/w6z6Qn8AQoVl4iyEjDmisGeA==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "6.0.46" + } + }, + "rollup-plugin-commonjs": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.3.tgz", + "integrity": "sha512-g91ZZKZwTW7F7vL6jMee38I8coj/Q9GBdTmXXeFL7ldgC1Ky5WJvHgbKlAiXXTh762qvohhExwUgeQGFh9suGg==", + "dev": true, + "requires": { + "estree-walker": "0.5.2", + "magic-string": "0.22.5", + "resolve": "1.11.0", + "rollup-pluginutils": "2.8.1" + }, + "dependencies": { + "magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "dev": true, + "requires": { + "vlq": "0.2.3" + } + } + } + }, + "rollup-plugin-node-resolve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", + "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==", + "dev": true, + "requires": { + "builtin-modules": "2.0.0", + "is-module": "1.0.0", + "resolve": "1.11.0" + } + }, + "rollup-plugin-sourcemaps": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", + "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "dev": true, + "requires": { + "rollup-pluginutils": "2.8.1", + "source-map-resolve": "0.5.2" + } + }, + "rollup-pluginutils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", + "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", + "dev": true, + "requires": { + "estree-walker": "0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "1.10.0" + } + }, + "rxjs-compat": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.5.2.tgz", + "integrity": "sha512-TRMkTp4FgSxE2HtGvxmgRukh3JqdFM7ejAj1Ti/VdodbPGfWvZR5+KdLKRV9jVDFyu2SknM8RD+PR54KGnoLjg==", + "dev": true + }, + "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.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "7.1.1", + "lodash": "4.17.11", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "2.5.1", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "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.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "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.6.3", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.1", + "statuses": "1.4.0" + }, + "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" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "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.7", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.24", + "parseurl": "1.3.3" + }, + "dependencies": { + "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" + } + }, + "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.5.0" + } + }, + "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 + }, + "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.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.3", + "send": "0.16.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "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.4", + "split-string": "3.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.1" + } + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "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 + }, + "shelljs": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz", + "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", + "dev": true, + "requires": { + "glob": "7.1.1", + "interpret": "1.2.0", + "rechoir": "0.6.2" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "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 + }, + "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.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.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.6" + } + }, + "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.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "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.1", + "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.2" + } + }, + "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.2" + } + }, + "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.2" + } + }, + "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.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.6" + } + } + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "socket.io": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.3", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.3", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "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 + }, + "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.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "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 + }, + "sourcemap-codec": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.4" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.2.0", + "spdx-license-ids": "3.0.4" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "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.2" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "2.0.5" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, + "standard-version": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-4.0.0.tgz", + "integrity": "sha1-5XjO/UOrewKUS9dWlSUFLqwbl4c=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "conventional-changelog": "1.1.24", + "conventional-recommended-bump": "0.3.0", + "figures": "1.7.0", + "fs-access": "1.0.1", + "object-assign": "4.1.1", + "semver": "5.7.0", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.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.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "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 + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "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.6" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "2.20.0", + "limiter": "1.1.4" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "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.2" + } + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "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.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "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" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "systemjs": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.21.4.tgz", + "integrity": "sha512-l1O8boHjAIY5UG74Xk4B63LK9QbFxv/FkQa//GGGWaTeQoMhTsWnFrYwPWBScSF4xQFMO/+v9QB4i633h8Oytw==", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.12", + "inherits": "2.0.3" + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "tfunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", + "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "object-path": "0.9.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "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" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "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.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "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 + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "1.1.32", + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "7.1.4" + }, + "dependencies": { + "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.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "ts-disposables": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/ts-disposables/-/ts-disposables-2.2.3.tgz", + "integrity": "sha1-YWuQnmRlG8icn/xlSEcJ+HAnaVY=" + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tslint": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", + "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.4.1", + "commander": "2.20.0", + "diff": "3.5.0", + "glob": "7.1.1", + "js-yaml": "3.13.1", + "minimatch": "3.0.4", + "resolve": "1.11.0", + "semver": "5.7.0", + "tslib": "1.10.0", + "tsutils": "2.29.0" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "1.10.0" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "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.1.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.4.tgz", + "integrity": "sha512-JZHJtA6ZL15+Q3Dqkbh8iCUmvxD3iJ7ujXS+fVkKnwIVAdHc5BJTDNM0aTrnr2luKulFjU7W+SRhDZvi66Ru7Q==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", + "dev": true + }, + "uglify-js": { + "version": "3.3.23", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.23.tgz", + "integrity": "sha512-Ks+KqLGDsYn4z+pU7JsKCzC0T3mPYl+rU+VcPZiQOazjE4Uqi4UCRY3qPMDbJi7ze37n1lDXj3biz1ik93vqvw==", + "dev": true, + "requires": { + "commander": "2.15.1", + "source-map": "0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "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.1" + } + }, + "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.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "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.1" + }, + "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.6", + "has-values": "0.1.4", + "isobject": "2.1.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.1" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "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 + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.5", + "tmp": "0.0.31" + } + }, + "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 + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "3.1.0", + "spdx-expression-parse": "3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.6" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "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 + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "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": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "zone.js": { + "version": "0.8.29", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", + "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==", + "dev": true + } + } +} From dc4a40d45702db9a49b96db9c41fc062b6a625e7 Mon Sep 17 00:00:00 2001 From: hakhan88 Date: Thu, 13 Jun 2019 00:18:04 +0800 Subject: [PATCH 04/10] update dis --- .gitignore | 1 - dist/LICENSE | 202 + dist/README.md | 33 + dist/bundles/spring-flo.umd.js | 3351 ++++++++++++++ dist/bundles/spring-flo.umd.min.js | 1 + .../code-editor/code-editor.component.js | 249 ++ dist/esm2015/directives/resizer.js | 161 + .../dsl-editor/dsl-editor.component.js | 168 + dist/esm2015/editor/editor-utils.js | 108 + dist/esm2015/editor/editor.component.js | 1778 ++++++++ dist/esm2015/index.js | 12 + dist/esm2015/module.js | 39 + dist/esm2015/palette/palette.component.js | 511 +++ .../properties/df.property.component.js | 82 + .../properties/properties.group.component.js | 50 + dist/esm2015/shared/flo-common.js | 57 + dist/esm2015/shared/flo-properties.js | 273 ++ dist/esm2015/shared/shapes.js | 494 +++ dist/esm2015/spring-flo.js | 5 + dist/esm2015/spring-flo.metadata.json | 1 + .../esm5/code-editor/code-editor.component.js | 237 + dist/esm5/directives/resizer.js | 192 + dist/esm5/dsl-editor/dsl-editor.component.js | 158 + dist/esm5/editor/editor-utils.js | 112 + dist/esm5/editor/editor.component.js | 1195 +++++ dist/esm5/index.js | 12 + dist/esm5/module.js | 42 + dist/esm5/palette/palette.component.js | 460 ++ dist/esm5/properties/df.property.component.js | 50 + .../properties/properties.group.component.js | 51 + dist/esm5/shared/flo-common.js | 57 + dist/esm5/shared/flo-properties.js | 345 ++ dist/esm5/shared/shapes.js | 497 +++ dist/esm5/spring-flo.js | 5 + dist/fesm2015/spring-flo.js | 3902 +++++++++++++++++ dist/fesm5/spring-flo.js | 3326 ++++++++++++++ dist/package.json | 109 + 37 files changed, 18325 insertions(+), 1 deletion(-) create mode 100644 dist/LICENSE create mode 100644 dist/README.md create mode 100644 dist/bundles/spring-flo.umd.js create mode 100644 dist/bundles/spring-flo.umd.min.js create mode 100644 dist/esm2015/code-editor/code-editor.component.js create mode 100644 dist/esm2015/directives/resizer.js create mode 100644 dist/esm2015/dsl-editor/dsl-editor.component.js create mode 100644 dist/esm2015/editor/editor-utils.js create mode 100644 dist/esm2015/editor/editor.component.js create mode 100644 dist/esm2015/index.js create mode 100644 dist/esm2015/module.js create mode 100644 dist/esm2015/palette/palette.component.js create mode 100644 dist/esm2015/properties/df.property.component.js create mode 100644 dist/esm2015/properties/properties.group.component.js create mode 100644 dist/esm2015/shared/flo-common.js create mode 100644 dist/esm2015/shared/flo-properties.js create mode 100644 dist/esm2015/shared/shapes.js create mode 100644 dist/esm2015/spring-flo.js create mode 100644 dist/esm2015/spring-flo.metadata.json create mode 100644 dist/esm5/code-editor/code-editor.component.js create mode 100644 dist/esm5/directives/resizer.js create mode 100644 dist/esm5/dsl-editor/dsl-editor.component.js create mode 100644 dist/esm5/editor/editor-utils.js create mode 100644 dist/esm5/editor/editor.component.js create mode 100644 dist/esm5/index.js create mode 100644 dist/esm5/module.js create mode 100644 dist/esm5/palette/palette.component.js create mode 100644 dist/esm5/properties/df.property.component.js create mode 100644 dist/esm5/properties/properties.group.component.js create mode 100644 dist/esm5/shared/flo-common.js create mode 100644 dist/esm5/shared/flo-properties.js create mode 100644 dist/esm5/shared/shapes.js create mode 100644 dist/esm5/spring-flo.js create mode 100644 dist/fesm2015/spring-flo.js create mode 100644 dist/fesm5/spring-flo.js create mode 100644 dist/package.json diff --git a/.gitignore b/.gitignore index 86be9b3..3cf2312 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -dist/ node_modules/ out-tsc/ debug.log diff --git a/dist/LICENSE b/dist/LICENSE new file mode 100644 index 0000000..62589ed --- /dev/null +++ b/dist/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/dist/README.md b/dist/README.md new file mode 100644 index 0000000..f254ae1 --- /dev/null +++ b/dist/README.md @@ -0,0 +1,33 @@ +# Spring Flo + +[![macOS Build Status](https://travis-ci.org/spring-projects/spring-flo.svg?branch=master)](https://travis-ci.org/spring-projects/spring-flo) [![Dependency Status](https://david-dm.org/spring-projects/spring-flo.svg)](https://david-dm.org/spring-projects/spring-flo) + +Spring Flo is a JavaScript library that offers a basic embeddable HTML5 visual builder for pipelines and simple graphs. This library is used as the basis of the stream builder in Spring Cloud Data Flow. + +[![dataflow ui](docs/Flo.png)](https://cloud.spring.io/spring-cloud-dataflow/) + +Here is a [youtube video](https://www.youtube.com/watch?v=78CgV46OstI) of Spring Flo in action. + +## Consuming Spring Flo + +Refer to the [wiki](https://github.com/spring-projects/spring-flo/wiki) for more information on how to embed it in an application. + +## Build + +Spring Flo is built using NPM commands. Simplest way to build is via `npm run build` to build the project and run the tests (Prerequisite for th build is `npm install` executed before the build command is). Build results are produced under the __dist__ folder. + +## Getting Help + +If you have any questions, issues, feedback or feature request please [raise an issue](https://github.com/spring-projects/spring-flo/issues). + +## Samples + +A small self contained sample usage of Spring Flo is available in the [demo](https://github.com/spring-projects/spring-flo/tree/master/src/demo) sub folder. Execute `npm start` to run the sample. The [Spring Cloud Data Flow UI](https://github.com/spring-cloud/spring-cloud-dataflow-ui) at github shows a larger scale usage of Spring Flo. + +## Contributing + +Pull requests are welcome, but before accepting them we will need you to sign the [Contributors Agreement](https://support.springsource.com/spring_committer_signup). + +## License + +Spring Flo is Open Source software released under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0.html). diff --git a/dist/bundles/spring-flo.umd.js b/dist/bundles/spring-flo.umd.js new file mode 100644 index 0000000..726255f --- /dev/null +++ b/dist/bundles/spring-flo.umd.js @@ -0,0 +1,3351 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jointjs'), require('jquery'), require('lodash'), require('@angular/core'), require('rxjs'), require('rxjs/operators'), require('@angular/platform-browser'), require('ts-disposables'), require('codemirror-minified'), require('codemirror-minified/addon/lint/lint'), require('codemirror-minified/addon/hint/show-hint'), require('codemirror-minified/addon/display/placeholder'), require('codemirror-minified/addon/scroll/annotatescrollbar'), require('codemirror-minified/addon/scroll/simplescrollbars'), require('@angular/forms'), require('codemirror-minified/mode/meta'), require('codemirror-minified/addon/edit/matchbrackets'), require('codemirror-minified/addon/edit/closebrackets'), require('codemirror-minified/addon/lint/javascript-lint'), require('codemirror-minified/addon/lint/coffeescript-lint'), require('codemirror-minified/addon/lint/json-lint'), require('codemirror-minified/addon/lint/yaml-lint'), require('codemirror-minified/mode/groovy/groovy'), require('codemirror-minified/mode/javascript/javascript'), require('codemirror-minified/mode/python/python'), require('codemirror-minified/mode/ruby/ruby'), require('codemirror-minified/mode/clike/clike'), require('codemirror-minified/mode/yaml/yaml'), require('codemirror-minified/mode/coffeescript/coffeescript'), require('@angular/common')) : + typeof define === 'function' && define.amd ? define('spring-flo', ['exports', 'jointjs', 'jquery', 'lodash', '@angular/core', 'rxjs', 'rxjs/operators', '@angular/platform-browser', 'ts-disposables', 'codemirror-minified', 'codemirror-minified/addon/lint/lint', 'codemirror-minified/addon/hint/show-hint', 'codemirror-minified/addon/display/placeholder', 'codemirror-minified/addon/scroll/annotatescrollbar', 'codemirror-minified/addon/scroll/simplescrollbars', '@angular/forms', 'codemirror-minified/mode/meta', 'codemirror-minified/addon/edit/matchbrackets', 'codemirror-minified/addon/edit/closebrackets', 'codemirror-minified/addon/lint/javascript-lint', 'codemirror-minified/addon/lint/coffeescript-lint', 'codemirror-minified/addon/lint/json-lint', 'codemirror-minified/addon/lint/yaml-lint', 'codemirror-minified/mode/groovy/groovy', 'codemirror-minified/mode/javascript/javascript', 'codemirror-minified/mode/python/python', 'codemirror-minified/mode/ruby/ruby', 'codemirror-minified/mode/clike/clike', 'codemirror-minified/mode/yaml/yaml', 'codemirror-minified/mode/coffeescript/coffeescript', '@angular/common'], factory) : + (factory((global.ng = global.ng || {}, global.ng['spring-flo'] = {}),global.jointjs,global.jquery,global.lodash,global.ng.core,global.rxjs,global.rxjs.operators,global.ng.browser,global['ts-disposables'],global['codemirror-minified'],global['codemirror-minified/addon/lint/lint'],global['codemirror-minified/addon/hint/show-hint'],global['codemirror-minified/addon/edit/closebrackets'],global['codemirror-minified/addon/scroll/annotatescrollbar'],global['codemirror-minified/addon/scroll/simplescrollbars'],global.ng.forms,global['codemirror-minified/mode/meta'],global['codemirror-minified/addon/edit/matchbrackets'],global['codemirror-minified/addon/edit/closebrackets'],global['codemirror-minified/addon/lint/javascript-lint'],global['codemirror-minified/addon/lint/coffeescript-lint'],global['codemirror-minified/addon/lint/json-lint'],global['codemirror-minified/addon/lint/yaml-lint'],global['codemirror-minified/mode/groovy/groovy'],global['codemirror-minified/mode/javascript/javascript'],global['codemirror-minified/mode/python/python'],global['codemirror-minified/mode/ruby/ruby'],global['codemirror-minified/mode/clike/clike'],global['codemirror-minified/mode/yaml/yaml'],global['codemirror-minified/mode/coffeescript/coffeescript'],global.ng.common)); +}(this, (function (exports,_joint,_$,lodash,core,rxjs,operators,platformBrowser,tsDisposables,codemirrorMinified,lint,showHint,placeholder,annotatescrollbar,simplescrollbars,forms,meta,matchbrackets,closebrackets,javascriptLint,coffeescriptLint,jsonLint,yamlLint,groovy,javascript,python,ruby,clike,yaml,coffeescript,common) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + } + + function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } + } + + function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); + } + + var $ = _$; + + (function (Flo) { + Flo.joint = _joint; + var DnDEventType; + (function (DnDEventType) { + DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; + DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; + })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); + var Severity; + (function (Severity) { + Severity[Severity["Error"] = 0] = "Error"; + Severity[Severity["Warning"] = 1] = "Warning"; + })(Severity = Flo.Severity || (Flo.Severity = {})); + function findMagnetByClass(view, className) { + if (className && className.startsWith('.')) { + className = className.substr(1); + } + var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0; }); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByClass = findMagnetByClass; + function findMagnetByPort(view, port) { + var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('port') === port; }); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByPort = findMagnetByPort; + /** + * Return the metadata for a particular palette entry in a particular group. + * @param name - name of the palette entry + * @param group - group in which the palette entry should exist (e.g. sinks) + * @return + */ + function getMetadata(metamodel, name, group) { + var groupObj = metamodel && group ? metamodel.get(group) : undefined; + if (name && groupObj && groupObj.get(name)) { + return metamodel.get(group).get(name); + } + else { + return { + name: name, + group: group, + unresolved: true, + get: function (property) { return new Promise(function (resolve) { return resolve(); }); }, + properties: function () { return Promise.resolve(new Map()); } + }; + } + } + Flo.getMetadata = getMetadata; + })(exports.Flo || (exports.Flo = {})); + + var joint = exports.Flo.joint; + var $$1 = _$; + var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); + var isFF = navigator.userAgent.indexOf('Firefox') > 0; + var IMAGE_W = 120; + var IMAGE_H = 35; + var ERROR_MARKER_SIZE = { width: 16, height: 16 }; + var HANDLE_SIZE = { width: 10, height: 10 }; + joint.shapes.flo = {}; + joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; + joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; + joint.shapes.flo.DECORATION_TYPE = 'decoration'; + joint.shapes.flo.HANDLE_TYPE = 'handle'; + var HANDLE_ICON_MAP = new Map(); + var REMOVE = 'remove'; + HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); + var DECORATION_ICON_MAP = new Map(); + var ERROR = 'error'; + DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); + joint.util.cloneDeep = function (obj) { + return lodash.cloneDeepWith(obj, function (o) { + if (lodash.isObject(o) && !lodash.isPlainObject(o)) { + return o; + } + }); + }; + joint.util.filter.redscale = function (args) { + var amount = Number.isFinite(args.amount) ? args.amount : 1; + return lodash.template('', { + a: 1 - 0.96 * amount, + b: 0.95 * amount, + c: 0.01 * amount, + d: 0.3 * amount, + e: 0.2 * amount, + f: 1 - 0.9 * amount, + g: 0.7 * amount, + h: 0.05 * amount, + i: 0.05 * amount, + k: 1 - 0.1 * amount + }); + }; + joint.util.filter.orangescale = function (args) { + var amount = Number.isFinite(args.amount) ? args.amount : 1; + return lodash.template('', { + a: 1.0 + 0.5 * amount, + b: 1.4 * amount, + c: 0.2 * amount, + d: 0.3 * amount, + e: 0.3 * amount, + f: 1 + 0.05 * amount, + g: 0.2 * amount, + h: 0.15 * amount, + i: 0.3 * amount, + k: 0.3 * amount, + l: 1 - 0.6 * amount + }); + }; + joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ + markup: '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.NODE_TYPE, + position: { x: 0, y: 0 }, + size: { width: IMAGE_W, height: IMAGE_H }, + attrs: { + '.': { magnet: false }, + // rounded edges around image + '.border': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + 'fill-opacity': 0, + stroke: '#eeeeee', + 'stroke-width': 0 + }, + '.box': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + //'fill-opacity': 0, // see through + stroke: '#6db33f', + fill: '#eeeeee', + 'stroke-width': 1 + }, + '.input-port': { + port: 'input', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.output-port': { + port: 'output', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.label': { + 'text-anchor': 'middle', + 'ref-x': 0.5, + // 'ref-y': -12, // jointjs specific: relative position to ref'd element + 'ref-y': 0.3, + ref: '.border', + fill: 'black', + 'font-size': 14 + }, + '.label2': { + 'text': '\u21d2', + 'text-anchor': 'middle', + 'ref-x': 0.15, + 'ref-y': 0.2, + ref: '.border', + // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', + fill: 'black', + 'font-size': 24 + }, + '.shape': {}, + '.image': { + width: IMAGE_W, + height: IMAGE_H + } + } + }, joint.shapes.basic.Generic.prototype.defaults) + }); + joint.shapes.flo.Link = joint.dia.Link.extend({ + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.LINK_TYPE, + attrs: { + '.connection': { stroke: '#34302d', 'stroke-width': 2 }, + // Lots of alternatives that have been played with: + // '.smoooth': true + // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, + // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, + // '.connection': { 'stroke':'black'}, + // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, + // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, + // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) + // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, + // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, + // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, + // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, + '.marker-arrowheads': { display: 'none' }, + '.tool-options': { display: 'none' } + }, + }, joint.dia.Link.prototype.defaults) + }); + joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ + options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), + _beforeArrowheadMove: function () { + if (this.model.get('source').id) { + this._oldSource = this.model.get('source'); + } + if (this.model.get('target').id) { + this._oldTarget = this.model.get('target'); + } + joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); + }, + _afterArrowheadMove: function () { + joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); + if (!this.model.get('source').id) { + if (this._oldSource) { + this.model.set('source', this._oldSource); + } + else { + this.model.remove(); + } + } + if (!this.model.get('target').id) { + if (this._oldTarget) { + this.model.set('target', this._oldTarget); + } + else { + this.model.remove(); + } + } + delete this._oldSource; + delete this._oldTarget; + } + }); + // TODO: must do cleanup for the `mainElementView' + joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ + // canShowTooltip: true, + beingDragged: false, + // _tempZorder: 0, + _tempOpacity: 1.0, + _hovering: false, + dragLinkStart: function (evt, magnet, x, y) { + this.model.startBatch('add-link'); + var linkView = this.addLinkFromMagnet(magnet, x, y); + // backwards compatiblity events + joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); + linkView.notify('link:pointerdown', evt, x, y); + /*** START MAIN DIFF ***/ + var sourceOrTarget = $$1(magnet).attr('port') === 'input' ? 'source' : 'target'; + linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); + /*** END MAIN DIFF ***/ + this.eventData(evt, { linkView: linkView }); + }, + addLinkFromMagnet: function (magnet, x, y) { + var paper = this.paper; + var graph = paper.model; + var link = paper.getDefaultLink(this, magnet); + var sourceEnd, targetEnd; + /*** START MAIN DIFF ***/ + if ($$1(magnet).attr('port') === 'input') { + sourceEnd = { x: x, y: y }; + targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); + } + else { + sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); + targetEnd = { x: x, y: y }; + } + /*** END MAIN DIFF ***/ + link.set({ + source: sourceEnd, + target: targetEnd + }).addTo(graph, { + async: false, + ui: true + }); + return link.findView(paper); + }, + // pointerdown: function(evt: any, x: number, y: number) { + // // this.canShowTooltip = false; + // // this.hideTooltip(); + // this.beingDragged = false; + // this._tempOpacity = this.model.attr('./opacity'); + // + // this.model.trigger('batch:start'); + // + // if ( // target is a valid magnet start linking + // evt.target.getAttribute('magnet') && + // this.paper.options.validateMagnet.call(this.paper, this, evt.target) + // ) { + // let link = this.paper.getDefaultLink(this, evt.target); + // if ($(evt.target).attr('port') === 'input') { + // link.set({ + // source: { x: x, y: y }, + // target: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // } + // }); + // } else { + // link.set({ + // source: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // }, + // target: { x: x, y: y } + // }); + // } + // this.paper.model.addCell(link); + // this._linkView = this.paper.findViewByModel(link); + // if ($(evt.target).attr('port') === 'input') { + // this._linkView.startArrowheadMove('source'); + // } else { + // this._linkView.startArrowheadMove('target'); + // } + // this.paper.__creatingLinkFromPort = true; + // } else { + // this._dx = x; + // this._dy = y; + // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); + // } + // }, + drag: function (evt, x, y) { + var interactive = lodash.isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : + this.options.interactive; + if (interactive !== false) { + this.paper.trigger('dragging-node-over-canvas', { type: exports.Flo.DnDEventType.DRAG, view: this, event: evt }); + } + joint.dia.ElementView.prototype.drag.apply(this, arguments); + }, + dragEnd: function (evt, x, y) { + this.paper.trigger('dragging-node-over-canvas', { type: exports.Flo.DnDEventType.DROP, view: this, event: evt }); + joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); + }, + }); + joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ + markup: '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.DECORATION_TYPE, + size: ERROR_MARKER_SIZE, + attrs: { + 'image': ERROR_MARKER_SIZE + } + }, joint.shapes.basic.Generic.prototype.defaults) + }); + + (function (Constants) { + Constants.REMOVE_HANDLE_TYPE = REMOVE; + Constants.PROPERTIES_HANDLE_TYPE = 'properties'; + Constants.ERROR_DECORATION_KIND = ERROR; + Constants.PALETTE_CONTEXT = 'palette'; + Constants.CANVAS_CONTEXT = 'canvas'; + Constants.FEEDBACK_CONTEXT = 'feedback'; + })(exports.Constants || (exports.Constants = {})); + + (function (Shapes) { + var Factory = /** @class */ (function () { + function Factory() { + } + /** + * Create a JointJS node that embeds extra metadata (properties). + */ + Factory.createNode = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var metadata = params.metadata; + var position = params.position; + var props = params.props; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + var node; + if (!position) { + position = { x: 0, y: 0 }; + } + if (renderer && lodash.isFunction(renderer.createNode)) { + node = renderer.createNode(metadata, props); + } + else { + node = new joint.shapes.flo.Node(); + if (metadata) { + node.attr('.label/text', metadata.name); + } + } + node.set('type', joint.shapes.flo.NODE_TYPE); + if (position) { + node.set('position', position); + } + if (props) { + Array.from(props.keys()).forEach(function (key) { return node.attr("props/" + key, props.get(key)); }); + } + node.attr('metadata', metadata); + if (graph) { + graph.addCell(node); + } + if (renderer && lodash.isFunction(renderer.initializeNewNode)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewNode(node, descriptor); + } + return node; + }; + Factory.createLink = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var metadata = params.metadata; + var source = params.source; + var target = params.target; + var props = params.props; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + var link; + if (renderer && lodash.isFunction(renderer.createLink)) { + link = renderer.createLink(source, target, metadata, props); + } + else { + link = new joint.shapes.flo.Link(); + } + if (source) { + link.set('source', source); + } + if (target) { + link.set('target', target); + } + link.set('type', joint.shapes.flo.LINK_TYPE); + if (metadata) { + link.attr('metadata', metadata); + } + if (props) { + Array.from(props.keys()).forEach(function (key) { return link.attr("props/" + key, props.get(key)); }); + } + if (graph) { + graph.addCell(link); + } + if (renderer && lodash.isFunction(renderer.initializeNewLink)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewLink(link, descriptor); + } + // prevent creation of link breaks + link.attr('.marker-vertices/display', 'none'); + return link; + }; + Factory.createDecoration = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var parent = params.parent; + var kind = params.kind; + var messages = params.messages; + var location = params.position; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + if (!location) { + location = { x: 0, y: 0 }; + } + var decoration; + if (renderer && lodash.isFunction(renderer.createDecoration)) { + decoration = renderer.createDecoration(kind, parent); + } + else { + decoration = new joint.shapes.flo.ErrorDecoration({ + attrs: { + image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, + } + }); + } + decoration.set('type', joint.shapes.flo.DECORATION_TYPE); + decoration.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + decoration.set('z', parent.get('z') + 1); + } + decoration.attr('./kind', kind); + decoration.attr('messages', messages); + if (graph) { + graph.addCell(decoration); + } + parent.embed(decoration); + if (renderer && lodash.isFunction(renderer.initializeNewDecoration)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewDecoration(decoration, descriptor); + } + return decoration; + }; + Factory.createHandle = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var parent = params.parent; + var kind = params.kind; + var location = params.position; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + var handle; + if (!location) { + location = { x: 0, y: 0 }; + } + if (renderer && lodash.isFunction(renderer.createHandle)) { + handle = renderer.createHandle(kind, parent); + } + else { + handle = new joint.shapes.flo.ErrorDecoration({ + size: HANDLE_SIZE, + attrs: { + 'image': { + 'xlink:href': HANDLE_ICON_MAP.get(kind) + } + } + }); + } + handle.set('type', joint.shapes.flo.HANDLE_TYPE); + handle.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + handle.set('z', parent.get('z') + 1); + } + handle.attr('./kind', kind); + if (graph) { + graph.addCell(handle); + } + parent.embed(handle); + if (renderer && lodash.isFunction(renderer.initializeNewHandle)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewHandle(handle, descriptor); + } + return handle; + }; + return Factory; + }()); + Shapes.Factory = Factory; + })(exports.Shapes || (exports.Shapes = {})); + + var joint$1 = exports.Flo.joint; + var $$2 = _$; + var DEBOUNCE_TIME = 300; + joint$1.shapes.flo.PaletteGroupHeader = joint$1.shapes.basic.Generic.extend({ + // The path is the open/close arrow, defaults to vertical (open) + markup: '', + defaults: joint$1.util.deepSupplement({ + type: 'palette.groupheader', + size: { width: 170, height: 30 }, + position: { x: 0, y: 0 }, + attrs: { + 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, + 'text': { + text: '', + fill: '#eeeeee', + 'ref-x': 0.5, + 'ref-y': 7, + 'x-alignment': 'middle', + 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ + }, + 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } + }, + // custom properties + isOpen: true + }, joint$1.shapes.basic.Generic.prototype.defaults) + }); + var Palette = /** @class */ (function () { + function Palette(element, document) { + var _this = this; + this.element = element; + this.document = document; + this._metamodelListener = { + metadataError: function (data) { }, + metadataAboutToChange: function () { }, + metadataChanged: function () { return _this.rebuildPalette(); } + }; + this.initialized = false; + this._filterText = ''; + this.filterTextModel = new rxjs.Subject(); + this.paletteEntryPadding = { width: 12, height: 12 }; + this.onPaletteEntryDrop = new core.EventEmitter(); + this.paletteReady = new core.EventEmitter(); + this.paletteFocus = new core.EventEmitter(); + this.mouseMoveHanlder = function (e) { return _this.handleDrag(e); }; + this.mouseUpHanlder = function (e) { return _this.handleMouseUp(e); }; + this.paletteGraph = new joint$1.dia.Graph(); + this.paletteGraph.set('type', exports.Constants.PALETTE_CONTEXT); + this._filterText = ''; + this.closedGroups = new Set(); + } + Object.defineProperty(Palette.prototype, "paletteSize", { + set: function (size) { + console.debug('Palette Size: ' + size); + if (this._paletteSize !== size) { + this._paletteSize = size; + this.rebuildPalette(); + } + }, + enumerable: true, + configurable: true + }); + Palette.prototype.onFocus = function () { + this.paletteFocus.emit(); + }; + Palette.prototype.ngOnInit = function () { + var _this = this; + var element = $$2('#palette-paper', this.element.nativeElement); + // Create the paper for the palette using the specified element view + this.palette = new joint$1.dia.Paper({ + el: element, + gridSize: 1, + model: this.paletteGraph, + height: $$2(this.element.nativeElement.parentNode).height(), + width: $$2(this.element.nativeElement.parentNode).width(), + elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView), + interactive: false + }); + this.palette.on('cell:pointerup', function (cellview, evt) { + if (_this.viewBeingDragged) { + _this.trigger({ + type: exports.Flo.DnDEventType.DROP, + view: _this.viewBeingDragged, + event: evt + }); + _this.viewBeingDragged = undefined; + } + _this.clickedElement = undefined; + $$2('#palette-floater').remove(); + if (_this.floaterpaper) { + _this.floaterpaper.remove(); + } + }); + // Toggle the header open/closed on a click + this.palette.on('cell:pointerclick', function (cellview, event) { + // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? + // Click position within the element would be: evt.offsetX, evt.offsetY + var cell = cellview.model; + if (cell.attributes.header) { + // Toggle the header open/closed + if (cell.get('isOpen')) { + _this.rotateClosed(cell); + } + else { + _this.rotateOpen(cell); + } + } + // TODO [palette] ensure other mouse handling events do nothing for headers + // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) + }); + $$2(this.document).on('mouseup', this.mouseUpHanlder); + if (this.metamodel) { + this.metamodel.load().then(function (data) { + _this.buildPalette(data); + // Add listener to metamodel + if (_this.metamodel && _this.metamodel.subscribe) { + _this.metamodel.subscribe(_this._metamodelListener); + } + // Add debounced listener to filter text changes + _this.filterTextModel + .pipe(operators.debounceTime(DEBOUNCE_TIME)) + .subscribe(function (value) { return _this.rebuildPalette(); }); + _this.initialized = true; + }); + } + else { + console.error('No Metamodel service specified for palette!'); + } + this._paletteSize = this._paletteSize || $$2(this.element.nativeElement.parentNode).width(); + }; + Palette.prototype.ngOnDestroy = function () { + if (this.metamodel && this.metamodel.unsubscribe) { + this.metamodel.unsubscribe(this._metamodelListener); + } + $$2(this.document).off('mouseup', this.mouseUpHanlder); + this.palette.remove(); + }; + Palette.prototype.ngOnChanges = function (changes) { + // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { + // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); + // } + }; + Palette.prototype.createPaletteGroup = function (title, isOpen) { + var newGroupHeader = new joint$1.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); + newGroupHeader.set('header', title); + if (!isOpen) { + newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); + newGroupHeader.set('isOpen', false); + } + this.paletteGraph.addCell(newGroupHeader); + return newGroupHeader; + }; + Palette.prototype.createPaletteEntry = function (title, metadata) { + return exports.Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.palette, + metadata: metadata + }); + }; + Palette.prototype.buildPalette = function (metamodel) { + var _this = this; + var startTime = new Date().getTime(); + this.paletteReady.emit(false); + this.paletteGraph.clear(); + var filterText = this.filterText; + if (filterText) { + filterText = filterText.toLowerCase(); + } + var paletteNodes = []; + var groupAdded = new Set(); + var parentWidth = this._paletteSize; + console.debug("Parent Width: " + parentWidth); + // The field closedGroups tells us which should not be shown + // Work out the list of active groups/nodes based on the filter text + this.metamodel.groups().forEach(function (group) { + if (metamodel && metamodel.has(group)) { + Array.from(metamodel.get(group).keys()).sort().forEach(function (name) { + var node = metamodel.get(group).get(name); + if (node) { + var nodeActive = !(node.metadata && node.metadata.noPaletteEntry); + if (nodeActive && filterText) { + nodeActive = false; + if (name.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + else if (group.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { + // nodeActive = true; + // } + // else if (node.properties) { + // Object.keys(node.properties).sort().forEach(function(propertyName) { + // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || + // (node.properties[propertyName].description && + // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { + // nodeActive=true; + // } + // }); + // } + } + if (nodeActive) { + if (!groupAdded.has(group)) { + var header = _this.createPaletteGroup(group, !_this.closedGroups.has(group)); + header.set('size', { width: parentWidth, height: 30 }); + paletteNodes.push(header); + groupAdded.add(group); + } + if (!_this.closedGroups.has(group)) { + paletteNodes.push(_this.createPaletteEntry(name, node)); + } + } + } + }); + } + }); + var cellWidth = 0, cellHeight = 0; + // Determine the size of the palette entry cell (width and height) + paletteNodes.forEach(function (pnode) { + if (pnode.attr('metadata/name')) { + var dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (cellWidth < dimension.width) { + cellWidth = dimension.width; + } + if (cellHeight < dimension.height) { + cellHeight = dimension.height; + } + } + }); + // Adjust the palette entry cell size with paddings. + cellWidth += 2 * this.paletteEntryPadding.width; + cellHeight += 2 * this.paletteEntryPadding.height; + // Align palette entries row to be at the center + var startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; + var xpos = startX; + var ypos = 0; + var prevNode; + // Layout palette entry nodes + paletteNodes.forEach(function (pnode) { + var dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (pnode.get('header')) { //attributes.attrs.header) { + // Palette entry header + xpos = startX; + pnode.set('position', { x: 0, y: ypos }); + ypos += dimension.height + 5; + } + else { + // Palette entry element + if (xpos + cellWidth > parentWidth) { + // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line + xpos = startX; + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + else { + // Enough real estate to place entry in a row - adjust y position + if (prevNode && prevNode.attr('metadata/name')) { + ypos -= cellHeight; + } + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + // increment x position and y position (can be reorganized) + xpos += cellWidth; + ypos += cellHeight; + } + prevNode = pnode; + }); + this.palette.setDimensions(parentWidth, ypos); + this.paletteReady.emit(true); + console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); + }; + Palette.prototype.rebuildPalette = function () { + var _this = this; + if (this.initialized && this.metamodel) { + this.metamodel.load().then(function (metamodel) { return _this.buildPalette(metamodel); }); + } + }; + Object.defineProperty(Palette.prototype, "filterText", { + get: function () { + return this._filterText; + }, + set: function (text) { + if (this._filterText !== text) { + this._filterText = text; + this.filterTextModel.next(text); + } + }, + enumerable: true, + configurable: true + }); + Palette.prototype.getPaletteView = function (view) { + var self = this; + return view.extend({ + pointerdown: function ( /*evt, x, y*/) { + // Remove the tooltip + // $('.node-tooltip').remove(); + // TODO move metadata to the right place (not inside attrs I think) + self.clickedElement = this.model; + if (self.clickedElement && self.clickedElement.attr('metadata')) { + $$2(self.document).on('mousemove', self.mouseMoveHanlder); + } + }, + pointermove: function ( /*evt, x, y*/) { + // Nothing to prevent move within the palette canvas + }, + }); + }; + Palette.prototype.handleMouseUp = function (event) { + $$2(this.document).off('mousemove', this.mouseMoveHanlder); + }; + Palette.prototype.trigger = function (event) { + this.onPaletteEntryDrop.emit(event); + }; + Palette.prototype.handleDrag = function (event) { + // TODO offsetX/Y not on firefox + // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); + // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); + if (this.clickedElement && this.clickedElement.attr('metadata')) { + if (!this.viewBeingDragged) { + var dataOfClickedElement = this.clickedElement.attr('metadata'); + // custom div if not already built. + $$2('
', { + id: 'palette-floater' + }).appendTo($$2('body')); + var floatergraph = new joint$1.dia.Graph(); + floatergraph.set('type', exports.Constants.FEEDBACK_CONTEXT); + var parent_1 = $$2('#palette-floater'); + this.floaterpaper = new joint$1.dia.Paper({ + el: $$2('#palette-floater'), + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView, + gridSize: 10, + model: floatergraph, + height: parent_1.height(), + width: parent_1.width(), + validateMagnet: function () { return false; }, + validateConnection: function () { return false; } + }); + // TODO float thing needs to be bigger otherwise icon label is missing + // Initiative drag and drop - create draggable element + var floaternode = exports.Shapes.Factory.createNode({ + 'renderer': this.renderer, + 'paper': this.floaterpaper, + 'graph': floatergraph, + 'metadata': dataOfClickedElement + }); + // Only node view expected + var box = this.floaterpaper.findViewByModel(floaternode).getBBox(); + var size = floaternode.get('size'); + // Account for node real size including ports + floaternode.translate(box.width - size.width, box.height - size.height); + this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); + $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + } + else { + $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + this.trigger({ + type: exports.Flo.DnDEventType.DRAG, + view: this.viewBeingDragged, + event: event + }); + } + } + }; + /* + * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) + */ + Palette.prototype.rotateOpen = function (element) { + var _this = this; + setTimeout(function () { return _this.doRotateOpen(element, 90); }); + }; + Palette.prototype.doRotateOpen = function (element, angle) { + var _this = this; + angle -= 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle <= 0) { + element.set('isOpen', true); + this.closedGroups.delete(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(function () { return _this.doRotateOpen(element, angle); }, 10); + } + }; + Palette.prototype.doRotateClose = function (element, angle) { + var _this = this; + angle += 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle >= 90) { + element.set('isOpen', false); + this.closedGroups.add(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(function () { return _this.doRotateClose(element, angle); }, 10); + } + }; + // TODO better name for this function as this does the animation *and* updates the palette + /* + * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) + */ + Palette.prototype.rotateClosed = function (element) { + var _this = this; + setTimeout(function () { return _this.doRotateClose(element, 0); }); + }; + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], Palette.prototype, "metamodel", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], Palette.prototype, "renderer", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], Palette.prototype, "paletteEntryPadding", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], Palette.prototype, "onPaletteEntryDrop", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], Palette.prototype, "paletteReady", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], Palette.prototype, "paletteFocus", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) + ], Palette.prototype, "paletteSize", null); + Palette = __decorate([ + core.Component({ + selector: 'flo-palette', + template: "\n
\n \n
\n
\n
\n
\n ", + styles: ["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "], + encapsulation: core.ViewEncapsulation.None + }), + __param(1, core.Inject(platformBrowser.DOCUMENT)), + __metadata("design:paramtypes", [core.ElementRef, Object]) + ], Palette); + return Palette; + }()); + + var joint$2 = exports.Flo.joint; + var $$3 = _$; + var Utils = /** @class */ (function () { + function Utils() { + } + Utils.fanRoute = function (graph, cell) { + if (cell instanceof joint$2.dia.Element) { + var links = graph.getConnectedLinks(cell); + var groupsOfOverlappingLinks = lodash.groupBy(links, function (link) { + // the key of the group is the model id of the link's source or target, but not our cell id. + var sourceId = link.get('source').id; + var targetId = link.get('target').id; + return cell.id !== sourceId ? sourceId : targetId; + }); + lodash.each(groupsOfOverlappingLinks, function (group, key) { + // If the member of the group has both source and target model adjust vertices. + var toRoute = {}; + if (key !== undefined) { + group.forEach(function (link) { + if (link.get('source').id === cell.get('id') && link.get('target').id) { + toRoute[link.get('target').id] = link; + } + else if (link.get('target').id === cell.get('id') && link.get('source').id) { + toRoute[link.get('source').id] = link; + } + }); + Object.keys(toRoute).forEach(function (k) { + Utils.fanRoute(graph, toRoute[k]); + }); + } + }); + } + else if (cell instanceof joint$2.dia.Link) { + // The cell is a link. Let's find its source and target models. + var srcId_1 = cell.get('source').id || cell.previous('source').id; + var trgId_1 = cell.get('target').id || cell.previous('target').id; + // If one of the ends is not a model, the link has no siblings. + if (!srcId_1 || !trgId_1) { + return; + } + var siblings = graph.getLinks().filter(function (sibling) { + var _srcId = sibling.get('source').id; + var _trgId = sibling.get('target').id; + var vertices = sibling.get('vertices'); + var fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); + return ((_srcId === srcId_1 && _trgId === trgId_1) || (_srcId === trgId_1 && _trgId === srcId_1)) && fanRouted; + }); + switch (siblings.length) { + case 0: + // The link was removed and had no siblings. + break; + case 1: + // There is only one link between the source and target. No vertices needed. + var vertices = cell.get('vertices'); + if (vertices && vertices.length && cell.get('fanRouted')) { + cell.unset('vertices'); + } + break; + default: + // There is more than one siblings. We need to create vertices. + // First of all we'll find the middle point of the link. + var source = graph.getCell(srcId_1); + var target = graph.getCell(trgId_1); + if (!source || !target) { + // When clearing the graph it may happen that some nodes are gone and some are left + return; + } + var srcCenter = source.getBBox().center(); + var trgCenter = target.getBBox().center(); + var midPoint_1 = joint$2.g.line(srcCenter, trgCenter).midpoint(); + // Then find the angle it forms. + var theta_1 = srcCenter.theta(trgCenter); + // This is the maximum distance between links + var gap_1 = 20; + siblings.forEach(function (sibling, index) { + // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. + var offset = gap_1 * Math.ceil(index / 2); + // Now we need the vertices to be placed at points which are 'offset' pixels distant + // from the first link and forms a perpendicular angle to it. And as index goes up + // alternate left and right. + // + // ^ odd indexes + // | + // |----> index 0 line (straight line between a source center and a target center. + // | + // v even indexes + var sign = index % 2 ? 1 : -1; + var angle = joint$2.g.toRad(theta_1 + sign * 90); + // We found the vertex. + var vertex = joint$2.g.point.fromPolar(offset, angle, midPoint_1); + sibling.set('fanRouted', true); + sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); + }); + } + } + }; + Utils.isCustomPaperEvent = function (args) { + return args.length === 5 && + lodash.isString(args[0]) && + (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && + args[1] instanceof $$3.Event && + args[2] instanceof joint$2.dia.CellView && + lodash.isNumber(args[3]) && + lodash.isNumber(args[4]); + }; + return Utils; + }()); + + var joint$3 = exports.Flo.joint; + var $$4 = _$; + var SCROLLBAR_SIZE = 17; + var EditorComponent = /** @class */ (function () { + function EditorComponent(element) { + var _this = this; + this.element = element; + /** + * Flag specifying whether the Flo-Editor is in read-only mode. + */ + this._readOnlyCanvas = false; + /** + * Grid size + */ + this._gridSize = 1; + this._hiddenPalette = false; + this.textToGraphEventEmitter = new core.EventEmitter(); + this.graphToTextEventEmitter = new core.EventEmitter(); + this._graphToTextSyncEnabled = true; + this.validationEventEmitter = new core.EventEmitter(); + this._disposables = new tsDisposables.CompositeDisposable(); + this._dslText = ''; + this.textToGraphConversionCompleted = new rxjs.Subject(); + this.graphToTextConversionCompleted = new rxjs.Subject(); + this.paletteReady = new rxjs.BehaviorSubject(false); + /** + * Min zoom percent value + */ + this.minZoom = 5; + /** + * Max zoom percent value + */ + this.maxZoom = 400; + /** + * Zoom percent increment/decrement step + */ + this.zoomStep = 5; + this.paperPadding = 0; + this.floApi = new core.EventEmitter(); + this.validationMarkers = new core.EventEmitter(); + this.contentValidated = new core.EventEmitter(); + this.dslChange = new core.EventEmitter(); + this._resizeHandler = function () { return _this.autosizePaper(); }; + var self = this; + this.editorContext = new (/** @class */ (function () { + function DefaultRunnableContext() { + } + Object.defineProperty(DefaultRunnableContext.prototype, "zoomPercent", { + get: function () { + return self.zoomPercent; + }, + set: function (percent) { + self.zoomPercent = percent; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "noPalette", { + get: function () { + return self.noPalette; + }, + set: function (noPalette) { + self.noPalette = noPalette; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "gridSize", { + get: function () { + return self.gridSize; + }, + set: function (gridSize) { + self.gridSize = gridSize; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "readOnlyCanvas", { + get: function () { + return self.readOnlyCanvas; + }, + set: function (readOnly) { + self.readOnlyCanvas = readOnly; + }, + enumerable: true, + configurable: true + }); + DefaultRunnableContext.prototype.setDsl = function (dsl) { + self.dsl = dsl; + }; + DefaultRunnableContext.prototype.updateGraph = function () { + return self.updateGraphRepresentation(); + }; + DefaultRunnableContext.prototype.updateText = function () { + return self.updateTextRepresentation(); + }; + DefaultRunnableContext.prototype.performLayout = function () { + return self.doLayout(); + }; + DefaultRunnableContext.prototype.clearGraph = function () { + var _this = this; + self.selection = undefined; + self.graph.clear(); + if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { + return self.metamodel.load().then(function (data) { + self.editor.setDefaultContent(_this, data); + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + }); + } + else { + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + } + }; + DefaultRunnableContext.prototype.getGraph = function () { + return self.graph; + }; + DefaultRunnableContext.prototype.getPaper = function () { + return self.paper; + }; + Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextSync", { + get: function () { + return self.graphToTextSync; + }, + set: function (sync) { + self.graphToTextSync = sync; + }, + enumerable: true, + configurable: true + }); + DefaultRunnableContext.prototype.getMinZoom = function () { + return self.minZoom; + }; + DefaultRunnableContext.prototype.getMaxZoom = function () { + return self.maxZoom; + }; + DefaultRunnableContext.prototype.getZoomStep = function () { + return self.zoomStep; + }; + DefaultRunnableContext.prototype.fitToPage = function () { + self.fitToPage(); + }; + DefaultRunnableContext.prototype.createNode = function (metadata, props, position) { + return self.createNode(metadata, props, position); + }; + DefaultRunnableContext.prototype.createLink = function (source, target, metadata, props) { + return self.createLink(source, target, metadata, props); + }; + Object.defineProperty(DefaultRunnableContext.prototype, "selection", { + get: function () { + return self.selection; + }, + set: function (newSelection) { + self.selection = newSelection; + }, + enumerable: true, + configurable: true + }); + DefaultRunnableContext.prototype.deleteSelectedNode = function () { + if (self.selection) { + if (self.editor && self.editor.preDelete) { + self.editor.preDelete(self.editorContext, self.selection.model); + } + else { + if (self.selection.model instanceof joint$3.dia.Element) { + self.graph.getConnectedLinks(self.selection.model).forEach(function (l) { return l.remove(); }); + } + } + self.selection.model.remove(); + self.selection = undefined; + } + }; + Object.defineProperty(DefaultRunnableContext.prototype, "textToGraphConversionObservable", { + get: function () { + return self.textToGraphConversionCompleted; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextConversionObservable", { + get: function () { + return self.graphToTextConversionCompleted; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "paletteReady", { + get: function () { + return self.paletteReady; + }, + enumerable: true, + configurable: true + }); + return DefaultRunnableContext; + }()))(); + } + EditorComponent.prototype.ngOnInit = function () { + var _this = this; + this.initGraph(); + this.initPaper(); + this.initGraphListeners(); + this.initPaperListeners(); + this.initMetamodel(); + $$4(window).on('resize', this._resizeHandler); + this._disposables.add(tsDisposables.Disposable.create(function () { return $$4(window).off('resize', _this._resizeHandler); })); + /* + * Execute resize to get the right size for the SVG element on the editor canvas. + * Executed via timeout to let angular render the DOM first and elements to have the right width and height + */ + window.setTimeout(this._resizeHandler); + this.floApi.emit(this.editorContext); + }; + EditorComponent.prototype.ngOnDestroy = function () { + this._disposables.dispose(); + }; + Object.defineProperty(EditorComponent.prototype, "noPalette", { + get: function () { + return this._hiddenPalette; + }, + set: function (hidden) { + this._hiddenPalette = hidden; + // If palette is not shown ensure that canvas starts from the left==0! + if (hidden) { + $$4('#paper-container', this.element.nativeElement).css('left', 0); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EditorComponent.prototype, "graphToTextSync", { + get: function () { + return this._graphToTextSyncEnabled; + }, + set: function (sync) { + this._graphToTextSyncEnabled = sync; + // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion + // this.performGraphToTextSyncing(); + }, + enumerable: true, + configurable: true + }); + EditorComponent.prototype.performGraphToTextSyncing = function () { + if (this._graphToTextSyncEnabled) { + this.graphToTextEventEmitter.emit(); + } + }; + EditorComponent.prototype.createHandle = function (element, kind, action, location) { + if (!location) { + var bbox = element.model.getBBox(); + location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); + } + var handle = exports.Shapes.Factory.createHandle({ + renderer: this.renderer, + paper: this.paper, + parent: element.model, + kind: kind, + position: location + }); + var view = this.paper.findViewByModel(handle); + view.on('cell:pointerdown', function () { + if (action) { + action(); + } + }); + view.on('cell:mouseover', function () { + handle.attr('image/filter', { + name: 'dropShadow', + args: { dx: 1, dy: 1, blur: 1, color: 'black' } + }); + }); + view.on('cell:mouseout', function () { + handle.removeAttr('image/filter'); + }); + view.setInteractivity(false); + return handle; + }; + EditorComponent.prototype.removeEmbeddedChildrenOfType = function (element, types) { + var embeds = element.getEmbeddedCells(); + for (var i = 0; i < embeds.length; i++) { + if (types.indexOf(embeds[i].get('type')) >= 0) { + embeds[i].remove(); + } + } + }; + Object.defineProperty(EditorComponent.prototype, "selection", { + get: function () { + return this._selection; + }, + set: function (newSelection) { + var _this = this; + if (newSelection && (newSelection.model.get('type') === joint$3.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint$3.shapes.flo.HANDLE_TYPE)) { + newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); + } + if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { + newSelection = undefined; + } + if (newSelection !== this._selection) { + if (this._selection) { + var elementview = this.paper.findViewByModel(this._selection.model); + if (elementview) { // May have been removed from the graph + this.removeEmbeddedChildrenOfType(elementview.model, joint$3.shapes.flo.HANDLE_TYPE); + elementview.unhighlight(); + } + } + if (newSelection) { + newSelection.highlight(); + if (this.editor && this.editor.createHandles) { + this.editor.createHandles(this.editorContext, function (owner, kind, action, location) { return _this.createHandle(owner, kind, action, location); }, newSelection); + } + } + this._selection = newSelection; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EditorComponent.prototype, "readOnlyCanvas", { + get: function () { + return this._readOnlyCanvas; + }, + set: function (value) { + var _this = this; + if (this._readOnlyCanvas === value) { + // Nothing to do + return; + } + if (value) { + this.selection = undefined; + } + if (this.graph) { + this.graph.getLinks().forEach(function (link) { + if (value) { + link.attr('.link-tools/display', 'none'); + link.attr('.marker-vertices/display', 'none'); + link.attr('.connection-wrap/display', 'none'); + } + else { + link.removeAttr('.link-tools/display'); + if (_this.editor && _this.editor.allowLinkVertexEdit) { + link.removeAttr('.marker-vertices/display'); + } + link.removeAttr('.connection-wrap/display'); + } + }); + } + this._readOnlyCanvas = value; + }, + enumerable: true, + configurable: true + }); + /** + * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + EditorComponent.prototype.showDragFeedback = function (dragDescriptor) { + if (this.editor && this.editor.showDragFeedback) { + this.editor.showDragFeedback(this.editorContext, dragDescriptor); + } + else { + var magnet = void 0; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint$3.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = exports.Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint$3.V(magnet).addClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint$3.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = exports.Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint$3.V(magnet).addClass('dnd-target-feedback'); + } + } + } + } + }; + /** + * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + EditorComponent.prototype.hideDragFeedback = function (dragDescriptor) { + if (this.editor && this.editor.hideDragFeedback) { + this.editor.hideDragFeedback(this.editorContext, dragDescriptor); + } + else { + var magnet = void 0; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint$3.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = exports.Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint$3.V(magnet).removeClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint$3.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = exports.Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint$3.V(magnet).removeClass('dnd-target-feedback'); + } + } + } + } + }; + /** + * Sets the new DnD info object - the descriptor for DnD + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + EditorComponent.prototype.setDragDescriptor = function (dragDescriptor) { + if (this.highlighted === dragDescriptor) { + return; + } + if (this.highlighted && dragDescriptor && lodash.isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { + if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { + return; + } + if (this.highlighted.source && + dragDescriptor.source && + this.highlighted.target && + dragDescriptor.target && + this.highlighted.source.view.model === dragDescriptor.source.view.model && + this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && + this.highlighted.target.view.model === dragDescriptor.target.view.model && + this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { + return; + } + } + if (this.highlighted) { + this.hideDragFeedback(this.highlighted); + } + this.highlighted = dragDescriptor; + if (this.highlighted) { + this.showDragFeedback(this.highlighted); + } + }; + /** + * Handles DnD events when a node is being dragged over canvas + * + * @param draggedView The Joint JS view object being dragged + * @param targetUnderMouse The Joint JS view under mouse cursor + * @param x X coordinate of the mouse on the canvas + * @param y Y coordinate of the mosue on the canvas + * @param context DnD context (palette or canvas) + */ + EditorComponent.prototype.handleNodeDragging = function (draggedView, targetUnderMouse, x, y, sourceComponent) { + if (this.editor && this.editor.calculateDragDescriptor) { + this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint$3.g.point(x, y), sourceComponent)); + } + }; + /** + * Handles DnD drop event when a node is being dragged and dropped on the main canvas + */ + EditorComponent.prototype.handleNodeDropping = function () { + if (this.highlighted && this.editor && this.editor.handleNodeDropping) { + this.editor.handleNodeDropping(this.editorContext, this.highlighted); + } + this.setDragDescriptor(undefined); + }; + /** + * Hides DOM Node (used to determine drop target DOM element) + * @param domNode DOM node to hide + * @returns + */ + EditorComponent.prototype._hideNode = function (domNode) { + var oldVisibility = { + visibility: domNode.style ? domNode.style.display : undefined, + children: [] + }; + for (var i = 0; i < domNode.children.length; i++) { + var node = domNode.children.item(i); + if (node instanceof HTMLElement) { + oldVisibility.children.push(this._hideNode(node)); + } + } + domNode.style.display = 'none'; + return oldVisibility; + }; + /** + * Restored DOM node original visibility (used to determine drop target DOM element) + * @param domNode DOM node to restore visibility of + * @param oldVisibility original visibility parameter + */ + EditorComponent.prototype._restoreNodeVisibility = function (domNode, oldVisibility) { + if (domNode.style) { + domNode.style.display = oldVisibility.visibility; + } + var j = 0; + for (var i = 0; i < domNode.childNodes.length; i++) { + if (j < oldVisibility.children.length) { + var node = domNode.children.item(i); + if (node instanceof HTMLElement) { + this._restoreNodeVisibility(node, oldVisibility.children[j++]); + } + } + } + }; + /** + * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. + * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location + * (bounding box of a link for testing is bad). + * The result of that is that links can only be the drop target when dragging from the palette currently. + * When DnDing shapes on the canvas drop target cannot be a link. + * + * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked + * - e.g. Drag-n-Drop) + */ + EditorComponent.prototype.getTargetViewFromEvent = function (event, x, y, excludeViews) { + var _this = this; + if (excludeViews === void 0) { excludeViews = []; } + if (!x && !y) { + var l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); + x = l.x; + y = l.y; + } + // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing + // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); + // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); + // if (underMouse) { + // return underMouse; + // } + var oldVisibility = excludeViews.map(function (_x) { return _this._hideNode(_x.el); }); + var targetElement = document.elementFromPoint(event.clientX, event.clientY); + excludeViews.forEach(function (excluded, i) { + _this._restoreNodeVisibility(excluded.el, oldVisibility[i]); + }); + return this.paper.findView($$4(targetElement)); + }; + EditorComponent.prototype.handleDnDFromPalette = function (dndEvent) { + switch (dndEvent.type) { + case exports.Flo.DnDEventType.DRAG: + this.handleDragFromPalette(dndEvent); + break; + case exports.Flo.DnDEventType.DROP: + this.handleDropFromPalette(dndEvent); + break; + default: + break; + } + }; + EditorComponent.prototype.handleDragFromPalette = function (dnDEvent) { + console.debug('Dragging from palette'); + if (dnDEvent.view && !this.readOnlyCanvas) { + var location_1 = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); + this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location_1.x, location_1.y, [dnDEvent.view]), location_1.x, location_1.y, exports.Constants.PALETTE_CONTEXT); + } + }; + EditorComponent.prototype.createNode = function (metadata, props, position) { + return exports.Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.paper, + metadata: metadata, + props: props, + position: position + }); + }; + EditorComponent.prototype.createLink = function (source, target, metadata, props) { + return exports.Shapes.Factory.createLink({ + renderer: this.renderer, + paper: this.paper, + source: source, + target: target, + metadata: metadata, + props: props + }); + }; + EditorComponent.prototype.handleDropFromPalette = function (event) { + var cellview = event.view; + var evt = event.event; + if (this.paper.el === evt.target || $$4.contains(this.paper.el, evt.target)) { + if (this.readOnlyCanvas) { + this.setDragDescriptor(undefined); + } + else { + var metadata = cellview.model.attr('metadata'); + var props = cellview.model.attr('props'); + var position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); + /* Calculate target element before creating the new + * element under mouse location. Otherwise target + * element would be the newly created element because + * it's under the mouse pointer + */ + var targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); + var newNode = this.createNode(metadata, props, position); + var newView = this.paper.findViewByModel(newNode); + this.handleNodeDragging(newView, targetElement, position.x, position.y, exports.Constants.PALETTE_CONTEXT); + this.handleNodeDropping(); + } + } + }; + EditorComponent.prototype.fitToContent = function (gridWidth, gridHeight, padding, opt) { + var paper = this.paper; + if (joint$3.util.isObject(gridWidth)) { + // first parameter is an option object + opt = gridWidth; + gridWidth = opt.gridWidth || 1; + gridHeight = opt.gridHeight || 1; + padding = opt.padding || 0; + } + else { + opt = opt || {}; + gridWidth = gridWidth || 1; + gridHeight = gridHeight || 1; + padding = padding || 0; + } + var paddingJson = joint$3.util.normalizeSides(padding); + // Calculate the paper size to accomodate all the graph's elements. + var bbox = joint$3.V(paper.viewport).getBBox(); + var currentScale = paper.scale(); + var currentTranslate = paper.translate(); + bbox.x *= currentScale.sx; + bbox.y *= currentScale.sy; + bbox.width *= currentScale.sx; + bbox.height *= currentScale.sy; + var calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; + var calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; + var tx = 0; + var ty = 0; + if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { + tx = (-bbox.x / gridWidth) * gridWidth; + tx += paddingJson.left; + } + else if (opt.allowNewOrigin === 'same') { + tx = currentTranslate.tx; + } + calcWidth += tx; + if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { + ty = (-bbox.y / gridHeight) * gridHeight; + ty += paddingJson.top; + } + else if (opt.allowNewOrigin === 'same') { + ty = currentTranslate.ty; + } + calcHeight += ty; + calcWidth += paddingJson.right; + calcHeight += paddingJson.bottom; + // Make sure the resulting width and height are greater than minimum. + calcWidth = Math.max(calcWidth, opt.minWidth || 0); + calcHeight = Math.max(calcHeight, opt.minHeight || 0); + // Make sure the resulting width and height are lesser than maximum. + calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); + calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); + var dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; + var originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; + // Change the dimensions only if there is a size discrepency or an origin change + if (originChange) { + paper.translate(tx, ty); + } + if (dimensionChange) { + paper.setDimensions(calcWidth, calcHeight); + } + }; + EditorComponent.prototype.autosizePaper = function () { + var parent = $$4('#paper-container', this.element.nativeElement); + var parentWidth = parent.innerWidth(); + var parentHeight = parent.innerHeight(); + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth - SCROLLBAR_SIZE, + minHeight: parentHeight - SCROLLBAR_SIZE, + allowNewOrigin: 'same' + }); + }; + EditorComponent.prototype.fitToPage = function () { + var parent = $$4('#paper-container', this.element.nativeElement); + var minScale = this.minZoom / 100; + var maxScale = 2; + var parentWidth = parent.innerWidth(); + var parentHeight = parent.innerHeight(); + this.paper.scaleContentToFit({ + padding: this.paperPadding, + minScaleX: minScale, + minScaleY: minScale, + maxScaleX: maxScale, + maxScaleY: maxScale, + fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } + }); + /** + * Size the canvas appropriately and allow origin movement + */ + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth, + minHeight: parentHeight, + maxWidth: parentWidth, + maxHeight: parentHeight, + allowNewOrigin: 'any' + }); + }; + Object.defineProperty(EditorComponent.prototype, "zoomPercent", { + get: function () { + return Math.round(joint$3.V(this.paper.viewport).scale().sx * 100); + }, + set: function (percent) { + if (!isNaN(percent)) { + if (percent < this.minZoom) { + percent = this.minZoom; + } + else if (percent >= this.maxZoom) { + percent = this.maxZoom; + } + else { + if (percent <= 0) { + percent = 0.00001; + } + } + this.paper.scale(percent / 100, percent / 100); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EditorComponent.prototype, "gridSize", { + get: function () { + return this._gridSize; + }, + set: function (size) { + if (!isNaN(size) && size >= 1) { + this._gridSize = size; + if (this.paper) { + this.paper.setGridSize(size); + } + } + }, + enumerable: true, + configurable: true + }); + EditorComponent.prototype.validateContent = function () { + var _this = this; + return new Promise(function (resolve) { + if (_this.editor && _this.editor.validate) { + return _this.editor + .validate(_this.graph, _this.dsl, _this.editorContext) + .then(function (allMarkers) { + _this.graph.getCells() + .forEach(function (cell) { return _this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : []); }); + _this.validationMarkers.emit(allMarkers); + _this.contentValidated.emit(true); + resolve(); + }); + } + else { + resolve(); + } + }); + }; + EditorComponent.prototype.markElement = function (cell, markers) { + var errorMessages = markers.map(function (m) { return m.message; }); + var errorCell = cell.getEmbeddedCells().find(function (e) { return e.attr('./kind') === exports.Constants.ERROR_DECORATION_KIND; }); + if (errorCell) { + if (errorMessages.length === 0) { + errorCell.remove(); + } + else { + // Without rewrite we merge this list with existing errors + errorCell.attr('messages', errorMessages, { rewrite: true }); + } + } + else if (errorMessages.length > 0) { + var error = exports.Shapes.Factory.createDecoration({ + renderer: this.renderer, + paper: this.paper, + parent: cell, + kind: exports.Constants.ERROR_DECORATION_KIND, + messages: errorMessages + }); + var pt = void 0; + var view = this.paper.findViewByModel(error); + if (cell instanceof joint$3.dia.Element) { + pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); + error.set('position', pt); + view.setInteractivity(false); + } + } + }; + EditorComponent.prototype.doLayout = function () { + if (this.renderer && this.renderer.layout) { + return this.renderer.layout(this.paper); + } + }; + Object.defineProperty(EditorComponent.prototype, "dsl", { + get: function () { + return this._dslText; + }, + set: function (dslText) { + if (this._dslText !== dslText) { + this._dslText = dslText; + this.textToGraphEventEmitter.emit(); + } + }, + enumerable: true, + configurable: true + }); + /** + * Ask the server to parse the supplied text into a JSON graph of nodes and links, + * then update the view based on that new information. + */ + EditorComponent.prototype.updateGraphRepresentation = function () { + var _this = this; + console.debug("Updating graph to represent '" + this._dslText + "'"); + if (this.metamodel && this.metamodel.textToGraph) { + return this.metamodel.textToGraph(this.editorContext, this._dslText).then(function () { + _this.textToGraphConversionCompleted.next(); + return _this.validateContent(); + }); + } + else { + this.textToGraphConversionCompleted.next(); + return this.validateContent(); + } + }; + EditorComponent.prototype.updateTextRepresentation = function () { + var _this = this; + if (this.metamodel && this.metamodel.graphToText) { + return this.metamodel.graphToText(this.editorContext).then(function (text) { + if (_this._dslText !== text) { + _this._dslText = text; + _this.dslChange.emit(text); + } + _this.graphToTextConversionCompleted.next(); + return _this.validateContent(); + }) + .catch(function (error) { + // Validation may reveal why the graph couldn't be + // converted so let it run + _this.graphToTextConversionCompleted.next(); + return _this.validateContent(); + }); + } + else { + this.graphToTextConversionCompleted.next(); + return this.validateContent(); + } + }; + EditorComponent.prototype.initMetamodel = function () { + var _this = this; + this.metamodel.load().then(function (data) { + _this.updateGraphRepresentation(); + var textSyncSubscription = _this.graphToTextEventEmitter.pipe(operators.debounceTime(100)).subscribe(function () { + if (_this._graphToTextSyncEnabled) { + _this.updateTextRepresentation(); + } + }); + _this._disposables.add(tsDisposables.Disposable.create(function () { return textSyncSubscription.unsubscribe(); })); + // Setup content validated event emitter. Emit not validated when graph to text conversion required + var graphValidatedSubscription1 = _this.graphToTextEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); + _this._disposables.add(tsDisposables.Disposable.create(function () { return graphValidatedSubscription1.unsubscribe; })); + // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); + // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); + var graphSyncSubscription = _this.textToGraphEventEmitter.pipe(operators.debounceTime(300)).subscribe(function () { return _this.updateGraphRepresentation(); }); + _this._disposables.add(tsDisposables.Disposable.create(function () { return graphSyncSubscription.unsubscribe(); })); + // Setup content validated event emitter. Emit not validated when text to graph conversion required + var graphValidatedSubscription2 = _this.textToGraphEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); + _this._disposables.add(tsDisposables.Disposable.create(function () { return graphValidatedSubscription2.unsubscribe; })); + if (_this.editor && _this.editor.setDefaultContent) { + _this.editor.setDefaultContent(_this.editorContext, data); + } + }); + }; + EditorComponent.prototype.initGraph = function () { + this.graph = new joint$3.dia.Graph(); + this.graph.set('type', exports.Constants.CANVAS_CONTEXT); + this.graph.set('paperPadding', this.paperPadding); + }; + EditorComponent.prototype.handleNodeCreation = function (node) { + var _this = this; + node.on('change:size', this._resizeHandler); + node.on('change:position', this._resizeHandler); + if (node.attr('metadata')) { + node.on('change:attrs', function (cell, attrs, changeData) { + var propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, node))) { + _this.performGraphToTextSyncing(); + } + if (_this.renderer && _this.renderer.refreshVisuals) { + _this.renderer.refreshVisuals(node, propAttr, _this.paper); + } + } + }); + } + }; + /** + * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples + * are 'change:source', 'change:target'. + */ + EditorComponent.prototype.handleLinkEvent = function (event, link) { + if (this.renderer && this.renderer.handleLinkEvent) { + this.renderer.handleLinkEvent(this.editorContext, event, link); + } + }; + EditorComponent.prototype.handleLinkCreation = function (link) { + var _this = this; + this.handleLinkEvent('add', link); + link.on('change:source', function (l) { + _this.autosizePaper(); + var newSourceId = l.get('source').id; + var oldSourceId = l.previous('source').id; + if (newSourceId !== oldSourceId) { + _this.performGraphToTextSyncing(); + } + _this.handleLinkEvent('change:source', l); + }); + link.on('change:target', function (l) { + _this.autosizePaper(); + var newTargetId = l.get('target').id; + var oldTargetId = l.previous('target').id; + if (newTargetId !== oldTargetId) { + _this.performGraphToTextSyncing(); + } + _this.handleLinkEvent('change:target', l); + }); + link.on('change:vertices', this._resizeHandler); + link.on('change:attrs', function (cell, attrs, changeData) { + var propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, link))) { + var sourceId = link.get('source').id; + var targetId = link.get('target').id; + _this.performGraphToTextSyncing(); + } + if (_this.renderer && _this.renderer.refreshVisuals) { + _this.renderer.refreshVisuals(link, propAttr, _this.paper); + } + } + }); + this.paper.findViewByModel(link).on('link:options', function () { return _this.handleLinkEvent('options', link); }); + if (this.readOnlyCanvas) { + link.attr('.link-tools/display', 'none'); + } + }; + EditorComponent.prototype.initGraphListeners = function () { + var _this = this; + this.graph.on('add', function (element) { + if (element instanceof joint$3.dia.Link) { + _this.handleLinkCreation(element); + } + else if (element instanceof joint$3.dia.Element) { + _this.handleNodeCreation(element); + } + if (element.get('type') === joint$3.shapes.flo.NODE_TYPE || element.get('type') === joint$3.shapes.flo.LINK_TYPE) { + _this.performGraphToTextSyncing(); + } + _this.autosizePaper(); + }); + this.graph.on('remove', function (element) { + if (element instanceof joint$3.dia.Link) { + _this.handleLinkEvent('remove', element); + } + if (_this.selection && _this.selection.model === element) { + _this.selection = undefined; + } + if (element.isLink()) { + window.setTimeout(function () { return _this.performGraphToTextSyncing(); }, 100); + } + else if (element.get('type') === joint$3.shapes.flo.NODE_TYPE) { + _this.performGraphToTextSyncing(); + } + _this.autosizePaper(); + }); + // Set if link is fan-routed. Should be called before routing call + this.graph.on('change:vertices', function (link, changed, opt) { + if (opt.fanRouted) { + link.set('fanRouted', true); + } + else { + link.unset('fanRouted'); + } + }); + // adjust vertices when a cell is removed or its source/target was changed + this.graph.on('add remove change:source change:target change:vertices change:position', lodash.partial(Utils.fanRoute, this.graph)); + }; + EditorComponent.prototype.initPaperListeners = function () { + var _this = this; + // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element + this.paper.on('cell:pointerclick', function (cellView) { + if (!_this.readOnlyCanvas) { + _this.selection = cellView; + } + }); + this.paper.on('blank:pointerclick', function () { + _this.selection = undefined; + }); + this.paper.on('scale', this._resizeHandler); + this.paper.on('all', function () { + if (Utils.isCustomPaperEvent(arguments)) { + arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); + } + }); + this.paper.on('dragging-node-over-canvas', function (dndEvent) { + console.debug("Canvas DnD type = " + dndEvent.type); + var location = _this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); + switch (dndEvent.type) { + case exports.Flo.DnDEventType.DRAG: + _this.handleNodeDragging(dndEvent.view, _this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, exports.Constants.CANVAS_CONTEXT); + break; + case exports.Flo.DnDEventType.DROP: + _this.handleNodeDropping(); + break; + default: + break; + } + }); + // JointJS now no longer grabs focus if working in a paper element - crude... + $$4('#flow-view', this.element.nativeElement).on('mousedown', function () { + $$4('#palette-filter-textfield', _this.element.nativeElement).focus(); + }); + }; + EditorComponent.prototype.initPaper = function () { + var _this = this; + var options = { + el: $$4('#paper', this.element.nativeElement), + gridSize: this._gridSize, + drawGrid: true, + model: this.graph, + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$3.shapes.flo.ElementView /*joint.dia.ElementView*/, + linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint$3.shapes.flo.LinkView, + // Enable link snapping within 25px lookup radius + snapLinks: { radius: 25 }, + defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ function (cellView, magnet) { + if (_this.renderer && _this.renderer.createLink) { + var linkEnd = { + id: cellView.model.id + }; + if (magnet) { + linkEnd.selector = cellView.getSelector(magnet, undefined); + } + if (magnet.getAttribute('port')) { + linkEnd.port = magnet.getAttribute('port'); + } + if (magnet.getAttribute('port') === 'input') { + return _this.renderer.createLink(undefined, linkEnd); + } + else { + return _this.renderer.createLink(linkEnd, undefined); + } + } + else { + return new joint$3.shapes.flo.Link(); + } + }, + // decide whether to create a link if the user clicks a magnet + validateMagnet: function (cellView, magnet) { + if (_this.readOnlyCanvas) { + return false; + } + else { + if (_this.editor && _this.editor.validatePort) { + return _this.editor.validatePort(_this.editorContext, cellView, magnet); + } + else { + return true; + } + } + }, + interactive: function (cellView, event) { + if (_this.readOnlyCanvas) { + return false; + } + else { + if (_this.editor && _this.editor.interactive) { + if (typeof _this.editor.interactive === 'function') { + // Type for interactive is wrong in JointJS have to cast to + return _this.editor.interactive(cellView, event); + } + else { + return _this.editor.interactive; + } + } + return true; + } + }, + highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { + 'default': { + name: 'addClass', + options: { + className: 'highlighted' + } + } + }, + markAvailable: true + }; + if (this.renderer && this.renderer.getLinkAnchorPoint) { + options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; + } + if (this.editor && this.editor.validateLink) { + var self_1 = this; + options.validateConnection = function (cellViewS, magnetS, cellViewT, magnetT, end, linkView) { + return self_1.editor.validateLink(_this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); + }; + } + // The paper is what will represent the graph on the screen + this.paper = new joint$3.dia.Paper(options); + this._disposables.add(tsDisposables.Disposable.create(function () { return _this.paper.remove(); })); + }; + EditorComponent.prototype.updatePaletteReadyState = function (ready) { + this.paletteReady.next(ready); + }; + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "metamodel", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "renderer", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "editor", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Number) + ], EditorComponent.prototype, "paletteSize", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "minZoom", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "maxZoom", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "zoomStep", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "paperPadding", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "floApi", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "validationMarkers", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "contentValidated", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "dslChange", void 0); + __decorate([ + core.Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], EditorComponent.prototype, "dsl", null); + EditorComponent = __decorate([ + core.Component({ + selector: 'flo-editor', + template: "\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ", + styles: ["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "], + encapsulation: core.ViewEncapsulation.None + }), + __metadata("design:paramtypes", [core.ElementRef]) + ], EditorComponent); + return EditorComponent; + }()); + + var $$5 = _$; + var ResizerDirective = /** @class */ (function () { + function ResizerDirective(element, document) { + var _this = this; + this.element = element; + this.document = document; + this.dragInProgress = false; + this.vertical = true; + this._subscriptions = new tsDisposables.CompositeDisposable(); + this.sizeChange = new core.EventEmitter(); + this.mouseMoveHandler = function (e) { + if (_this.dragInProgress) { + _this.mousemove(e); + } + }; + } + Object.defineProperty(ResizerDirective.prototype, "splitSize", { + set: function (splitSize) { + if (this.maxSplitSize && splitSize > this.maxSplitSize) { + splitSize = this.maxSplitSize; + } + if (this.vertical) { + // Handle vertical resizer + $$5(this.element.nativeElement).css({ + left: splitSize + 'px' + }); + $$5(this.first).css({ + width: splitSize + 'px' + }); + $$5(this.second).css({ + left: (splitSize + this._size) + 'px' + }); + } + else { + // Handle horizontal resizer + $$5(this.element.nativeElement).css({ + bottom: splitSize + 'px' + }); + $$5(this.first).css({ + bottom: (splitSize + this._size) + 'px' + }); + $$5(this.second).css({ + height: splitSize + 'px' + }); + } + this._splitSize = splitSize; + // Update the local field + this.sizeChange.emit(splitSize); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerWidth", { + set: function (width) { + this._size = width; + this.vertical = true; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerHeight", { + set: function (height) { + this._size = height; + this.vertical = false; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerLeft", { + set: function (first) { + this.first = first; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerTop", { + set: function (first) { + this.first = first; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerRight", { + set: function (second) { + this.second = second; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerBottom", { + set: function (second) { + this.second = second; + }, + enumerable: true, + configurable: true + }); + ResizerDirective.prototype.startDrag = function () { + this.dragInProgress = true; + }; + ResizerDirective.prototype.mousemove = function (event) { + var size; + if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node + size = event.pageX - $$5(this.first).offset().left; + } + else { + // Handle horizontal resizer Calculate new size relative to palette container DOM node + size = window.innerHeight - event.pageY - $$5(this.second).offset().top; + } + this.splitSize = size; + }; + ResizerDirective.prototype.ngOnInit = function () { + // Need to set left and right elements width and fire events on init when DOM is built + var _this = this; + this.splitSize = this._splitSize; + var subscription1 = rxjs.fromEvent($$5(this.document).get(0), 'mousemove') + .pipe(operators.sampleTime(300)) + .subscribe(this.mouseMoveHandler); + this._subscriptions.add(tsDisposables.Disposable.create(function () { return subscription1.unsubscribe(); })); + var subscription2 = rxjs.fromEvent($$5(this.document).get(0), 'mouseup') + .subscribe(function (e) { + if (_this.dragInProgress) { + _this.mousemove(e); + _this.dragInProgress = false; + } + }); + this._subscriptions.add(tsDisposables.Disposable.create(function () { return subscription2.unsubscribe(); })); + }; + ResizerDirective.prototype.ngOnDestroy = function () { + this._subscriptions.dispose(); + }; + __decorate([ + core.Input(), + __metadata("design:type", Number) + ], ResizerDirective.prototype, "maxSplitSize", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], ResizerDirective.prototype, "sizeChange", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) + ], ResizerDirective.prototype, "splitSize", null); + __decorate([ + core.Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) + ], ResizerDirective.prototype, "resizerWidth", null); + __decorate([ + core.Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) + ], ResizerDirective.prototype, "resizerHeight", null); + __decorate([ + core.Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerLeft", null); + __decorate([ + core.Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerTop", null); + __decorate([ + core.Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerRight", null); + __decorate([ + core.Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerBottom", null); + ResizerDirective = __decorate([ + core.Directive({ + selector: '[resizer]', + host: { '(mousedown)': 'startDrag()' } + }), + __param(1, core.Inject(platformBrowser.DOCUMENT)), + __metadata("design:paramtypes", [core.ElementRef, Object]) + ], ResizerDirective); + return ResizerDirective; + }()); + + var $$6 = _$; + var DslEditorComponent = /** @class */ (function () { + function DslEditorComponent(element) { + var _this = this; + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.debounce = 0; + this.dslChange = new core.EventEmitter(); + this.focus = new core.EventEmitter(); + this.blur = new core.EventEmitter(); + this.editor = new core.EventEmitter(); + this._dslChangedHandler = function () { + _this._dsl = _this.doc.getValue(); + _this.dslChange.emit(_this._dsl); + }; + } + Object.defineProperty(DslEditorComponent.prototype, "dsl", { + set: function (dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + var cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DslEditorComponent.prototype, "lintOptions", { + set: function (lintOptions) { + this._lint = lintOptions; + if (this.doc) { + this.doc.setOption('lint', this._lint); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DslEditorComponent.prototype, "hintOptions", { + set: function (hintOptions) { + this._hint = hintOptions; + if (this.doc) { + this.doc.setOption('hintOptions', this._hint); + } + }, + enumerable: true, + configurable: true + }); + DslEditorComponent.prototype.ngOnInit = function () { + var _this = this; + var options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + electricChars: false, + smartIndent: false, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + if (this._hint) { + options.hintOptions = this._hint; + } + this.doc = codemirrorMinified.fromTextArea($$6('#dsl-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this.debounce ? lodash.debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); + this.doc.on('focus', function () { return _this.focus.emit(); }); + this.doc.on('blur', function () { return _this.blur.emit(); }); + this.editor.emit(this.doc); + }; + DslEditorComponent.prototype.ngOnDestroy = function () { + }; + __decorate([ + core.Input('line-numbers'), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "lineNumbers", void 0); + __decorate([ + core.Input('line-wrapping'), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "lineWrapping", void 0); + __decorate([ + core.Input('scrollbar-style'), + __metadata("design:type", String) + ], DslEditorComponent.prototype, "scrollbarStyle", void 0); + __decorate([ + core.Input(), + __metadata("design:type", String) + ], DslEditorComponent.prototype, "placeholder", void 0); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "debounce", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "dslChange", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "focus", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "blur", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "editor", void 0); + __decorate([ + core.Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], DslEditorComponent.prototype, "dsl", null); + __decorate([ + core.Input(), + __metadata("design:type", Object), + __metadata("design:paramtypes", [Object]) + ], DslEditorComponent.prototype, "lintOptions", null); + __decorate([ + core.Input(), + __metadata("design:type", Object), + __metadata("design:paramtypes", [Object]) + ], DslEditorComponent.prototype, "hintOptions", null); + DslEditorComponent = __decorate([ + core.Component({ + selector: 'dsl-editor', + template: "\n \n ", + styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "], + encapsulation: core.ViewEncapsulation.None + }), + __metadata("design:paramtypes", [core.ElementRef]) + ], DslEditorComponent); + return DslEditorComponent; + }()); + + var $$7 = _$; + var CodeEditorComponent = /** @class */ (function () { + function CodeEditorComponent(element) { + var _this = this; + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.dslChange = new core.EventEmitter(); + this.focus = new core.EventEmitter(); + this.blur = new core.EventEmitter(); + this.editor = new core.EventEmitter(); + this._dslChangedHandler = function () { + _this._dsl = _this.doc.getValue(); + _this.dslChange.emit(_this._dsl); + if (_this._onChangeHandler) { + _this._onChangeHandler(_this._dsl); + } + }; + } + CodeEditorComponent_1 = CodeEditorComponent; + Object.defineProperty(CodeEditorComponent.prototype, "dsl", { + set: function (dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + var cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CodeEditorComponent.prototype, "language", { + set: function (_language) { + if (this._language !== _language) { + this._language = _language; + this.loadEditorMode(); + } + }, + enumerable: true, + configurable: true + }); + CodeEditorComponent.prototype.ngOnInit = function () { + var _this = this; + var options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + matchBrackets: true, + autoCloseBrackets: true, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + this.doc = codemirrorMinified.fromTextArea($$7('#code-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this._dslChangedHandler); + this.doc.on('focus', function () { + _this.focus.emit(); + if (_this._onTouchHandler) { + _this._onTouchHandler(); + } + }); + this.doc.on('blur', function () { return _this.blur.emit(); }); + this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); + this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); + this.loadEditorMode(); + this.editor.emit(this.doc); + }; + CodeEditorComponent.prototype.loadEditorMode = function () { + // CodeMirror doc object must be initialized + if (!this.doc) { + return; + } + var info = this._language ? codemirrorMinified.findModeByName(this._language) : undefined; + // Set proper editor mode + if (info) { + this.doc.setOption('mode', info.mime); + // (CodeMirror).autoLoadMode(this.doc, info.mode); + } + else { + this.doc.setOption('mode', 'text/plain'); + } + // Set proper Lint mode + this.doc.setOption('lint', this.getLintOptions()); + }; + CodeEditorComponent.prototype.ngOnDestroy = function () { + }; + CodeEditorComponent.prototype.writeValue = function (obj) { + this.dsl = obj; + }; + CodeEditorComponent.prototype.registerOnChange = function (fn) { + this._onChangeHandler = fn; + }; + CodeEditorComponent.prototype.registerOnTouched = function (fn) { + this._onTouchHandler = fn; + }; + CodeEditorComponent.prototype.getLintOptions = function () { + var _this = this; + switch (this._language) { + case 'javascript': + case 'json': + case 'coffeescript': + case 'yaml': + return { + onUpdateLinting: function (annotations) { + var warnings = []; + var errors = []; + if (_this.overviewRuler) { + if (Array.isArray(annotations)) { + annotations.forEach(function (a) { + if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { + if (a.severity === 'error') { + errors.push(a); + } + else if (a.severity === 'warning') { + warnings.push(a); + } + } + }); + } + } + _this.warningRuler.update(warnings); + _this.errorRuler.update(errors); + } + }; + } + return false; + }; + var CodeEditorComponent_1; + __decorate([ + core.Input('line-numbers'), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "lineNumbers", void 0); + __decorate([ + core.Input('line-wrapping'), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "lineWrapping", void 0); + __decorate([ + core.Input('scrollbar-style'), + __metadata("design:type", String) + ], CodeEditorComponent.prototype, "scrollbarStyle", void 0); + __decorate([ + core.Input(), + __metadata("design:type", String) + ], CodeEditorComponent.prototype, "placeholder", void 0); + __decorate([ + core.Input('overview-ruler'), + __metadata("design:type", Boolean) + ], CodeEditorComponent.prototype, "overviewRuler", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "dslChange", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "focus", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "blur", void 0); + __decorate([ + core.Output(), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "editor", void 0); + __decorate([ + core.Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], CodeEditorComponent.prototype, "dsl", null); + __decorate([ + core.Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], CodeEditorComponent.prototype, "language", null); + CodeEditorComponent = CodeEditorComponent_1 = __decorate([ + core.Component({ + selector: 'code-editor', + template: "\n
\n \n
\n ", + styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "], + encapsulation: core.ViewEncapsulation.None, + providers: [ + { + provide: forms.NG_VALUE_ACCESSOR, + useExisting: core.forwardRef(function () { return CodeEditorComponent_1; }), + multi: true + } + ] + }), + __metadata("design:paramtypes", [core.ElementRef]) + ], CodeEditorComponent); + return CodeEditorComponent; + }()); + + + (function (Properties) { + var InputType; + (function (InputType) { + InputType[InputType["TEXT"] = 0] = "TEXT"; + InputType[InputType["NUMBER"] = 1] = "NUMBER"; + InputType[InputType["SELECT"] = 2] = "SELECT"; + InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; + InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; + InputType[InputType["EMAIL"] = 5] = "EMAIL"; + InputType[InputType["URL"] = 6] = "URL"; + InputType[InputType["CODE"] = 7] = "CODE"; + })(InputType = Properties.InputType || (Properties.InputType = {})); + var GenericControlModel = /** @class */ (function () { + function GenericControlModel(_property, type, validation) { + this._property = _property; + this.type = type; + this.validation = validation; + } + Object.defineProperty(GenericControlModel.prototype, "id", { + get: function () { + return this.property.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "name", { + get: function () { + return this.property.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "description", { + get: function () { + return this.property.description; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "defaultValue", { + get: function () { + return this.property.defaultValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "value", { + get: function () { + return this.getValue(); + }, + set: function (value) { + this.setValue(value); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "property", { + get: function () { + return this._property; + }, + enumerable: true, + configurable: true + }); + GenericControlModel.prototype.setValue = function (value) { + this.property.value = value; + }; + GenericControlModel.prototype.getValue = function () { + return this.property.value; + }; + return GenericControlModel; + }()); + Properties.GenericControlModel = GenericControlModel; + var CheckBoxControlModel = /** @class */ (function (_super) { + __extends(CheckBoxControlModel, _super); + function CheckBoxControlModel(_property, validation) { + return _super.call(this, _property, InputType.CHECKBOX, validation) || this; + } + CheckBoxControlModel.prototype.getValue = function () { + var res = _super.prototype.getValue.call(this); + var type = typeof res; + switch (type) { + case 'boolean': + return res; + case 'string': + switch (res.trim().toLowerCase()) { + case 'true': + case '1': + return true; + case 'false': + case '0': + return false; + default: + return this.property.defaultValue; + } + case 'number': + var num = res; + if (num === 0) { + return false; + } + else if (num === 1) { + return true; + } + else { + return this.property.defaultValue; + } + } + return this.property.defaultValue; + }; + return CheckBoxControlModel; + }(GenericControlModel)); + Properties.CheckBoxControlModel = CheckBoxControlModel; + var AbstractCodeControlModel = /** @class */ (function (_super) { + __extends(AbstractCodeControlModel, _super); + function AbstractCodeControlModel(_property, encode, decode, validation) { + var _this = _super.call(this, _property, InputType.CODE, validation) || this; + _this.encode = encode; + _this.decode = decode; + return _this; + } + Object.defineProperty(AbstractCodeControlModel.prototype, "value", { + get: function () { + var dsl = _super.prototype.getValue.call(this); + if (dsl && this.decode) { + return this.decode(dsl); + } + else { + return dsl; + } + }, + set: function (value) { + if (value && this.encode) { + _super.prototype.setValue.call(this, this.encode(value)); + } + else { + _super.prototype.setValue.call(this, value); + } + }, + enumerable: true, + configurable: true + }); + return AbstractCodeControlModel; + }(GenericControlModel)); + Properties.AbstractCodeControlModel = AbstractCodeControlModel; + var GenericCodeControlModel = /** @class */ (function (_super) { + __extends(GenericCodeControlModel, _super); + function GenericCodeControlModel(_property, language, encode, decode, validation) { + var _this = _super.call(this, _property, encode, decode, validation) || this; + _this.language = language; + return _this; + } + return GenericCodeControlModel; + }(AbstractCodeControlModel)); + Properties.GenericCodeControlModel = GenericCodeControlModel; + var CodeControlModelWithDynamicLanguageProperty = /** @class */ (function (_super) { + __extends(CodeControlModelWithDynamicLanguageProperty, _super); + function CodeControlModelWithDynamicLanguageProperty(_property, _languagePropertyName, _groupModel, encode, decode, validation) { + var _this = _super.call(this, _property, encode, decode, validation) || this; + _this._languagePropertyName = _languagePropertyName; + _this._groupModel = _groupModel; + return _this; + } + Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "language", { + get: function () { + var value = this.languageControlModel.value; + return value ? value : this.languageControlModel.defaultValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "languageControlModel", { + get: function () { + var _this = this; + if (!this._langControlModel) { + // Cast to Properties.ControlModel from Properties.ControlModel | undefined + // Should not be undefined! + this._langControlModel = this._groupModel.getControlsModels().find(function (c) { return c.id === _this._languagePropertyName; }); + } + return this._langControlModel; + }, + enumerable: true, + configurable: true + }); + return CodeControlModelWithDynamicLanguageProperty; + }(AbstractCodeControlModel)); + Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; + var GenericListControlModel = /** @class */ (function (_super) { + __extends(GenericListControlModel, _super); + function GenericListControlModel(property, validation) { + return _super.call(this, property, InputType.TEXT, validation) || this; + } + Object.defineProperty(GenericListControlModel.prototype, "value", { + get: function () { + return this.property.value ? this.property.value.join(', ') : ''; + }, + set: function (value) { + this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; + }, + enumerable: true, + configurable: true + }); + return GenericListControlModel; + }(GenericControlModel)); + Properties.GenericListControlModel = GenericListControlModel; + var SelectControlModel = /** @class */ (function (_super) { + __extends(SelectControlModel, _super); + function SelectControlModel(_property, type, options) { + var _this = _super.call(this, _property, type) || this; + _this.options = options; + if (_property.defaultValue === undefined) { + options.unshift({ + name: 'SELECT', + value: _property.defaultValue + }); + } + return _this; + } + return SelectControlModel; + }(GenericControlModel)); + Properties.SelectControlModel = SelectControlModel; + var DefaultCellPropertiesSource = /** @class */ (function () { + function DefaultCellPropertiesSource(cell) { + this.cell = cell; + } + DefaultCellPropertiesSource.prototype.getProperties = function () { + var _this = this; + var metadata = this.cell.attr('metadata'); + return Promise.resolve(metadata.properties().then(function (propsMetadata) { return Array.from(propsMetadata.values()).map(function (m) { return _this.createProperty(m); }); })); + }; + DefaultCellPropertiesSource.prototype.createProperty = function (metadata) { + return { + id: metadata.id, + name: metadata.name, + type: metadata.type, + defaultValue: metadata.defaultValue, + attr: "props/" + metadata.name, + value: this.cell.attr("props/" + metadata.name), + description: metadata.description, + valueOptions: metadata.options + }; + }; + DefaultCellPropertiesSource.prototype.applyChanges = function (properties) { + var _this = this; + this.cell.trigger('batch:start', { batchName: 'update properties' }); + properties.forEach(function (property) { + if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || + (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { + var currentValue = _this.cell.attr(property.attr); + if (currentValue !== undefined && currentValue !== null) { + // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync + _this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); + _this.cell.removeAttr(property.attr); + } + } + else { + _this.cell.attr(property.attr, property.value); + } + }); + this.cell.trigger('batch:stop', { batchName: 'update properties' }); + }; + return DefaultCellPropertiesSource; + }()); + Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; + var PropertiesGroupModel = /** @class */ (function () { + function PropertiesGroupModel(propertiesSource) { + this.loading = true; + this.propertiesSource = propertiesSource; + } + PropertiesGroupModel.prototype.load = function () { + var _this = this; + this.loading = true; + this._loadedSubject = new rxjs.Subject(); + this.propertiesSource.getProperties().then(function (properties) { + _this.controlModels = properties.map(function (p) { return _this.createControlModel(p); }); + _this.loading = false; + _this._loadedSubject.next(true); + _this._loadedSubject.complete(); + }); + }; + Object.defineProperty(PropertiesGroupModel.prototype, "isLoading", { + get: function () { + return this.loading; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PropertiesGroupModel.prototype, "loadedSubject", { + get: function () { + return this._loadedSubject; + }, + enumerable: true, + configurable: true + }); + PropertiesGroupModel.prototype.getControlsModels = function () { + return this.controlModels; + }; + PropertiesGroupModel.prototype.createControlModel = function (property) { + return new GenericControlModel(property, InputType.TEXT); + }; + PropertiesGroupModel.prototype.applyChanges = function () { + if (this.loading) { + return; + } + var properties = this.controlModels.map(function (cm) { return cm.property; }); + this.propertiesSource.applyChanges(properties); + }; + return PropertiesGroupModel; + }()); + Properties.PropertiesGroupModel = PropertiesGroupModel; + var Validators; + (function (Validators) { + function uniqueResource(service, debounce$$1) { + return function (control) { + return new rxjs.Observable(function (obs) { + if (control.valueChanges && control.value) { + control.valueChanges + .pipe(operators.debounceTime(debounce$$1), operators.mergeMap(function (value) { return service(value); })) + .subscribe(function () { + obs.next({ uniqueResource: true }); + obs.complete(); + }, function () { + obs.next(undefined); + obs.complete(); + }); + } + else { + obs.next(undefined); + obs.complete(); + } + }); + }; + } + Validators.uniqueResource = uniqueResource; + function noneOf(excluded) { + return function (control) { + return excluded.find(function (e) { return e === control.value; }) ? { 'noneOf': { value: control.value } } : {}; + }; + } + Validators.noneOf = noneOf; + })(Validators = Properties.Validators || (Properties.Validators = {})); + })(exports.Properties || (exports.Properties = {})); + + var PropertiesGroupComponent = /** @class */ (function () { + function PropertiesGroupComponent() { + } + PropertiesGroupComponent.prototype.ngOnInit = function () { + var _this = this; + if (this.propertiesGroupModel.isLoading) { + var subscription_1 = this.propertiesGroupModel.loadedSubject.subscribe(function (loaded) { + if (loaded) { + subscription_1.unsubscribe(); + _this.createGroupControls(); + } + }); + } + else { + this.createGroupControls(); + } + }; + PropertiesGroupComponent.prototype.createGroupControls = function () { + var _this = this; + this.propertiesGroupModel.getControlsModels().forEach(function (c) { + if (c.validation) { + _this.form.addControl(c.id, new forms.FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); + } + else { + _this.form.addControl(c.id, new forms.FormControl(c.value || '')); + } + }); + }; + __decorate([ + core.Input(), + __metadata("design:type", exports.Properties.PropertiesGroupModel) + ], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); + __decorate([ + core.Input(), + __metadata("design:type", forms.FormGroup) + ], PropertiesGroupComponent.prototype, "form", void 0); + PropertiesGroupComponent = __decorate([ + core.Component({ + selector: 'properties-group', + template: "\n
\n \n
\n ", + encapsulation: core.ViewEncapsulation.None + }) + ], PropertiesGroupComponent); + return PropertiesGroupComponent; + }()); + + var DynamicFormPropertyComponent = /** @class */ (function () { + function DynamicFormPropertyComponent() { + } + Object.defineProperty(DynamicFormPropertyComponent.prototype, "types", { + get: function () { + return exports.Properties.InputType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DynamicFormPropertyComponent.prototype, "control", { + get: function () { + return this.form.controls[this.model.id]; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DynamicFormPropertyComponent.prototype, "errorData", { + get: function () { + var _this = this; + return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) + .filter(function (e) { return _this.control.errors && _this.control.errors[e.id]; }); + }, + enumerable: true, + configurable: true + }); + __decorate([ + core.Input(), + __metadata("design:type", Object) + ], DynamicFormPropertyComponent.prototype, "model", void 0); + __decorate([ + core.Input(), + __metadata("design:type", forms.FormGroup) + ], DynamicFormPropertyComponent.prototype, "form", void 0); + DynamicFormPropertyComponent = __decorate([ + core.Component({ + selector: 'df-property', + template: "\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ", + encapsulation: core.ViewEncapsulation.None + }), + __metadata("design:paramtypes", []) + ], DynamicFormPropertyComponent); + return DynamicFormPropertyComponent; + }()); + + var FloModule = /** @class */ (function () { + function FloModule() { + } + FloModule = __decorate([ + core.NgModule({ + imports: [ + forms.FormsModule, + common.CommonModule, + forms.ReactiveFormsModule + ], + declarations: [ + Palette, + EditorComponent, + ResizerDirective, + DslEditorComponent, + CodeEditorComponent, + PropertiesGroupComponent, + DynamicFormPropertyComponent + ], + exports: [ + EditorComponent, + DslEditorComponent, + DynamicFormPropertyComponent, + PropertiesGroupComponent + ] + }) + ], FloModule); + return FloModule; + }()); + + exports.FloModule = FloModule; + exports.Palette = Palette; + exports.EditorComponent = EditorComponent; + exports.DslEditorComponent = DslEditorComponent; + exports.CodeEditorComponent = CodeEditorComponent; + exports.PropertiesGroupComponent = PropertiesGroupComponent; + exports.DynamicFormPropertyComponent = DynamicFormPropertyComponent; + exports.ResizerDirective = ResizerDirective; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=spring-flo.umd.js.map diff --git a/dist/bundles/spring-flo.umd.min.js b/dist/bundles/spring-flo.umd.min.js new file mode 100644 index 0000000..bc043f2 --- /dev/null +++ b/dist/bundles/spring-flo.umd.min.js @@ -0,0 +1 @@ +!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?factory(exports,require("jointjs"),require("jquery"),require("lodash"),require("@angular/core"),require("rxjs"),require("rxjs/operators"),require("@angular/platform-browser"),require("ts-disposables"),require("codemirror-minified"),require("codemirror-minified/addon/lint/lint"),require("codemirror-minified/addon/hint/show-hint"),require("codemirror-minified/addon/display/placeholder"),require("codemirror-minified/addon/scroll/annotatescrollbar"),require("codemirror-minified/addon/scroll/simplescrollbars"),require("@angular/forms"),require("codemirror-minified/mode/meta"),require("codemirror-minified/addon/edit/matchbrackets"),require("codemirror-minified/addon/edit/closebrackets"),require("codemirror-minified/addon/lint/javascript-lint"),require("codemirror-minified/addon/lint/coffeescript-lint"),require("codemirror-minified/addon/lint/json-lint"),require("codemirror-minified/addon/lint/yaml-lint"),require("codemirror-minified/mode/groovy/groovy"),require("codemirror-minified/mode/javascript/javascript"),require("codemirror-minified/mode/python/python"),require("codemirror-minified/mode/ruby/ruby"),require("codemirror-minified/mode/clike/clike"),require("codemirror-minified/mode/yaml/yaml"),require("codemirror-minified/mode/coffeescript/coffeescript"),require("@angular/common")):"function"==typeof define&&define.amd?define("spring-flo",["exports","jointjs","jquery","lodash","@angular/core","rxjs","rxjs/operators","@angular/platform-browser","ts-disposables","codemirror-minified","codemirror-minified/addon/lint/lint","codemirror-minified/addon/hint/show-hint","codemirror-minified/addon/display/placeholder","codemirror-minified/addon/scroll/annotatescrollbar","codemirror-minified/addon/scroll/simplescrollbars","@angular/forms","codemirror-minified/mode/meta","codemirror-minified/addon/edit/matchbrackets","codemirror-minified/addon/edit/closebrackets","codemirror-minified/addon/lint/javascript-lint","codemirror-minified/addon/lint/coffeescript-lint","codemirror-minified/addon/lint/json-lint","codemirror-minified/addon/lint/yaml-lint","codemirror-minified/mode/groovy/groovy","codemirror-minified/mode/javascript/javascript","codemirror-minified/mode/python/python","codemirror-minified/mode/ruby/ruby","codemirror-minified/mode/clike/clike","codemirror-minified/mode/yaml/yaml","codemirror-minified/mode/coffeescript/coffeescript","@angular/common"],factory):factory((global.ng=global.ng||{},global.ng["spring-flo"]={}),global.jointjs,global.jquery,global.lodash,global.ng.core,global.rxjs,global.rxjs.operators,global.ng.browser,global["ts-disposables"],global["codemirror-minified"],global["codemirror-minified/addon/lint/lint"],global["codemirror-minified/addon/hint/show-hint"],global["codemirror-minified/addon/edit/closebrackets"],global["codemirror-minified/addon/scroll/annotatescrollbar"],global["codemirror-minified/addon/scroll/simplescrollbars"],global.ng.forms,global["codemirror-minified/mode/meta"],global["codemirror-minified/addon/edit/matchbrackets"],global["codemirror-minified/addon/edit/closebrackets"],global["codemirror-minified/addon/lint/javascript-lint"],global["codemirror-minified/addon/lint/coffeescript-lint"],global["codemirror-minified/addon/lint/json-lint"],global["codemirror-minified/addon/lint/yaml-lint"],global["codemirror-minified/mode/groovy/groovy"],global["codemirror-minified/mode/javascript/javascript"],global["codemirror-minified/mode/python/python"],global["codemirror-minified/mode/ruby/ruby"],global["codemirror-minified/mode/clike/clike"],global["codemirror-minified/mode/yaml/yaml"],global["codemirror-minified/mode/coffeescript/coffeescript"],global.ng.common)}(this,function(exports,_joint,_$,lodash,core,rxjs,operators,platformBrowser,tsDisposables,codemirrorMinified,lint,showHint,placeholder,annotatescrollbar,simplescrollbars,forms,meta,matchbrackets,closebrackets,javascriptLint,coffeescriptLint,jsonLint,yamlLint,groovy,javascript,python,ruby,clike,yaml,coffeescript,common){"use strict";var extendStatics=function(d,b){return(extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b}||function(d,b){for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p])})(d,b)};function __extends(d,b){function __(){this.constructor=d}extendStatics(d,b),d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)}function __decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;0<=i;i--)(d=decorators[i])&&(r=(c<3?d(r):3',{a:1-.96*amount,b:.95*amount,c:.01*amount,d:.3*amount,e:.2*amount,f:1-.9*amount,g:.7*amount,h:.05*amount,i:.05*amount,k:1-.1*amount})},joint.util.filter.orangescale=function(args){var amount=Number.isFinite(args.amount)?args.amount:1;return lodash.template('',{a:1+.5*amount,b:1.4*amount,c:.2*amount,d:.3*amount,e:.3*amount,f:1+.05*amount,g:.2*amount,h:.15*amount,i:.3*amount,k:.3*amount,l:1-.6*amount})},joint.shapes.flo.Node=joint.shapes.basic.Generic.extend({markup:'',defaults:joint.util.deepSupplement({type:joint.shapes.flo.NODE_TYPE,position:{x:0,y:0},size:{width:120,height:35},attrs:{".":{magnet:!1},".border":{width:120,height:35,rx:3,ry:3,"fill-opacity":0,stroke:"#eeeeee","stroke-width":0},".box":{width:120,height:35,rx:3,ry:3,stroke:"#6db33f",fill:"#eeeeee","stroke-width":1},".input-port":{port:"input",height:8,width:8,magnet:!0,fill:"#eeeeee",transform:"translate(-4,13.5)",stroke:"#34302d","stroke-width":1},".output-port":{port:"output",height:8,width:8,magnet:!0,fill:"#eeeeee",transform:"translate(116,13.5)",stroke:"#34302d","stroke-width":1},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":.3,ref:".border",fill:"black","font-size":14},".label2":{text:"⇒","text-anchor":"middle","ref-x":.15,"ref-y":.2,ref:".border",fill:"black","font-size":24},".shape":{},".image":{width:120,height:35}}},joint.shapes.basic.Generic.prototype.defaults)}),joint.shapes.flo.Link=joint.dia.Link.extend({defaults:joint.util.deepSupplement({type:joint.shapes.flo.LINK_TYPE,attrs:{".connection":{stroke:"#34302d","stroke-width":2},".marker-arrowheads":{display:"none"},".tool-options":{display:"none"}}},joint.dia.Link.prototype.defaults)}),joint.shapes.flo.LinkView=joint.dia.LinkView.extend({options:joint.util.deepSupplement({},joint.dia.LinkView.prototype.options),_beforeArrowheadMove:function(){this.model.get("source").id&&(this._oldSource=this.model.get("source")),this.model.get("target").id&&(this._oldTarget=this.model.get("target")),joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this,arguments)},_afterArrowheadMove:function(){joint.dia.LinkView.prototype._afterArrowheadMove.apply(this,arguments),this.model.get("source").id||(this._oldSource?this.model.set("source",this._oldSource):this.model.remove()),this.model.get("target").id||(this._oldTarget?this.model.set("target",this._oldTarget):this.model.remove()),delete this._oldSource,delete this._oldTarget}}),joint.shapes.flo.ElementView=joint.dia.ElementView.extend({beingDragged:!1,_tempOpacity:1,_hovering:!1,dragLinkStart:function(evt,magnet,x,y){this.model.startBatch("add-link");var linkView=this.addLinkFromMagnet(magnet,x,y);joint.dia.CellView.prototype.pointerdown.apply(linkView,[evt,x,y]),linkView.notify("link:pointerdown",evt,x,y);var sourceOrTarget="input"===$$1(magnet).attr("port")?"source":"target";linkView.eventData(evt,linkView.startArrowheadMove(sourceOrTarget,{whenNotAllowed:"remove"})),this.eventData(evt,{linkView:linkView})},addLinkFromMagnet:function(magnet,x,y){var sourceEnd,targetEnd,paper=this.paper,graph=paper.model,link=paper.getDefaultLink(this,magnet);return"input"===$$1(magnet).attr("port")?(sourceEnd={x:x,y:y},targetEnd=this.getLinkEnd(magnet,x,y,link,"target")):(sourceEnd=this.getLinkEnd(magnet,x,y,link,"source"),targetEnd={x:x,y:y}),link.set({source:sourceEnd,target:targetEnd}).addTo(graph,{async:!1,ui:!0}),link.findView(paper)},drag:function(evt,x,y){!1!==(lodash.isFunction(this.options.interactive)?this.options.interactive(this,"pointermove"):this.options.interactive)&&this.paper.trigger("dragging-node-over-canvas",{type:exports.Flo.DnDEventType.DRAG,view:this,event:evt}),joint.dia.ElementView.prototype.drag.apply(this,arguments)},dragEnd:function(evt,x,y){this.paper.trigger("dragging-node-over-canvas",{type:exports.Flo.DnDEventType.DROP,view:this,event:evt}),joint.dia.ElementView.prototype.dragEnd.apply(this,arguments)}}),joint.shapes.flo.ErrorDecoration=joint.shapes.basic.Generic.extend({markup:'',defaults:joint.util.deepSupplement({type:joint.shapes.flo.DECORATION_TYPE,size:ERROR_MARKER_SIZE,attrs:{image:ERROR_MARKER_SIZE}},joint.shapes.basic.Generic.prototype.defaults)}),(Constants=exports.Constants||(exports.Constants={})).REMOVE_HANDLE_TYPE="remove",Constants.PROPERTIES_HANDLE_TYPE="properties",Constants.ERROR_DECORATION_KIND="error",Constants.PALETTE_CONTEXT="palette",Constants.CANVAS_CONTEXT="canvas",Constants.FEEDBACK_CONTEXT="feedback",Shapes=exports.Shapes||(exports.Shapes={}),Factory=function(){function Factory(){}return Factory.createNode=function(params){var node,renderer=params.renderer,paper=params.paper,metadata=params.metadata,position=params.position,props=params.props,graph=params.graph||(params.paper?params.paper.model:void 0);if(position||(position={x:0,y:0}),renderer&&lodash.isFunction(renderer.createNode)?node=renderer.createNode(metadata,props):(node=new joint.shapes.flo.Node,metadata&&node.attr(".label/text",metadata.name)),node.set("type",joint.shapes.flo.NODE_TYPE),position&&node.set("position",position),props&&Array.from(props.keys()).forEach(function(key){return node.attr("props/"+key,props.get(key))}),node.attr("metadata",metadata),graph&&graph.addCell(node),renderer&&lodash.isFunction(renderer.initializeNewNode)){var descriptor={paper:paper,graph:graph};renderer.initializeNewNode(node,descriptor)}return node},Factory.createLink=function(params){var link,renderer=params.renderer,paper=params.paper,metadata=params.metadata,source=params.source,target=params.target,props=params.props,graph=params.graph||(params.paper?params.paper.model:void 0);if(link=renderer&&lodash.isFunction(renderer.createLink)?renderer.createLink(source,target,metadata,props):new joint.shapes.flo.Link,source&&link.set("source",source),target&&link.set("target",target),link.set("type",joint.shapes.flo.LINK_TYPE),metadata&&link.attr("metadata",metadata),props&&Array.from(props.keys()).forEach(function(key){return link.attr("props/"+key,props.get(key))}),graph&&graph.addCell(link),renderer&&lodash.isFunction(renderer.initializeNewLink)){var descriptor={paper:paper,graph:graph};renderer.initializeNewLink(link,descriptor)}return link.attr(".marker-vertices/display","none"),link},Factory.createDecoration=function(params){var decoration,renderer=params.renderer,paper=params.paper,parent=params.parent,kind=params.kind,messages=params.messages,location=params.position,graph=params.graph||(params.paper?params.paper.model:void 0);if(location||(location={x:0,y:0}),(decoration=renderer&&lodash.isFunction(renderer.createDecoration)?renderer.createDecoration(kind,parent):new joint.shapes.flo.ErrorDecoration({attrs:{image:{"xlink:href":DECORATION_ICON_MAP.get(kind)}}})).set("type",joint.shapes.flo.DECORATION_TYPE),decoration.set("position",location),(isChrome||isFF)&&parent&&"number"==typeof parent.get("z")&&decoration.set("z",parent.get("z")+1),decoration.attr("./kind",kind),decoration.attr("messages",messages),graph&&graph.addCell(decoration),parent.embed(decoration),renderer&&lodash.isFunction(renderer.initializeNewDecoration)){var descriptor={paper:paper,graph:graph};renderer.initializeNewDecoration(decoration,descriptor)}return decoration},Factory.createHandle=function(params){var handle,renderer=params.renderer,paper=params.paper,parent=params.parent,kind=params.kind,location=params.position,graph=params.graph||(params.paper?params.paper.model:void 0);if(location||(location={x:0,y:0}),(handle=renderer&&lodash.isFunction(renderer.createHandle)?renderer.createHandle(kind,parent):new joint.shapes.flo.ErrorDecoration({size:HANDLE_SIZE,attrs:{image:{"xlink:href":HANDLE_ICON_MAP.get(kind)}}})).set("type",joint.shapes.flo.HANDLE_TYPE),handle.set("position",location),(isChrome||isFF)&&parent&&"number"==typeof parent.get("z")&&handle.set("z",parent.get("z")+1),handle.attr("./kind",kind),graph&&graph.addCell(handle),parent.embed(handle),renderer&&lodash.isFunction(renderer.initializeNewHandle)){var descriptor={paper:paper,graph:graph};renderer.initializeNewHandle(handle,descriptor)}return handle},Factory}(),Shapes.Factory=Factory;var joint$1=exports.Flo.joint,$$2=_$;joint$1.shapes.flo.PaletteGroupHeader=joint$1.shapes.basic.Generic.extend({markup:'',defaults:joint$1.util.deepSupplement({type:"palette.groupheader",size:{width:170,height:30},position:{x:0,y:0},attrs:{rect:{fill:"#34302d","stroke-width":1,stroke:"#6db33f","follow-scale":!0,width:80,height:40},text:{text:"",fill:"#eeeeee","ref-x":.5,"ref-y":7,"x-alignment":"middle","font-size":18},path:{fill:"white","stroke-width":2,stroke:"white"}},isOpen:!0},joint$1.shapes.basic.Generic.prototype.defaults)});var Palette=function(){function Palette(element,document){var _this=this;this.element=element,this.document=document,this._metamodelListener={metadataError:function(data){},metadataAboutToChange:function(){},metadataChanged:function(){return _this.rebuildPalette()}},this.initialized=!1,this._filterText="",this.filterTextModel=new rxjs.Subject,this.paletteEntryPadding={width:12,height:12},this.onPaletteEntryDrop=new core.EventEmitter,this.paletteReady=new core.EventEmitter,this.paletteFocus=new core.EventEmitter,this.mouseMoveHanlder=function(e){return _this.handleDrag(e)},this.mouseUpHanlder=function(e){return _this.handleMouseUp(e)},this.paletteGraph=new joint$1.dia.Graph,this.paletteGraph.set("type",exports.Constants.PALETTE_CONTEXT),this._filterText="",this.closedGroups=new Set}return Object.defineProperty(Palette.prototype,"paletteSize",{set:function(size){console.debug("Palette Size: "+size),this._paletteSize!==size&&(this._paletteSize=size,this.rebuildPalette())},enumerable:!0,configurable:!0}),Palette.prototype.onFocus=function(){this.paletteFocus.emit()},Palette.prototype.ngOnInit=function(){var _this=this,element=$$2("#palette-paper",this.element.nativeElement);this.palette=new joint$1.dia.Paper({el:element,gridSize:1,model:this.paletteGraph,height:$$2(this.element.nativeElement.parentNode).height(),width:$$2(this.element.nativeElement.parentNode).width(),elementView:this.getPaletteView(this.renderer&&this.renderer.getNodeView?this.renderer.getNodeView():joint$1.dia.ElementView),interactive:!1}),this.palette.on("cell:pointerup",function(cellview,evt){_this.viewBeingDragged&&(_this.trigger({type:exports.Flo.DnDEventType.DROP,view:_this.viewBeingDragged,event:evt}),_this.viewBeingDragged=void 0),_this.clickedElement=void 0,$$2("#palette-floater").remove(),_this.floaterpaper&&_this.floaterpaper.remove()}),this.palette.on("cell:pointerclick",function(cellview,event){var cell=cellview.model;cell.attributes.header&&(cell.get("isOpen")?_this.rotateClosed(cell):_this.rotateOpen(cell))}),$$2(this.document).on("mouseup",this.mouseUpHanlder),this.metamodel?this.metamodel.load().then(function(data){_this.buildPalette(data),_this.metamodel&&_this.metamodel.subscribe&&_this.metamodel.subscribe(_this._metamodelListener),_this.filterTextModel.pipe(operators.debounceTime(300)).subscribe(function(value){return _this.rebuildPalette()}),_this.initialized=!0}):console.error("No Metamodel service specified for palette!"),this._paletteSize=this._paletteSize||$$2(this.element.nativeElement.parentNode).width()},Palette.prototype.ngOnDestroy=function(){this.metamodel&&this.metamodel.unsubscribe&&this.metamodel.unsubscribe(this._metamodelListener),$$2(this.document).off("mouseup",this.mouseUpHanlder),this.palette.remove()},Palette.prototype.ngOnChanges=function(changes){},Palette.prototype.createPaletteGroup=function(title,isOpen){var newGroupHeader=new joint$1.shapes.flo.PaletteGroupHeader({attrs:{text:{text:title}}});return newGroupHeader.set("header",title),isOpen||(newGroupHeader.attr({path:{transform:"rotate(-90,15,13)"}}),newGroupHeader.set("isOpen",!1)),this.paletteGraph.addCell(newGroupHeader),newGroupHeader},Palette.prototype.createPaletteEntry=function(title,metadata){return exports.Shapes.Factory.createNode({renderer:this.renderer,paper:this.palette,metadata:metadata})},Palette.prototype.buildPalette=function(metamodel){var _this=this,startTime=(new Date).getTime();this.paletteReady.emit(!1),this.paletteGraph.clear();var filterText=this.filterText;filterText&&(filterText=filterText.toLowerCase());var paletteNodes=[],groupAdded=new Set,parentWidth=this._paletteSize;console.debug("Parent Width: "+parentWidth),this.metamodel.groups().forEach(function(group){metamodel&&metamodel.has(group)&&Array.from(metamodel.get(group).keys()).sort().forEach(function(name){var node=metamodel.get(group).get(name);if(node){var nodeActive=!(node.metadata&&node.metadata.noPaletteEntry);if(nodeActive&&filterText&&(nodeActive=!1,-1!==name.toLowerCase().indexOf(filterText)?nodeActive=!0:-1!==group.toLowerCase().indexOf(filterText)&&(nodeActive=!0)),nodeActive){if(!groupAdded.has(group)){var header=_this.createPaletteGroup(group,!_this.closedGroups.has(group));header.set("size",{width:parentWidth,height:30}),paletteNodes.push(header),groupAdded.add(group)}_this.closedGroups.has(group)||paletteNodes.push(_this.createPaletteEntry(name,node))}}})});var cellWidth=0,cellHeight=0;paletteNodes.forEach(function(pnode){if(pnode.attr("metadata/name")){var dimension={width:pnode.get("size").width,height:pnode.get("size").height};cellWidth",{id:"palette-floater"}).appendTo($$2("body"));var floatergraph=new joint$1.dia.Graph;floatergraph.set("type",exports.Constants.FEEDBACK_CONTEXT);var parent_1=$$2("#palette-floater");this.floaterpaper=new joint$1.dia.Paper({el:$$2("#palette-floater"),elementView:this.renderer&&this.renderer.getNodeView?this.renderer.getNodeView():joint$1.dia.ElementView,gridSize:10,model:floatergraph,height:parent_1.height(),width:parent_1.width(),validateMagnet:function(){return!1},validateConnection:function(){return!1}});var floaternode=exports.Shapes.Factory.createNode({renderer:this.renderer,paper:this.floaterpaper,graph:floatergraph,metadata:dataOfClickedElement}),box=this.floaterpaper.findViewByModel(floaternode).getBBox(),size=floaternode.get("size");floaternode.translate(box.width-size.width,box.height-size.height),this.viewBeingDragged=this.floaterpaper.findViewByModel(floaternode),$$2("#palette-floater").offset({left:event.pageX+5,top:event.pageY+5})}},Palette.prototype.rotateOpen=function(element){var _this=this;setTimeout(function(){return _this.doRotateOpen(element,90)})},Palette.prototype.doRotateOpen=function(element,angle){var _this=this;angle-=10,element.attr({path:{transform:"rotate(-"+angle+",15,13)"}}),angle<=0?(element.set("isOpen",!0),this.closedGroups.delete(element.get("header")),this.rebuildPalette()):setTimeout(function(){return _this.doRotateOpen(element,angle)},10)},Palette.prototype.doRotateClose=function(element,angle){var _this=this;angle+=10,element.attr({path:{transform:"rotate(-"+angle+",15,13)"}}),90<=angle?(element.set("isOpen",!1),this.closedGroups.add(element.get("header")),this.rebuildPalette()):setTimeout(function(){return _this.doRotateClose(element,angle)},10)},Palette.prototype.rotateClosed=function(element){var _this=this;setTimeout(function(){return _this.doRotateClose(element,0)})},__decorate([core.Input(),__metadata("design:type",Object)],Palette.prototype,"metamodel",void 0),__decorate([core.Input(),__metadata("design:type",Object)],Palette.prototype,"renderer",void 0),__decorate([core.Input(),__metadata("design:type",Object)],Palette.prototype,"paletteEntryPadding",void 0),__decorate([core.Output(),__metadata("design:type",Object)],Palette.prototype,"onPaletteEntryDrop",void 0),__decorate([core.Output(),__metadata("design:type",Object)],Palette.prototype,"paletteReady",void 0),__decorate([core.Output(),__metadata("design:type",Object)],Palette.prototype,"paletteFocus",void 0),__decorate([core.Input(),__metadata("design:type",Number),__metadata("design:paramtypes",[Number])],Palette.prototype,"paletteSize",null),Palette=__decorate([core.Component({selector:"flo-palette",template:'\n
\n \n
\n
\n
\n
\n ',styles:['\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: "Varela Round",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n '],encapsulation:core.ViewEncapsulation.None}),__param(1,core.Inject(platformBrowser.DOCUMENT)),__metadata("design:paramtypes",[core.ElementRef,Object])],Palette)}(),joint$2=exports.Flo.joint,$$3=_$,Utils=function(){function Utils(){}return Utils.fanRoute=function(graph,cell){if(cell instanceof joint$2.dia.Element){var links=graph.getConnectedLinks(cell),groupsOfOverlappingLinks=lodash.groupBy(links,function(link){var sourceId=link.get("source").id,targetId=link.get("target").id;return cell.id!==sourceId?sourceId:targetId});lodash.each(groupsOfOverlappingLinks,function(group,key){var toRoute={};void 0!==key&&(group.forEach(function(link){link.get("source").id===cell.get("id")&&link.get("target").id?toRoute[link.get("target").id]=link:link.get("target").id===cell.get("id")&&link.get("source").id&&(toRoute[link.get("source").id]=link)}),Object.keys(toRoute).forEach(function(k){Utils.fanRoute(graph,toRoute[k])}))})}else if(cell instanceof joint$2.dia.Link){var srcId_1=cell.get("source").id||cell.previous("source").id,trgId_1=cell.get("target").id||cell.previous("target").id;if(!srcId_1||!trgId_1)return;var siblings=graph.getLinks().filter(function(sibling){var _srcId=sibling.get("source").id,_trgId=sibling.get("target").id,vertices=sibling.get("vertices"),fanRouted=!vertices||0===vertices.length||sibling.get("fanRouted");return(_srcId===srcId_1&&_trgId===trgId_1||_srcId===trgId_1&&_trgId===srcId_1)&&fanRouted});switch(siblings.length){case 0:break;case 1:var vertices=cell.get("vertices");vertices&&vertices.length&&cell.get("fanRouted")&&cell.unset("vertices");break;default:var source=graph.getCell(srcId_1),target=graph.getCell(trgId_1);if(!source||!target)return;var srcCenter=source.getBBox().center(),trgCenter=target.getBBox().center(),midPoint_1=joint$2.g.line(srcCenter,trgCenter).midpoint(),theta_1=srcCenter.theta(trgCenter);siblings.forEach(function(sibling,index){var offset=20*Math.ceil(index/2),sign=index%2?1:-1,angle=joint$2.g.toRad(theta_1+90*sign),vertex=joint$2.g.point.fromPolar(offset,angle,midPoint_1);sibling.set("fanRouted",!0),sibling.set("vertices",[{x:vertex.x,y:vertex.y}],{fanRouted:!0})})}}},Utils.isCustomPaperEvent=function(args){return 5===args.length&&lodash.isString(args[0])&&(0===args[0].indexOf("link:")||0===args[0].indexOf("element:"))&&args[1]instanceof $$3.Event&&args[2]instanceof joint$2.dia.CellView&&lodash.isNumber(args[3])&&lodash.isNumber(args[4])},Utils}(),joint$3=exports.Flo.joint,$$4=_$,EditorComponent=function(){function EditorComponent(element){var _this=this;this.element=element,this._readOnlyCanvas=!1,this._gridSize=1,this._hiddenPalette=!1,this.textToGraphEventEmitter=new core.EventEmitter,this.graphToTextEventEmitter=new core.EventEmitter,this._graphToTextSyncEnabled=!0,this.validationEventEmitter=new core.EventEmitter,this._disposables=new tsDisposables.CompositeDisposable,this._dslText="",this.textToGraphConversionCompleted=new rxjs.Subject,this.graphToTextConversionCompleted=new rxjs.Subject,this.paletteReady=new rxjs.BehaviorSubject(!1),this.minZoom=5,this.maxZoom=400,this.zoomStep=5,this.paperPadding=0,this.floApi=new core.EventEmitter,this.validationMarkers=new core.EventEmitter,this.contentValidated=new core.EventEmitter,this.dslChange=new core.EventEmitter,this._resizeHandler=function(){return _this.autosizePaper()};var self=this;this.editorContext=new(function(){function DefaultRunnableContext(){}return Object.defineProperty(DefaultRunnableContext.prototype,"zoomPercent",{get:function(){return self.zoomPercent},set:function(percent){self.zoomPercent=percent},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"noPalette",{get:function(){return self.noPalette},set:function(noPalette){self.noPalette=noPalette},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"gridSize",{get:function(){return self.gridSize},set:function(gridSize){self.gridSize=gridSize},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"readOnlyCanvas",{get:function(){return self.readOnlyCanvas},set:function(readOnly){self.readOnlyCanvas=readOnly},enumerable:!0,configurable:!0}),DefaultRunnableContext.prototype.setDsl=function(dsl){self.dsl=dsl},DefaultRunnableContext.prototype.updateGraph=function(){return self.updateGraphRepresentation()},DefaultRunnableContext.prototype.updateText=function(){return self.updateTextRepresentation()},DefaultRunnableContext.prototype.performLayout=function(){return self.doLayout()},DefaultRunnableContext.prototype.clearGraph=function(){var _this=this;return self.selection=void 0,self.graph.clear(),self.metamodel&&self.metamodel.load&&self.editor&&self.editor.setDefaultContent?self.metamodel.load().then(function(data){if(self.editor.setDefaultContent(_this,data),!self.graphToTextSync)return self.updateTextRepresentation()}):self.graphToTextSync?void 0:self.updateTextRepresentation()},DefaultRunnableContext.prototype.getGraph=function(){return self.graph},DefaultRunnableContext.prototype.getPaper=function(){return self.paper},Object.defineProperty(DefaultRunnableContext.prototype,"graphToTextSync",{get:function(){return self.graphToTextSync},set:function(sync){self.graphToTextSync=sync},enumerable:!0,configurable:!0}),DefaultRunnableContext.prototype.getMinZoom=function(){return self.minZoom},DefaultRunnableContext.prototype.getMaxZoom=function(){return self.maxZoom},DefaultRunnableContext.prototype.getZoomStep=function(){return self.zoomStep},DefaultRunnableContext.prototype.fitToPage=function(){self.fitToPage()},DefaultRunnableContext.prototype.createNode=function(metadata,props,position){return self.createNode(metadata,props,position)},DefaultRunnableContext.prototype.createLink=function(source,target,metadata,props){return self.createLink(source,target,metadata,props)},Object.defineProperty(DefaultRunnableContext.prototype,"selection",{get:function(){return self.selection},set:function(newSelection){self.selection=newSelection},enumerable:!0,configurable:!0}),DefaultRunnableContext.prototype.deleteSelectedNode=function(){self.selection&&(self.editor&&self.editor.preDelete?self.editor.preDelete(self.editorContext,self.selection.model):self.selection.model instanceof joint$3.dia.Element&&self.graph.getConnectedLinks(self.selection.model).forEach(function(l){return l.remove()}),self.selection.model.remove(),self.selection=void 0)},Object.defineProperty(DefaultRunnableContext.prototype,"textToGraphConversionObservable",{get:function(){return self.textToGraphConversionCompleted},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"graphToTextConversionObservable",{get:function(){return self.graphToTextConversionCompleted},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"paletteReady",{get:function(){return self.paletteReady},enumerable:!0,configurable:!0}),DefaultRunnableContext}())}return EditorComponent.prototype.ngOnInit=function(){var _this=this;this.initGraph(),this.initPaper(),this.initGraphListeners(),this.initPaperListeners(),this.initMetamodel(),$$4(window).on("resize",this._resizeHandler),this._disposables.add(tsDisposables.Disposable.create(function(){return $$4(window).off("resize",_this._resizeHandler)})),window.setTimeout(this._resizeHandler),this.floApi.emit(this.editorContext)},EditorComponent.prototype.ngOnDestroy=function(){this._disposables.dispose()},Object.defineProperty(EditorComponent.prototype,"noPalette",{get:function(){return this._hiddenPalette},set:function(hidden){(this._hiddenPalette=hidden)&&$$4("#paper-container",this.element.nativeElement).css("left",0)},enumerable:!0,configurable:!0}),Object.defineProperty(EditorComponent.prototype,"graphToTextSync",{get:function(){return this._graphToTextSyncEnabled},set:function(sync){this._graphToTextSyncEnabled=sync},enumerable:!0,configurable:!0}),EditorComponent.prototype.performGraphToTextSyncing=function(){this._graphToTextSyncEnabled&&this.graphToTextEventEmitter.emit()},EditorComponent.prototype.createHandle=function(element,kind,action,location){if(!location){var bbox=element.model.getBBox();location=bbox.origin().offset(bbox.width/2,bbox.height/2)}var handle=exports.Shapes.Factory.createHandle({renderer:this.renderer,paper:this.paper,parent:element.model,kind:kind,position:location}),view=this.paper.findViewByModel(handle);return view.on("cell:pointerdown",function(){action&&action()}),view.on("cell:mouseover",function(){handle.attr("image/filter",{name:"dropShadow",args:{dx:1,dy:1,blur:1,color:"black"}})}),view.on("cell:mouseout",function(){handle.removeAttr("image/filter")}),view.setInteractivity(!1),handle},EditorComponent.prototype.removeEmbeddedChildrenOfType=function(element,types){for(var embeds=element.getEmbeddedCells(),i=0;i=this.maxZoom?percent=this.maxZoom:percent<=0&&(percent=1e-5),this.paper.scale(percent/100,percent/100))},enumerable:!0,configurable:!0}),Object.defineProperty(EditorComponent.prototype,"gridSize",{get:function(){return this._gridSize},set:function(size){!isNaN(size)&&1<=size&&(this._gridSize=size,this.paper&&this.paper.setGridSize(size))},enumerable:!0,configurable:!0}),EditorComponent.prototype.validateContent=function(){var _this=this;return new Promise(function(resolve){if(_this.editor&&_this.editor.validate)return _this.editor.validate(_this.graph,_this.dsl,_this.editorContext).then(function(allMarkers){_this.graph.getCells().forEach(function(cell){return _this.markElement(cell,allMarkers.has(cell.id)?allMarkers.get(cell.id):[])}),_this.validationMarkers.emit(allMarkers),_this.contentValidated.emit(!0),resolve()});resolve()})},EditorComponent.prototype.markElement=function(cell,markers){var errorMessages=markers.map(function(m){return m.message}),errorCell=cell.getEmbeddedCells().find(function(e){return e.attr("./kind")===exports.Constants.ERROR_DECORATION_KIND});if(errorCell)0===errorMessages.length?errorCell.remove():errorCell.attr("messages",errorMessages,{rewrite:!0});else if(0\n
\n
\n
\n \n
\n\n \n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ',styles:['\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can\'t handle paths without the `d` attribute for bounding box calculation\n 2. IE can\'t even handle \'d\' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class "element basic Rect".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don\'t display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event="link:options"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: \'lato-light\';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format(\'woff\');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: "Varela Round",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: "Varela Round",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*"Varela Round",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: "Varela Round",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: "Varela Round",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: "Varela Round",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don\'t display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It\'ll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n '],encapsulation:core.ViewEncapsulation.None}),__metadata("design:paramtypes",[core.ElementRef])],EditorComponent)}(),$$5=_$,ResizerDirective=function(){function ResizerDirective(element,document){var _this=this;this.element=element,this.document=document,this.dragInProgress=!1,this.vertical=!0,this._subscriptions=new tsDisposables.CompositeDisposable,this.sizeChange=new core.EventEmitter,this.mouseMoveHandler=function(e){_this.dragInProgress&&_this.mousemove(e)}}return Object.defineProperty(ResizerDirective.prototype,"splitSize",{set:function(splitSize){this.maxSplitSize&&splitSize>this.maxSplitSize&&(splitSize=this.maxSplitSize),this.vertical?($$5(this.element.nativeElement).css({left:splitSize+"px"}),$$5(this.first).css({width:splitSize+"px"}),$$5(this.second).css({left:splitSize+this._size+"px"})):($$5(this.element.nativeElement).css({bottom:splitSize+"px"}),$$5(this.first).css({bottom:splitSize+this._size+"px"}),$$5(this.second).css({height:splitSize+"px"})),this._splitSize=splitSize,this.sizeChange.emit(splitSize)},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerWidth",{set:function(width){this._size=width,this.vertical=!0},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerHeight",{set:function(height){this._size=height,this.vertical=!1},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerLeft",{set:function(first){this.first=first},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerTop",{set:function(first){this.first=first},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerRight",{set:function(second){this.second=second},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerBottom",{set:function(second){this.second=second},enumerable:!0,configurable:!0}),ResizerDirective.prototype.startDrag=function(){this.dragInProgress=!0},ResizerDirective.prototype.mousemove=function(event){var size;size=this.vertical?event.pageX-$$5(this.first).offset().left:window.innerHeight-event.pageY-$$5(this.second).offset().top,this.splitSize=size},ResizerDirective.prototype.ngOnInit=function(){var _this=this;this.splitSize=this._splitSize;var subscription1=rxjs.fromEvent($$5(this.document).get(0),"mousemove").pipe(operators.sampleTime(300)).subscribe(this.mouseMoveHandler);this._subscriptions.add(tsDisposables.Disposable.create(function(){return subscription1.unsubscribe()}));var subscription2=rxjs.fromEvent($$5(this.document).get(0),"mouseup").subscribe(function(e){_this.dragInProgress&&(_this.mousemove(e),_this.dragInProgress=!1)});this._subscriptions.add(tsDisposables.Disposable.create(function(){return subscription2.unsubscribe()}))},ResizerDirective.prototype.ngOnDestroy=function(){this._subscriptions.dispose()},__decorate([core.Input(),__metadata("design:type",Number)],ResizerDirective.prototype,"maxSplitSize",void 0),__decorate([core.Output(),__metadata("design:type",Object)],ResizerDirective.prototype,"sizeChange",void 0),__decorate([core.Input(),__metadata("design:type",Number),__metadata("design:paramtypes",[Number])],ResizerDirective.prototype,"splitSize",null),__decorate([core.Input(),__metadata("design:type",Number),__metadata("design:paramtypes",[Number])],ResizerDirective.prototype,"resizerWidth",null),__decorate([core.Input(),__metadata("design:type",Number),__metadata("design:paramtypes",[Number])],ResizerDirective.prototype,"resizerHeight",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],ResizerDirective.prototype,"resizerLeft",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],ResizerDirective.prototype,"resizerTop",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],ResizerDirective.prototype,"resizerRight",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],ResizerDirective.prototype,"resizerBottom",null),ResizerDirective=__decorate([core.Directive({selector:"[resizer]",host:{"(mousedown)":"startDrag()"}}),__param(1,core.Inject(platformBrowser.DOCUMENT)),__metadata("design:paramtypes",[core.ElementRef,Object])],ResizerDirective)}(),$$6=_$,DslEditorComponent=function(){function DslEditorComponent(element){var _this=this;this.element=element,this._dsl="",this._lint=!1,this.lineNumbers=!1,this.lineWrapping=!1,this.debounce=0,this.dslChange=new core.EventEmitter,this.focus=new core.EventEmitter,this.blur=new core.EventEmitter,this.editor=new core.EventEmitter,this._dslChangedHandler=function(){_this._dsl=_this.doc.getValue(),_this.dslChange.emit(_this._dsl)}}return Object.defineProperty(DslEditorComponent.prototype,"dsl",{set:function(dsl){if(this._dsl=dsl,this.doc&&this._dsl!==this.doc.getValue()){var cursorPosition=this.doc.getCursor();this.doc.setValue(this._dsl||""),this.doc.setCursor(cursorPosition)}},enumerable:!0,configurable:!0}),Object.defineProperty(DslEditorComponent.prototype,"lintOptions",{set:function(lintOptions){this._lint=lintOptions,this.doc&&this.doc.setOption("lint",this._lint)},enumerable:!0,configurable:!0}),Object.defineProperty(DslEditorComponent.prototype,"hintOptions",{set:function(hintOptions){this._hint=hintOptions,this.doc&&this.doc.setOption("hintOptions",this._hint)},enumerable:!0,configurable:!0}),DslEditorComponent.prototype.ngOnInit=function(){var _this=this,options={value:this._dsl||"",gutters:["CodeMirror-lint-markers"],extraKeys:{"Ctrl-Space":"autocomplete"},lineNumbers:this.lineNumbers,lineWrapping:this.lineWrapping,electricChars:!1,smartIndent:!1};this.scrollbarStyle&&(options.scrollbarStyle=this.scrollbarStyle),this._lint&&(options.lint=this._lint),this._hint&&(options.hintOptions=this._hint),this.doc=codemirrorMinified.fromTextArea($$6("#dsl-editor-host",this.element.nativeElement)[0],options),this.placeholder&&this.doc.setOption("placeholder",this.placeholder),this.doc.setValue(this._dsl||""),this.doc.on("change",this.debounce?lodash.debounce(this._dslChangedHandler,this.debounce):this._dslChangedHandler),this.doc.on("focus",function(){return _this.focus.emit()}),this.doc.on("blur",function(){return _this.blur.emit()}),this.editor.emit(this.doc)},DslEditorComponent.prototype.ngOnDestroy=function(){},__decorate([core.Input("line-numbers"),__metadata("design:type",Object)],DslEditorComponent.prototype,"lineNumbers",void 0),__decorate([core.Input("line-wrapping"),__metadata("design:type",Object)],DslEditorComponent.prototype,"lineWrapping",void 0),__decorate([core.Input("scrollbar-style"),__metadata("design:type",String)],DslEditorComponent.prototype,"scrollbarStyle",void 0),__decorate([core.Input(),__metadata("design:type",String)],DslEditorComponent.prototype,"placeholder",void 0),__decorate([core.Input(),__metadata("design:type",Object)],DslEditorComponent.prototype,"debounce",void 0),__decorate([core.Output(),__metadata("design:type",Object)],DslEditorComponent.prototype,"dslChange",void 0),__decorate([core.Output(),__metadata("design:type",Object)],DslEditorComponent.prototype,"focus",void 0),__decorate([core.Output(),__metadata("design:type",Object)],DslEditorComponent.prototype,"blur",void 0),__decorate([core.Output(),__metadata("design:type",Object)],DslEditorComponent.prototype,"editor",void 0),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],DslEditorComponent.prototype,"dsl",null),__decorate([core.Input(),__metadata("design:type",Object),__metadata("design:paramtypes",[Object])],DslEditorComponent.prototype,"lintOptions",null),__decorate([core.Input(),__metadata("design:type",Object),__metadata("design:paramtypes",[Object])],DslEditorComponent.prototype,"hintOptions",null),DslEditorComponent=__decorate([core.Component({selector:"dsl-editor",template:'\n \n ',styles:["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "],encapsulation:core.ViewEncapsulation.None}),__metadata("design:paramtypes",[core.ElementRef])],DslEditorComponent)}(),$$7=_$,CodeEditorComponent=function(){function CodeEditorComponent(element){var _this=this;this.element=element,this._dsl="",this._lint=!1,this.lineNumbers=!1,this.lineWrapping=!1,this.dslChange=new core.EventEmitter,this.focus=new core.EventEmitter,this.blur=new core.EventEmitter,this.editor=new core.EventEmitter,this._dslChangedHandler=function(){_this._dsl=_this.doc.getValue(),_this.dslChange.emit(_this._dsl),_this._onChangeHandler&&_this._onChangeHandler(_this._dsl)}}var CodeEditorComponent_1;return CodeEditorComponent_1=CodeEditorComponent,Object.defineProperty(CodeEditorComponent.prototype,"dsl",{set:function(dsl){if(this._dsl=dsl,this.doc&&this._dsl!==this.doc.getValue()){var cursorPosition=this.doc.getCursor();this.doc.setValue(this._dsl||""),this.doc.setCursor(cursorPosition)}},enumerable:!0,configurable:!0}),Object.defineProperty(CodeEditorComponent.prototype,"language",{set:function(_language){this._language!==_language&&(this._language=_language,this.loadEditorMode())},enumerable:!0,configurable:!0}),CodeEditorComponent.prototype.ngOnInit=function(){var _this=this,options={value:this._dsl||"",gutters:["CodeMirror-lint-markers"],extraKeys:{"Ctrl-Space":"autocomplete"},lineNumbers:this.lineNumbers,lineWrapping:this.lineWrapping,matchBrackets:!0,autoCloseBrackets:!0};this.scrollbarStyle&&(options.scrollbarStyle=this.scrollbarStyle),this._lint&&(options.lint=this._lint),this.doc=codemirrorMinified.fromTextArea($$7("#code-editor-host",this.element.nativeElement)[0],options),this.placeholder&&this.doc.setOption("placeholder",this.placeholder),this.doc.setValue(this._dsl||""),this.doc.on("change",this._dslChangedHandler),this.doc.on("focus",function(){_this.focus.emit(),_this._onTouchHandler&&_this._onTouchHandler()}),this.doc.on("blur",function(){return _this.blur.emit()}),this.warningRuler=this.doc.annotateScrollbar("CodeMirror-vertical-ruler-warning"),this.errorRuler=this.doc.annotateScrollbar("CodeMirror-vertical-ruler-error"),this.loadEditorMode(),this.editor.emit(this.doc)},CodeEditorComponent.prototype.loadEditorMode=function(){if(this.doc){var info=this._language?codemirrorMinified.findModeByName(this._language):void 0;info?this.doc.setOption("mode",info.mime):this.doc.setOption("mode","text/plain"),this.doc.setOption("lint",this.getLintOptions())}},CodeEditorComponent.prototype.ngOnDestroy=function(){},CodeEditorComponent.prototype.writeValue=function(obj){this.dsl=obj},CodeEditorComponent.prototype.registerOnChange=function(fn){this._onChangeHandler=fn},CodeEditorComponent.prototype.registerOnTouched=function(fn){this._onTouchHandler=fn},CodeEditorComponent.prototype.getLintOptions=function(){var _this=this;switch(this._language){case"javascript":case"json":case"coffeescript":case"yaml":return{onUpdateLinting:function(annotations){var warnings=[],errors=[];_this.overviewRuler&&Array.isArray(annotations)&&annotations.forEach(function(a){a.to&&a.from&&0<=a.from.line&&0<=a.from.ch&&a.to.line>=a.from.line&&0<=a.from.ch&&("error"===a.severity?errors.push(a):"warning"===a.severity&&warnings.push(a))}),_this.warningRuler.update(warnings),_this.errorRuler.update(errors)}}}return!1},__decorate([core.Input("line-numbers"),__metadata("design:type",Object)],CodeEditorComponent.prototype,"lineNumbers",void 0),__decorate([core.Input("line-wrapping"),__metadata("design:type",Object)],CodeEditorComponent.prototype,"lineWrapping",void 0),__decorate([core.Input("scrollbar-style"),__metadata("design:type",String)],CodeEditorComponent.prototype,"scrollbarStyle",void 0),__decorate([core.Input(),__metadata("design:type",String)],CodeEditorComponent.prototype,"placeholder",void 0),__decorate([core.Input("overview-ruler"),__metadata("design:type",Boolean)],CodeEditorComponent.prototype,"overviewRuler",void 0),__decorate([core.Output(),__metadata("design:type",Object)],CodeEditorComponent.prototype,"dslChange",void 0),__decorate([core.Output(),__metadata("design:type",Object)],CodeEditorComponent.prototype,"focus",void 0),__decorate([core.Output(),__metadata("design:type",Object)],CodeEditorComponent.prototype,"blur",void 0),__decorate([core.Output(),__metadata("design:type",Object)],CodeEditorComponent.prototype,"editor",void 0),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],CodeEditorComponent.prototype,"dsl",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],CodeEditorComponent.prototype,"language",null),CodeEditorComponent=CodeEditorComponent_1=__decorate([core.Component({selector:"code-editor",template:'\n
\n \n
\n ',styles:["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "],encapsulation:core.ViewEncapsulation.None,providers:[{provide:forms.NG_VALUE_ACCESSOR,useExisting:core.forwardRef(function(){return CodeEditorComponent_1}),multi:!0}]}),__metadata("design:paramtypes",[core.ElementRef])],CodeEditorComponent)}();!function(Properties){var InputType;!function(InputType){InputType[InputType.TEXT=0]="TEXT",InputType[InputType.NUMBER=1]="NUMBER",InputType[InputType.SELECT=2]="SELECT",InputType[InputType.CHECKBOX=3]="CHECKBOX",InputType[InputType.PASSWORD=4]="PASSWORD",InputType[InputType.EMAIL=5]="EMAIL",InputType[InputType.URL=6]="URL",InputType[InputType.CODE=7]="CODE"}(InputType=Properties.InputType||(Properties.InputType={}));var GenericControlModel=function(){function GenericControlModel(_property,type,validation){this._property=_property,this.type=type,this.validation=validation}return Object.defineProperty(GenericControlModel.prototype,"id",{get:function(){return this.property.id},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"name",{get:function(){return this.property.name},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"description",{get:function(){return this.property.description},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"defaultValue",{get:function(){return this.property.defaultValue},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"value",{get:function(){return this.getValue()},set:function(value){this.setValue(value)},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"property",{get:function(){return this._property},enumerable:!0,configurable:!0}),GenericControlModel.prototype.setValue=function(value){this.property.value=value},GenericControlModel.prototype.getValue=function(){return this.property.value},GenericControlModel}(),CheckBoxControlModel=function(_super){function CheckBoxControlModel(_property,validation){return _super.call(this,_property,InputType.CHECKBOX,validation)||this}return __extends(CheckBoxControlModel,_super),CheckBoxControlModel.prototype.getValue=function(){var res=_super.prototype.getValue.call(this);switch(typeof res){case"boolean":return res;case"string":switch(res.trim().toLowerCase()){case"true":case"1":return!0;case"false":case"0":return!1;default:return this.property.defaultValue}case"number":return 0!==res&&(1===res||this.property.defaultValue)}return this.property.defaultValue},CheckBoxControlModel}(Properties.GenericControlModel=GenericControlModel);Properties.CheckBoxControlModel=CheckBoxControlModel;var AbstractCodeControlModel=function(_super){function AbstractCodeControlModel(_property,encode,decode,validation){var _this=_super.call(this,_property,InputType.CODE,validation)||this;return _this.encode=encode,_this.decode=decode,_this}return __extends(AbstractCodeControlModel,_super),Object.defineProperty(AbstractCodeControlModel.prototype,"value",{get:function(){var dsl=_super.prototype.getValue.call(this);return dsl&&this.decode?this.decode(dsl):dsl},set:function(value){value&&this.encode?_super.prototype.setValue.call(this,this.encode(value)):_super.prototype.setValue.call(this,value)},enumerable:!0,configurable:!0}),AbstractCodeControlModel}(GenericControlModel),GenericCodeControlModel=function(_super){function GenericCodeControlModel(_property,language,encode,decode,validation){var _this=_super.call(this,_property,encode,decode,validation)||this;return _this.language=language,_this}return __extends(GenericCodeControlModel,_super),GenericCodeControlModel}(Properties.AbstractCodeControlModel=AbstractCodeControlModel);Properties.GenericCodeControlModel=GenericCodeControlModel;var CodeControlModelWithDynamicLanguageProperty=function(_super){function CodeControlModelWithDynamicLanguageProperty(_property,_languagePropertyName,_groupModel,encode,decode,validation){var _this=_super.call(this,_property,encode,decode,validation)||this;return _this._languagePropertyName=_languagePropertyName,_this._groupModel=_groupModel,_this}return __extends(CodeControlModelWithDynamicLanguageProperty,_super),Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype,"language",{get:function(){var value=this.languageControlModel.value;return value||this.languageControlModel.defaultValue},enumerable:!0,configurable:!0}),Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype,"languageControlModel",{get:function(){var _this=this;return this._langControlModel||(this._langControlModel=this._groupModel.getControlsModels().find(function(c){return c.id===_this._languagePropertyName})),this._langControlModel},enumerable:!0,configurable:!0}),CodeControlModelWithDynamicLanguageProperty}(AbstractCodeControlModel);Properties.CodeControlModelWithDynamicLanguageProperty=CodeControlModelWithDynamicLanguageProperty;var GenericListControlModel=function(_super){function GenericListControlModel(property,validation){return _super.call(this,property,InputType.TEXT,validation)||this}return __extends(GenericListControlModel,_super),Object.defineProperty(GenericListControlModel.prototype,"value",{get:function(){return this.property.value?this.property.value.join(", "):""},set:function(value){this.property.value=value&&value.trim()?value.split(/\s*,\s*/):void 0},enumerable:!0,configurable:!0}),GenericListControlModel}(GenericControlModel);Properties.GenericListControlModel=GenericListControlModel;var SelectControlModel=function(_super){function SelectControlModel(_property,type,options){var _this=_super.call(this,_property,type)||this;return _this.options=options,void 0===_property.defaultValue&&options.unshift({name:"SELECT",value:_property.defaultValue}),_this}return __extends(SelectControlModel,_super),SelectControlModel}(GenericControlModel);Properties.SelectControlModel=SelectControlModel;var DefaultCellPropertiesSource=function(){function DefaultCellPropertiesSource(cell){this.cell=cell}return DefaultCellPropertiesSource.prototype.getProperties=function(){var _this=this,metadata=this.cell.attr("metadata");return Promise.resolve(metadata.properties().then(function(propsMetadata){return Array.from(propsMetadata.values()).map(function(m){return _this.createProperty(m)})}))},DefaultCellPropertiesSource.prototype.createProperty=function(metadata){return{id:metadata.id,name:metadata.name,type:metadata.type,defaultValue:metadata.defaultValue,attr:"props/"+metadata.name,value:this.cell.attr("props/"+metadata.name),description:metadata.description,valueOptions:metadata.options}},DefaultCellPropertiesSource.prototype.applyChanges=function(properties){var _this=this;this.cell.trigger("batch:start",{batchName:"update properties"}),properties.forEach(function(property){if("boolean"==typeof property.value&&!property.defaultValue&&!property.value||property.value===property.defaultValue||""===property.value||void 0===property.value||null===property.value){var currentValue=_this.cell.attr(property.attr);null!=currentValue&&(_this.cell.attr(property.attr,void 0===property.defaultValue?null:property.defaultValue),_this.cell.removeAttr(property.attr))}else _this.cell.attr(property.attr,property.value)}),this.cell.trigger("batch:stop",{batchName:"update properties"})},DefaultCellPropertiesSource}();Properties.DefaultCellPropertiesSource=DefaultCellPropertiesSource;var PropertiesGroupModel=function(){function PropertiesGroupModel(propertiesSource){this.loading=!0,this.propertiesSource=propertiesSource}return PropertiesGroupModel.prototype.load=function(){var _this=this;this.loading=!0,this._loadedSubject=new rxjs.Subject,this.propertiesSource.getProperties().then(function(properties){_this.controlModels=properties.map(function(p){return _this.createControlModel(p)}),_this.loading=!1,_this._loadedSubject.next(!0),_this._loadedSubject.complete()})},Object.defineProperty(PropertiesGroupModel.prototype,"isLoading",{get:function(){return this.loading},enumerable:!0,configurable:!0}),Object.defineProperty(PropertiesGroupModel.prototype,"loadedSubject",{get:function(){return this._loadedSubject},enumerable:!0,configurable:!0}),PropertiesGroupModel.prototype.getControlsModels=function(){return this.controlModels},PropertiesGroupModel.prototype.createControlModel=function(property){return new GenericControlModel(property,InputType.TEXT)},PropertiesGroupModel.prototype.applyChanges=function(){if(!this.loading){var properties=this.controlModels.map(function(cm){return cm.property});this.propertiesSource.applyChanges(properties)}},PropertiesGroupModel}();Properties.PropertiesGroupModel=PropertiesGroupModel,function(Validators){Validators.uniqueResource=function(service,debounce$$1){return function(control){return new rxjs.Observable(function(obs){control.valueChanges&&control.value?control.valueChanges.pipe(operators.debounceTime(debounce$$1),operators.mergeMap(function(value){return service(value)})).subscribe(function(){obs.next({uniqueResource:!0}),obs.complete()},function(){obs.next(void 0),obs.complete()}):(obs.next(void 0),obs.complete())})}},Validators.noneOf=function(excluded){return function(control){return excluded.find(function(e){return e===control.value})?{noneOf:{value:control.value}}:{}}}}(Properties.Validators||(Properties.Validators={}))}(exports.Properties||(exports.Properties={}));var PropertiesGroupComponent=function(){function PropertiesGroupComponent(){}return PropertiesGroupComponent.prototype.ngOnInit=function(){var _this=this;if(this.propertiesGroupModel.isLoading)var subscription_1=this.propertiesGroupModel.loadedSubject.subscribe(function(loaded){loaded&&(subscription_1.unsubscribe(),_this.createGroupControls())});else this.createGroupControls()},PropertiesGroupComponent.prototype.createGroupControls=function(){var _this=this;this.propertiesGroupModel.getControlsModels().forEach(function(c){c.validation?_this.form.addControl(c.id,new forms.FormControl(c.value||"",c.validation.validator,c.validation.asyncValidator)):_this.form.addControl(c.id,new forms.FormControl(c.value||""))})},__decorate([core.Input(),__metadata("design:type",exports.Properties.PropertiesGroupModel)],PropertiesGroupComponent.prototype,"propertiesGroupModel",void 0),__decorate([core.Input(),__metadata("design:type",forms.FormGroup)],PropertiesGroupComponent.prototype,"form",void 0),PropertiesGroupComponent=__decorate([core.Component({selector:"properties-group",template:'\n
\n \n
\n ',encapsulation:core.ViewEncapsulation.None})],PropertiesGroupComponent)}(),DynamicFormPropertyComponent=function(){function DynamicFormPropertyComponent(){}return Object.defineProperty(DynamicFormPropertyComponent.prototype,"types",{get:function(){return exports.Properties.InputType},enumerable:!0,configurable:!0}),Object.defineProperty(DynamicFormPropertyComponent.prototype,"control",{get:function(){return this.form.controls[this.model.id]},enumerable:!0,configurable:!0}),Object.defineProperty(DynamicFormPropertyComponent.prototype,"errorData",{get:function(){var _this=this;return(this.model.validation&&this.model.validation.errorData?this.model.validation.errorData:[]).filter(function(e){return _this.control.errors&&_this.control.errors[e.id]})},enumerable:!0,configurable:!0}),__decorate([core.Input(),__metadata("design:type",Object)],DynamicFormPropertyComponent.prototype,"model",void 0),__decorate([core.Input(),__metadata("design:type",forms.FormGroup)],DynamicFormPropertyComponent.prototype,"form",void 0),DynamicFormPropertyComponent=__decorate([core.Component({selector:"df-property",template:'\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ',encapsulation:core.ViewEncapsulation.None}),__metadata("design:paramtypes",[])],DynamicFormPropertyComponent)}(),FloModule=function(){function FloModule(){}return FloModule=__decorate([core.NgModule({imports:[forms.FormsModule,common.CommonModule,forms.ReactiveFormsModule],declarations:[Palette,EditorComponent,ResizerDirective,DslEditorComponent,CodeEditorComponent,PropertiesGroupComponent,DynamicFormPropertyComponent],exports:[EditorComponent,DslEditorComponent,DynamicFormPropertyComponent,PropertiesGroupComponent]})],FloModule)}();exports.FloModule=FloModule,exports.Palette=Palette,exports.EditorComponent=EditorComponent,exports.DslEditorComponent=DslEditorComponent,exports.CodeEditorComponent=CodeEditorComponent,exports.PropertiesGroupComponent=PropertiesGroupComponent,exports.DynamicFormPropertyComponent=DynamicFormPropertyComponent,exports.ResizerDirective=ResizerDirective,Object.defineProperty(exports,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/dist/esm2015/code-editor/code-editor.component.js b/dist/esm2015/code-editor/code-editor.component.js new file mode 100644 index 0000000..01f12b5 --- /dev/null +++ b/dist/esm2015/code-editor/code-editor.component.js @@ -0,0 +1,249 @@ +import * as tslib_1 from "tslib"; +var CodeEditorComponent_1; +import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation, forwardRef } from '@angular/core'; +import { NG_VALUE_ACCESSOR } from '@angular/forms'; +import * as CodeMirror from 'codemirror-minified'; +import * as _$ from 'jquery'; +const $ = _$; +// CodeMirror extensions +import 'codemirror-minified/mode/meta'; +import 'codemirror-minified/addon/lint/lint'; +import 'codemirror-minified/addon/hint/show-hint'; +// import 'codemirror-minified/addon/mode/loadmode'; +import 'codemirror-minified/addon/edit/matchbrackets'; +import 'codemirror-minified/addon/edit/closebrackets'; +import 'codemirror-minified/addon/display/placeholder'; +import 'codemirror-minified/addon/scroll/annotatescrollbar'; +import 'codemirror-minified/addon/scroll/simplescrollbars'; +// Lint support +// Unclear how to import this dynamically... +import 'codemirror-minified/addon/lint/javascript-lint'; +import 'codemirror-minified/addon/lint/coffeescript-lint'; +import 'codemirror-minified/addon/lint/json-lint'; +import 'codemirror-minified/addon/lint/yaml-lint'; +// TODO: use dynamic import with JS7 in the future. CM autoLoad cannot load it properly - thinks its AMD +// Supported languages until dynamic loading +import 'codemirror-minified/mode/groovy/groovy'; +import 'codemirror-minified/mode/javascript/javascript'; +import 'codemirror-minified/mode/python/python'; +import 'codemirror-minified/mode/ruby/ruby'; +import 'codemirror-minified/mode/clike/clike'; +import 'codemirror-minified/mode/yaml/yaml'; +import 'codemirror-minified/mode/coffeescript/coffeescript'; +let CodeEditorComponent = CodeEditorComponent_1 = class CodeEditorComponent { + constructor(element) { + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.dslChange = new EventEmitter(); + this.focus = new EventEmitter(); + this.blur = new EventEmitter(); + this.editor = new EventEmitter(); + this._dslChangedHandler = () => { + this._dsl = this.doc.getValue(); + this.dslChange.emit(this._dsl); + if (this._onChangeHandler) { + this._onChangeHandler(this._dsl); + } + }; + } + set dsl(dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + let cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + } + set language(_language) { + if (this._language !== _language) { + this._language = _language; + this.loadEditorMode(); + } + } + ngOnInit() { + let options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + matchBrackets: true, + autoCloseBrackets: true, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + this.doc = CodeMirror.fromTextArea($('#code-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this._dslChangedHandler); + this.doc.on('focus', () => { + this.focus.emit(); + if (this._onTouchHandler) { + this._onTouchHandler(); + } + }); + this.doc.on('blur', () => this.blur.emit()); + this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); + this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); + this.loadEditorMode(); + this.editor.emit(this.doc); + } + loadEditorMode() { + // CodeMirror doc object must be initialized + if (!this.doc) { + return; + } + const info = this._language ? CodeMirror.findModeByName(this._language) : undefined; + // Set proper editor mode + if (info) { + this.doc.setOption('mode', info.mime); + // (CodeMirror).autoLoadMode(this.doc, info.mode); + } + else { + this.doc.setOption('mode', 'text/plain'); + } + // Set proper Lint mode + this.doc.setOption('lint', this.getLintOptions()); + } + ngOnDestroy() { + } + writeValue(obj) { + this.dsl = obj; + } + registerOnChange(fn) { + this._onChangeHandler = fn; + } + registerOnTouched(fn) { + this._onTouchHandler = fn; + } + getLintOptions() { + switch (this._language) { + case 'javascript': + case 'json': + case 'coffeescript': + case 'yaml': + return { + onUpdateLinting: (annotations) => { + const warnings = []; + const errors = []; + if (this.overviewRuler) { + if (Array.isArray(annotations)) { + annotations.forEach((a) => { + if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { + if (a.severity === 'error') { + errors.push(a); + } + else if (a.severity === 'warning') { + warnings.push(a); + } + } + }); + } + } + this.warningRuler.update(warnings); + this.errorRuler.update(errors); + } + }; + } + return false; + } +}; +tslib_1.__decorate([ + Input('line-numbers'), + tslib_1.__metadata("design:type", Object) +], CodeEditorComponent.prototype, "lineNumbers", void 0); +tslib_1.__decorate([ + Input('line-wrapping'), + tslib_1.__metadata("design:type", Object) +], CodeEditorComponent.prototype, "lineWrapping", void 0); +tslib_1.__decorate([ + Input('scrollbar-style'), + tslib_1.__metadata("design:type", String) +], CodeEditorComponent.prototype, "scrollbarStyle", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String) +], CodeEditorComponent.prototype, "placeholder", void 0); +tslib_1.__decorate([ + Input('overview-ruler'), + tslib_1.__metadata("design:type", Boolean) +], CodeEditorComponent.prototype, "overviewRuler", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], CodeEditorComponent.prototype, "dslChange", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], CodeEditorComponent.prototype, "focus", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], CodeEditorComponent.prototype, "blur", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], CodeEditorComponent.prototype, "editor", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) +], CodeEditorComponent.prototype, "dsl", null); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) +], CodeEditorComponent.prototype, "language", null); +CodeEditorComponent = CodeEditorComponent_1 = tslib_1.__decorate([ + Component({ + selector: 'code-editor', + template: ` +
+ +
+ `, + styles: [` + .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + height: 100%; + } + .CodeMirror-hint { + max-width: 38em; + } + .CodeMirror-vertical-ruler-error { + background-color: rgba(188, 0, 0, 0.5); + } + .CodeMirror-vertical-ruler-warning { + background-color: rgba(255, 188, 0, 0.5); + } + .CodeMirror-lint-tooltip { + z-index: 2000; + } + `], + encapsulation: ViewEncapsulation.None, + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CodeEditorComponent_1), + multi: true + } + ] + }), + tslib_1.__metadata("design:paramtypes", [ElementRef]) +], CodeEditorComponent); +export { CodeEditorComponent }; +//# sourceMappingURL=code-editor.component.js.map \ No newline at end of file diff --git a/dist/esm2015/directives/resizer.js b/dist/esm2015/directives/resizer.js new file mode 100644 index 0000000..1977e8e --- /dev/null +++ b/dist/esm2015/directives/resizer.js @@ -0,0 +1,161 @@ +import * as tslib_1 from "tslib"; +import { Directive, Input, Output, EventEmitter, Inject, ElementRef } from '@angular/core'; +import { DOCUMENT } from '@angular/platform-browser'; +import { fromEvent } from 'rxjs'; +import { sampleTime } from 'rxjs/operators'; +import { CompositeDisposable, Disposable } from 'ts-disposables'; +import * as _$ from 'jquery'; +const $ = _$; +let ResizerDirective = class ResizerDirective { + constructor(element, document) { + this.element = element; + this.document = document; + this.dragInProgress = false; + this.vertical = true; + this._subscriptions = new CompositeDisposable(); + this.sizeChange = new EventEmitter(); + this.mouseMoveHandler = (e) => { + if (this.dragInProgress) { + this.mousemove(e); + } + }; + } + set splitSize(splitSize) { + if (this.maxSplitSize && splitSize > this.maxSplitSize) { + splitSize = this.maxSplitSize; + } + if (this.vertical) { + // Handle vertical resizer + $(this.element.nativeElement).css({ + left: splitSize + 'px' + }); + $(this.first).css({ + width: splitSize + 'px' + }); + $(this.second).css({ + left: (splitSize + this._size) + 'px' + }); + } + else { + // Handle horizontal resizer + $(this.element.nativeElement).css({ + bottom: splitSize + 'px' + }); + $(this.first).css({ + bottom: (splitSize + this._size) + 'px' + }); + $(this.second).css({ + height: splitSize + 'px' + }); + } + this._splitSize = splitSize; + // Update the local field + this.sizeChange.emit(splitSize); + } + set resizerWidth(width) { + this._size = width; + this.vertical = true; + } + set resizerHeight(height) { + this._size = height; + this.vertical = false; + } + set resizerLeft(first) { + this.first = first; + } + set resizerTop(first) { + this.first = first; + } + set resizerRight(second) { + this.second = second; + } + set resizerBottom(second) { + this.second = second; + } + startDrag() { + this.dragInProgress = true; + } + mousemove(event) { + let size; + if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node + size = event.pageX - $(this.first).offset().left; + } + else { + // Handle horizontal resizer Calculate new size relative to palette container DOM node + size = window.innerHeight - event.pageY - $(this.second).offset().top; + } + this.splitSize = size; + } + ngOnInit() { + // Need to set left and right elements width and fire events on init when DOM is built + this.splitSize = this._splitSize; + let subscription1 = fromEvent($(this.document).get(0), 'mousemove') + .pipe(sampleTime(300)) + .subscribe(this.mouseMoveHandler); + this._subscriptions.add(Disposable.create(() => subscription1.unsubscribe())); + let subscription2 = fromEvent($(this.document).get(0), 'mouseup') + .subscribe(e => { + if (this.dragInProgress) { + this.mousemove(e); + this.dragInProgress = false; + } + }); + this._subscriptions.add(Disposable.create(() => subscription2.unsubscribe())); + } + ngOnDestroy() { + this._subscriptions.dispose(); + } +}; +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number) +], ResizerDirective.prototype, "maxSplitSize", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], ResizerDirective.prototype, "sizeChange", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number), + tslib_1.__metadata("design:paramtypes", [Number]) +], ResizerDirective.prototype, "splitSize", null); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number), + tslib_1.__metadata("design:paramtypes", [Number]) +], ResizerDirective.prototype, "resizerWidth", null); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number), + tslib_1.__metadata("design:paramtypes", [Number]) +], ResizerDirective.prototype, "resizerHeight", null); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) +], ResizerDirective.prototype, "resizerLeft", null); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) +], ResizerDirective.prototype, "resizerTop", null); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) +], ResizerDirective.prototype, "resizerRight", null); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) +], ResizerDirective.prototype, "resizerBottom", null); +ResizerDirective = tslib_1.__decorate([ + Directive({ + selector: '[resizer]', + host: { '(mousedown)': 'startDrag()' } + }), + tslib_1.__param(1, Inject(DOCUMENT)), + tslib_1.__metadata("design:paramtypes", [ElementRef, Object]) +], ResizerDirective); +export { ResizerDirective }; +//# sourceMappingURL=resizer.js.map \ No newline at end of file diff --git a/dist/esm2015/dsl-editor/dsl-editor.component.js b/dist/esm2015/dsl-editor/dsl-editor.component.js new file mode 100644 index 0000000..860a577 --- /dev/null +++ b/dist/esm2015/dsl-editor/dsl-editor.component.js @@ -0,0 +1,168 @@ +import * as tslib_1 from "tslib"; +import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation } from '@angular/core'; +import * as _ from 'lodash'; +import * as CodeMirror from 'codemirror-minified'; +import * as _$ from 'jquery'; +const $ = _$; +import 'codemirror-minified/addon/lint/lint'; +import 'codemirror-minified/addon/hint/show-hint'; +import 'codemirror-minified/addon/display/placeholder'; +import 'codemirror-minified/addon/scroll/annotatescrollbar'; +import 'codemirror-minified/addon/scroll/simplescrollbars'; +let DslEditorComponent = class DslEditorComponent { + constructor(element) { + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.debounce = 0; + this.dslChange = new EventEmitter(); + this.focus = new EventEmitter(); + this.blur = new EventEmitter(); + this.editor = new EventEmitter(); + this._dslChangedHandler = () => { + this._dsl = this.doc.getValue(); + this.dslChange.emit(this._dsl); + }; + } + set dsl(dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + let cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + } + set lintOptions(lintOptions) { + this._lint = lintOptions; + if (this.doc) { + this.doc.setOption('lint', this._lint); + } + } + set hintOptions(hintOptions) { + this._hint = hintOptions; + if (this.doc) { + this.doc.setOption('hintOptions', this._hint); + } + } + ngOnInit() { + let options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + electricChars: false, + smartIndent: false, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + if (this._hint) { + options.hintOptions = this._hint; + } + this.doc = CodeMirror.fromTextArea($('#dsl-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this.debounce ? _.debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); + this.doc.on('focus', () => this.focus.emit()); + this.doc.on('blur', () => this.blur.emit()); + this.editor.emit(this.doc); + } + ngOnDestroy() { + } +}; +tslib_1.__decorate([ + Input('line-numbers'), + tslib_1.__metadata("design:type", Object) +], DslEditorComponent.prototype, "lineNumbers", void 0); +tslib_1.__decorate([ + Input('line-wrapping'), + tslib_1.__metadata("design:type", Object) +], DslEditorComponent.prototype, "lineWrapping", void 0); +tslib_1.__decorate([ + Input('scrollbar-style'), + tslib_1.__metadata("design:type", String) +], DslEditorComponent.prototype, "scrollbarStyle", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String) +], DslEditorComponent.prototype, "placeholder", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], DslEditorComponent.prototype, "debounce", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], DslEditorComponent.prototype, "dslChange", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], DslEditorComponent.prototype, "focus", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], DslEditorComponent.prototype, "blur", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], DslEditorComponent.prototype, "editor", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) +], DslEditorComponent.prototype, "dsl", null); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object), + tslib_1.__metadata("design:paramtypes", [Object]) +], DslEditorComponent.prototype, "lintOptions", null); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object), + tslib_1.__metadata("design:paramtypes", [Object]) +], DslEditorComponent.prototype, "hintOptions", null); +DslEditorComponent = tslib_1.__decorate([ + Component({ + selector: 'dsl-editor', + template: ` + + `, + styles: [` + .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */ + + .CodeMirror { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + height: 100%; + } + .CodeMirror-hint { + max-width: 38em; + } + .CodeMirror-vertical-ruler-error { + background-color: rgba(188, 0, 0, 0.5); + } + .CodeMirror-vertical-ruler-warning { + background-color: rgba(255, 188, 0, 0.5); + } + + + /* Code Mirror related styles END */ + `], + encapsulation: ViewEncapsulation.None + }), + tslib_1.__metadata("design:paramtypes", [ElementRef]) +], DslEditorComponent); +export { DslEditorComponent }; +//# sourceMappingURL=dsl-editor.component.js.map \ No newline at end of file diff --git a/dist/esm2015/editor/editor-utils.js b/dist/esm2015/editor/editor-utils.js new file mode 100644 index 0000000..2f16930 --- /dev/null +++ b/dist/esm2015/editor/editor-utils.js @@ -0,0 +1,108 @@ +import { Flo } from '../shared/flo-common'; +import * as _ from 'lodash'; +const joint = Flo.joint; +import * as _$ from 'jquery'; +const $ = _$; +export class Utils { + static fanRoute(graph, cell) { + if (cell instanceof joint.dia.Element) { + const links = graph.getConnectedLinks(cell); + const groupsOfOverlappingLinks = _.groupBy(links, (link) => { + // the key of the group is the model id of the link's source or target, but not our cell id. + const sourceId = link.get('source').id; + const targetId = link.get('target').id; + return cell.id !== sourceId ? sourceId : targetId; + }); + _.each(groupsOfOverlappingLinks, (group, key) => { + // If the member of the group has both source and target model adjust vertices. + let toRoute = {}; + if (key !== undefined) { + group.forEach((link) => { + if (link.get('source').id === cell.get('id') && link.get('target').id) { + toRoute[link.get('target').id] = link; + } + else if (link.get('target').id === cell.get('id') && link.get('source').id) { + toRoute[link.get('source').id] = link; + } + }); + Object.keys(toRoute).forEach(k => { + Utils.fanRoute(graph, toRoute[k]); + }); + } + }); + } + else if (cell instanceof joint.dia.Link) { + // The cell is a link. Let's find its source and target models. + let srcId = cell.get('source').id || cell.previous('source').id; + let trgId = cell.get('target').id || cell.previous('target').id; + // If one of the ends is not a model, the link has no siblings. + if (!srcId || !trgId) { + return; + } + const siblings = graph.getLinks().filter((sibling) => { + const _srcId = sibling.get('source').id; + const _trgId = sibling.get('target').id; + const vertices = sibling.get('vertices'); + const fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); + return ((_srcId === srcId && _trgId === trgId) || (_srcId === trgId && _trgId === srcId)) && fanRouted; + }); + switch (siblings.length) { + case 0: + // The link was removed and had no siblings. + break; + case 1: + // There is only one link between the source and target. No vertices needed. + let vertices = cell.get('vertices'); + if (vertices && vertices.length && cell.get('fanRouted')) { + cell.unset('vertices'); + } + break; + default: + // There is more than one siblings. We need to create vertices. + // First of all we'll find the middle point of the link. + let source = graph.getCell(srcId); + let target = graph.getCell(trgId); + if (!source || !target) { + // When clearing the graph it may happen that some nodes are gone and some are left + return; + } + let srcCenter = source.getBBox().center(); + let trgCenter = target.getBBox().center(); + let midPoint = joint.g.line(srcCenter, trgCenter).midpoint(); + // Then find the angle it forms. + let theta = srcCenter.theta(trgCenter); + // This is the maximum distance between links + let gap = 20; + siblings.forEach((sibling, index) => { + // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. + let offset = gap * Math.ceil(index / 2); + // Now we need the vertices to be placed at points which are 'offset' pixels distant + // from the first link and forms a perpendicular angle to it. And as index goes up + // alternate left and right. + // + // ^ odd indexes + // | + // |----> index 0 line (straight line between a source center and a target center. + // | + // v even indexes + let sign = index % 2 ? 1 : -1; + let angle = joint.g.toRad(theta + sign * 90); + // We found the vertex. + let vertex = joint.g.point.fromPolar(offset, angle, midPoint); + sibling.set('fanRouted', true); + sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); + }); + } + } + } + static isCustomPaperEvent(args) { + return args.length === 5 && + _.isString(args[0]) && + (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && + args[1] instanceof $.Event && + args[2] instanceof joint.dia.CellView && + _.isNumber(args[3]) && + _.isNumber(args[4]); + } +} +//# sourceMappingURL=editor-utils.js.map \ No newline at end of file diff --git a/dist/esm2015/editor/editor.component.js b/dist/esm2015/editor/editor.component.js new file mode 100644 index 0000000..38582c6 --- /dev/null +++ b/dist/esm2015/editor/editor.component.js @@ -0,0 +1,1778 @@ +import * as tslib_1 from "tslib"; +import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation } from '@angular/core'; +import { debounceTime } from 'rxjs/operators'; +import { Flo } from '../shared/flo-common'; +import { Shapes, Constants } from '../shared/shapes'; +import { Utils } from './editor-utils'; +import { CompositeDisposable, Disposable } from 'ts-disposables'; +import * as _$ from 'jquery'; +import * as _ from 'lodash'; +import { Subject, BehaviorSubject } from 'rxjs'; +const joint = Flo.joint; +const $ = _$; +const SCROLLBAR_SIZE = 17; +let EditorComponent = class EditorComponent { + constructor(element) { + this.element = element; + /** + * Flag specifying whether the Flo-Editor is in read-only mode. + */ + this._readOnlyCanvas = false; + /** + * Grid size + */ + this._gridSize = 1; + this._hiddenPalette = false; + this.textToGraphEventEmitter = new EventEmitter(); + this.graphToTextEventEmitter = new EventEmitter(); + this._graphToTextSyncEnabled = true; + this.validationEventEmitter = new EventEmitter(); + this._disposables = new CompositeDisposable(); + this._dslText = ''; + this.textToGraphConversionCompleted = new Subject(); + this.graphToTextConversionCompleted = new Subject(); + this.paletteReady = new BehaviorSubject(false); + /** + * Min zoom percent value + */ + this.minZoom = 5; + /** + * Max zoom percent value + */ + this.maxZoom = 400; + /** + * Zoom percent increment/decrement step + */ + this.zoomStep = 5; + this.paperPadding = 0; + this.floApi = new EventEmitter(); + this.validationMarkers = new EventEmitter(); + this.contentValidated = new EventEmitter(); + this.dslChange = new EventEmitter(); + this._resizeHandler = () => this.autosizePaper(); + let self = this; + this.editorContext = new (class DefaultRunnableContext { + set zoomPercent(percent) { + self.zoomPercent = percent; + } + get zoomPercent() { + return self.zoomPercent; + } + set noPalette(noPalette) { + self.noPalette = noPalette; + } + get noPalette() { + return self.noPalette; + } + set gridSize(gridSize) { + self.gridSize = gridSize; + } + get gridSize() { + return self.gridSize; + } + set readOnlyCanvas(readOnly) { + self.readOnlyCanvas = readOnly; + } + get readOnlyCanvas() { + return self.readOnlyCanvas; + } + setDsl(dsl) { + self.dsl = dsl; + } + updateGraph() { + return self.updateGraphRepresentation(); + } + updateText() { + return self.updateTextRepresentation(); + } + performLayout() { + return self.doLayout(); + } + clearGraph() { + self.selection = undefined; + self.graph.clear(); + if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { + return self.metamodel.load().then(data => { + self.editor.setDefaultContent(this, data); + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + }); + } + else { + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + } + } + getGraph() { + return self.graph; + } + getPaper() { + return self.paper; + } + get graphToTextSync() { + return self.graphToTextSync; + } + set graphToTextSync(sync) { + self.graphToTextSync = sync; + } + getMinZoom() { + return self.minZoom; + } + getMaxZoom() { + return self.maxZoom; + } + getZoomStep() { + return self.zoomStep; + } + fitToPage() { + self.fitToPage(); + } + createNode(metadata, props, position) { + return self.createNode(metadata, props, position); + } + createLink(source, target, metadata, props) { + return self.createLink(source, target, metadata, props); + } + get selection() { + return self.selection; + } + set selection(newSelection) { + self.selection = newSelection; + } + deleteSelectedNode() { + if (self.selection) { + if (self.editor && self.editor.preDelete) { + self.editor.preDelete(self.editorContext, self.selection.model); + } + else { + if (self.selection.model instanceof joint.dia.Element) { + self.graph.getConnectedLinks(self.selection.model).forEach((l) => l.remove()); + } + } + self.selection.model.remove(); + self.selection = undefined; + } + } + get textToGraphConversionObservable() { + return self.textToGraphConversionCompleted; + } + get graphToTextConversionObservable() { + return self.graphToTextConversionCompleted; + } + get paletteReady() { + return self.paletteReady; + } + })(); + } + ngOnInit() { + this.initGraph(); + this.initPaper(); + this.initGraphListeners(); + this.initPaperListeners(); + this.initMetamodel(); + $(window).on('resize', this._resizeHandler); + this._disposables.add(Disposable.create(() => $(window).off('resize', this._resizeHandler))); + /* + * Execute resize to get the right size for the SVG element on the editor canvas. + * Executed via timeout to let angular render the DOM first and elements to have the right width and height + */ + window.setTimeout(this._resizeHandler); + this.floApi.emit(this.editorContext); + } + ngOnDestroy() { + this._disposables.dispose(); + } + get noPalette() { + return this._hiddenPalette; + } + set noPalette(hidden) { + this._hiddenPalette = hidden; + // If palette is not shown ensure that canvas starts from the left==0! + if (hidden) { + $('#paper-container', this.element.nativeElement).css('left', 0); + } + } + get graphToTextSync() { + return this._graphToTextSyncEnabled; + } + set graphToTextSync(sync) { + this._graphToTextSyncEnabled = sync; + // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion + // this.performGraphToTextSyncing(); + } + performGraphToTextSyncing() { + if (this._graphToTextSyncEnabled) { + this.graphToTextEventEmitter.emit(); + } + } + createHandle(element, kind, action, location) { + if (!location) { + let bbox = element.model.getBBox(); + location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); + } + let handle = Shapes.Factory.createHandle({ + renderer: this.renderer, + paper: this.paper, + parent: element.model, + kind: kind, + position: location + }); + const view = this.paper.findViewByModel(handle); + view.on('cell:pointerdown', () => { + if (action) { + action(); + } + }); + view.on('cell:mouseover', () => { + handle.attr('image/filter', { + name: 'dropShadow', + args: { dx: 1, dy: 1, blur: 1, color: 'black' } + }); + }); + view.on('cell:mouseout', () => { + handle.removeAttr('image/filter'); + }); + view.setInteractivity(false); + return handle; + } + removeEmbeddedChildrenOfType(element, types) { + let embeds = element.getEmbeddedCells(); + for (let i = 0; i < embeds.length; i++) { + if (types.indexOf(embeds[i].get('type')) >= 0) { + embeds[i].remove(); + } + } + } + get selection() { + return this._selection; + } + set selection(newSelection) { + if (newSelection && (newSelection.model.get('type') === joint.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint.shapes.flo.HANDLE_TYPE)) { + newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); + } + if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { + newSelection = undefined; + } + if (newSelection !== this._selection) { + if (this._selection) { + const elementview = this.paper.findViewByModel(this._selection.model); + if (elementview) { // May have been removed from the graph + this.removeEmbeddedChildrenOfType(elementview.model, joint.shapes.flo.HANDLE_TYPE); + elementview.unhighlight(); + } + } + if (newSelection) { + newSelection.highlight(); + if (this.editor && this.editor.createHandles) { + this.editor.createHandles(this.editorContext, (owner, kind, action, location) => this.createHandle(owner, kind, action, location), newSelection); + } + } + this._selection = newSelection; + } + } + get readOnlyCanvas() { + return this._readOnlyCanvas; + } + set readOnlyCanvas(value) { + if (this._readOnlyCanvas === value) { + // Nothing to do + return; + } + if (value) { + this.selection = undefined; + } + if (this.graph) { + this.graph.getLinks().forEach((link) => { + if (value) { + link.attr('.link-tools/display', 'none'); + link.attr('.marker-vertices/display', 'none'); + link.attr('.connection-wrap/display', 'none'); + } + else { + link.removeAttr('.link-tools/display'); + if (this.editor && this.editor.allowLinkVertexEdit) { + link.removeAttr('.marker-vertices/display'); + } + link.removeAttr('.connection-wrap/display'); + } + }); + } + this._readOnlyCanvas = value; + } + /** + * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + showDragFeedback(dragDescriptor) { + if (this.editor && this.editor.showDragFeedback) { + this.editor.showDragFeedback(this.editorContext, dragDescriptor); + } + else { + let magnet; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint.V(magnet).addClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint.V(magnet).addClass('dnd-target-feedback'); + } + } + } + } + } + /** + * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + hideDragFeedback(dragDescriptor) { + if (this.editor && this.editor.hideDragFeedback) { + this.editor.hideDragFeedback(this.editorContext, dragDescriptor); + } + else { + let magnet; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint.V(magnet).removeClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint.V(magnet).removeClass('dnd-target-feedback'); + } + } + } + } + } + /** + * Sets the new DnD info object - the descriptor for DnD + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + setDragDescriptor(dragDescriptor) { + if (this.highlighted === dragDescriptor) { + return; + } + if (this.highlighted && dragDescriptor && _.isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { + if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { + return; + } + if (this.highlighted.source && + dragDescriptor.source && + this.highlighted.target && + dragDescriptor.target && + this.highlighted.source.view.model === dragDescriptor.source.view.model && + this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && + this.highlighted.target.view.model === dragDescriptor.target.view.model && + this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { + return; + } + } + if (this.highlighted) { + this.hideDragFeedback(this.highlighted); + } + this.highlighted = dragDescriptor; + if (this.highlighted) { + this.showDragFeedback(this.highlighted); + } + } + /** + * Handles DnD events when a node is being dragged over canvas + * + * @param draggedView The Joint JS view object being dragged + * @param targetUnderMouse The Joint JS view under mouse cursor + * @param x X coordinate of the mouse on the canvas + * @param y Y coordinate of the mosue on the canvas + * @param context DnD context (palette or canvas) + */ + handleNodeDragging(draggedView, targetUnderMouse, x, y, sourceComponent) { + if (this.editor && this.editor.calculateDragDescriptor) { + this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint.g.point(x, y), sourceComponent)); + } + } + /** + * Handles DnD drop event when a node is being dragged and dropped on the main canvas + */ + handleNodeDropping() { + if (this.highlighted && this.editor && this.editor.handleNodeDropping) { + this.editor.handleNodeDropping(this.editorContext, this.highlighted); + } + this.setDragDescriptor(undefined); + } + /** + * Hides DOM Node (used to determine drop target DOM element) + * @param domNode DOM node to hide + * @returns + */ + _hideNode(domNode) { + let oldVisibility = { + visibility: domNode.style ? domNode.style.display : undefined, + children: [] + }; + for (let i = 0; i < domNode.children.length; i++) { + let node = domNode.children.item(i); + if (node instanceof HTMLElement) { + oldVisibility.children.push(this._hideNode(node)); + } + } + domNode.style.display = 'none'; + return oldVisibility; + } + /** + * Restored DOM node original visibility (used to determine drop target DOM element) + * @param domNode DOM node to restore visibility of + * @param oldVisibility original visibility parameter + */ + _restoreNodeVisibility(domNode, oldVisibility) { + if (domNode.style) { + domNode.style.display = oldVisibility.visibility; + } + let j = 0; + for (let i = 0; i < domNode.childNodes.length; i++) { + if (j < oldVisibility.children.length) { + let node = domNode.children.item(i); + if (node instanceof HTMLElement) { + this._restoreNodeVisibility(node, oldVisibility.children[j++]); + } + } + } + } + /** + * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. + * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location + * (bounding box of a link for testing is bad). + * The result of that is that links can only be the drop target when dragging from the palette currently. + * When DnDing shapes on the canvas drop target cannot be a link. + * + * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked + * - e.g. Drag-n-Drop) + */ + getTargetViewFromEvent(event, x, y, excludeViews = []) { + if (!x && !y) { + let l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); + x = l.x; + y = l.y; + } + // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing + // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); + // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); + // if (underMouse) { + // return underMouse; + // } + let oldVisibility = excludeViews.map(_x => this._hideNode(_x.el)); + let targetElement = document.elementFromPoint(event.clientX, event.clientY); + excludeViews.forEach((excluded, i) => { + this._restoreNodeVisibility(excluded.el, oldVisibility[i]); + }); + return this.paper.findView($(targetElement)); + } + handleDnDFromPalette(dndEvent) { + switch (dndEvent.type) { + case Flo.DnDEventType.DRAG: + this.handleDragFromPalette(dndEvent); + break; + case Flo.DnDEventType.DROP: + this.handleDropFromPalette(dndEvent); + break; + default: + break; + } + } + handleDragFromPalette(dnDEvent) { + console.debug('Dragging from palette'); + if (dnDEvent.view && !this.readOnlyCanvas) { + let location = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); + this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location.x, location.y, [dnDEvent.view]), location.x, location.y, Constants.PALETTE_CONTEXT); + } + } + createNode(metadata, props, position) { + return Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.paper, + metadata: metadata, + props: props, + position: position + }); + } + createLink(source, target, metadata, props) { + return Shapes.Factory.createLink({ + renderer: this.renderer, + paper: this.paper, + source: source, + target: target, + metadata: metadata, + props: props + }); + } + handleDropFromPalette(event) { + let cellview = event.view; + let evt = event.event; + if (this.paper.el === evt.target || $.contains(this.paper.el, evt.target)) { + if (this.readOnlyCanvas) { + this.setDragDescriptor(undefined); + } + else { + let metadata = cellview.model.attr('metadata'); + let props = cellview.model.attr('props'); + let position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); + /* Calculate target element before creating the new + * element under mouse location. Otherwise target + * element would be the newly created element because + * it's under the mouse pointer + */ + let targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); + let newNode = this.createNode(metadata, props, position); + let newView = this.paper.findViewByModel(newNode); + this.handleNodeDragging(newView, targetElement, position.x, position.y, Constants.PALETTE_CONTEXT); + this.handleNodeDropping(); + } + } + } + fitToContent(gridWidth, gridHeight, padding, opt) { + const paper = this.paper; + if (joint.util.isObject(gridWidth)) { + // first parameter is an option object + opt = gridWidth; + gridWidth = opt.gridWidth || 1; + gridHeight = opt.gridHeight || 1; + padding = opt.padding || 0; + } + else { + opt = opt || {}; + gridWidth = gridWidth || 1; + gridHeight = gridHeight || 1; + padding = padding || 0; + } + const paddingJson = joint.util.normalizeSides(padding); + // Calculate the paper size to accomodate all the graph's elements. + const bbox = joint.V(paper.viewport).getBBox(); + const currentScale = paper.scale(); + const currentTranslate = paper.translate(); + bbox.x *= currentScale.sx; + bbox.y *= currentScale.sy; + bbox.width *= currentScale.sx; + bbox.height *= currentScale.sy; + let calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; + let calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; + let tx = 0; + let ty = 0; + if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { + tx = (-bbox.x / gridWidth) * gridWidth; + tx += paddingJson.left; + } + else if (opt.allowNewOrigin === 'same') { + tx = currentTranslate.tx; + } + calcWidth += tx; + if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { + ty = (-bbox.y / gridHeight) * gridHeight; + ty += paddingJson.top; + } + else if (opt.allowNewOrigin === 'same') { + ty = currentTranslate.ty; + } + calcHeight += ty; + calcWidth += paddingJson.right; + calcHeight += paddingJson.bottom; + // Make sure the resulting width and height are greater than minimum. + calcWidth = Math.max(calcWidth, opt.minWidth || 0); + calcHeight = Math.max(calcHeight, opt.minHeight || 0); + // Make sure the resulting width and height are lesser than maximum. + calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); + calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); + const dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; + const originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; + // Change the dimensions only if there is a size discrepency or an origin change + if (originChange) { + paper.translate(tx, ty); + } + if (dimensionChange) { + paper.setDimensions(calcWidth, calcHeight); + } + } + autosizePaper() { + let parent = $('#paper-container', this.element.nativeElement); + const parentWidth = parent.innerWidth(); + const parentHeight = parent.innerHeight(); + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth - SCROLLBAR_SIZE, + minHeight: parentHeight - SCROLLBAR_SIZE, + allowNewOrigin: 'same' + }); + } + fitToPage() { + let parent = $('#paper-container', this.element.nativeElement); + let minScale = this.minZoom / 100; + let maxScale = 2; + const parentWidth = parent.innerWidth(); + const parentHeight = parent.innerHeight(); + this.paper.scaleContentToFit({ + padding: this.paperPadding, + minScaleX: minScale, + minScaleY: minScale, + maxScaleX: maxScale, + maxScaleY: maxScale, + fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } + }); + /** + * Size the canvas appropriately and allow origin movement + */ + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth, + minHeight: parentHeight, + maxWidth: parentWidth, + maxHeight: parentHeight, + allowNewOrigin: 'any' + }); + } + get zoomPercent() { + return Math.round(joint.V(this.paper.viewport).scale().sx * 100); + } + set zoomPercent(percent) { + if (!isNaN(percent)) { + if (percent < this.minZoom) { + percent = this.minZoom; + } + else if (percent >= this.maxZoom) { + percent = this.maxZoom; + } + else { + if (percent <= 0) { + percent = 0.00001; + } + } + this.paper.scale(percent / 100, percent / 100); + } + } + get gridSize() { + return this._gridSize; + } + set gridSize(size) { + if (!isNaN(size) && size >= 1) { + this._gridSize = size; + if (this.paper) { + this.paper.setGridSize(size); + } + } + } + validateContent() { + return new Promise(resolve => { + if (this.editor && this.editor.validate) { + return this.editor + .validate(this.graph, this.dsl, this.editorContext) + .then(allMarkers => { + this.graph.getCells() + .forEach((cell) => this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : [])); + this.validationMarkers.emit(allMarkers); + this.contentValidated.emit(true); + resolve(); + }); + } + else { + resolve(); + } + }); + } + markElement(cell, markers) { + let errorMessages = markers.map(m => m.message); + let errorCell = cell.getEmbeddedCells().find((e) => e.attr('./kind') === Constants.ERROR_DECORATION_KIND); + if (errorCell) { + if (errorMessages.length === 0) { + errorCell.remove(); + } + else { + // Without rewrite we merge this list with existing errors + errorCell.attr('messages', errorMessages, { rewrite: true }); + } + } + else if (errorMessages.length > 0) { + let error = Shapes.Factory.createDecoration({ + renderer: this.renderer, + paper: this.paper, + parent: cell, + kind: Constants.ERROR_DECORATION_KIND, + messages: errorMessages + }); + let pt; + const view = this.paper.findViewByModel(error); + if (cell instanceof joint.dia.Element) { + pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); + error.set('position', pt); + view.setInteractivity(false); + } + else { + // TODO: do something for the link perhaps? + } + } + } + doLayout() { + if (this.renderer && this.renderer.layout) { + return this.renderer.layout(this.paper); + } + } + set dsl(dslText) { + if (this._dslText !== dslText) { + this._dslText = dslText; + this.textToGraphEventEmitter.emit(); + } + } + get dsl() { + return this._dslText; + } + /** + * Ask the server to parse the supplied text into a JSON graph of nodes and links, + * then update the view based on that new information. + */ + updateGraphRepresentation() { + console.debug(`Updating graph to represent '${this._dslText}'`); + if (this.metamodel && this.metamodel.textToGraph) { + return this.metamodel.textToGraph(this.editorContext, this._dslText).then(() => { + this.textToGraphConversionCompleted.next(); + return this.validateContent(); + }); + } + else { + this.textToGraphConversionCompleted.next(); + return this.validateContent(); + } + } + updateTextRepresentation() { + if (this.metamodel && this.metamodel.graphToText) { + return this.metamodel.graphToText(this.editorContext).then(text => { + if (this._dslText !== text) { + this._dslText = text; + this.dslChange.emit(text); + } + this.graphToTextConversionCompleted.next(); + return this.validateContent(); + }) + .catch(error => { + // Validation may reveal why the graph couldn't be + // converted so let it run + this.graphToTextConversionCompleted.next(); + return this.validateContent(); + }); + } + else { + this.graphToTextConversionCompleted.next(); + return this.validateContent(); + } + } + initMetamodel() { + this.metamodel.load().then(data => { + this.updateGraphRepresentation(); + let textSyncSubscription = this.graphToTextEventEmitter.pipe(debounceTime(100)).subscribe(() => { + if (this._graphToTextSyncEnabled) { + this.updateTextRepresentation(); + } + }); + this._disposables.add(Disposable.create(() => textSyncSubscription.unsubscribe())); + // Setup content validated event emitter. Emit not validated when graph to text conversion required + let graphValidatedSubscription1 = this.graphToTextEventEmitter.subscribe(() => this.contentValidated.emit(false)); + this._disposables.add(Disposable.create(() => graphValidatedSubscription1.unsubscribe)); + // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); + // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); + let graphSyncSubscription = this.textToGraphEventEmitter.pipe(debounceTime(300)).subscribe(() => this.updateGraphRepresentation()); + this._disposables.add(Disposable.create(() => graphSyncSubscription.unsubscribe())); + // Setup content validated event emitter. Emit not validated when text to graph conversion required + let graphValidatedSubscription2 = this.textToGraphEventEmitter.subscribe(() => this.contentValidated.emit(false)); + this._disposables.add(Disposable.create(() => graphValidatedSubscription2.unsubscribe)); + if (this.editor && this.editor.setDefaultContent) { + this.editor.setDefaultContent(this.editorContext, data); + } + }); + } + initGraph() { + this.graph = new joint.dia.Graph(); + this.graph.set('type', Constants.CANVAS_CONTEXT); + this.graph.set('paperPadding', this.paperPadding); + } + handleNodeCreation(node) { + node.on('change:size', this._resizeHandler); + node.on('change:position', this._resizeHandler); + if (node.attr('metadata')) { + node.on('change:attrs', (cell, attrs, changeData) => { + let propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + let propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (this.renderer && this.renderer.isSemanticProperty && this.renderer.isSemanticProperty(propAttr, node))) { + this.performGraphToTextSyncing(); + } + if (this.renderer && this.renderer.refreshVisuals) { + this.renderer.refreshVisuals(node, propAttr, this.paper); + } + } + }); + } + } + /** + * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples + * are 'change:source', 'change:target'. + */ + handleLinkEvent(event, link) { + if (this.renderer && this.renderer.handleLinkEvent) { + this.renderer.handleLinkEvent(this.editorContext, event, link); + } + } + handleLinkCreation(link) { + this.handleLinkEvent('add', link); + link.on('change:source', (l) => { + this.autosizePaper(); + let newSourceId = l.get('source').id; + let oldSourceId = l.previous('source').id; + if (newSourceId !== oldSourceId) { + this.performGraphToTextSyncing(); + } + this.handleLinkEvent('change:source', l); + }); + link.on('change:target', (l) => { + this.autosizePaper(); + let newTargetId = l.get('target').id; + let oldTargetId = l.previous('target').id; + if (newTargetId !== oldTargetId) { + this.performGraphToTextSyncing(); + } + this.handleLinkEvent('change:target', l); + }); + link.on('change:vertices', this._resizeHandler); + link.on('change:attrs', (cell, attrs, changeData) => { + let propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + let propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (this.renderer && this.renderer.isSemanticProperty && this.renderer.isSemanticProperty(propAttr, link))) { + let sourceId = link.get('source').id; + let targetId = link.get('target').id; + this.performGraphToTextSyncing(); + } + if (this.renderer && this.renderer.refreshVisuals) { + this.renderer.refreshVisuals(link, propAttr, this.paper); + } + } + }); + this.paper.findViewByModel(link).on('link:options', () => this.handleLinkEvent('options', link)); + if (this.readOnlyCanvas) { + link.attr('.link-tools/display', 'none'); + } + } + initGraphListeners() { + this.graph.on('add', (element) => { + if (element instanceof joint.dia.Link) { + this.handleLinkCreation(element); + } + else if (element instanceof joint.dia.Element) { + this.handleNodeCreation(element); + } + if (element.get('type') === joint.shapes.flo.NODE_TYPE || element.get('type') === joint.shapes.flo.LINK_TYPE) { + this.performGraphToTextSyncing(); + } + this.autosizePaper(); + }); + this.graph.on('remove', (element) => { + if (element instanceof joint.dia.Link) { + this.handleLinkEvent('remove', element); + } + if (this.selection && this.selection.model === element) { + this.selection = undefined; + } + if (element.isLink()) { + window.setTimeout(() => this.performGraphToTextSyncing(), 100); + } + else if (element.get('type') === joint.shapes.flo.NODE_TYPE) { + this.performGraphToTextSyncing(); + } + this.autosizePaper(); + }); + // Set if link is fan-routed. Should be called before routing call + this.graph.on('change:vertices', (link, changed, opt) => { + if (opt.fanRouted) { + link.set('fanRouted', true); + } + else { + link.unset('fanRouted'); + } + }); + // adjust vertices when a cell is removed or its source/target was changed + this.graph.on('add remove change:source change:target change:vertices change:position', _.partial(Utils.fanRoute, this.graph)); + } + initPaperListeners() { + // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element + this.paper.on('cell:pointerclick', (cellView) => { + if (!this.readOnlyCanvas) { + this.selection = cellView; + } + }); + this.paper.on('blank:pointerclick', () => { + this.selection = undefined; + }); + this.paper.on('scale', this._resizeHandler); + this.paper.on('all', function () { + if (Utils.isCustomPaperEvent(arguments)) { + arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); + } + }); + this.paper.on('dragging-node-over-canvas', (dndEvent) => { + console.debug(`Canvas DnD type = ${dndEvent.type}`); + let location = this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); + switch (dndEvent.type) { + case Flo.DnDEventType.DRAG: + this.handleNodeDragging(dndEvent.view, this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, Constants.CANVAS_CONTEXT); + break; + case Flo.DnDEventType.DROP: + this.handleNodeDropping(); + break; + default: + break; + } + }); + // JointJS now no longer grabs focus if working in a paper element - crude... + $('#flow-view', this.element.nativeElement).on('mousedown', () => { + $('#palette-filter-textfield', this.element.nativeElement).focus(); + }); + } + initPaper() { + let options = { + el: $('#paper', this.element.nativeElement), + gridSize: this._gridSize, + drawGrid: true, + model: this.graph, + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.shapes.flo.ElementView /*joint.dia.ElementView*/, + linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint.shapes.flo.LinkView, + // Enable link snapping within 25px lookup radius + snapLinks: { radius: 25 }, + defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ (cellView, magnet) => { + if (this.renderer && this.renderer.createLink) { + let linkEnd = { + id: cellView.model.id + }; + if (magnet) { + linkEnd.selector = cellView.getSelector(magnet, undefined); + } + if (magnet.getAttribute('port')) { + linkEnd.port = magnet.getAttribute('port'); + } + if (magnet.getAttribute('port') === 'input') { + return this.renderer.createLink(undefined, linkEnd); + } + else { + return this.renderer.createLink(linkEnd, undefined); + } + } + else { + return new joint.shapes.flo.Link(); + } + }, + // decide whether to create a link if the user clicks a magnet + validateMagnet: (cellView, magnet) => { + if (this.readOnlyCanvas) { + return false; + } + else { + if (this.editor && this.editor.validatePort) { + return this.editor.validatePort(this.editorContext, cellView, magnet); + } + else { + return true; + } + } + }, + interactive: (cellView, event) => { + if (this.readOnlyCanvas) { + return false; + } + else { + if (this.editor && this.editor.interactive) { + if (typeof this.editor.interactive === 'function') { + // Type for interactive is wrong in JointJS have to cast to + return this.editor.interactive(cellView, event); + } + else { + return this.editor.interactive; + } + } + return true; + } + }, + highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { + 'default': { + name: 'addClass', + options: { + className: 'highlighted' + } + } + }, + markAvailable: true + }; + if (this.renderer && this.renderer.getLinkAnchorPoint) { + options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; + } + if (this.editor && this.editor.validateLink) { + const self = this; + options.validateConnection = (cellViewS, magnetS, cellViewT, magnetT, end, linkView) => self.editor.validateLink(this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); + } + // The paper is what will represent the graph on the screen + this.paper = new joint.dia.Paper(options); + this._disposables.add(Disposable.create(() => this.paper.remove())); + } + updatePaletteReadyState(ready) { + this.paletteReady.next(ready); + } +}; +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "metamodel", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "renderer", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "editor", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number) +], EditorComponent.prototype, "paletteSize", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "minZoom", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "maxZoom", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "zoomStep", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "paperPadding", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "floApi", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "validationMarkers", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "contentValidated", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], EditorComponent.prototype, "dslChange", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) +], EditorComponent.prototype, "dsl", null); +EditorComponent = tslib_1.__decorate([ + Component({ + selector: 'flo-editor', + template: ` + +
+
+
+ +
+ + + +
+ +
+
+
+ + + + + + + + + + +
+ + + + + +
+
+ +
+
+
+ `, + styles: [` + /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library + + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + /* + A complete list of SVG properties that can be set through CSS is here: + http://www.w3.org/TR/SVG/styling.html + + Important note: Presentation attributes have a lower precedence over CSS style rules. + */ + + + /* .viewport is a node wrapping all diagram elements in the paper */ + .joint-viewport { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + } + + .joint-paper > svg, + .joint-paper-background, + .joint-paper-grid { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } + + /* + 1. IE can't handle paths without the \`d\` attribute for bounding box calculation + 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will + break the links rendering. + + path:not([d]) { + display: none; + } + + */ + + + /* magnet is an element that can be either source or a target of a link */ + [magnet=true]:not(.joint-element) { + cursor: crosshair; + } + [magnet=true]:not(.joint-element):hover { + opacity: .7; + } + + /* + + Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class "element basic Rect". + This makes it possible to easilly style elements in CSS and have generic CSS rules applying to + the whole group of elements. Each plugin can provide its own stylesheet. + + */ + + .joint-element { + /* Give the user a hint that he can drag&drop the element. */ + cursor: move; + } + + .joint-element * { + user-drag: none; + } + + .joint-element .scalable * { + /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */ + vector-effect: non-scaling-stroke; + } + /* + + connection-wrap is a element of the joint.dia.Link that follows the .connection of that link. + In other words, the \`d\` attribute of the .connection-wrap contains the same data as the \`d\` attribute of the + .connection . The advantage of using .connection-wrap is to be able to catch pointer events + in the neighborhood of the .connection . This is especially handy if the .connection is + very thin. + + */ + + .marker-source, + .marker-target { + /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */ + vector-effect: non-scaling-stroke; + } + + /* Paper */ + .joint-paper { + position: relative; + } + /* Paper */ + + /* Highlighting */ + .joint-highlight-opacity { + opacity: 0.3; + } + /* Highlighting */ + + /* + + Vertex markers are \`\` elements that appear at connection vertex positions. + + */ + + .joint-link .connection-wrap, + .joint-link .connection { + fill: none; + } + + /* element wrapping .marker-vertex-group. */ + .marker-vertices { + opacity: 0; + cursor: move; + } + .marker-arrowheads { + opacity: 0; + cursor: move; + cursor: -webkit-grab; + cursor: -moz-grab; + /* display: none; */ /* setting \`display: none\` on .marker-arrowheads effectivelly switches of links reconnecting */ + } + .link-tools { + opacity: 0; + cursor: pointer; + } + .link-tools .tool-options { + display: none; /* by default, we don't display link options tool */ + } + .joint-link:hover .marker-vertices, + .joint-link:hover .marker-arrowheads, + .joint-link:hover .link-tools { + opacity: 1; + } + + /* element used to remove a vertex */ + .marker-vertex-remove { + cursor: pointer; + opacity: .1; + } + + .marker-vertex-group:hover .marker-vertex-remove { + opacity: 1; + } + + .marker-vertex-remove-area { + opacity: .1; + cursor: pointer; + } + .marker-vertex-group:hover .marker-vertex-remove-area { + opacity: 1; + } + + /* + Example of custom changes (in pure CSS only!): + + Do not show marker vertices at all: .marker-vertices { display: none; } + Do not allow adding new vertices: .connection-wrap { pointer-events: none; } + */ + + /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */ + .joint-element .fobj { + overflow: hidden; + } + .joint-element .fobj body { + background-color: transparent; + margin: 0px; + position: static; + } + .joint-element .fobj div { + text-align: center; + vertical-align: middle; + display: table-cell; + padding: 0px 5px 0px 5px; + } + + /* Paper */ + .joint-paper.joint-theme-dark { + background-color: #18191b; + } + /* Paper */ + + /* Links */ + .joint-link.joint-theme-dark .connection-wrap { + stroke: #8F8FF3; + stroke-width: 15; + stroke-linecap: round; + stroke-linejoin: round; + opacity: 0; + cursor: move; + } + .joint-link.joint-theme-dark .connection-wrap:hover { + opacity: .4; + stroke-opacity: .4; + } + .joint-link.joint-theme-dark .connection { + stroke-linejoin: round; + } + .joint-link.joint-theme-dark .link-tools .tool-remove circle { + fill: #F33636; + } + .joint-link.joint-theme-dark .link-tools .tool-remove path { + fill: white; + } + .joint-link.joint-theme-dark .link-tools [event="link:options"] circle { + fill: green; + } + /* element inside .marker-vertex-group element */ + .joint-link.joint-theme-dark .marker-vertex { + fill: #5652DB; + } + .joint-link.joint-theme-dark .marker-vertex:hover { + fill: #8E8CE1; + stroke: none; + } + .joint-link.joint-theme-dark .marker-arrowhead { + fill: #5652DB; + } + .joint-link.joint-theme-dark .marker-arrowhead:hover { + fill: #8E8CE1; + stroke: none; + } + /* element used to remove a vertex */ + .joint-link.joint-theme-dark .marker-vertex-remove-area { + fill: green; + stroke: darkgreen; + } + .joint-link.joint-theme-dark .marker-vertex-remove { + fill: white; + stroke: white; + } + /* Links */ + /* Paper */ + .joint-paper.joint-theme-default { + background-color: #FFFFFF; + } + /* Paper */ + + /* Links */ + .joint-link.joint-theme-default .connection-wrap { + stroke: #000000; + stroke-width: 15; + stroke-linecap: round; + stroke-linejoin: round; + opacity: 0; + cursor: move; + } + .joint-link.joint-theme-default .connection-wrap:hover { + opacity: .4; + stroke-opacity: .4; + } + .joint-link.joint-theme-default .connection { + stroke-linejoin: round; + } + .joint-link.joint-theme-default .link-tools .tool-remove circle { + fill: #FF0000; + } + .joint-link.joint-theme-default .link-tools .tool-remove path { + fill: #FFFFFF; + } + + /* element inside .marker-vertex-group element */ + .joint-link.joint-theme-default .marker-vertex { + fill: #1ABC9C; + } + .joint-link.joint-theme-default .marker-vertex:hover { + fill: #34495E; + stroke: none; + } + + .joint-link.joint-theme-default .marker-arrowhead { + fill: #1ABC9C; + } + .joint-link.joint-theme-default .marker-arrowhead:hover { + fill: #F39C12; + stroke: none; + } + + /* element used to remove a vertex */ + .joint-link.joint-theme-default .marker-vertex-remove { + fill: #FFFFFF; + } + /* Links */ + + @font-face { + font-family: 'lato-light'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); + font-weight: normal; + font-style: normal; + } + + /* Links */ + .joint-link.joint-theme-material .connection-wrap { + stroke: #000000; + stroke-width: 15; + stroke-linecap: round; + stroke-linejoin: round; + opacity: 0; + cursor: move; + } + .joint-link.joint-theme-material .connection-wrap:hover { + opacity: .4; + stroke-opacity: .4; + } + .joint-link.joint-theme-material .connection { + stroke-linejoin: round; + } + .joint-link.joint-theme-material .link-tools .tool-remove circle { + fill: #C64242; + } + .joint-link.joint-theme-material .link-tools .tool-remove path { + fill: #FFFFFF; + } + + /* element inside .marker-vertex-group element */ + .joint-link.joint-theme-material .marker-vertex { + fill: #d0d8e8; + } + .joint-link.joint-theme-material .marker-vertex:hover { + fill: #5fa9ee; + stroke: none; + } + + .joint-link.joint-theme-material .marker-arrowhead { + fill: #d0d8e8; + } + .joint-link.joint-theme-material .marker-arrowhead:hover { + fill: #5fa9ee; + stroke: none; + } + + /* element used to remove a vertex */ + .joint-link.joint-theme-material .marker-vertex-remove-area { + fill: #5fa9ee; + } + .joint-link.joint-theme-material .marker-vertex-remove { + fill: white; + } + /* Links */ + + /* Links */ + .joint-link.joint-theme-modern .connection-wrap { + stroke: #000000; + stroke-width: 15; + stroke-linecap: round; + stroke-linejoin: round; + opacity: 0; + cursor: move; + } + .joint-link.joint-theme-modern .connection-wrap:hover { + opacity: .4; + stroke-opacity: .4; + } + .joint-link.joint-theme-modern .connection { + stroke-linejoin: round; + } + .joint-link.joint-theme-modern .link-tools .tool-remove circle { + fill: #FF0000; + } + .joint-link.joint-theme-modern .link-tools .tool-remove path { + fill: #FFFFFF; + } + + /* element inside .marker-vertex-group element */ + .joint-link.joint-theme-modern .marker-vertex { + fill: #1ABC9C; + } + .joint-link.joint-theme-modern .marker-vertex:hover { + fill: #34495E; + stroke: none; + } + + .joint-link.joint-theme-modern .marker-arrowhead { + fill: #1ABC9C; + } + .joint-link.joint-theme-modern .marker-arrowhead:hover { + fill: #F39C12; + stroke: none; + } + + /* element used to remove a vertex */ + .joint-link.joint-theme-modern .marker-vertex-remove { + fill: white; + } + /* Links */ + flo-view { + width:100%; + height:100%; + margin: 0; + background-color: #eeeeee; + font-family: "Varela Round",sans-serif; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + } + + .canvas { + border: 1px solid; + border-color: #6db33f; + border-radius: 2px; + margin-top: 3px; + } + + /* Canvas contains the palette on the left and the paper on the right */ + + .paper { + padding: 0px; + background-color: #ffffff; + /* height: 100%; + width: 100%; + position: relative; + overflow: hidden; + *//* margin-left: 400px; */ + } + + #sidebar-resizer { + background-color: #34302d; + position: absolute; + top: 0; + bottom: 0; + width: 6px; + cursor: e-resize; + } + + #palette-container { + background-color: #EEE; + position: absolute; + top: 0; + bottom: 0; + left: 0; + overflow: auto; + } + + #paper-container { + position: absolute; + top: 0; + bottom: 0; + right: 0; + overflow: auto; + color: #FFF; + background-color: #FFF; + } + + /* Tooltip START */ + + .node-tooltip .tooltip-description { + margin-top: 5px; + margin-left: 0px; + margin-bottom: 5px; + } + + .node-tooltip { + display:none; + position:absolute; + border:1px solid #333; + background-color:#34302d;/*#161616;*/ + border-radius:5px; + padding:5px; + color:#fff; + /* font-size:12px Arial;*/ + font-family: "Varela Round",sans-serif; + font-size: 19px; + z-index: 100; + } + + .tooltip-title-type { + font-size: 24px; + font-weight: bold; + } + + .tooltip-title-group { + padding-left: 5px; + font-size: 20px; + font-style: italic; + } + + .node-tooltip-option-name { + font-family: monospace;/*"Varela Round",sans-serif;*/ + font-size: 17px; + font-weight: bold; + padding-right: 20px; + + } + + .node-tooltip-option-description { + font-family: "Varela Round",sans-serif; + font-size: 18px; + } + + /* Tooltip END */ + + + /* Validation Error Marker on Canvas START */ + + .error-tooltip p { + margin-top: 5px; + margin-left: 0px; + margin-bottom: 5px; + color:#fff; + } + .error-tooltip { + display:none; + position:absolute; + border:1px solid #333; + background-color:red;/*#161616;*/ + border-radius:5px; + padding:5px; + color:#fff; + /* font-size:12px Arial;*/ + font-family: "Varela Round",sans-serif; + font-size: 20px; + z-index: 100; + } + + /* Validation Error Marker on Canvas END */ + + /* Controls on Canvas START */ + + .canvas-controls-container { + position: absolute; + right: 15px; + top: 5px; + } + + .canvas-control { + background: transparent; + font-family: "Varela Round",sans-serif; + font-size: 11px; + vertical-align: middle; + margin: 0px; + } + + .zoom-canvas-control { + border: 0px; + padding: 0px; + margin: 0px; + outline: none; + } + + .zoom-canvas-input { + text-align: right; + font-weight:bold; + color: black; + background-color: transparent; + } + + .zoom-canvas-label { + padding-right: 4px; + color: black; + } + + /* Controls on Canvas END */ + + + + + /* START - FLO CANVAS STYLES - override joint js styles */ + + .highlighted { + outline: none; + } + + .joint-element.highlighted rect { + stroke: #34302d; + stroke-width: 3; + } + + .joint-type-handle { + cursor: pointer; + } + + .available-magnet { + stroke-width: 3; + } + + .link { + fill: none; + stroke: #ccc; + stroke-width: 1.5px; + } + + .link-tools .tool-options { + display: none; /* by default, we don't display link options tool */ + } + + /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */ + .link-tools .tool-options circle { + fill: transparent; + stroke: transparent; + } + + .link-tools .tool-options path { + fill: black; + stroke: black; + } + + .link-tools .tool-remove circle { + fill: red; + stroke: red; + } + + .link-tools .tool-remove path { + fill: white; + stroke: white; + } + + .link-tools-container { + stroke-width: 0; + fill: transparent; + } + + /* END - FLO CANVAS STYLES */ + `], + encapsulation: ViewEncapsulation.None + }), + tslib_1.__metadata("design:paramtypes", [ElementRef]) +], EditorComponent); +export { EditorComponent }; +//# sourceMappingURL=editor.component.js.map \ No newline at end of file diff --git a/dist/esm2015/index.js b/dist/esm2015/index.js new file mode 100644 index 0000000..e50ba34 --- /dev/null +++ b/dist/esm2015/index.js @@ -0,0 +1,12 @@ +export { FloModule } from './module'; +export { Palette } from './palette/palette.component'; +export { EditorComponent } from './editor/editor.component'; +export { DslEditorComponent } from './dsl-editor/dsl-editor.component'; +export { CodeEditorComponent } from './code-editor/code-editor.component'; +export { PropertiesGroupComponent } from './properties/properties.group.component'; +export { DynamicFormPropertyComponent } from './properties/df.property.component'; +export { ResizerDirective } from './directives/resizer'; +export * from './shared/flo-common'; +export * from './shared/flo-properties'; +export * from './shared/shapes'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/esm2015/module.js b/dist/esm2015/module.js new file mode 100644 index 0000000..07cf0b0 --- /dev/null +++ b/dist/esm2015/module.js @@ -0,0 +1,39 @@ +import * as tslib_1 from "tslib"; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { CommonModule } from '@angular/common'; +import { Palette } from './palette/palette.component'; +import { EditorComponent } from './editor/editor.component'; +import { ResizerDirective } from './directives/resizer'; +import { DslEditorComponent } from './dsl-editor/dsl-editor.component'; +import { CodeEditorComponent } from './code-editor/code-editor.component'; +import { PropertiesGroupComponent } from './properties/properties.group.component'; +import { DynamicFormPropertyComponent } from './properties/df.property.component'; +let FloModule = class FloModule { +}; +FloModule = tslib_1.__decorate([ + NgModule({ + imports: [ + FormsModule, + CommonModule, + ReactiveFormsModule + ], + declarations: [ + Palette, + EditorComponent, + ResizerDirective, + DslEditorComponent, + CodeEditorComponent, + PropertiesGroupComponent, + DynamicFormPropertyComponent + ], + exports: [ + EditorComponent, + DslEditorComponent, + DynamicFormPropertyComponent, + PropertiesGroupComponent + ] + }) +], FloModule); +export { FloModule }; +//# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/dist/esm2015/palette/palette.component.js b/dist/esm2015/palette/palette.component.js new file mode 100644 index 0000000..d66a10d --- /dev/null +++ b/dist/esm2015/palette/palette.component.js @@ -0,0 +1,511 @@ +import * as tslib_1 from "tslib"; +import { Component, ElementRef, Input, Output, EventEmitter, Inject, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { dia } from 'jointjs'; +import { Flo } from '../shared/flo-common'; +import { Shapes, Constants } from '../shared/shapes'; +import { DOCUMENT } from '@angular/platform-browser'; +import * as _$ from 'jquery'; +const joint = Flo.joint; +const $ = _$; +const DEBOUNCE_TIME = 300; +joint.shapes.flo.PaletteGroupHeader = joint.shapes.basic.Generic.extend({ + // The path is the open/close arrow, defaults to vertical (open) + markup: '', + defaults: joint.util.deepSupplement({ + type: 'palette.groupheader', + size: { width: 170, height: 30 }, + position: { x: 0, y: 0 }, + attrs: { + 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, + 'text': { + text: '', + fill: '#eeeeee', + 'ref-x': 0.5, + 'ref-y': 7, + 'x-alignment': 'middle', + 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ + }, + 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } + }, + // custom properties + isOpen: true + }, joint.shapes.basic.Generic.prototype.defaults) +}); +let Palette = class Palette { + constructor(element, document) { + this.element = element; + this.document = document; + this._metamodelListener = { + metadataError: (data) => { }, + metadataAboutToChange: () => { }, + metadataChanged: () => this.rebuildPalette() + }; + this.initialized = false; + this._filterText = ''; + this.filterTextModel = new Subject(); + this.paletteEntryPadding = { width: 12, height: 12 }; + this.onPaletteEntryDrop = new EventEmitter(); + this.paletteReady = new EventEmitter(); + this.paletteFocus = new EventEmitter(); + this.mouseMoveHanlder = (e) => this.handleDrag(e); + this.mouseUpHanlder = (e) => this.handleMouseUp(e); + this.paletteGraph = new joint.dia.Graph(); + this.paletteGraph.set('type', Constants.PALETTE_CONTEXT); + this._filterText = ''; + this.closedGroups = new Set(); + } + set paletteSize(size) { + console.debug('Palette Size: ' + size); + if (this._paletteSize !== size) { + this._paletteSize = size; + this.rebuildPalette(); + } + } + onFocus() { + this.paletteFocus.emit(); + } + ngOnInit() { + let element = $('#palette-paper', this.element.nativeElement); + // Create the paper for the palette using the specified element view + this.palette = new joint.dia.Paper({ + el: element, + gridSize: 1, + model: this.paletteGraph, + height: $(this.element.nativeElement.parentNode).height(), + width: $(this.element.nativeElement.parentNode).width(), + elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.dia.ElementView), + interactive: false + }); + this.palette.on('cell:pointerup', (cellview, evt) => { + if (this.viewBeingDragged) { + this.trigger({ + type: Flo.DnDEventType.DROP, + view: this.viewBeingDragged, + event: evt + }); + this.viewBeingDragged = undefined; + } + this.clickedElement = undefined; + $('#palette-floater').remove(); + if (this.floaterpaper) { + this.floaterpaper.remove(); + } + }); + // Toggle the header open/closed on a click + this.palette.on('cell:pointerclick', (cellview, event) => { + // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? + // Click position within the element would be: evt.offsetX, evt.offsetY + const cell = cellview.model; + if (cell.attributes.header) { + // Toggle the header open/closed + if (cell.get('isOpen')) { + this.rotateClosed(cell); + } + else { + this.rotateOpen(cell); + } + } + // TODO [palette] ensure other mouse handling events do nothing for headers + // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) + }); + $(this.document).on('mouseup', this.mouseUpHanlder); + if (this.metamodel) { + this.metamodel.load().then(data => { + this.buildPalette(data); + // Add listener to metamodel + if (this.metamodel && this.metamodel.subscribe) { + this.metamodel.subscribe(this._metamodelListener); + } + // Add debounced listener to filter text changes + this.filterTextModel + .pipe(debounceTime(DEBOUNCE_TIME)) + .subscribe((value) => this.rebuildPalette()); + this.initialized = true; + }); + } + else { + console.error('No Metamodel service specified for palette!'); + } + this._paletteSize = this._paletteSize || $(this.element.nativeElement.parentNode).width(); + } + ngOnDestroy() { + if (this.metamodel && this.metamodel.unsubscribe) { + this.metamodel.unsubscribe(this._metamodelListener); + } + $(this.document).off('mouseup', this.mouseUpHanlder); + this.palette.remove(); + } + ngOnChanges(changes) { + // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { + // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); + // } + } + createPaletteGroup(title, isOpen) { + let newGroupHeader = new joint.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); + newGroupHeader.set('header', title); + if (!isOpen) { + newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); + newGroupHeader.set('isOpen', false); + } + this.paletteGraph.addCell(newGroupHeader); + return newGroupHeader; + } + createPaletteEntry(title, metadata) { + return Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.palette, + metadata: metadata + }); + } + buildPalette(metamodel) { + let startTime = new Date().getTime(); + this.paletteReady.emit(false); + this.paletteGraph.clear(); + let filterText = this.filterText; + if (filterText) { + filterText = filterText.toLowerCase(); + } + let paletteNodes = []; + let groupAdded = new Set(); + let parentWidth = this._paletteSize; + console.debug(`Parent Width: ${parentWidth}`); + // The field closedGroups tells us which should not be shown + // Work out the list of active groups/nodes based on the filter text + this.metamodel.groups().forEach(group => { + if (metamodel && metamodel.has(group)) { + Array.from(metamodel.get(group).keys()).sort().forEach(name => { + let node = metamodel.get(group).get(name); + if (node) { + let nodeActive = !(node.metadata && node.metadata.noPaletteEntry); + if (nodeActive && filterText) { + nodeActive = false; + if (name.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + else if (group.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { + // nodeActive = true; + // } + // else if (node.properties) { + // Object.keys(node.properties).sort().forEach(function(propertyName) { + // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || + // (node.properties[propertyName].description && + // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { + // nodeActive=true; + // } + // }); + // } + } + if (nodeActive) { + if (!groupAdded.has(group)) { + let header = this.createPaletteGroup(group, !this.closedGroups.has(group)); + header.set('size', { width: parentWidth, height: 30 }); + paletteNodes.push(header); + groupAdded.add(group); + } + if (!this.closedGroups.has(group)) { + paletteNodes.push(this.createPaletteEntry(name, node)); + } + } + } + }); + } + }); + let cellWidth = 0, cellHeight = 0; + // Determine the size of the palette entry cell (width and height) + paletteNodes.forEach(pnode => { + if (pnode.attr('metadata/name')) { + let dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (cellWidth < dimension.width) { + cellWidth = dimension.width; + } + if (cellHeight < dimension.height) { + cellHeight = dimension.height; + } + } + }); + // Adjust the palette entry cell size with paddings. + cellWidth += 2 * this.paletteEntryPadding.width; + cellHeight += 2 * this.paletteEntryPadding.height; + // Align palette entries row to be at the center + let startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; + let xpos = startX; + let ypos = 0; + let prevNode; + // Layout palette entry nodes + paletteNodes.forEach(pnode => { + let dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (pnode.get('header')) { //attributes.attrs.header) { + // Palette entry header + xpos = startX; + pnode.set('position', { x: 0, y: ypos }); + ypos += dimension.height + 5; + } + else { + // Palette entry element + if (xpos + cellWidth > parentWidth) { + // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line + xpos = startX; + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + else { + // Enough real estate to place entry in a row - adjust y position + if (prevNode && prevNode.attr('metadata/name')) { + ypos -= cellHeight; + } + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + // increment x position and y position (can be reorganized) + xpos += cellWidth; + ypos += cellHeight; + } + prevNode = pnode; + }); + this.palette.setDimensions(parentWidth, ypos); + this.paletteReady.emit(true); + console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); + } + rebuildPalette() { + if (this.initialized && this.metamodel) { + this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); + } + } + set filterText(text) { + if (this._filterText !== text) { + this._filterText = text; + this.filterTextModel.next(text); + } + } + get filterText() { + return this._filterText; + } + getPaletteView(view) { + let self = this; + return view.extend({ + pointerdown: function ( /*evt, x, y*/) { + // Remove the tooltip + // $('.node-tooltip').remove(); + // TODO move metadata to the right place (not inside attrs I think) + self.clickedElement = this.model; + if (self.clickedElement && self.clickedElement.attr('metadata')) { + $(self.document).on('mousemove', self.mouseMoveHanlder); + } + }, + pointermove: function ( /*evt, x, y*/) { + // Nothing to prevent move within the palette canvas + }, + }); + } + handleMouseUp(event) { + $(this.document).off('mousemove', this.mouseMoveHanlder); + } + trigger(event) { + this.onPaletteEntryDrop.emit(event); + } + handleDrag(event) { + // TODO offsetX/Y not on firefox + // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); + // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); + if (this.clickedElement && this.clickedElement.attr('metadata')) { + if (!this.viewBeingDragged) { + let dataOfClickedElement = this.clickedElement.attr('metadata'); + // custom div if not already built. + $('
', { + id: 'palette-floater' + }).appendTo($('body')); + let floatergraph = new joint.dia.Graph(); + floatergraph.set('type', Constants.FEEDBACK_CONTEXT); + const parent = $('#palette-floater'); + this.floaterpaper = new joint.dia.Paper({ + el: $('#palette-floater'), + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.dia.ElementView, + gridSize: 10, + model: floatergraph, + height: parent.height(), + width: parent.width(), + validateMagnet: () => false, + validateConnection: () => false + }); + // TODO float thing needs to be bigger otherwise icon label is missing + // Initiative drag and drop - create draggable element + let floaternode = Shapes.Factory.createNode({ + 'renderer': this.renderer, + 'paper': this.floaterpaper, + 'graph': floatergraph, + 'metadata': dataOfClickedElement + }); + // Only node view expected + let box = this.floaterpaper.findViewByModel(floaternode).getBBox(); + let size = floaternode.get('size'); + // Account for node real size including ports + floaternode.translate(box.width - size.width, box.height - size.height); + this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); + $('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + } + else { + $('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + this.trigger({ + type: Flo.DnDEventType.DRAG, + view: this.viewBeingDragged, + event: event + }); + } + } + } + /* + * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) + */ + rotateOpen(element) { + setTimeout(() => this.doRotateOpen(element, 90)); + } + doRotateOpen(element, angle) { + angle -= 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle <= 0) { + element.set('isOpen', true); + this.closedGroups.delete(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(() => this.doRotateOpen(element, angle), 10); + } + } + doRotateClose(element, angle) { + angle += 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle >= 90) { + element.set('isOpen', false); + this.closedGroups.add(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(() => this.doRotateClose(element, angle), 10); + } + } + // TODO better name for this function as this does the animation *and* updates the palette + /* + * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) + */ + rotateClosed(element) { + setTimeout(() => this.doRotateClose(element, 0)); + } +}; +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], Palette.prototype, "metamodel", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], Palette.prototype, "renderer", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], Palette.prototype, "paletteEntryPadding", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], Palette.prototype, "onPaletteEntryDrop", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], Palette.prototype, "paletteReady", void 0); +tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) +], Palette.prototype, "paletteFocus", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number), + tslib_1.__metadata("design:paramtypes", [Number]) +], Palette.prototype, "paletteSize", null); +Palette = tslib_1.__decorate([ + Component({ + selector: 'flo-palette', + template: ` +
+ +
+
+
+
+ `, + styles: [` + /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */ + + #palette-floater { + /* TODO size relative to paper that goes on it? */ + opacity: 0.75; + width:170px; + height:60px; + background-color: transparent; + /* + background-color: #6db33f; + */ + float:left; + position: absolute; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + } + + #palette-floater.joint-paper > svg { + background-color: transparent; + } + + #palette-paper-container { + overflow-y: auto; + overflow-x: hidden; + background-color: white; + color: white; + } + + /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */ + + /* Palette START */ + + .palette-filter { + border: 3px solid #6db33f; + } + + .palette-filter-textfield { + width: 100%; + font-size:24px; + /* border: 3px solid #6db33f; + */ font-family: "Varela Round",sans-serif; + /* padding: 2px; */ + } + + .palette-paper { + background-color: #eeeeee; + /* + border-right: 7px solid; + */ + border-color: #6db33f; + /* width: 170px; + height:100%; + float: left; + */ + } + + /* Palette END */ + `], + encapsulation: ViewEncapsulation.None + }), + tslib_1.__param(1, Inject(DOCUMENT)), + tslib_1.__metadata("design:paramtypes", [ElementRef, Object]) +], Palette); +export { Palette }; +//# sourceMappingURL=palette.component.js.map \ No newline at end of file diff --git a/dist/esm2015/properties/df.property.component.js b/dist/esm2015/properties/df.property.component.js new file mode 100644 index 0000000..ccd6811 --- /dev/null +++ b/dist/esm2015/properties/df.property.component.js @@ -0,0 +1,82 @@ +import * as tslib_1 from "tslib"; +import { Component, Input, ViewEncapsulation } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { Properties } from '../shared/flo-properties'; +let DynamicFormPropertyComponent = class DynamicFormPropertyComponent { + constructor() { } + get types() { + return Properties.InputType; + } + get control() { + return this.form.controls[this.model.id]; + } + get errorData() { + return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) + .filter(e => this.control.errors && this.control.errors[e.id]); + } +}; +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) +], DynamicFormPropertyComponent.prototype, "model", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", FormGroup) +], DynamicFormPropertyComponent.prototype, "form", void 0); +DynamicFormPropertyComponent = tslib_1.__decorate([ + Component({ + selector: 'df-property', + template: ` + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+
+
{{model.description}}
+
{{e.message}}
+
+ + + + `, + encapsulation: ViewEncapsulation.None + }), + tslib_1.__metadata("design:paramtypes", []) +], DynamicFormPropertyComponent); +export { DynamicFormPropertyComponent }; +//# sourceMappingURL=df.property.component.js.map \ No newline at end of file diff --git a/dist/esm2015/properties/properties.group.component.js b/dist/esm2015/properties/properties.group.component.js new file mode 100644 index 0000000..28395ea --- /dev/null +++ b/dist/esm2015/properties/properties.group.component.js @@ -0,0 +1,50 @@ +import * as tslib_1 from "tslib"; +import { Component, Input, ViewEncapsulation } from '@angular/core'; +import { FormGroup, FormControl } from '@angular/forms'; +import { Properties } from '../shared/flo-properties'; +let PropertiesGroupComponent = class PropertiesGroupComponent { + ngOnInit() { + if (this.propertiesGroupModel.isLoading) { + let subscription = this.propertiesGroupModel.loadedSubject.subscribe(loaded => { + if (loaded) { + subscription.unsubscribe(); + this.createGroupControls(); + } + }); + } + else { + this.createGroupControls(); + } + } + createGroupControls() { + this.propertiesGroupModel.getControlsModels().forEach(c => { + if (c.validation) { + this.form.addControl(c.id, new FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); + } + else { + this.form.addControl(c.id, new FormControl(c.value || '')); + } + }); + } +}; +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Properties.PropertiesGroupModel) +], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); +tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", FormGroup) +], PropertiesGroupComponent.prototype, "form", void 0); +PropertiesGroupComponent = tslib_1.__decorate([ + Component({ + selector: 'properties-group', + template: ` +
+ +
+ `, + encapsulation: ViewEncapsulation.None + }) +], PropertiesGroupComponent); +export { PropertiesGroupComponent }; +//# sourceMappingURL=properties.group.component.js.map \ No newline at end of file diff --git a/dist/esm2015/shared/flo-common.js b/dist/esm2015/shared/flo-common.js new file mode 100644 index 0000000..945ef9e --- /dev/null +++ b/dist/esm2015/shared/flo-common.js @@ -0,0 +1,57 @@ +import * as _joint from 'jointjs'; +import * as _$ from 'jquery'; +const $ = _$; +export var Flo; +(function (Flo) { + Flo.joint = _joint; + let DnDEventType; + (function (DnDEventType) { + DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; + DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; + })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); + let Severity; + (function (Severity) { + Severity[Severity["Error"] = 0] = "Error"; + Severity[Severity["Warning"] = 1] = "Warning"; + })(Severity = Flo.Severity || (Flo.Severity = {})); + function findMagnetByClass(view, className) { + if (className && className.startsWith('.')) { + className = className.substr(1); + } + const element = view.$('[magnet]').toArray().find((magnet) => magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByClass = findMagnetByClass; + function findMagnetByPort(view, port) { + const element = view.$('[magnet]').toArray().find((magnet) => magnet.getAttribute('port') === port); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByPort = findMagnetByPort; + /** + * Return the metadata for a particular palette entry in a particular group. + * @param name - name of the palette entry + * @param group - group in which the palette entry should exist (e.g. sinks) + * @return + */ + function getMetadata(metamodel, name, group) { + const groupObj = metamodel && group ? metamodel.get(group) : undefined; + if (name && groupObj && groupObj.get(name)) { + return metamodel.get(group).get(name); + } + else { + return { + name: name, + group: group, + unresolved: true, + get: (property) => new Promise(resolve => resolve()), + properties: () => Promise.resolve(new Map()) + }; + } + } + Flo.getMetadata = getMetadata; +})(Flo || (Flo = {})); +//# sourceMappingURL=flo-common.js.map \ No newline at end of file diff --git a/dist/esm2015/shared/flo-properties.js b/dist/esm2015/shared/flo-properties.js new file mode 100644 index 0000000..9d77cbe --- /dev/null +++ b/dist/esm2015/shared/flo-properties.js @@ -0,0 +1,273 @@ +import { Subject, Observable } from 'rxjs'; +import { debounceTime, mergeMap } from 'rxjs/operators'; +export var Properties; +(function (Properties) { + let InputType; + (function (InputType) { + InputType[InputType["TEXT"] = 0] = "TEXT"; + InputType[InputType["NUMBER"] = 1] = "NUMBER"; + InputType[InputType["SELECT"] = 2] = "SELECT"; + InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; + InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; + InputType[InputType["EMAIL"] = 5] = "EMAIL"; + InputType[InputType["URL"] = 6] = "URL"; + InputType[InputType["CODE"] = 7] = "CODE"; + })(InputType = Properties.InputType || (Properties.InputType = {})); + class GenericControlModel { + constructor(_property, type, validation) { + this._property = _property; + this.type = type; + this.validation = validation; + } + get id() { + return this.property.id; + } + get name() { + return this.property.name; + } + get description() { + return this.property.description; + } + get defaultValue() { + return this.property.defaultValue; + } + get value() { + return this.getValue(); + } + set value(value) { + this.setValue(value); + } + get property() { + return this._property; + } + setValue(value) { + this.property.value = value; + } + getValue() { + return this.property.value; + } + } + Properties.GenericControlModel = GenericControlModel; + class CheckBoxControlModel extends GenericControlModel { + constructor(_property, validation) { + super(_property, InputType.CHECKBOX, validation); + } + getValue() { + const res = super.getValue(); + const type = typeof res; + switch (type) { + case 'boolean': + return res; + case 'string': + switch (res.trim().toLowerCase()) { + case 'true': + case '1': + return true; + case 'false': + case '0': + return false; + default: + return this.property.defaultValue; + } + case 'number': + const num = res; + if (num === 0) { + return false; + } + else if (num === 1) { + return true; + } + else { + return this.property.defaultValue; + } + } + return this.property.defaultValue; + } + } + Properties.CheckBoxControlModel = CheckBoxControlModel; + class AbstractCodeControlModel extends GenericControlModel { + constructor(_property, encode, decode, validation) { + super(_property, InputType.CODE, validation); + this.encode = encode; + this.decode = decode; + } + set value(value) { + if (value && this.encode) { + super.setValue(this.encode(value)); + } + else { + super.setValue(value); + } + } + get value() { + let dsl = super.getValue(); + if (dsl && this.decode) { + return this.decode(dsl); + } + else { + return dsl; + } + } + } + Properties.AbstractCodeControlModel = AbstractCodeControlModel; + class GenericCodeControlModel extends AbstractCodeControlModel { + constructor(_property, language, encode, decode, validation) { + super(_property, encode, decode, validation); + this.language = language; + } + } + Properties.GenericCodeControlModel = GenericCodeControlModel; + class CodeControlModelWithDynamicLanguageProperty extends AbstractCodeControlModel { + constructor(_property, _languagePropertyName, _groupModel, encode, decode, validation) { + super(_property, encode, decode, validation); + this._languagePropertyName = _languagePropertyName; + this._groupModel = _groupModel; + } + get language() { + const value = this.languageControlModel.value; + return value ? value : this.languageControlModel.defaultValue; + } + get languageControlModel() { + if (!this._langControlModel) { + // Cast to Properties.ControlModel from Properties.ControlModel | undefined + // Should not be undefined! + this._langControlModel = this._groupModel.getControlsModels().find(c => c.id === this._languagePropertyName); + } + return this._langControlModel; + } + } + Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; + class GenericListControlModel extends GenericControlModel { + constructor(property, validation) { + super(property, InputType.TEXT, validation); + } + get value() { + return this.property.value ? this.property.value.join(', ') : ''; + } + set value(value) { + this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; + } + } + Properties.GenericListControlModel = GenericListControlModel; + class SelectControlModel extends GenericControlModel { + constructor(_property, type, options) { + super(_property, type); + this.options = options; + if (_property.defaultValue === undefined) { + options.unshift({ + name: 'SELECT', + value: _property.defaultValue + }); + } + } + } + Properties.SelectControlModel = SelectControlModel; + class DefaultCellPropertiesSource { + constructor(cell) { + this.cell = cell; + } + getProperties() { + let metadata = this.cell.attr('metadata'); + return Promise.resolve(metadata.properties().then(propsMetadata => Array.from(propsMetadata.values()).map(m => this.createProperty(m)))); + } + createProperty(metadata) { + return { + id: metadata.id, + name: metadata.name, + type: metadata.type, + defaultValue: metadata.defaultValue, + attr: `props/${metadata.name}`, + value: this.cell.attr(`props/${metadata.name}`), + description: metadata.description, + valueOptions: metadata.options + }; + } + applyChanges(properties) { + this.cell.trigger('batch:start', { batchName: 'update properties' }); + properties.forEach(property => { + if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || + (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { + let currentValue = this.cell.attr(property.attr); + if (currentValue !== undefined && currentValue !== null) { + // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync + this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); + this.cell.removeAttr(property.attr); + } + } + else { + this.cell.attr(property.attr, property.value); + } + }); + this.cell.trigger('batch:stop', { batchName: 'update properties' }); + } + } + Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; + class PropertiesGroupModel { + constructor(propertiesSource) { + this.loading = true; + this.propertiesSource = propertiesSource; + } + load() { + this.loading = true; + this._loadedSubject = new Subject(); + this.propertiesSource.getProperties().then(properties => { + this.controlModels = properties.map(p => this.createControlModel(p)); + this.loading = false; + this._loadedSubject.next(true); + this._loadedSubject.complete(); + }); + } + get isLoading() { + return this.loading; + } + get loadedSubject() { + return this._loadedSubject; + } + getControlsModels() { + return this.controlModels; + } + createControlModel(property) { + return new GenericControlModel(property, InputType.TEXT); + } + applyChanges() { + if (this.loading) { + return; + } + let properties = this.controlModels.map(cm => cm.property); + this.propertiesSource.applyChanges(properties); + } + } + Properties.PropertiesGroupModel = PropertiesGroupModel; + let Validators; + (function (Validators) { + function uniqueResource(service, debounce) { + return (control) => { + return new Observable(obs => { + if (control.valueChanges && control.value) { + control.valueChanges + .pipe(debounceTime(debounce), mergeMap(value => service(value))) + .subscribe(() => { + obs.next({ uniqueResource: true }); + obs.complete(); + }, () => { + obs.next(undefined); + obs.complete(); + }); + } + else { + obs.next(undefined); + obs.complete(); + } + }); + }; + } + Validators.uniqueResource = uniqueResource; + function noneOf(excluded) { + return (control) => { + return excluded.find(e => e === control.value) ? { 'noneOf': { value: control.value } } : {}; + }; + } + Validators.noneOf = noneOf; + })(Validators = Properties.Validators || (Properties.Validators = {})); +})(Properties || (Properties = {})); +//# sourceMappingURL=flo-properties.js.map \ No newline at end of file diff --git a/dist/esm2015/shared/shapes.js b/dist/esm2015/shared/shapes.js new file mode 100644 index 0000000..7ad599b --- /dev/null +++ b/dist/esm2015/shared/shapes.js @@ -0,0 +1,494 @@ +import { Flo } from './flo-common'; +import * as _ from 'lodash'; +import * as _$ from 'jquery'; +const joint = Flo.joint; +const $ = _$; +const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); +const isFF = navigator.userAgent.indexOf('Firefox') > 0; +const IMAGE_W = 120; +const IMAGE_H = 35; +const ERROR_MARKER_SIZE = { width: 16, height: 16 }; +const HANDLE_SIZE = { width: 10, height: 10 }; +joint.shapes.flo = {}; +joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; +joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; +joint.shapes.flo.DECORATION_TYPE = 'decoration'; +joint.shapes.flo.HANDLE_TYPE = 'handle'; +const HANDLE_ICON_MAP = new Map(); +const REMOVE = 'remove'; +HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); +const DECORATION_ICON_MAP = new Map(); +const ERROR = 'error'; +DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); +joint.util.cloneDeep = (obj) => { + return _.cloneDeepWith(obj, (o) => { + if (_.isObject(o) && !_.isPlainObject(o)) { + return o; + } + }); +}; +joint.util.filter.redscale = (args) => { + let amount = Number.isFinite(args.amount) ? args.amount : 1; + return _.template('', { + a: 1 - 0.96 * amount, + b: 0.95 * amount, + c: 0.01 * amount, + d: 0.3 * amount, + e: 0.2 * amount, + f: 1 - 0.9 * amount, + g: 0.7 * amount, + h: 0.05 * amount, + i: 0.05 * amount, + k: 1 - 0.1 * amount + }); +}; +joint.util.filter.orangescale = (args) => { + let amount = Number.isFinite(args.amount) ? args.amount : 1; + return _.template('', { + a: 1.0 + 0.5 * amount, + b: 1.4 * amount, + c: 0.2 * amount, + d: 0.3 * amount, + e: 0.3 * amount, + f: 1 + 0.05 * amount, + g: 0.2 * amount, + h: 0.15 * amount, + i: 0.3 * amount, + k: 0.3 * amount, + l: 1 - 0.6 * amount + }); +}; +joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ + markup: '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.NODE_TYPE, + position: { x: 0, y: 0 }, + size: { width: IMAGE_W, height: IMAGE_H }, + attrs: { + '.': { magnet: false }, + // rounded edges around image + '.border': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + 'fill-opacity': 0, + stroke: '#eeeeee', + 'stroke-width': 0 + }, + '.box': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + //'fill-opacity': 0, // see through + stroke: '#6db33f', + fill: '#eeeeee', + 'stroke-width': 1 + }, + '.input-port': { + port: 'input', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.output-port': { + port: 'output', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.label': { + 'text-anchor': 'middle', + 'ref-x': 0.5, + // 'ref-y': -12, // jointjs specific: relative position to ref'd element + 'ref-y': 0.3, + ref: '.border', + fill: 'black', + 'font-size': 14 + }, + '.label2': { + 'text': '\u21d2', + 'text-anchor': 'middle', + 'ref-x': 0.15, + 'ref-y': 0.2, + ref: '.border', + // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', + fill: 'black', + 'font-size': 24 + }, + '.shape': {}, + '.image': { + width: IMAGE_W, + height: IMAGE_H + } + } + }, joint.shapes.basic.Generic.prototype.defaults) +}); +joint.shapes.flo.Link = joint.dia.Link.extend({ + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.LINK_TYPE, + attrs: { + '.connection': { stroke: '#34302d', 'stroke-width': 2 }, + // Lots of alternatives that have been played with: + // '.smoooth': true + // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, + // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, + // '.connection': { 'stroke':'black'}, + // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, + // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, + // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) + // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, + // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, + // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, + // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, + '.marker-arrowheads': { display: 'none' }, + '.tool-options': { display: 'none' } + }, + }, joint.dia.Link.prototype.defaults) +}); +joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ + options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), + _beforeArrowheadMove: function () { + if (this.model.get('source').id) { + this._oldSource = this.model.get('source'); + } + if (this.model.get('target').id) { + this._oldTarget = this.model.get('target'); + } + joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); + }, + _afterArrowheadMove: function () { + joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); + if (!this.model.get('source').id) { + if (this._oldSource) { + this.model.set('source', this._oldSource); + } + else { + this.model.remove(); + } + } + if (!this.model.get('target').id) { + if (this._oldTarget) { + this.model.set('target', this._oldTarget); + } + else { + this.model.remove(); + } + } + delete this._oldSource; + delete this._oldTarget; + } +}); +// TODO: must do cleanup for the `mainElementView' +joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ + // canShowTooltip: true, + beingDragged: false, + // _tempZorder: 0, + _tempOpacity: 1.0, + _hovering: false, + dragLinkStart: function (evt, magnet, x, y) { + this.model.startBatch('add-link'); + const linkView = this.addLinkFromMagnet(magnet, x, y); + // backwards compatiblity events + joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); + linkView.notify('link:pointerdown', evt, x, y); + /*** START MAIN DIFF ***/ + const sourceOrTarget = $(magnet).attr('port') === 'input' ? 'source' : 'target'; + linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); + /*** END MAIN DIFF ***/ + this.eventData(evt, { linkView: linkView }); + }, + addLinkFromMagnet: function (magnet, x, y) { + const paper = this.paper; + const graph = paper.model; + const link = paper.getDefaultLink(this, magnet); + let sourceEnd, targetEnd; + /*** START MAIN DIFF ***/ + if ($(magnet).attr('port') === 'input') { + sourceEnd = { x: x, y: y }; + targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); + } + else { + sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); + targetEnd = { x: x, y: y }; + } + /*** END MAIN DIFF ***/ + link.set({ + source: sourceEnd, + target: targetEnd + }).addTo(graph, { + async: false, + ui: true + }); + return link.findView(paper); + }, + // pointerdown: function(evt: any, x: number, y: number) { + // // this.canShowTooltip = false; + // // this.hideTooltip(); + // this.beingDragged = false; + // this._tempOpacity = this.model.attr('./opacity'); + // + // this.model.trigger('batch:start'); + // + // if ( // target is a valid magnet start linking + // evt.target.getAttribute('magnet') && + // this.paper.options.validateMagnet.call(this.paper, this, evt.target) + // ) { + // let link = this.paper.getDefaultLink(this, evt.target); + // if ($(evt.target).attr('port') === 'input') { + // link.set({ + // source: { x: x, y: y }, + // target: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // } + // }); + // } else { + // link.set({ + // source: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // }, + // target: { x: x, y: y } + // }); + // } + // this.paper.model.addCell(link); + // this._linkView = this.paper.findViewByModel(link); + // if ($(evt.target).attr('port') === 'input') { + // this._linkView.startArrowheadMove('source'); + // } else { + // this._linkView.startArrowheadMove('target'); + // } + // this.paper.__creatingLinkFromPort = true; + // } else { + // this._dx = x; + // this._dy = y; + // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); + // } + // }, + drag: function (evt, x, y) { + let interactive = _.isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : + this.options.interactive; + if (interactive !== false) { + this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DRAG, view: this, event: evt }); + } + joint.dia.ElementView.prototype.drag.apply(this, arguments); + }, + dragEnd: function (evt, x, y) { + this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DROP, view: this, event: evt }); + joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); + }, +}); +joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ + markup: '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.DECORATION_TYPE, + size: ERROR_MARKER_SIZE, + attrs: { + 'image': ERROR_MARKER_SIZE + } + }, joint.shapes.basic.Generic.prototype.defaults) +}); +export var Constants; +(function (Constants) { + Constants.REMOVE_HANDLE_TYPE = REMOVE; + Constants.PROPERTIES_HANDLE_TYPE = 'properties'; + Constants.ERROR_DECORATION_KIND = ERROR; + Constants.PALETTE_CONTEXT = 'palette'; + Constants.CANVAS_CONTEXT = 'canvas'; + Constants.FEEDBACK_CONTEXT = 'feedback'; +})(Constants || (Constants = {})); +export var Shapes; +(function (Shapes) { + class Factory { + /** + * Create a JointJS node that embeds extra metadata (properties). + */ + static createNode(params) { + let renderer = params.renderer; + let paper = params.paper; + let metadata = params.metadata; + let position = params.position; + let props = params.props; + let graph = params.graph || (params.paper ? params.paper.model : undefined); + let node; + if (!position) { + position = { x: 0, y: 0 }; + } + if (renderer && _.isFunction(renderer.createNode)) { + node = renderer.createNode(metadata, props); + } + else { + node = new joint.shapes.flo.Node(); + if (metadata) { + node.attr('.label/text', metadata.name); + } + } + node.set('type', joint.shapes.flo.NODE_TYPE); + if (position) { + node.set('position', position); + } + if (props) { + Array.from(props.keys()).forEach(key => node.attr(`props/${key}`, props.get(key))); + } + node.attr('metadata', metadata); + if (graph) { + graph.addCell(node); + } + if (renderer && _.isFunction(renderer.initializeNewNode)) { + let descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewNode(node, descriptor); + } + return node; + } + static createLink(params) { + let renderer = params.renderer; + let paper = params.paper; + let metadata = params.metadata; + let source = params.source; + let target = params.target; + let props = params.props; + let graph = params.graph || (params.paper ? params.paper.model : undefined); + let link; + if (renderer && _.isFunction(renderer.createLink)) { + link = renderer.createLink(source, target, metadata, props); + } + else { + link = new joint.shapes.flo.Link(); + } + if (source) { + link.set('source', source); + } + if (target) { + link.set('target', target); + } + link.set('type', joint.shapes.flo.LINK_TYPE); + if (metadata) { + link.attr('metadata', metadata); + } + if (props) { + Array.from(props.keys()).forEach(key => link.attr(`props/${key}`, props.get(key))); + } + if (graph) { + graph.addCell(link); + } + if (renderer && _.isFunction(renderer.initializeNewLink)) { + let descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewLink(link, descriptor); + } + // prevent creation of link breaks + link.attr('.marker-vertices/display', 'none'); + return link; + } + static createDecoration(params) { + let renderer = params.renderer; + let paper = params.paper; + let parent = params.parent; + let kind = params.kind; + let messages = params.messages; + let location = params.position; + let graph = params.graph || (params.paper ? params.paper.model : undefined); + if (!location) { + location = { x: 0, y: 0 }; + } + let decoration; + if (renderer && _.isFunction(renderer.createDecoration)) { + decoration = renderer.createDecoration(kind, parent); + } + else { + decoration = new joint.shapes.flo.ErrorDecoration({ + attrs: { + image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, + } + }); + } + decoration.set('type', joint.shapes.flo.DECORATION_TYPE); + decoration.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + decoration.set('z', parent.get('z') + 1); + } + decoration.attr('./kind', kind); + decoration.attr('messages', messages); + if (graph) { + graph.addCell(decoration); + } + parent.embed(decoration); + if (renderer && _.isFunction(renderer.initializeNewDecoration)) { + let descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewDecoration(decoration, descriptor); + } + return decoration; + } + static createHandle(params) { + let renderer = params.renderer; + let paper = params.paper; + let parent = params.parent; + let kind = params.kind; + let location = params.position; + let graph = params.graph || (params.paper ? params.paper.model : undefined); + let handle; + if (!location) { + location = { x: 0, y: 0 }; + } + if (renderer && _.isFunction(renderer.createHandle)) { + handle = renderer.createHandle(kind, parent); + } + else { + handle = new joint.shapes.flo.ErrorDecoration({ + size: HANDLE_SIZE, + attrs: { + 'image': { + 'xlink:href': HANDLE_ICON_MAP.get(kind) + } + } + }); + } + handle.set('type', joint.shapes.flo.HANDLE_TYPE); + handle.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + handle.set('z', parent.get('z') + 1); + } + handle.attr('./kind', kind); + if (graph) { + graph.addCell(handle); + } + parent.embed(handle); + if (renderer && _.isFunction(renderer.initializeNewHandle)) { + let descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewHandle(handle, descriptor); + } + return handle; + } + } + Shapes.Factory = Factory; +})(Shapes || (Shapes = {})); +//# sourceMappingURL=shapes.js.map \ No newline at end of file diff --git a/dist/esm2015/spring-flo.js b/dist/esm2015/spring-flo.js new file mode 100644 index 0000000..31c32cd --- /dev/null +++ b/dist/esm2015/spring-flo.js @@ -0,0 +1,5 @@ +/** + * Generated bundle index. Do not edit. + */ +export * from './index'; +//# sourceMappingURL=spring-flo.js.map \ No newline at end of file diff --git a/dist/esm2015/spring-flo.metadata.json b/dist/esm2015/spring-flo.metadata.json new file mode 100644 index 0000000..688daff --- /dev/null +++ b/dist/esm2015/spring-flo.metadata.json @@ -0,0 +1 @@ +{"__symbolic":"module","version":4,"exports":[{"from":"./shared/flo-common"},{"from":"./shared/flo-properties"},{"from":"./shared/shapes"}],"metadata":{"FloModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":12,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@angular/forms","name":"FormsModule","line":14,"character":4},{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":15,"character":4},{"__symbolic":"reference","module":"@angular/forms","name":"ReactiveFormsModule","line":16,"character":4}],"declarations":[{"__symbolic":"reference","name":"Palette"},{"__symbolic":"reference","name":"EditorComponent"},{"__symbolic":"reference","name":"ResizerDirective"},{"__symbolic":"reference","name":"DslEditorComponent"},{"__symbolic":"reference","name":"CodeEditorComponent"},{"__symbolic":"reference","name":"PropertiesGroupComponent"},{"__symbolic":"reference","name":"DynamicFormPropertyComponent"}],"exports":[{"__symbolic":"reference","name":"EditorComponent"},{"__symbolic":"reference","name":"DslEditorComponent"},{"__symbolic":"reference","name":"DynamicFormPropertyComponent"},{"__symbolic":"reference","name":"PropertiesGroupComponent"}]}]}],"members":{}},"Palette":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":37,"character":1},"arguments":[{"selector":"flo-palette","template":"\n
\n \n
\n
\n
\n
\n ","styles":["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":109,"character":17},"member":"None"}}]}],"members":{"metamodel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":145,"character":3}}]}],"renderer":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":148,"character":3}}]}],"paletteEntryPadding":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":151,"character":3}}]}],"onPaletteEntryDrop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":154,"character":3}}]}],"paletteReady":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":157,"character":3}}]}],"paletteFocus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":160,"character":3}}]}],"paletteSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":166,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":175,"character":44},"arguments":[{"__symbolic":"reference","module":"@angular/platform-browser","name":"DOCUMENT","line":175,"character":51}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":175,"character":31},{"__symbolic":"reference","name":"any"}]}],"onFocus":[{"__symbolic":"method"}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"createPaletteGroup":[{"__symbolic":"method"}],"createPaletteEntry":[{"__symbolic":"method"}],"buildPalette":[{"__symbolic":"method"}],"rebuildPalette":[{"__symbolic":"method"}],"getPaletteView":[{"__symbolic":"method"}],"handleMouseUp":[{"__symbolic":"method"}],"trigger":[{"__symbolic":"method"}],"handleDrag":[{"__symbolic":"method"}],"rotateOpen":[{"__symbolic":"method"}],"doRotateOpen":[{"__symbolic":"method"}],"doRotateClose":[{"__symbolic":"method"}],"rotateClosed":[{"__symbolic":"method"}]}},"EditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":20,"character":1},"arguments":[{"selector":"flo-editor","template":"\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ","styles":["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":693,"character":17},"member":"None"}}]}],"members":{"metamodel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":752,"character":3}}]}],"renderer":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":758,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":764,"character":3}}]}],"paletteSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":770,"character":3}}]}],"minZoom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":776,"character":3}}]}],"maxZoom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":782,"character":3}}]}],"zoomStep":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":788,"character":3}}]}],"paperPadding":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":791,"character":3}}]}],"floApi":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":794,"character":3}}]}],"validationMarkers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":797,"character":3}}]}],"contentValidated":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":800,"character":3}}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":803,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":808,"character":31}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"performGraphToTextSyncing":[{"__symbolic":"method"}],"createHandle":[{"__symbolic":"method"}],"removeEmbeddedChildrenOfType":[{"__symbolic":"method"}],"showDragFeedback":[{"__symbolic":"method"}],"hideDragFeedback":[{"__symbolic":"method"}],"setDragDescriptor":[{"__symbolic":"method"}],"handleNodeDragging":[{"__symbolic":"method"}],"handleNodeDropping":[{"__symbolic":"method"}],"_hideNode":[{"__symbolic":"method"}],"_restoreNodeVisibility":[{"__symbolic":"method"}],"getTargetViewFromEvent":[{"__symbolic":"method"}],"handleDnDFromPalette":[{"__symbolic":"method"}],"handleDragFromPalette":[{"__symbolic":"method"}],"createNode":[{"__symbolic":"method"}],"createLink":[{"__symbolic":"method"}],"handleDropFromPalette":[{"__symbolic":"method"}],"fitToContent":[{"__symbolic":"method"}],"autosizePaper":[{"__symbolic":"method"}],"fitToPage":[{"__symbolic":"method"}],"validateContent":[{"__symbolic":"method"}],"markElement":[{"__symbolic":"method"}],"doLayout":[{"__symbolic":"method"}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":1577,"character":3}}]}],"updateGraphRepresentation":[{"__symbolic":"method"}],"updateTextRepresentation":[{"__symbolic":"method"}],"initMetamodel":[{"__symbolic":"method"}],"initGraph":[{"__symbolic":"method"}],"handleNodeCreation":[{"__symbolic":"method"}],"handleLinkEvent":[{"__symbolic":"method"}],"handleLinkCreation":[{"__symbolic":"method"}],"initGraphListeners":[{"__symbolic":"method"}],"initPaperListeners":[{"__symbolic":"method"}],"initPaper":[{"__symbolic":"method"}],"updatePaletteReadyState":[{"__symbolic":"method"}]}},"DslEditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":13,"character":1},"arguments":[{"selector":"dsl-editor","template":"\n \n ","styles":["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":42,"character":17},"member":"None"}}]}],"members":{"lineNumbers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":54,"character":3},"arguments":["line-numbers"]}]}],"lineWrapping":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3},"arguments":["line-wrapping"]}]}],"scrollbarStyle":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3},"arguments":["scrollbar-style"]}]}],"placeholder":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":63,"character":3}}]}],"debounce":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":66,"character":3}}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":69,"character":3}}]}],"focus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":72,"character":3}}]}],"blur":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":75,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":78,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":86,"character":31}]}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":88,"character":3}}]}],"lintOptions":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":98,"character":3}}]}],"hintOptions":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":106,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}},"CodeEditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":35,"character":1},"arguments":[{"selector":"code-editor","template":"\n
\n \n
\n ","styles":["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":64,"character":17},"member":"None"},"providers":[{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":67,"character":15},"useExisting":{"__symbolic":"reference","name":"CodeEditorComponent"},"multi":true}]}]}],"members":{"lineNumbers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":91,"character":3},"arguments":["line-numbers"]}]}],"lineWrapping":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":94,"character":3},"arguments":["line-wrapping"]}]}],"scrollbarStyle":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":97,"character":3},"arguments":["scrollbar-style"]}]}],"placeholder":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":100,"character":3}}]}],"overviewRuler":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":103,"character":3},"arguments":["overview-ruler"]}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":106,"character":3}}]}],"focus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":109,"character":3}}]}],"blur":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":112,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":115,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":126,"character":31}]}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":128,"character":3}}]}],"language":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":138,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"loadEditorMode":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"registerOnChange":[{"__symbolic":"method"}],"registerOnTouched":[{"__symbolic":"method"}],"getLintOptions":[{"__symbolic":"method"}]}},"PropertiesGroupComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"properties-group","template":"\n
\n \n
\n ","encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":11,"character":17},"member":"None"}}]}],"members":{"propertiesGroupModel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":18,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"createGroupControls":[{"__symbolic":"method"}]}},"DynamicFormPropertyComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"df-property","template":"\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ","encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":54,"character":17},"member":"None"}}]}],"members":{"model":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":58,"character":3}}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":61,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor"}]}},"ResizerDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":9,"character":1},"arguments":[{"selector":"[resizer]","host":{"(mousedown)":"startDrag()","$quoted$":["(mousedown)"]}}]}],"members":{"maxSplitSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":21,"character":3}}]}],"sizeChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":24,"character":3}}]}],"splitSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"resizerWidth":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":72,"character":3}}]}],"resizerHeight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":78,"character":3}}]}],"resizerLeft":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":84,"character":3}}]}],"resizerTop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":89,"character":3}}]}],"resizerRight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":94,"character":3}}]}],"resizerBottom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":99,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":104,"character":44},"arguments":[{"__symbolic":"reference","module":"@angular/platform-browser","name":"DOCUMENT","line":104,"character":51}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":104,"character":31},{"__symbolic":"reference","name":"any"}]}],"startDrag":[{"__symbolic":"method"}],"mousemove":[{"__symbolic":"method"}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}}},"origins":{"FloModule":"./module","Palette":"./palette/palette.component","EditorComponent":"./editor/editor.component","DslEditorComponent":"./dsl-editor/dsl-editor.component","CodeEditorComponent":"./code-editor/code-editor.component","PropertiesGroupComponent":"./properties/properties.group.component","DynamicFormPropertyComponent":"./properties/df.property.component","ResizerDirective":"./directives/resizer"},"importAs":"spring-flo"} \ No newline at end of file diff --git a/dist/esm5/code-editor/code-editor.component.js b/dist/esm5/code-editor/code-editor.component.js new file mode 100644 index 0000000..1679726 --- /dev/null +++ b/dist/esm5/code-editor/code-editor.component.js @@ -0,0 +1,237 @@ +import * as tslib_1 from "tslib"; +import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation, forwardRef } from '@angular/core'; +import { NG_VALUE_ACCESSOR } from '@angular/forms'; +import * as CodeMirror from 'codemirror-minified'; +import * as _$ from 'jquery'; +var $ = _$; +// CodeMirror extensions +import 'codemirror-minified/mode/meta'; +import 'codemirror-minified/addon/lint/lint'; +import 'codemirror-minified/addon/hint/show-hint'; +// import 'codemirror-minified/addon/mode/loadmode'; +import 'codemirror-minified/addon/edit/matchbrackets'; +import 'codemirror-minified/addon/edit/closebrackets'; +import 'codemirror-minified/addon/display/placeholder'; +import 'codemirror-minified/addon/scroll/annotatescrollbar'; +import 'codemirror-minified/addon/scroll/simplescrollbars'; +// Lint support +// Unclear how to import this dynamically... +import 'codemirror-minified/addon/lint/javascript-lint'; +import 'codemirror-minified/addon/lint/coffeescript-lint'; +import 'codemirror-minified/addon/lint/json-lint'; +import 'codemirror-minified/addon/lint/yaml-lint'; +// TODO: use dynamic import with JS7 in the future. CM autoLoad cannot load it properly - thinks its AMD +// Supported languages until dynamic loading +import 'codemirror-minified/mode/groovy/groovy'; +import 'codemirror-minified/mode/javascript/javascript'; +import 'codemirror-minified/mode/python/python'; +import 'codemirror-minified/mode/ruby/ruby'; +import 'codemirror-minified/mode/clike/clike'; +import 'codemirror-minified/mode/yaml/yaml'; +import 'codemirror-minified/mode/coffeescript/coffeescript'; +var CodeEditorComponent = /** @class */ (function () { + function CodeEditorComponent(element) { + var _this = this; + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.dslChange = new EventEmitter(); + this.focus = new EventEmitter(); + this.blur = new EventEmitter(); + this.editor = new EventEmitter(); + this._dslChangedHandler = function () { + _this._dsl = _this.doc.getValue(); + _this.dslChange.emit(_this._dsl); + if (_this._onChangeHandler) { + _this._onChangeHandler(_this._dsl); + } + }; + } + CodeEditorComponent_1 = CodeEditorComponent; + Object.defineProperty(CodeEditorComponent.prototype, "dsl", { + set: function (dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + var cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CodeEditorComponent.prototype, "language", { + set: function (_language) { + if (this._language !== _language) { + this._language = _language; + this.loadEditorMode(); + } + }, + enumerable: true, + configurable: true + }); + CodeEditorComponent.prototype.ngOnInit = function () { + var _this = this; + var options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + matchBrackets: true, + autoCloseBrackets: true, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + this.doc = CodeMirror.fromTextArea($('#code-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this._dslChangedHandler); + this.doc.on('focus', function () { + _this.focus.emit(); + if (_this._onTouchHandler) { + _this._onTouchHandler(); + } + }); + this.doc.on('blur', function () { return _this.blur.emit(); }); + this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); + this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); + this.loadEditorMode(); + this.editor.emit(this.doc); + }; + CodeEditorComponent.prototype.loadEditorMode = function () { + // CodeMirror doc object must be initialized + if (!this.doc) { + return; + } + var info = this._language ? CodeMirror.findModeByName(this._language) : undefined; + // Set proper editor mode + if (info) { + this.doc.setOption('mode', info.mime); + // (CodeMirror).autoLoadMode(this.doc, info.mode); + } + else { + this.doc.setOption('mode', 'text/plain'); + } + // Set proper Lint mode + this.doc.setOption('lint', this.getLintOptions()); + }; + CodeEditorComponent.prototype.ngOnDestroy = function () { + }; + CodeEditorComponent.prototype.writeValue = function (obj) { + this.dsl = obj; + }; + CodeEditorComponent.prototype.registerOnChange = function (fn) { + this._onChangeHandler = fn; + }; + CodeEditorComponent.prototype.registerOnTouched = function (fn) { + this._onTouchHandler = fn; + }; + CodeEditorComponent.prototype.getLintOptions = function () { + var _this = this; + switch (this._language) { + case 'javascript': + case 'json': + case 'coffeescript': + case 'yaml': + return { + onUpdateLinting: function (annotations) { + var warnings = []; + var errors = []; + if (_this.overviewRuler) { + if (Array.isArray(annotations)) { + annotations.forEach(function (a) { + if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { + if (a.severity === 'error') { + errors.push(a); + } + else if (a.severity === 'warning') { + warnings.push(a); + } + } + }); + } + } + _this.warningRuler.update(warnings); + _this.errorRuler.update(errors); + } + }; + } + return false; + }; + var CodeEditorComponent_1; + tslib_1.__decorate([ + Input('line-numbers'), + tslib_1.__metadata("design:type", Object) + ], CodeEditorComponent.prototype, "lineNumbers", void 0); + tslib_1.__decorate([ + Input('line-wrapping'), + tslib_1.__metadata("design:type", Object) + ], CodeEditorComponent.prototype, "lineWrapping", void 0); + tslib_1.__decorate([ + Input('scrollbar-style'), + tslib_1.__metadata("design:type", String) + ], CodeEditorComponent.prototype, "scrollbarStyle", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String) + ], CodeEditorComponent.prototype, "placeholder", void 0); + tslib_1.__decorate([ + Input('overview-ruler'), + tslib_1.__metadata("design:type", Boolean) + ], CodeEditorComponent.prototype, "overviewRuler", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], CodeEditorComponent.prototype, "dslChange", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], CodeEditorComponent.prototype, "focus", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], CodeEditorComponent.prototype, "blur", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], CodeEditorComponent.prototype, "editor", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) + ], CodeEditorComponent.prototype, "dsl", null); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) + ], CodeEditorComponent.prototype, "language", null); + CodeEditorComponent = CodeEditorComponent_1 = tslib_1.__decorate([ + Component({ + selector: 'code-editor', + template: "\n
\n \n
\n ", + styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "], + encapsulation: ViewEncapsulation.None, + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(function () { return CodeEditorComponent_1; }), + multi: true + } + ] + }), + tslib_1.__metadata("design:paramtypes", [ElementRef]) + ], CodeEditorComponent); + return CodeEditorComponent; +}()); +export { CodeEditorComponent }; +//# sourceMappingURL=code-editor.component.js.map \ No newline at end of file diff --git a/dist/esm5/directives/resizer.js b/dist/esm5/directives/resizer.js new file mode 100644 index 0000000..7f5415a --- /dev/null +++ b/dist/esm5/directives/resizer.js @@ -0,0 +1,192 @@ +import * as tslib_1 from "tslib"; +import { Directive, Input, Output, EventEmitter, Inject, ElementRef } from '@angular/core'; +import { DOCUMENT } from '@angular/platform-browser'; +import { fromEvent } from 'rxjs'; +import { sampleTime } from 'rxjs/operators'; +import { CompositeDisposable, Disposable } from 'ts-disposables'; +import * as _$ from 'jquery'; +var $ = _$; +var ResizerDirective = /** @class */ (function () { + function ResizerDirective(element, document) { + var _this = this; + this.element = element; + this.document = document; + this.dragInProgress = false; + this.vertical = true; + this._subscriptions = new CompositeDisposable(); + this.sizeChange = new EventEmitter(); + this.mouseMoveHandler = function (e) { + if (_this.dragInProgress) { + _this.mousemove(e); + } + }; + } + Object.defineProperty(ResizerDirective.prototype, "splitSize", { + set: function (splitSize) { + if (this.maxSplitSize && splitSize > this.maxSplitSize) { + splitSize = this.maxSplitSize; + } + if (this.vertical) { + // Handle vertical resizer + $(this.element.nativeElement).css({ + left: splitSize + 'px' + }); + $(this.first).css({ + width: splitSize + 'px' + }); + $(this.second).css({ + left: (splitSize + this._size) + 'px' + }); + } + else { + // Handle horizontal resizer + $(this.element.nativeElement).css({ + bottom: splitSize + 'px' + }); + $(this.first).css({ + bottom: (splitSize + this._size) + 'px' + }); + $(this.second).css({ + height: splitSize + 'px' + }); + } + this._splitSize = splitSize; + // Update the local field + this.sizeChange.emit(splitSize); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerWidth", { + set: function (width) { + this._size = width; + this.vertical = true; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerHeight", { + set: function (height) { + this._size = height; + this.vertical = false; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerLeft", { + set: function (first) { + this.first = first; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerTop", { + set: function (first) { + this.first = first; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerRight", { + set: function (second) { + this.second = second; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerBottom", { + set: function (second) { + this.second = second; + }, + enumerable: true, + configurable: true + }); + ResizerDirective.prototype.startDrag = function () { + this.dragInProgress = true; + }; + ResizerDirective.prototype.mousemove = function (event) { + var size; + if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node + size = event.pageX - $(this.first).offset().left; + } + else { + // Handle horizontal resizer Calculate new size relative to palette container DOM node + size = window.innerHeight - event.pageY - $(this.second).offset().top; + } + this.splitSize = size; + }; + ResizerDirective.prototype.ngOnInit = function () { + // Need to set left and right elements width and fire events on init when DOM is built + var _this = this; + this.splitSize = this._splitSize; + var subscription1 = fromEvent($(this.document).get(0), 'mousemove') + .pipe(sampleTime(300)) + .subscribe(this.mouseMoveHandler); + this._subscriptions.add(Disposable.create(function () { return subscription1.unsubscribe(); })); + var subscription2 = fromEvent($(this.document).get(0), 'mouseup') + .subscribe(function (e) { + if (_this.dragInProgress) { + _this.mousemove(e); + _this.dragInProgress = false; + } + }); + this._subscriptions.add(Disposable.create(function () { return subscription2.unsubscribe(); })); + }; + ResizerDirective.prototype.ngOnDestroy = function () { + this._subscriptions.dispose(); + }; + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number) + ], ResizerDirective.prototype, "maxSplitSize", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], ResizerDirective.prototype, "sizeChange", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number), + tslib_1.__metadata("design:paramtypes", [Number]) + ], ResizerDirective.prototype, "splitSize", null); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number), + tslib_1.__metadata("design:paramtypes", [Number]) + ], ResizerDirective.prototype, "resizerWidth", null); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number), + tslib_1.__metadata("design:paramtypes", [Number]) + ], ResizerDirective.prototype, "resizerHeight", null); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerLeft", null); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerTop", null); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerRight", null); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerBottom", null); + ResizerDirective = tslib_1.__decorate([ + Directive({ + selector: '[resizer]', + host: { '(mousedown)': 'startDrag()' } + }), + tslib_1.__param(1, Inject(DOCUMENT)), + tslib_1.__metadata("design:paramtypes", [ElementRef, Object]) + ], ResizerDirective); + return ResizerDirective; +}()); +export { ResizerDirective }; +//# sourceMappingURL=resizer.js.map \ No newline at end of file diff --git a/dist/esm5/dsl-editor/dsl-editor.component.js b/dist/esm5/dsl-editor/dsl-editor.component.js new file mode 100644 index 0000000..aeaaa4b --- /dev/null +++ b/dist/esm5/dsl-editor/dsl-editor.component.js @@ -0,0 +1,158 @@ +import * as tslib_1 from "tslib"; +import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation } from '@angular/core'; +import * as _ from 'lodash'; +import * as CodeMirror from 'codemirror-minified'; +import * as _$ from 'jquery'; +var $ = _$; +import 'codemirror-minified/addon/lint/lint'; +import 'codemirror-minified/addon/hint/show-hint'; +import 'codemirror-minified/addon/display/placeholder'; +import 'codemirror-minified/addon/scroll/annotatescrollbar'; +import 'codemirror-minified/addon/scroll/simplescrollbars'; +var DslEditorComponent = /** @class */ (function () { + function DslEditorComponent(element) { + var _this = this; + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.debounce = 0; + this.dslChange = new EventEmitter(); + this.focus = new EventEmitter(); + this.blur = new EventEmitter(); + this.editor = new EventEmitter(); + this._dslChangedHandler = function () { + _this._dsl = _this.doc.getValue(); + _this.dslChange.emit(_this._dsl); + }; + } + Object.defineProperty(DslEditorComponent.prototype, "dsl", { + set: function (dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + var cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DslEditorComponent.prototype, "lintOptions", { + set: function (lintOptions) { + this._lint = lintOptions; + if (this.doc) { + this.doc.setOption('lint', this._lint); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DslEditorComponent.prototype, "hintOptions", { + set: function (hintOptions) { + this._hint = hintOptions; + if (this.doc) { + this.doc.setOption('hintOptions', this._hint); + } + }, + enumerable: true, + configurable: true + }); + DslEditorComponent.prototype.ngOnInit = function () { + var _this = this; + var options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + electricChars: false, + smartIndent: false, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + if (this._hint) { + options.hintOptions = this._hint; + } + this.doc = CodeMirror.fromTextArea($('#dsl-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this.debounce ? _.debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); + this.doc.on('focus', function () { return _this.focus.emit(); }); + this.doc.on('blur', function () { return _this.blur.emit(); }); + this.editor.emit(this.doc); + }; + DslEditorComponent.prototype.ngOnDestroy = function () { + }; + tslib_1.__decorate([ + Input('line-numbers'), + tslib_1.__metadata("design:type", Object) + ], DslEditorComponent.prototype, "lineNumbers", void 0); + tslib_1.__decorate([ + Input('line-wrapping'), + tslib_1.__metadata("design:type", Object) + ], DslEditorComponent.prototype, "lineWrapping", void 0); + tslib_1.__decorate([ + Input('scrollbar-style'), + tslib_1.__metadata("design:type", String) + ], DslEditorComponent.prototype, "scrollbarStyle", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String) + ], DslEditorComponent.prototype, "placeholder", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], DslEditorComponent.prototype, "debounce", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], DslEditorComponent.prototype, "dslChange", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], DslEditorComponent.prototype, "focus", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], DslEditorComponent.prototype, "blur", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], DslEditorComponent.prototype, "editor", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) + ], DslEditorComponent.prototype, "dsl", null); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object), + tslib_1.__metadata("design:paramtypes", [Object]) + ], DslEditorComponent.prototype, "lintOptions", null); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object), + tslib_1.__metadata("design:paramtypes", [Object]) + ], DslEditorComponent.prototype, "hintOptions", null); + DslEditorComponent = tslib_1.__decorate([ + Component({ + selector: 'dsl-editor', + template: "\n \n ", + styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "], + encapsulation: ViewEncapsulation.None + }), + tslib_1.__metadata("design:paramtypes", [ElementRef]) + ], DslEditorComponent); + return DslEditorComponent; +}()); +export { DslEditorComponent }; +//# sourceMappingURL=dsl-editor.component.js.map \ No newline at end of file diff --git a/dist/esm5/editor/editor-utils.js b/dist/esm5/editor/editor-utils.js new file mode 100644 index 0000000..40454b6 --- /dev/null +++ b/dist/esm5/editor/editor-utils.js @@ -0,0 +1,112 @@ +import { Flo } from '../shared/flo-common'; +import * as _ from 'lodash'; +var joint = Flo.joint; +import * as _$ from 'jquery'; +var $ = _$; +var Utils = /** @class */ (function () { + function Utils() { + } + Utils.fanRoute = function (graph, cell) { + if (cell instanceof joint.dia.Element) { + var links = graph.getConnectedLinks(cell); + var groupsOfOverlappingLinks = _.groupBy(links, function (link) { + // the key of the group is the model id of the link's source or target, but not our cell id. + var sourceId = link.get('source').id; + var targetId = link.get('target').id; + return cell.id !== sourceId ? sourceId : targetId; + }); + _.each(groupsOfOverlappingLinks, function (group, key) { + // If the member of the group has both source and target model adjust vertices. + var toRoute = {}; + if (key !== undefined) { + group.forEach(function (link) { + if (link.get('source').id === cell.get('id') && link.get('target').id) { + toRoute[link.get('target').id] = link; + } + else if (link.get('target').id === cell.get('id') && link.get('source').id) { + toRoute[link.get('source').id] = link; + } + }); + Object.keys(toRoute).forEach(function (k) { + Utils.fanRoute(graph, toRoute[k]); + }); + } + }); + } + else if (cell instanceof joint.dia.Link) { + // The cell is a link. Let's find its source and target models. + var srcId_1 = cell.get('source').id || cell.previous('source').id; + var trgId_1 = cell.get('target').id || cell.previous('target').id; + // If one of the ends is not a model, the link has no siblings. + if (!srcId_1 || !trgId_1) { + return; + } + var siblings = graph.getLinks().filter(function (sibling) { + var _srcId = sibling.get('source').id; + var _trgId = sibling.get('target').id; + var vertices = sibling.get('vertices'); + var fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); + return ((_srcId === srcId_1 && _trgId === trgId_1) || (_srcId === trgId_1 && _trgId === srcId_1)) && fanRouted; + }); + switch (siblings.length) { + case 0: + // The link was removed and had no siblings. + break; + case 1: + // There is only one link between the source and target. No vertices needed. + var vertices = cell.get('vertices'); + if (vertices && vertices.length && cell.get('fanRouted')) { + cell.unset('vertices'); + } + break; + default: + // There is more than one siblings. We need to create vertices. + // First of all we'll find the middle point of the link. + var source = graph.getCell(srcId_1); + var target = graph.getCell(trgId_1); + if (!source || !target) { + // When clearing the graph it may happen that some nodes are gone and some are left + return; + } + var srcCenter = source.getBBox().center(); + var trgCenter = target.getBBox().center(); + var midPoint_1 = joint.g.line(srcCenter, trgCenter).midpoint(); + // Then find the angle it forms. + var theta_1 = srcCenter.theta(trgCenter); + // This is the maximum distance between links + var gap_1 = 20; + siblings.forEach(function (sibling, index) { + // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. + var offset = gap_1 * Math.ceil(index / 2); + // Now we need the vertices to be placed at points which are 'offset' pixels distant + // from the first link and forms a perpendicular angle to it. And as index goes up + // alternate left and right. + // + // ^ odd indexes + // | + // |----> index 0 line (straight line between a source center and a target center. + // | + // v even indexes + var sign = index % 2 ? 1 : -1; + var angle = joint.g.toRad(theta_1 + sign * 90); + // We found the vertex. + var vertex = joint.g.point.fromPolar(offset, angle, midPoint_1); + sibling.set('fanRouted', true); + sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); + }); + } + } + }; + Utils.isCustomPaperEvent = function (args) { + return args.length === 5 && + _.isString(args[0]) && + (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && + args[1] instanceof $.Event && + args[2] instanceof joint.dia.CellView && + _.isNumber(args[3]) && + _.isNumber(args[4]); + }; + return Utils; +}()); +export { Utils }; +//# sourceMappingURL=editor-utils.js.map \ No newline at end of file diff --git a/dist/esm5/editor/editor.component.js b/dist/esm5/editor/editor.component.js new file mode 100644 index 0000000..5eb2e9f --- /dev/null +++ b/dist/esm5/editor/editor.component.js @@ -0,0 +1,1195 @@ +import * as tslib_1 from "tslib"; +import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation } from '@angular/core'; +import { debounceTime } from 'rxjs/operators'; +import { Flo } from '../shared/flo-common'; +import { Shapes, Constants } from '../shared/shapes'; +import { Utils } from './editor-utils'; +import { CompositeDisposable, Disposable } from 'ts-disposables'; +import * as _$ from 'jquery'; +import * as _ from 'lodash'; +import { Subject, BehaviorSubject } from 'rxjs'; +var joint = Flo.joint; +var $ = _$; +var SCROLLBAR_SIZE = 17; +var EditorComponent = /** @class */ (function () { + function EditorComponent(element) { + var _this = this; + this.element = element; + /** + * Flag specifying whether the Flo-Editor is in read-only mode. + */ + this._readOnlyCanvas = false; + /** + * Grid size + */ + this._gridSize = 1; + this._hiddenPalette = false; + this.textToGraphEventEmitter = new EventEmitter(); + this.graphToTextEventEmitter = new EventEmitter(); + this._graphToTextSyncEnabled = true; + this.validationEventEmitter = new EventEmitter(); + this._disposables = new CompositeDisposable(); + this._dslText = ''; + this.textToGraphConversionCompleted = new Subject(); + this.graphToTextConversionCompleted = new Subject(); + this.paletteReady = new BehaviorSubject(false); + /** + * Min zoom percent value + */ + this.minZoom = 5; + /** + * Max zoom percent value + */ + this.maxZoom = 400; + /** + * Zoom percent increment/decrement step + */ + this.zoomStep = 5; + this.paperPadding = 0; + this.floApi = new EventEmitter(); + this.validationMarkers = new EventEmitter(); + this.contentValidated = new EventEmitter(); + this.dslChange = new EventEmitter(); + this._resizeHandler = function () { return _this.autosizePaper(); }; + var self = this; + this.editorContext = new (/** @class */ (function () { + function DefaultRunnableContext() { + } + Object.defineProperty(DefaultRunnableContext.prototype, "zoomPercent", { + get: function () { + return self.zoomPercent; + }, + set: function (percent) { + self.zoomPercent = percent; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "noPalette", { + get: function () { + return self.noPalette; + }, + set: function (noPalette) { + self.noPalette = noPalette; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "gridSize", { + get: function () { + return self.gridSize; + }, + set: function (gridSize) { + self.gridSize = gridSize; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "readOnlyCanvas", { + get: function () { + return self.readOnlyCanvas; + }, + set: function (readOnly) { + self.readOnlyCanvas = readOnly; + }, + enumerable: true, + configurable: true + }); + DefaultRunnableContext.prototype.setDsl = function (dsl) { + self.dsl = dsl; + }; + DefaultRunnableContext.prototype.updateGraph = function () { + return self.updateGraphRepresentation(); + }; + DefaultRunnableContext.prototype.updateText = function () { + return self.updateTextRepresentation(); + }; + DefaultRunnableContext.prototype.performLayout = function () { + return self.doLayout(); + }; + DefaultRunnableContext.prototype.clearGraph = function () { + var _this = this; + self.selection = undefined; + self.graph.clear(); + if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { + return self.metamodel.load().then(function (data) { + self.editor.setDefaultContent(_this, data); + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + }); + } + else { + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + } + }; + DefaultRunnableContext.prototype.getGraph = function () { + return self.graph; + }; + DefaultRunnableContext.prototype.getPaper = function () { + return self.paper; + }; + Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextSync", { + get: function () { + return self.graphToTextSync; + }, + set: function (sync) { + self.graphToTextSync = sync; + }, + enumerable: true, + configurable: true + }); + DefaultRunnableContext.prototype.getMinZoom = function () { + return self.minZoom; + }; + DefaultRunnableContext.prototype.getMaxZoom = function () { + return self.maxZoom; + }; + DefaultRunnableContext.prototype.getZoomStep = function () { + return self.zoomStep; + }; + DefaultRunnableContext.prototype.fitToPage = function () { + self.fitToPage(); + }; + DefaultRunnableContext.prototype.createNode = function (metadata, props, position) { + return self.createNode(metadata, props, position); + }; + DefaultRunnableContext.prototype.createLink = function (source, target, metadata, props) { + return self.createLink(source, target, metadata, props); + }; + Object.defineProperty(DefaultRunnableContext.prototype, "selection", { + get: function () { + return self.selection; + }, + set: function (newSelection) { + self.selection = newSelection; + }, + enumerable: true, + configurable: true + }); + DefaultRunnableContext.prototype.deleteSelectedNode = function () { + if (self.selection) { + if (self.editor && self.editor.preDelete) { + self.editor.preDelete(self.editorContext, self.selection.model); + } + else { + if (self.selection.model instanceof joint.dia.Element) { + self.graph.getConnectedLinks(self.selection.model).forEach(function (l) { return l.remove(); }); + } + } + self.selection.model.remove(); + self.selection = undefined; + } + }; + Object.defineProperty(DefaultRunnableContext.prototype, "textToGraphConversionObservable", { + get: function () { + return self.textToGraphConversionCompleted; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextConversionObservable", { + get: function () { + return self.graphToTextConversionCompleted; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "paletteReady", { + get: function () { + return self.paletteReady; + }, + enumerable: true, + configurable: true + }); + return DefaultRunnableContext; + }()))(); + } + EditorComponent.prototype.ngOnInit = function () { + var _this = this; + this.initGraph(); + this.initPaper(); + this.initGraphListeners(); + this.initPaperListeners(); + this.initMetamodel(); + $(window).on('resize', this._resizeHandler); + this._disposables.add(Disposable.create(function () { return $(window).off('resize', _this._resizeHandler); })); + /* + * Execute resize to get the right size for the SVG element on the editor canvas. + * Executed via timeout to let angular render the DOM first and elements to have the right width and height + */ + window.setTimeout(this._resizeHandler); + this.floApi.emit(this.editorContext); + }; + EditorComponent.prototype.ngOnDestroy = function () { + this._disposables.dispose(); + }; + Object.defineProperty(EditorComponent.prototype, "noPalette", { + get: function () { + return this._hiddenPalette; + }, + set: function (hidden) { + this._hiddenPalette = hidden; + // If palette is not shown ensure that canvas starts from the left==0! + if (hidden) { + $('#paper-container', this.element.nativeElement).css('left', 0); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EditorComponent.prototype, "graphToTextSync", { + get: function () { + return this._graphToTextSyncEnabled; + }, + set: function (sync) { + this._graphToTextSyncEnabled = sync; + // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion + // this.performGraphToTextSyncing(); + }, + enumerable: true, + configurable: true + }); + EditorComponent.prototype.performGraphToTextSyncing = function () { + if (this._graphToTextSyncEnabled) { + this.graphToTextEventEmitter.emit(); + } + }; + EditorComponent.prototype.createHandle = function (element, kind, action, location) { + if (!location) { + var bbox = element.model.getBBox(); + location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); + } + var handle = Shapes.Factory.createHandle({ + renderer: this.renderer, + paper: this.paper, + parent: element.model, + kind: kind, + position: location + }); + var view = this.paper.findViewByModel(handle); + view.on('cell:pointerdown', function () { + if (action) { + action(); + } + }); + view.on('cell:mouseover', function () { + handle.attr('image/filter', { + name: 'dropShadow', + args: { dx: 1, dy: 1, blur: 1, color: 'black' } + }); + }); + view.on('cell:mouseout', function () { + handle.removeAttr('image/filter'); + }); + view.setInteractivity(false); + return handle; + }; + EditorComponent.prototype.removeEmbeddedChildrenOfType = function (element, types) { + var embeds = element.getEmbeddedCells(); + for (var i = 0; i < embeds.length; i++) { + if (types.indexOf(embeds[i].get('type')) >= 0) { + embeds[i].remove(); + } + } + }; + Object.defineProperty(EditorComponent.prototype, "selection", { + get: function () { + return this._selection; + }, + set: function (newSelection) { + var _this = this; + if (newSelection && (newSelection.model.get('type') === joint.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint.shapes.flo.HANDLE_TYPE)) { + newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); + } + if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { + newSelection = undefined; + } + if (newSelection !== this._selection) { + if (this._selection) { + var elementview = this.paper.findViewByModel(this._selection.model); + if (elementview) { // May have been removed from the graph + this.removeEmbeddedChildrenOfType(elementview.model, joint.shapes.flo.HANDLE_TYPE); + elementview.unhighlight(); + } + } + if (newSelection) { + newSelection.highlight(); + if (this.editor && this.editor.createHandles) { + this.editor.createHandles(this.editorContext, function (owner, kind, action, location) { return _this.createHandle(owner, kind, action, location); }, newSelection); + } + } + this._selection = newSelection; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EditorComponent.prototype, "readOnlyCanvas", { + get: function () { + return this._readOnlyCanvas; + }, + set: function (value) { + var _this = this; + if (this._readOnlyCanvas === value) { + // Nothing to do + return; + } + if (value) { + this.selection = undefined; + } + if (this.graph) { + this.graph.getLinks().forEach(function (link) { + if (value) { + link.attr('.link-tools/display', 'none'); + link.attr('.marker-vertices/display', 'none'); + link.attr('.connection-wrap/display', 'none'); + } + else { + link.removeAttr('.link-tools/display'); + if (_this.editor && _this.editor.allowLinkVertexEdit) { + link.removeAttr('.marker-vertices/display'); + } + link.removeAttr('.connection-wrap/display'); + } + }); + } + this._readOnlyCanvas = value; + }, + enumerable: true, + configurable: true + }); + /** + * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + EditorComponent.prototype.showDragFeedback = function (dragDescriptor) { + if (this.editor && this.editor.showDragFeedback) { + this.editor.showDragFeedback(this.editorContext, dragDescriptor); + } + else { + var magnet = void 0; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint.V(magnet).addClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint.V(magnet).addClass('dnd-target-feedback'); + } + } + } + } + }; + /** + * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + EditorComponent.prototype.hideDragFeedback = function (dragDescriptor) { + if (this.editor && this.editor.hideDragFeedback) { + this.editor.hideDragFeedback(this.editorContext, dragDescriptor); + } + else { + var magnet = void 0; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint.V(magnet).removeClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint.V(magnet).removeClass('dnd-target-feedback'); + } + } + } + } + }; + /** + * Sets the new DnD info object - the descriptor for DnD + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + EditorComponent.prototype.setDragDescriptor = function (dragDescriptor) { + if (this.highlighted === dragDescriptor) { + return; + } + if (this.highlighted && dragDescriptor && _.isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { + if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { + return; + } + if (this.highlighted.source && + dragDescriptor.source && + this.highlighted.target && + dragDescriptor.target && + this.highlighted.source.view.model === dragDescriptor.source.view.model && + this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && + this.highlighted.target.view.model === dragDescriptor.target.view.model && + this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { + return; + } + } + if (this.highlighted) { + this.hideDragFeedback(this.highlighted); + } + this.highlighted = dragDescriptor; + if (this.highlighted) { + this.showDragFeedback(this.highlighted); + } + }; + /** + * Handles DnD events when a node is being dragged over canvas + * + * @param draggedView The Joint JS view object being dragged + * @param targetUnderMouse The Joint JS view under mouse cursor + * @param x X coordinate of the mouse on the canvas + * @param y Y coordinate of the mosue on the canvas + * @param context DnD context (palette or canvas) + */ + EditorComponent.prototype.handleNodeDragging = function (draggedView, targetUnderMouse, x, y, sourceComponent) { + if (this.editor && this.editor.calculateDragDescriptor) { + this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint.g.point(x, y), sourceComponent)); + } + }; + /** + * Handles DnD drop event when a node is being dragged and dropped on the main canvas + */ + EditorComponent.prototype.handleNodeDropping = function () { + if (this.highlighted && this.editor && this.editor.handleNodeDropping) { + this.editor.handleNodeDropping(this.editorContext, this.highlighted); + } + this.setDragDescriptor(undefined); + }; + /** + * Hides DOM Node (used to determine drop target DOM element) + * @param domNode DOM node to hide + * @returns + */ + EditorComponent.prototype._hideNode = function (domNode) { + var oldVisibility = { + visibility: domNode.style ? domNode.style.display : undefined, + children: [] + }; + for (var i = 0; i < domNode.children.length; i++) { + var node = domNode.children.item(i); + if (node instanceof HTMLElement) { + oldVisibility.children.push(this._hideNode(node)); + } + } + domNode.style.display = 'none'; + return oldVisibility; + }; + /** + * Restored DOM node original visibility (used to determine drop target DOM element) + * @param domNode DOM node to restore visibility of + * @param oldVisibility original visibility parameter + */ + EditorComponent.prototype._restoreNodeVisibility = function (domNode, oldVisibility) { + if (domNode.style) { + domNode.style.display = oldVisibility.visibility; + } + var j = 0; + for (var i = 0; i < domNode.childNodes.length; i++) { + if (j < oldVisibility.children.length) { + var node = domNode.children.item(i); + if (node instanceof HTMLElement) { + this._restoreNodeVisibility(node, oldVisibility.children[j++]); + } + } + } + }; + /** + * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. + * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location + * (bounding box of a link for testing is bad). + * The result of that is that links can only be the drop target when dragging from the palette currently. + * When DnDing shapes on the canvas drop target cannot be a link. + * + * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked + * - e.g. Drag-n-Drop) + */ + EditorComponent.prototype.getTargetViewFromEvent = function (event, x, y, excludeViews) { + var _this = this; + if (excludeViews === void 0) { excludeViews = []; } + if (!x && !y) { + var l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); + x = l.x; + y = l.y; + } + // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing + // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); + // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); + // if (underMouse) { + // return underMouse; + // } + var oldVisibility = excludeViews.map(function (_x) { return _this._hideNode(_x.el); }); + var targetElement = document.elementFromPoint(event.clientX, event.clientY); + excludeViews.forEach(function (excluded, i) { + _this._restoreNodeVisibility(excluded.el, oldVisibility[i]); + }); + return this.paper.findView($(targetElement)); + }; + EditorComponent.prototype.handleDnDFromPalette = function (dndEvent) { + switch (dndEvent.type) { + case Flo.DnDEventType.DRAG: + this.handleDragFromPalette(dndEvent); + break; + case Flo.DnDEventType.DROP: + this.handleDropFromPalette(dndEvent); + break; + default: + break; + } + }; + EditorComponent.prototype.handleDragFromPalette = function (dnDEvent) { + console.debug('Dragging from palette'); + if (dnDEvent.view && !this.readOnlyCanvas) { + var location_1 = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); + this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location_1.x, location_1.y, [dnDEvent.view]), location_1.x, location_1.y, Constants.PALETTE_CONTEXT); + } + }; + EditorComponent.prototype.createNode = function (metadata, props, position) { + return Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.paper, + metadata: metadata, + props: props, + position: position + }); + }; + EditorComponent.prototype.createLink = function (source, target, metadata, props) { + return Shapes.Factory.createLink({ + renderer: this.renderer, + paper: this.paper, + source: source, + target: target, + metadata: metadata, + props: props + }); + }; + EditorComponent.prototype.handleDropFromPalette = function (event) { + var cellview = event.view; + var evt = event.event; + if (this.paper.el === evt.target || $.contains(this.paper.el, evt.target)) { + if (this.readOnlyCanvas) { + this.setDragDescriptor(undefined); + } + else { + var metadata = cellview.model.attr('metadata'); + var props = cellview.model.attr('props'); + var position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); + /* Calculate target element before creating the new + * element under mouse location. Otherwise target + * element would be the newly created element because + * it's under the mouse pointer + */ + var targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); + var newNode = this.createNode(metadata, props, position); + var newView = this.paper.findViewByModel(newNode); + this.handleNodeDragging(newView, targetElement, position.x, position.y, Constants.PALETTE_CONTEXT); + this.handleNodeDropping(); + } + } + }; + EditorComponent.prototype.fitToContent = function (gridWidth, gridHeight, padding, opt) { + var paper = this.paper; + if (joint.util.isObject(gridWidth)) { + // first parameter is an option object + opt = gridWidth; + gridWidth = opt.gridWidth || 1; + gridHeight = opt.gridHeight || 1; + padding = opt.padding || 0; + } + else { + opt = opt || {}; + gridWidth = gridWidth || 1; + gridHeight = gridHeight || 1; + padding = padding || 0; + } + var paddingJson = joint.util.normalizeSides(padding); + // Calculate the paper size to accomodate all the graph's elements. + var bbox = joint.V(paper.viewport).getBBox(); + var currentScale = paper.scale(); + var currentTranslate = paper.translate(); + bbox.x *= currentScale.sx; + bbox.y *= currentScale.sy; + bbox.width *= currentScale.sx; + bbox.height *= currentScale.sy; + var calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; + var calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; + var tx = 0; + var ty = 0; + if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { + tx = (-bbox.x / gridWidth) * gridWidth; + tx += paddingJson.left; + } + else if (opt.allowNewOrigin === 'same') { + tx = currentTranslate.tx; + } + calcWidth += tx; + if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { + ty = (-bbox.y / gridHeight) * gridHeight; + ty += paddingJson.top; + } + else if (opt.allowNewOrigin === 'same') { + ty = currentTranslate.ty; + } + calcHeight += ty; + calcWidth += paddingJson.right; + calcHeight += paddingJson.bottom; + // Make sure the resulting width and height are greater than minimum. + calcWidth = Math.max(calcWidth, opt.minWidth || 0); + calcHeight = Math.max(calcHeight, opt.minHeight || 0); + // Make sure the resulting width and height are lesser than maximum. + calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); + calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); + var dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; + var originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; + // Change the dimensions only if there is a size discrepency or an origin change + if (originChange) { + paper.translate(tx, ty); + } + if (dimensionChange) { + paper.setDimensions(calcWidth, calcHeight); + } + }; + EditorComponent.prototype.autosizePaper = function () { + var parent = $('#paper-container', this.element.nativeElement); + var parentWidth = parent.innerWidth(); + var parentHeight = parent.innerHeight(); + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth - SCROLLBAR_SIZE, + minHeight: parentHeight - SCROLLBAR_SIZE, + allowNewOrigin: 'same' + }); + }; + EditorComponent.prototype.fitToPage = function () { + var parent = $('#paper-container', this.element.nativeElement); + var minScale = this.minZoom / 100; + var maxScale = 2; + var parentWidth = parent.innerWidth(); + var parentHeight = parent.innerHeight(); + this.paper.scaleContentToFit({ + padding: this.paperPadding, + minScaleX: minScale, + minScaleY: minScale, + maxScaleX: maxScale, + maxScaleY: maxScale, + fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } + }); + /** + * Size the canvas appropriately and allow origin movement + */ + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth, + minHeight: parentHeight, + maxWidth: parentWidth, + maxHeight: parentHeight, + allowNewOrigin: 'any' + }); + }; + Object.defineProperty(EditorComponent.prototype, "zoomPercent", { + get: function () { + return Math.round(joint.V(this.paper.viewport).scale().sx * 100); + }, + set: function (percent) { + if (!isNaN(percent)) { + if (percent < this.minZoom) { + percent = this.minZoom; + } + else if (percent >= this.maxZoom) { + percent = this.maxZoom; + } + else { + if (percent <= 0) { + percent = 0.00001; + } + } + this.paper.scale(percent / 100, percent / 100); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EditorComponent.prototype, "gridSize", { + get: function () { + return this._gridSize; + }, + set: function (size) { + if (!isNaN(size) && size >= 1) { + this._gridSize = size; + if (this.paper) { + this.paper.setGridSize(size); + } + } + }, + enumerable: true, + configurable: true + }); + EditorComponent.prototype.validateContent = function () { + var _this = this; + return new Promise(function (resolve) { + if (_this.editor && _this.editor.validate) { + return _this.editor + .validate(_this.graph, _this.dsl, _this.editorContext) + .then(function (allMarkers) { + _this.graph.getCells() + .forEach(function (cell) { return _this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : []); }); + _this.validationMarkers.emit(allMarkers); + _this.contentValidated.emit(true); + resolve(); + }); + } + else { + resolve(); + } + }); + }; + EditorComponent.prototype.markElement = function (cell, markers) { + var errorMessages = markers.map(function (m) { return m.message; }); + var errorCell = cell.getEmbeddedCells().find(function (e) { return e.attr('./kind') === Constants.ERROR_DECORATION_KIND; }); + if (errorCell) { + if (errorMessages.length === 0) { + errorCell.remove(); + } + else { + // Without rewrite we merge this list with existing errors + errorCell.attr('messages', errorMessages, { rewrite: true }); + } + } + else if (errorMessages.length > 0) { + var error = Shapes.Factory.createDecoration({ + renderer: this.renderer, + paper: this.paper, + parent: cell, + kind: Constants.ERROR_DECORATION_KIND, + messages: errorMessages + }); + var pt = void 0; + var view = this.paper.findViewByModel(error); + if (cell instanceof joint.dia.Element) { + pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); + error.set('position', pt); + view.setInteractivity(false); + } + else { + // TODO: do something for the link perhaps? + } + } + }; + EditorComponent.prototype.doLayout = function () { + if (this.renderer && this.renderer.layout) { + return this.renderer.layout(this.paper); + } + }; + Object.defineProperty(EditorComponent.prototype, "dsl", { + get: function () { + return this._dslText; + }, + set: function (dslText) { + if (this._dslText !== dslText) { + this._dslText = dslText; + this.textToGraphEventEmitter.emit(); + } + }, + enumerable: true, + configurable: true + }); + /** + * Ask the server to parse the supplied text into a JSON graph of nodes and links, + * then update the view based on that new information. + */ + EditorComponent.prototype.updateGraphRepresentation = function () { + var _this = this; + console.debug("Updating graph to represent '" + this._dslText + "'"); + if (this.metamodel && this.metamodel.textToGraph) { + return this.metamodel.textToGraph(this.editorContext, this._dslText).then(function () { + _this.textToGraphConversionCompleted.next(); + return _this.validateContent(); + }); + } + else { + this.textToGraphConversionCompleted.next(); + return this.validateContent(); + } + }; + EditorComponent.prototype.updateTextRepresentation = function () { + var _this = this; + if (this.metamodel && this.metamodel.graphToText) { + return this.metamodel.graphToText(this.editorContext).then(function (text) { + if (_this._dslText !== text) { + _this._dslText = text; + _this.dslChange.emit(text); + } + _this.graphToTextConversionCompleted.next(); + return _this.validateContent(); + }) + .catch(function (error) { + // Validation may reveal why the graph couldn't be + // converted so let it run + _this.graphToTextConversionCompleted.next(); + return _this.validateContent(); + }); + } + else { + this.graphToTextConversionCompleted.next(); + return this.validateContent(); + } + }; + EditorComponent.prototype.initMetamodel = function () { + var _this = this; + this.metamodel.load().then(function (data) { + _this.updateGraphRepresentation(); + var textSyncSubscription = _this.graphToTextEventEmitter.pipe(debounceTime(100)).subscribe(function () { + if (_this._graphToTextSyncEnabled) { + _this.updateTextRepresentation(); + } + }); + _this._disposables.add(Disposable.create(function () { return textSyncSubscription.unsubscribe(); })); + // Setup content validated event emitter. Emit not validated when graph to text conversion required + var graphValidatedSubscription1 = _this.graphToTextEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); + _this._disposables.add(Disposable.create(function () { return graphValidatedSubscription1.unsubscribe; })); + // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); + // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); + var graphSyncSubscription = _this.textToGraphEventEmitter.pipe(debounceTime(300)).subscribe(function () { return _this.updateGraphRepresentation(); }); + _this._disposables.add(Disposable.create(function () { return graphSyncSubscription.unsubscribe(); })); + // Setup content validated event emitter. Emit not validated when text to graph conversion required + var graphValidatedSubscription2 = _this.textToGraphEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); + _this._disposables.add(Disposable.create(function () { return graphValidatedSubscription2.unsubscribe; })); + if (_this.editor && _this.editor.setDefaultContent) { + _this.editor.setDefaultContent(_this.editorContext, data); + } + }); + }; + EditorComponent.prototype.initGraph = function () { + this.graph = new joint.dia.Graph(); + this.graph.set('type', Constants.CANVAS_CONTEXT); + this.graph.set('paperPadding', this.paperPadding); + }; + EditorComponent.prototype.handleNodeCreation = function (node) { + var _this = this; + node.on('change:size', this._resizeHandler); + node.on('change:position', this._resizeHandler); + if (node.attr('metadata')) { + node.on('change:attrs', function (cell, attrs, changeData) { + var propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, node))) { + _this.performGraphToTextSyncing(); + } + if (_this.renderer && _this.renderer.refreshVisuals) { + _this.renderer.refreshVisuals(node, propAttr, _this.paper); + } + } + }); + } + }; + /** + * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples + * are 'change:source', 'change:target'. + */ + EditorComponent.prototype.handleLinkEvent = function (event, link) { + if (this.renderer && this.renderer.handleLinkEvent) { + this.renderer.handleLinkEvent(this.editorContext, event, link); + } + }; + EditorComponent.prototype.handleLinkCreation = function (link) { + var _this = this; + this.handleLinkEvent('add', link); + link.on('change:source', function (l) { + _this.autosizePaper(); + var newSourceId = l.get('source').id; + var oldSourceId = l.previous('source').id; + if (newSourceId !== oldSourceId) { + _this.performGraphToTextSyncing(); + } + _this.handleLinkEvent('change:source', l); + }); + link.on('change:target', function (l) { + _this.autosizePaper(); + var newTargetId = l.get('target').id; + var oldTargetId = l.previous('target').id; + if (newTargetId !== oldTargetId) { + _this.performGraphToTextSyncing(); + } + _this.handleLinkEvent('change:target', l); + }); + link.on('change:vertices', this._resizeHandler); + link.on('change:attrs', function (cell, attrs, changeData) { + var propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, link))) { + var sourceId = link.get('source').id; + var targetId = link.get('target').id; + _this.performGraphToTextSyncing(); + } + if (_this.renderer && _this.renderer.refreshVisuals) { + _this.renderer.refreshVisuals(link, propAttr, _this.paper); + } + } + }); + this.paper.findViewByModel(link).on('link:options', function () { return _this.handleLinkEvent('options', link); }); + if (this.readOnlyCanvas) { + link.attr('.link-tools/display', 'none'); + } + }; + EditorComponent.prototype.initGraphListeners = function () { + var _this = this; + this.graph.on('add', function (element) { + if (element instanceof joint.dia.Link) { + _this.handleLinkCreation(element); + } + else if (element instanceof joint.dia.Element) { + _this.handleNodeCreation(element); + } + if (element.get('type') === joint.shapes.flo.NODE_TYPE || element.get('type') === joint.shapes.flo.LINK_TYPE) { + _this.performGraphToTextSyncing(); + } + _this.autosizePaper(); + }); + this.graph.on('remove', function (element) { + if (element instanceof joint.dia.Link) { + _this.handleLinkEvent('remove', element); + } + if (_this.selection && _this.selection.model === element) { + _this.selection = undefined; + } + if (element.isLink()) { + window.setTimeout(function () { return _this.performGraphToTextSyncing(); }, 100); + } + else if (element.get('type') === joint.shapes.flo.NODE_TYPE) { + _this.performGraphToTextSyncing(); + } + _this.autosizePaper(); + }); + // Set if link is fan-routed. Should be called before routing call + this.graph.on('change:vertices', function (link, changed, opt) { + if (opt.fanRouted) { + link.set('fanRouted', true); + } + else { + link.unset('fanRouted'); + } + }); + // adjust vertices when a cell is removed or its source/target was changed + this.graph.on('add remove change:source change:target change:vertices change:position', _.partial(Utils.fanRoute, this.graph)); + }; + EditorComponent.prototype.initPaperListeners = function () { + var _this = this; + // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element + this.paper.on('cell:pointerclick', function (cellView) { + if (!_this.readOnlyCanvas) { + _this.selection = cellView; + } + }); + this.paper.on('blank:pointerclick', function () { + _this.selection = undefined; + }); + this.paper.on('scale', this._resizeHandler); + this.paper.on('all', function () { + if (Utils.isCustomPaperEvent(arguments)) { + arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); + } + }); + this.paper.on('dragging-node-over-canvas', function (dndEvent) { + console.debug("Canvas DnD type = " + dndEvent.type); + var location = _this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); + switch (dndEvent.type) { + case Flo.DnDEventType.DRAG: + _this.handleNodeDragging(dndEvent.view, _this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, Constants.CANVAS_CONTEXT); + break; + case Flo.DnDEventType.DROP: + _this.handleNodeDropping(); + break; + default: + break; + } + }); + // JointJS now no longer grabs focus if working in a paper element - crude... + $('#flow-view', this.element.nativeElement).on('mousedown', function () { + $('#palette-filter-textfield', _this.element.nativeElement).focus(); + }); + }; + EditorComponent.prototype.initPaper = function () { + var _this = this; + var options = { + el: $('#paper', this.element.nativeElement), + gridSize: this._gridSize, + drawGrid: true, + model: this.graph, + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.shapes.flo.ElementView /*joint.dia.ElementView*/, + linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint.shapes.flo.LinkView, + // Enable link snapping within 25px lookup radius + snapLinks: { radius: 25 }, + defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ function (cellView, magnet) { + if (_this.renderer && _this.renderer.createLink) { + var linkEnd = { + id: cellView.model.id + }; + if (magnet) { + linkEnd.selector = cellView.getSelector(magnet, undefined); + } + if (magnet.getAttribute('port')) { + linkEnd.port = magnet.getAttribute('port'); + } + if (magnet.getAttribute('port') === 'input') { + return _this.renderer.createLink(undefined, linkEnd); + } + else { + return _this.renderer.createLink(linkEnd, undefined); + } + } + else { + return new joint.shapes.flo.Link(); + } + }, + // decide whether to create a link if the user clicks a magnet + validateMagnet: function (cellView, magnet) { + if (_this.readOnlyCanvas) { + return false; + } + else { + if (_this.editor && _this.editor.validatePort) { + return _this.editor.validatePort(_this.editorContext, cellView, magnet); + } + else { + return true; + } + } + }, + interactive: function (cellView, event) { + if (_this.readOnlyCanvas) { + return false; + } + else { + if (_this.editor && _this.editor.interactive) { + if (typeof _this.editor.interactive === 'function') { + // Type for interactive is wrong in JointJS have to cast to + return _this.editor.interactive(cellView, event); + } + else { + return _this.editor.interactive; + } + } + return true; + } + }, + highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { + 'default': { + name: 'addClass', + options: { + className: 'highlighted' + } + } + }, + markAvailable: true + }; + if (this.renderer && this.renderer.getLinkAnchorPoint) { + options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; + } + if (this.editor && this.editor.validateLink) { + var self_1 = this; + options.validateConnection = function (cellViewS, magnetS, cellViewT, magnetT, end, linkView) { + return self_1.editor.validateLink(_this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); + }; + } + // The paper is what will represent the graph on the screen + this.paper = new joint.dia.Paper(options); + this._disposables.add(Disposable.create(function () { return _this.paper.remove(); })); + }; + EditorComponent.prototype.updatePaletteReadyState = function (ready) { + this.paletteReady.next(ready); + }; + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "metamodel", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "renderer", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "editor", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number) + ], EditorComponent.prototype, "paletteSize", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "minZoom", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "maxZoom", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "zoomStep", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "paperPadding", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "floApi", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "validationMarkers", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "contentValidated", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], EditorComponent.prototype, "dslChange", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", String), + tslib_1.__metadata("design:paramtypes", [String]) + ], EditorComponent.prototype, "dsl", null); + EditorComponent = tslib_1.__decorate([ + Component({ + selector: 'flo-editor', + template: "\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ", + styles: ["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "], + encapsulation: ViewEncapsulation.None + }), + tslib_1.__metadata("design:paramtypes", [ElementRef]) + ], EditorComponent); + return EditorComponent; +}()); +export { EditorComponent }; +//# sourceMappingURL=editor.component.js.map \ No newline at end of file diff --git a/dist/esm5/index.js b/dist/esm5/index.js new file mode 100644 index 0000000..e50ba34 --- /dev/null +++ b/dist/esm5/index.js @@ -0,0 +1,12 @@ +export { FloModule } from './module'; +export { Palette } from './palette/palette.component'; +export { EditorComponent } from './editor/editor.component'; +export { DslEditorComponent } from './dsl-editor/dsl-editor.component'; +export { CodeEditorComponent } from './code-editor/code-editor.component'; +export { PropertiesGroupComponent } from './properties/properties.group.component'; +export { DynamicFormPropertyComponent } from './properties/df.property.component'; +export { ResizerDirective } from './directives/resizer'; +export * from './shared/flo-common'; +export * from './shared/flo-properties'; +export * from './shared/shapes'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/esm5/module.js b/dist/esm5/module.js new file mode 100644 index 0000000..bb89c48 --- /dev/null +++ b/dist/esm5/module.js @@ -0,0 +1,42 @@ +import * as tslib_1 from "tslib"; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { CommonModule } from '@angular/common'; +import { Palette } from './palette/palette.component'; +import { EditorComponent } from './editor/editor.component'; +import { ResizerDirective } from './directives/resizer'; +import { DslEditorComponent } from './dsl-editor/dsl-editor.component'; +import { CodeEditorComponent } from './code-editor/code-editor.component'; +import { PropertiesGroupComponent } from './properties/properties.group.component'; +import { DynamicFormPropertyComponent } from './properties/df.property.component'; +var FloModule = /** @class */ (function () { + function FloModule() { + } + FloModule = tslib_1.__decorate([ + NgModule({ + imports: [ + FormsModule, + CommonModule, + ReactiveFormsModule + ], + declarations: [ + Palette, + EditorComponent, + ResizerDirective, + DslEditorComponent, + CodeEditorComponent, + PropertiesGroupComponent, + DynamicFormPropertyComponent + ], + exports: [ + EditorComponent, + DslEditorComponent, + DynamicFormPropertyComponent, + PropertiesGroupComponent + ] + }) + ], FloModule); + return FloModule; +}()); +export { FloModule }; +//# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/dist/esm5/palette/palette.component.js b/dist/esm5/palette/palette.component.js new file mode 100644 index 0000000..9862077 --- /dev/null +++ b/dist/esm5/palette/palette.component.js @@ -0,0 +1,460 @@ +import * as tslib_1 from "tslib"; +import { Component, ElementRef, Input, Output, EventEmitter, Inject, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { dia } from 'jointjs'; +import { Flo } from '../shared/flo-common'; +import { Shapes, Constants } from '../shared/shapes'; +import { DOCUMENT } from '@angular/platform-browser'; +import * as _$ from 'jquery'; +var joint = Flo.joint; +var $ = _$; +var DEBOUNCE_TIME = 300; +joint.shapes.flo.PaletteGroupHeader = joint.shapes.basic.Generic.extend({ + // The path is the open/close arrow, defaults to vertical (open) + markup: '', + defaults: joint.util.deepSupplement({ + type: 'palette.groupheader', + size: { width: 170, height: 30 }, + position: { x: 0, y: 0 }, + attrs: { + 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, + 'text': { + text: '', + fill: '#eeeeee', + 'ref-x': 0.5, + 'ref-y': 7, + 'x-alignment': 'middle', + 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ + }, + 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } + }, + // custom properties + isOpen: true + }, joint.shapes.basic.Generic.prototype.defaults) +}); +var Palette = /** @class */ (function () { + function Palette(element, document) { + var _this = this; + this.element = element; + this.document = document; + this._metamodelListener = { + metadataError: function (data) { }, + metadataAboutToChange: function () { }, + metadataChanged: function () { return _this.rebuildPalette(); } + }; + this.initialized = false; + this._filterText = ''; + this.filterTextModel = new Subject(); + this.paletteEntryPadding = { width: 12, height: 12 }; + this.onPaletteEntryDrop = new EventEmitter(); + this.paletteReady = new EventEmitter(); + this.paletteFocus = new EventEmitter(); + this.mouseMoveHanlder = function (e) { return _this.handleDrag(e); }; + this.mouseUpHanlder = function (e) { return _this.handleMouseUp(e); }; + this.paletteGraph = new joint.dia.Graph(); + this.paletteGraph.set('type', Constants.PALETTE_CONTEXT); + this._filterText = ''; + this.closedGroups = new Set(); + } + Object.defineProperty(Palette.prototype, "paletteSize", { + set: function (size) { + console.debug('Palette Size: ' + size); + if (this._paletteSize !== size) { + this._paletteSize = size; + this.rebuildPalette(); + } + }, + enumerable: true, + configurable: true + }); + Palette.prototype.onFocus = function () { + this.paletteFocus.emit(); + }; + Palette.prototype.ngOnInit = function () { + var _this = this; + var element = $('#palette-paper', this.element.nativeElement); + // Create the paper for the palette using the specified element view + this.palette = new joint.dia.Paper({ + el: element, + gridSize: 1, + model: this.paletteGraph, + height: $(this.element.nativeElement.parentNode).height(), + width: $(this.element.nativeElement.parentNode).width(), + elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.dia.ElementView), + interactive: false + }); + this.palette.on('cell:pointerup', function (cellview, evt) { + if (_this.viewBeingDragged) { + _this.trigger({ + type: Flo.DnDEventType.DROP, + view: _this.viewBeingDragged, + event: evt + }); + _this.viewBeingDragged = undefined; + } + _this.clickedElement = undefined; + $('#palette-floater').remove(); + if (_this.floaterpaper) { + _this.floaterpaper.remove(); + } + }); + // Toggle the header open/closed on a click + this.palette.on('cell:pointerclick', function (cellview, event) { + // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? + // Click position within the element would be: evt.offsetX, evt.offsetY + var cell = cellview.model; + if (cell.attributes.header) { + // Toggle the header open/closed + if (cell.get('isOpen')) { + _this.rotateClosed(cell); + } + else { + _this.rotateOpen(cell); + } + } + // TODO [palette] ensure other mouse handling events do nothing for headers + // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) + }); + $(this.document).on('mouseup', this.mouseUpHanlder); + if (this.metamodel) { + this.metamodel.load().then(function (data) { + _this.buildPalette(data); + // Add listener to metamodel + if (_this.metamodel && _this.metamodel.subscribe) { + _this.metamodel.subscribe(_this._metamodelListener); + } + // Add debounced listener to filter text changes + _this.filterTextModel + .pipe(debounceTime(DEBOUNCE_TIME)) + .subscribe(function (value) { return _this.rebuildPalette(); }); + _this.initialized = true; + }); + } + else { + console.error('No Metamodel service specified for palette!'); + } + this._paletteSize = this._paletteSize || $(this.element.nativeElement.parentNode).width(); + }; + Palette.prototype.ngOnDestroy = function () { + if (this.metamodel && this.metamodel.unsubscribe) { + this.metamodel.unsubscribe(this._metamodelListener); + } + $(this.document).off('mouseup', this.mouseUpHanlder); + this.palette.remove(); + }; + Palette.prototype.ngOnChanges = function (changes) { + // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { + // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); + // } + }; + Palette.prototype.createPaletteGroup = function (title, isOpen) { + var newGroupHeader = new joint.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); + newGroupHeader.set('header', title); + if (!isOpen) { + newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); + newGroupHeader.set('isOpen', false); + } + this.paletteGraph.addCell(newGroupHeader); + return newGroupHeader; + }; + Palette.prototype.createPaletteEntry = function (title, metadata) { + return Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.palette, + metadata: metadata + }); + }; + Palette.prototype.buildPalette = function (metamodel) { + var _this = this; + var startTime = new Date().getTime(); + this.paletteReady.emit(false); + this.paletteGraph.clear(); + var filterText = this.filterText; + if (filterText) { + filterText = filterText.toLowerCase(); + } + var paletteNodes = []; + var groupAdded = new Set(); + var parentWidth = this._paletteSize; + console.debug("Parent Width: " + parentWidth); + // The field closedGroups tells us which should not be shown + // Work out the list of active groups/nodes based on the filter text + this.metamodel.groups().forEach(function (group) { + if (metamodel && metamodel.has(group)) { + Array.from(metamodel.get(group).keys()).sort().forEach(function (name) { + var node = metamodel.get(group).get(name); + if (node) { + var nodeActive = !(node.metadata && node.metadata.noPaletteEntry); + if (nodeActive && filterText) { + nodeActive = false; + if (name.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + else if (group.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { + // nodeActive = true; + // } + // else if (node.properties) { + // Object.keys(node.properties).sort().forEach(function(propertyName) { + // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || + // (node.properties[propertyName].description && + // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { + // nodeActive=true; + // } + // }); + // } + } + if (nodeActive) { + if (!groupAdded.has(group)) { + var header = _this.createPaletteGroup(group, !_this.closedGroups.has(group)); + header.set('size', { width: parentWidth, height: 30 }); + paletteNodes.push(header); + groupAdded.add(group); + } + if (!_this.closedGroups.has(group)) { + paletteNodes.push(_this.createPaletteEntry(name, node)); + } + } + } + }); + } + }); + var cellWidth = 0, cellHeight = 0; + // Determine the size of the palette entry cell (width and height) + paletteNodes.forEach(function (pnode) { + if (pnode.attr('metadata/name')) { + var dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (cellWidth < dimension.width) { + cellWidth = dimension.width; + } + if (cellHeight < dimension.height) { + cellHeight = dimension.height; + } + } + }); + // Adjust the palette entry cell size with paddings. + cellWidth += 2 * this.paletteEntryPadding.width; + cellHeight += 2 * this.paletteEntryPadding.height; + // Align palette entries row to be at the center + var startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; + var xpos = startX; + var ypos = 0; + var prevNode; + // Layout palette entry nodes + paletteNodes.forEach(function (pnode) { + var dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (pnode.get('header')) { //attributes.attrs.header) { + // Palette entry header + xpos = startX; + pnode.set('position', { x: 0, y: ypos }); + ypos += dimension.height + 5; + } + else { + // Palette entry element + if (xpos + cellWidth > parentWidth) { + // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line + xpos = startX; + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + else { + // Enough real estate to place entry in a row - adjust y position + if (prevNode && prevNode.attr('metadata/name')) { + ypos -= cellHeight; + } + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + // increment x position and y position (can be reorganized) + xpos += cellWidth; + ypos += cellHeight; + } + prevNode = pnode; + }); + this.palette.setDimensions(parentWidth, ypos); + this.paletteReady.emit(true); + console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); + }; + Palette.prototype.rebuildPalette = function () { + var _this = this; + if (this.initialized && this.metamodel) { + this.metamodel.load().then(function (metamodel) { return _this.buildPalette(metamodel); }); + } + }; + Object.defineProperty(Palette.prototype, "filterText", { + get: function () { + return this._filterText; + }, + set: function (text) { + if (this._filterText !== text) { + this._filterText = text; + this.filterTextModel.next(text); + } + }, + enumerable: true, + configurable: true + }); + Palette.prototype.getPaletteView = function (view) { + var self = this; + return view.extend({ + pointerdown: function ( /*evt, x, y*/) { + // Remove the tooltip + // $('.node-tooltip').remove(); + // TODO move metadata to the right place (not inside attrs I think) + self.clickedElement = this.model; + if (self.clickedElement && self.clickedElement.attr('metadata')) { + $(self.document).on('mousemove', self.mouseMoveHanlder); + } + }, + pointermove: function ( /*evt, x, y*/) { + // Nothing to prevent move within the palette canvas + }, + }); + }; + Palette.prototype.handleMouseUp = function (event) { + $(this.document).off('mousemove', this.mouseMoveHanlder); + }; + Palette.prototype.trigger = function (event) { + this.onPaletteEntryDrop.emit(event); + }; + Palette.prototype.handleDrag = function (event) { + // TODO offsetX/Y not on firefox + // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); + // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); + if (this.clickedElement && this.clickedElement.attr('metadata')) { + if (!this.viewBeingDragged) { + var dataOfClickedElement = this.clickedElement.attr('metadata'); + // custom div if not already built. + $('
', { + id: 'palette-floater' + }).appendTo($('body')); + var floatergraph = new joint.dia.Graph(); + floatergraph.set('type', Constants.FEEDBACK_CONTEXT); + var parent_1 = $('#palette-floater'); + this.floaterpaper = new joint.dia.Paper({ + el: $('#palette-floater'), + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.dia.ElementView, + gridSize: 10, + model: floatergraph, + height: parent_1.height(), + width: parent_1.width(), + validateMagnet: function () { return false; }, + validateConnection: function () { return false; } + }); + // TODO float thing needs to be bigger otherwise icon label is missing + // Initiative drag and drop - create draggable element + var floaternode = Shapes.Factory.createNode({ + 'renderer': this.renderer, + 'paper': this.floaterpaper, + 'graph': floatergraph, + 'metadata': dataOfClickedElement + }); + // Only node view expected + var box = this.floaterpaper.findViewByModel(floaternode).getBBox(); + var size = floaternode.get('size'); + // Account for node real size including ports + floaternode.translate(box.width - size.width, box.height - size.height); + this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); + $('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + } + else { + $('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + this.trigger({ + type: Flo.DnDEventType.DRAG, + view: this.viewBeingDragged, + event: event + }); + } + } + }; + /* + * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) + */ + Palette.prototype.rotateOpen = function (element) { + var _this = this; + setTimeout(function () { return _this.doRotateOpen(element, 90); }); + }; + Palette.prototype.doRotateOpen = function (element, angle) { + var _this = this; + angle -= 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle <= 0) { + element.set('isOpen', true); + this.closedGroups.delete(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(function () { return _this.doRotateOpen(element, angle); }, 10); + } + }; + Palette.prototype.doRotateClose = function (element, angle) { + var _this = this; + angle += 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle >= 90) { + element.set('isOpen', false); + this.closedGroups.add(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(function () { return _this.doRotateClose(element, angle); }, 10); + } + }; + // TODO better name for this function as this does the animation *and* updates the palette + /* + * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) + */ + Palette.prototype.rotateClosed = function (element) { + var _this = this; + setTimeout(function () { return _this.doRotateClose(element, 0); }); + }; + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], Palette.prototype, "metamodel", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], Palette.prototype, "renderer", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], Palette.prototype, "paletteEntryPadding", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], Palette.prototype, "onPaletteEntryDrop", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], Palette.prototype, "paletteReady", void 0); + tslib_1.__decorate([ + Output(), + tslib_1.__metadata("design:type", Object) + ], Palette.prototype, "paletteFocus", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Number), + tslib_1.__metadata("design:paramtypes", [Number]) + ], Palette.prototype, "paletteSize", null); + Palette = tslib_1.__decorate([ + Component({ + selector: 'flo-palette', + template: "\n
\n \n
\n
\n
\n
\n ", + styles: ["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "], + encapsulation: ViewEncapsulation.None + }), + tslib_1.__param(1, Inject(DOCUMENT)), + tslib_1.__metadata("design:paramtypes", [ElementRef, Object]) + ], Palette); + return Palette; +}()); +export { Palette }; +//# sourceMappingURL=palette.component.js.map \ No newline at end of file diff --git a/dist/esm5/properties/df.property.component.js b/dist/esm5/properties/df.property.component.js new file mode 100644 index 0000000..a46b78b --- /dev/null +++ b/dist/esm5/properties/df.property.component.js @@ -0,0 +1,50 @@ +import * as tslib_1 from "tslib"; +import { Component, Input, ViewEncapsulation } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { Properties } from '../shared/flo-properties'; +var DynamicFormPropertyComponent = /** @class */ (function () { + function DynamicFormPropertyComponent() { + } + Object.defineProperty(DynamicFormPropertyComponent.prototype, "types", { + get: function () { + return Properties.InputType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DynamicFormPropertyComponent.prototype, "control", { + get: function () { + return this.form.controls[this.model.id]; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DynamicFormPropertyComponent.prototype, "errorData", { + get: function () { + var _this = this; + return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) + .filter(function (e) { return _this.control.errors && _this.control.errors[e.id]; }); + }, + enumerable: true, + configurable: true + }); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Object) + ], DynamicFormPropertyComponent.prototype, "model", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", FormGroup) + ], DynamicFormPropertyComponent.prototype, "form", void 0); + DynamicFormPropertyComponent = tslib_1.__decorate([ + Component({ + selector: 'df-property', + template: "\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ", + encapsulation: ViewEncapsulation.None + }), + tslib_1.__metadata("design:paramtypes", []) + ], DynamicFormPropertyComponent); + return DynamicFormPropertyComponent; +}()); +export { DynamicFormPropertyComponent }; +//# sourceMappingURL=df.property.component.js.map \ No newline at end of file diff --git a/dist/esm5/properties/properties.group.component.js b/dist/esm5/properties/properties.group.component.js new file mode 100644 index 0000000..47b0499 --- /dev/null +++ b/dist/esm5/properties/properties.group.component.js @@ -0,0 +1,51 @@ +import * as tslib_1 from "tslib"; +import { Component, Input, ViewEncapsulation } from '@angular/core'; +import { FormGroup, FormControl } from '@angular/forms'; +import { Properties } from '../shared/flo-properties'; +var PropertiesGroupComponent = /** @class */ (function () { + function PropertiesGroupComponent() { + } + PropertiesGroupComponent.prototype.ngOnInit = function () { + var _this = this; + if (this.propertiesGroupModel.isLoading) { + var subscription_1 = this.propertiesGroupModel.loadedSubject.subscribe(function (loaded) { + if (loaded) { + subscription_1.unsubscribe(); + _this.createGroupControls(); + } + }); + } + else { + this.createGroupControls(); + } + }; + PropertiesGroupComponent.prototype.createGroupControls = function () { + var _this = this; + this.propertiesGroupModel.getControlsModels().forEach(function (c) { + if (c.validation) { + _this.form.addControl(c.id, new FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); + } + else { + _this.form.addControl(c.id, new FormControl(c.value || '')); + } + }); + }; + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", Properties.PropertiesGroupModel) + ], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); + tslib_1.__decorate([ + Input(), + tslib_1.__metadata("design:type", FormGroup) + ], PropertiesGroupComponent.prototype, "form", void 0); + PropertiesGroupComponent = tslib_1.__decorate([ + Component({ + selector: 'properties-group', + template: "\n
\n \n
\n ", + encapsulation: ViewEncapsulation.None + }) + ], PropertiesGroupComponent); + return PropertiesGroupComponent; +}()); +export { PropertiesGroupComponent }; +//# sourceMappingURL=properties.group.component.js.map \ No newline at end of file diff --git a/dist/esm5/shared/flo-common.js b/dist/esm5/shared/flo-common.js new file mode 100644 index 0000000..4ae8eb8 --- /dev/null +++ b/dist/esm5/shared/flo-common.js @@ -0,0 +1,57 @@ +import * as _joint from 'jointjs'; +import * as _$ from 'jquery'; +var $ = _$; +export var Flo; +(function (Flo) { + Flo.joint = _joint; + var DnDEventType; + (function (DnDEventType) { + DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; + DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; + })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); + var Severity; + (function (Severity) { + Severity[Severity["Error"] = 0] = "Error"; + Severity[Severity["Warning"] = 1] = "Warning"; + })(Severity = Flo.Severity || (Flo.Severity = {})); + function findMagnetByClass(view, className) { + if (className && className.startsWith('.')) { + className = className.substr(1); + } + var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0; }); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByClass = findMagnetByClass; + function findMagnetByPort(view, port) { + var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('port') === port; }); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByPort = findMagnetByPort; + /** + * Return the metadata for a particular palette entry in a particular group. + * @param name - name of the palette entry + * @param group - group in which the palette entry should exist (e.g. sinks) + * @return + */ + function getMetadata(metamodel, name, group) { + var groupObj = metamodel && group ? metamodel.get(group) : undefined; + if (name && groupObj && groupObj.get(name)) { + return metamodel.get(group).get(name); + } + else { + return { + name: name, + group: group, + unresolved: true, + get: function (property) { return new Promise(function (resolve) { return resolve(); }); }, + properties: function () { return Promise.resolve(new Map()); } + }; + } + } + Flo.getMetadata = getMetadata; +})(Flo || (Flo = {})); +//# sourceMappingURL=flo-common.js.map \ No newline at end of file diff --git a/dist/esm5/shared/flo-properties.js b/dist/esm5/shared/flo-properties.js new file mode 100644 index 0000000..6123464 --- /dev/null +++ b/dist/esm5/shared/flo-properties.js @@ -0,0 +1,345 @@ +import * as tslib_1 from "tslib"; +import { Subject, Observable } from 'rxjs'; +import { debounceTime, mergeMap } from 'rxjs/operators'; +export var Properties; +(function (Properties) { + var InputType; + (function (InputType) { + InputType[InputType["TEXT"] = 0] = "TEXT"; + InputType[InputType["NUMBER"] = 1] = "NUMBER"; + InputType[InputType["SELECT"] = 2] = "SELECT"; + InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; + InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; + InputType[InputType["EMAIL"] = 5] = "EMAIL"; + InputType[InputType["URL"] = 6] = "URL"; + InputType[InputType["CODE"] = 7] = "CODE"; + })(InputType = Properties.InputType || (Properties.InputType = {})); + var GenericControlModel = /** @class */ (function () { + function GenericControlModel(_property, type, validation) { + this._property = _property; + this.type = type; + this.validation = validation; + } + Object.defineProperty(GenericControlModel.prototype, "id", { + get: function () { + return this.property.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "name", { + get: function () { + return this.property.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "description", { + get: function () { + return this.property.description; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "defaultValue", { + get: function () { + return this.property.defaultValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "value", { + get: function () { + return this.getValue(); + }, + set: function (value) { + this.setValue(value); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "property", { + get: function () { + return this._property; + }, + enumerable: true, + configurable: true + }); + GenericControlModel.prototype.setValue = function (value) { + this.property.value = value; + }; + GenericControlModel.prototype.getValue = function () { + return this.property.value; + }; + return GenericControlModel; + }()); + Properties.GenericControlModel = GenericControlModel; + var CheckBoxControlModel = /** @class */ (function (_super) { + tslib_1.__extends(CheckBoxControlModel, _super); + function CheckBoxControlModel(_property, validation) { + return _super.call(this, _property, InputType.CHECKBOX, validation) || this; + } + CheckBoxControlModel.prototype.getValue = function () { + var res = _super.prototype.getValue.call(this); + var type = typeof res; + switch (type) { + case 'boolean': + return res; + case 'string': + switch (res.trim().toLowerCase()) { + case 'true': + case '1': + return true; + case 'false': + case '0': + return false; + default: + return this.property.defaultValue; + } + case 'number': + var num = res; + if (num === 0) { + return false; + } + else if (num === 1) { + return true; + } + else { + return this.property.defaultValue; + } + } + return this.property.defaultValue; + }; + return CheckBoxControlModel; + }(GenericControlModel)); + Properties.CheckBoxControlModel = CheckBoxControlModel; + var AbstractCodeControlModel = /** @class */ (function (_super) { + tslib_1.__extends(AbstractCodeControlModel, _super); + function AbstractCodeControlModel(_property, encode, decode, validation) { + var _this = _super.call(this, _property, InputType.CODE, validation) || this; + _this.encode = encode; + _this.decode = decode; + return _this; + } + Object.defineProperty(AbstractCodeControlModel.prototype, "value", { + get: function () { + var dsl = _super.prototype.getValue.call(this); + if (dsl && this.decode) { + return this.decode(dsl); + } + else { + return dsl; + } + }, + set: function (value) { + if (value && this.encode) { + _super.prototype.setValue.call(this, this.encode(value)); + } + else { + _super.prototype.setValue.call(this, value); + } + }, + enumerable: true, + configurable: true + }); + return AbstractCodeControlModel; + }(GenericControlModel)); + Properties.AbstractCodeControlModel = AbstractCodeControlModel; + var GenericCodeControlModel = /** @class */ (function (_super) { + tslib_1.__extends(GenericCodeControlModel, _super); + function GenericCodeControlModel(_property, language, encode, decode, validation) { + var _this = _super.call(this, _property, encode, decode, validation) || this; + _this.language = language; + return _this; + } + return GenericCodeControlModel; + }(AbstractCodeControlModel)); + Properties.GenericCodeControlModel = GenericCodeControlModel; + var CodeControlModelWithDynamicLanguageProperty = /** @class */ (function (_super) { + tslib_1.__extends(CodeControlModelWithDynamicLanguageProperty, _super); + function CodeControlModelWithDynamicLanguageProperty(_property, _languagePropertyName, _groupModel, encode, decode, validation) { + var _this = _super.call(this, _property, encode, decode, validation) || this; + _this._languagePropertyName = _languagePropertyName; + _this._groupModel = _groupModel; + return _this; + } + Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "language", { + get: function () { + var value = this.languageControlModel.value; + return value ? value : this.languageControlModel.defaultValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "languageControlModel", { + get: function () { + var _this = this; + if (!this._langControlModel) { + // Cast to Properties.ControlModel from Properties.ControlModel | undefined + // Should not be undefined! + this._langControlModel = this._groupModel.getControlsModels().find(function (c) { return c.id === _this._languagePropertyName; }); + } + return this._langControlModel; + }, + enumerable: true, + configurable: true + }); + return CodeControlModelWithDynamicLanguageProperty; + }(AbstractCodeControlModel)); + Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; + var GenericListControlModel = /** @class */ (function (_super) { + tslib_1.__extends(GenericListControlModel, _super); + function GenericListControlModel(property, validation) { + return _super.call(this, property, InputType.TEXT, validation) || this; + } + Object.defineProperty(GenericListControlModel.prototype, "value", { + get: function () { + return this.property.value ? this.property.value.join(', ') : ''; + }, + set: function (value) { + this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; + }, + enumerable: true, + configurable: true + }); + return GenericListControlModel; + }(GenericControlModel)); + Properties.GenericListControlModel = GenericListControlModel; + var SelectControlModel = /** @class */ (function (_super) { + tslib_1.__extends(SelectControlModel, _super); + function SelectControlModel(_property, type, options) { + var _this = _super.call(this, _property, type) || this; + _this.options = options; + if (_property.defaultValue === undefined) { + options.unshift({ + name: 'SELECT', + value: _property.defaultValue + }); + } + return _this; + } + return SelectControlModel; + }(GenericControlModel)); + Properties.SelectControlModel = SelectControlModel; + var DefaultCellPropertiesSource = /** @class */ (function () { + function DefaultCellPropertiesSource(cell) { + this.cell = cell; + } + DefaultCellPropertiesSource.prototype.getProperties = function () { + var _this = this; + var metadata = this.cell.attr('metadata'); + return Promise.resolve(metadata.properties().then(function (propsMetadata) { return Array.from(propsMetadata.values()).map(function (m) { return _this.createProperty(m); }); })); + }; + DefaultCellPropertiesSource.prototype.createProperty = function (metadata) { + return { + id: metadata.id, + name: metadata.name, + type: metadata.type, + defaultValue: metadata.defaultValue, + attr: "props/" + metadata.name, + value: this.cell.attr("props/" + metadata.name), + description: metadata.description, + valueOptions: metadata.options + }; + }; + DefaultCellPropertiesSource.prototype.applyChanges = function (properties) { + var _this = this; + this.cell.trigger('batch:start', { batchName: 'update properties' }); + properties.forEach(function (property) { + if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || + (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { + var currentValue = _this.cell.attr(property.attr); + if (currentValue !== undefined && currentValue !== null) { + // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync + _this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); + _this.cell.removeAttr(property.attr); + } + } + else { + _this.cell.attr(property.attr, property.value); + } + }); + this.cell.trigger('batch:stop', { batchName: 'update properties' }); + }; + return DefaultCellPropertiesSource; + }()); + Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; + var PropertiesGroupModel = /** @class */ (function () { + function PropertiesGroupModel(propertiesSource) { + this.loading = true; + this.propertiesSource = propertiesSource; + } + PropertiesGroupModel.prototype.load = function () { + var _this = this; + this.loading = true; + this._loadedSubject = new Subject(); + this.propertiesSource.getProperties().then(function (properties) { + _this.controlModels = properties.map(function (p) { return _this.createControlModel(p); }); + _this.loading = false; + _this._loadedSubject.next(true); + _this._loadedSubject.complete(); + }); + }; + Object.defineProperty(PropertiesGroupModel.prototype, "isLoading", { + get: function () { + return this.loading; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PropertiesGroupModel.prototype, "loadedSubject", { + get: function () { + return this._loadedSubject; + }, + enumerable: true, + configurable: true + }); + PropertiesGroupModel.prototype.getControlsModels = function () { + return this.controlModels; + }; + PropertiesGroupModel.prototype.createControlModel = function (property) { + return new GenericControlModel(property, InputType.TEXT); + }; + PropertiesGroupModel.prototype.applyChanges = function () { + if (this.loading) { + return; + } + var properties = this.controlModels.map(function (cm) { return cm.property; }); + this.propertiesSource.applyChanges(properties); + }; + return PropertiesGroupModel; + }()); + Properties.PropertiesGroupModel = PropertiesGroupModel; + var Validators; + (function (Validators) { + function uniqueResource(service, debounce) { + return function (control) { + return new Observable(function (obs) { + if (control.valueChanges && control.value) { + control.valueChanges + .pipe(debounceTime(debounce), mergeMap(function (value) { return service(value); })) + .subscribe(function () { + obs.next({ uniqueResource: true }); + obs.complete(); + }, function () { + obs.next(undefined); + obs.complete(); + }); + } + else { + obs.next(undefined); + obs.complete(); + } + }); + }; + } + Validators.uniqueResource = uniqueResource; + function noneOf(excluded) { + return function (control) { + return excluded.find(function (e) { return e === control.value; }) ? { 'noneOf': { value: control.value } } : {}; + }; + } + Validators.noneOf = noneOf; + })(Validators = Properties.Validators || (Properties.Validators = {})); +})(Properties || (Properties = {})); +//# sourceMappingURL=flo-properties.js.map \ No newline at end of file diff --git a/dist/esm5/shared/shapes.js b/dist/esm5/shared/shapes.js new file mode 100644 index 0000000..e563eda --- /dev/null +++ b/dist/esm5/shared/shapes.js @@ -0,0 +1,497 @@ +import { Flo } from './flo-common'; +import * as _ from 'lodash'; +import * as _$ from 'jquery'; +var joint = Flo.joint; +var $ = _$; +var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); +var isFF = navigator.userAgent.indexOf('Firefox') > 0; +var IMAGE_W = 120; +var IMAGE_H = 35; +var ERROR_MARKER_SIZE = { width: 16, height: 16 }; +var HANDLE_SIZE = { width: 10, height: 10 }; +joint.shapes.flo = {}; +joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; +joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; +joint.shapes.flo.DECORATION_TYPE = 'decoration'; +joint.shapes.flo.HANDLE_TYPE = 'handle'; +var HANDLE_ICON_MAP = new Map(); +var REMOVE = 'remove'; +HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); +var DECORATION_ICON_MAP = new Map(); +var ERROR = 'error'; +DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); +joint.util.cloneDeep = function (obj) { + return _.cloneDeepWith(obj, function (o) { + if (_.isObject(o) && !_.isPlainObject(o)) { + return o; + } + }); +}; +joint.util.filter.redscale = function (args) { + var amount = Number.isFinite(args.amount) ? args.amount : 1; + return _.template('', { + a: 1 - 0.96 * amount, + b: 0.95 * amount, + c: 0.01 * amount, + d: 0.3 * amount, + e: 0.2 * amount, + f: 1 - 0.9 * amount, + g: 0.7 * amount, + h: 0.05 * amount, + i: 0.05 * amount, + k: 1 - 0.1 * amount + }); +}; +joint.util.filter.orangescale = function (args) { + var amount = Number.isFinite(args.amount) ? args.amount : 1; + return _.template('', { + a: 1.0 + 0.5 * amount, + b: 1.4 * amount, + c: 0.2 * amount, + d: 0.3 * amount, + e: 0.3 * amount, + f: 1 + 0.05 * amount, + g: 0.2 * amount, + h: 0.15 * amount, + i: 0.3 * amount, + k: 0.3 * amount, + l: 1 - 0.6 * amount + }); +}; +joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ + markup: '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.NODE_TYPE, + position: { x: 0, y: 0 }, + size: { width: IMAGE_W, height: IMAGE_H }, + attrs: { + '.': { magnet: false }, + // rounded edges around image + '.border': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + 'fill-opacity': 0, + stroke: '#eeeeee', + 'stroke-width': 0 + }, + '.box': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + //'fill-opacity': 0, // see through + stroke: '#6db33f', + fill: '#eeeeee', + 'stroke-width': 1 + }, + '.input-port': { + port: 'input', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.output-port': { + port: 'output', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.label': { + 'text-anchor': 'middle', + 'ref-x': 0.5, + // 'ref-y': -12, // jointjs specific: relative position to ref'd element + 'ref-y': 0.3, + ref: '.border', + fill: 'black', + 'font-size': 14 + }, + '.label2': { + 'text': '\u21d2', + 'text-anchor': 'middle', + 'ref-x': 0.15, + 'ref-y': 0.2, + ref: '.border', + // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', + fill: 'black', + 'font-size': 24 + }, + '.shape': {}, + '.image': { + width: IMAGE_W, + height: IMAGE_H + } + } + }, joint.shapes.basic.Generic.prototype.defaults) +}); +joint.shapes.flo.Link = joint.dia.Link.extend({ + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.LINK_TYPE, + attrs: { + '.connection': { stroke: '#34302d', 'stroke-width': 2 }, + // Lots of alternatives that have been played with: + // '.smoooth': true + // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, + // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, + // '.connection': { 'stroke':'black'}, + // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, + // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, + // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) + // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, + // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, + // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, + // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, + '.marker-arrowheads': { display: 'none' }, + '.tool-options': { display: 'none' } + }, + }, joint.dia.Link.prototype.defaults) +}); +joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ + options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), + _beforeArrowheadMove: function () { + if (this.model.get('source').id) { + this._oldSource = this.model.get('source'); + } + if (this.model.get('target').id) { + this._oldTarget = this.model.get('target'); + } + joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); + }, + _afterArrowheadMove: function () { + joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); + if (!this.model.get('source').id) { + if (this._oldSource) { + this.model.set('source', this._oldSource); + } + else { + this.model.remove(); + } + } + if (!this.model.get('target').id) { + if (this._oldTarget) { + this.model.set('target', this._oldTarget); + } + else { + this.model.remove(); + } + } + delete this._oldSource; + delete this._oldTarget; + } +}); +// TODO: must do cleanup for the `mainElementView' +joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ + // canShowTooltip: true, + beingDragged: false, + // _tempZorder: 0, + _tempOpacity: 1.0, + _hovering: false, + dragLinkStart: function (evt, magnet, x, y) { + this.model.startBatch('add-link'); + var linkView = this.addLinkFromMagnet(magnet, x, y); + // backwards compatiblity events + joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); + linkView.notify('link:pointerdown', evt, x, y); + /*** START MAIN DIFF ***/ + var sourceOrTarget = $(magnet).attr('port') === 'input' ? 'source' : 'target'; + linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); + /*** END MAIN DIFF ***/ + this.eventData(evt, { linkView: linkView }); + }, + addLinkFromMagnet: function (magnet, x, y) { + var paper = this.paper; + var graph = paper.model; + var link = paper.getDefaultLink(this, magnet); + var sourceEnd, targetEnd; + /*** START MAIN DIFF ***/ + if ($(magnet).attr('port') === 'input') { + sourceEnd = { x: x, y: y }; + targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); + } + else { + sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); + targetEnd = { x: x, y: y }; + } + /*** END MAIN DIFF ***/ + link.set({ + source: sourceEnd, + target: targetEnd + }).addTo(graph, { + async: false, + ui: true + }); + return link.findView(paper); + }, + // pointerdown: function(evt: any, x: number, y: number) { + // // this.canShowTooltip = false; + // // this.hideTooltip(); + // this.beingDragged = false; + // this._tempOpacity = this.model.attr('./opacity'); + // + // this.model.trigger('batch:start'); + // + // if ( // target is a valid magnet start linking + // evt.target.getAttribute('magnet') && + // this.paper.options.validateMagnet.call(this.paper, this, evt.target) + // ) { + // let link = this.paper.getDefaultLink(this, evt.target); + // if ($(evt.target).attr('port') === 'input') { + // link.set({ + // source: { x: x, y: y }, + // target: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // } + // }); + // } else { + // link.set({ + // source: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // }, + // target: { x: x, y: y } + // }); + // } + // this.paper.model.addCell(link); + // this._linkView = this.paper.findViewByModel(link); + // if ($(evt.target).attr('port') === 'input') { + // this._linkView.startArrowheadMove('source'); + // } else { + // this._linkView.startArrowheadMove('target'); + // } + // this.paper.__creatingLinkFromPort = true; + // } else { + // this._dx = x; + // this._dy = y; + // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); + // } + // }, + drag: function (evt, x, y) { + var interactive = _.isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : + this.options.interactive; + if (interactive !== false) { + this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DRAG, view: this, event: evt }); + } + joint.dia.ElementView.prototype.drag.apply(this, arguments); + }, + dragEnd: function (evt, x, y) { + this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DROP, view: this, event: evt }); + joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); + }, +}); +joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ + markup: '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.DECORATION_TYPE, + size: ERROR_MARKER_SIZE, + attrs: { + 'image': ERROR_MARKER_SIZE + } + }, joint.shapes.basic.Generic.prototype.defaults) +}); +export var Constants; +(function (Constants) { + Constants.REMOVE_HANDLE_TYPE = REMOVE; + Constants.PROPERTIES_HANDLE_TYPE = 'properties'; + Constants.ERROR_DECORATION_KIND = ERROR; + Constants.PALETTE_CONTEXT = 'palette'; + Constants.CANVAS_CONTEXT = 'canvas'; + Constants.FEEDBACK_CONTEXT = 'feedback'; +})(Constants || (Constants = {})); +export var Shapes; +(function (Shapes) { + var Factory = /** @class */ (function () { + function Factory() { + } + /** + * Create a JointJS node that embeds extra metadata (properties). + */ + Factory.createNode = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var metadata = params.metadata; + var position = params.position; + var props = params.props; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + var node; + if (!position) { + position = { x: 0, y: 0 }; + } + if (renderer && _.isFunction(renderer.createNode)) { + node = renderer.createNode(metadata, props); + } + else { + node = new joint.shapes.flo.Node(); + if (metadata) { + node.attr('.label/text', metadata.name); + } + } + node.set('type', joint.shapes.flo.NODE_TYPE); + if (position) { + node.set('position', position); + } + if (props) { + Array.from(props.keys()).forEach(function (key) { return node.attr("props/" + key, props.get(key)); }); + } + node.attr('metadata', metadata); + if (graph) { + graph.addCell(node); + } + if (renderer && _.isFunction(renderer.initializeNewNode)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewNode(node, descriptor); + } + return node; + }; + Factory.createLink = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var metadata = params.metadata; + var source = params.source; + var target = params.target; + var props = params.props; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + var link; + if (renderer && _.isFunction(renderer.createLink)) { + link = renderer.createLink(source, target, metadata, props); + } + else { + link = new joint.shapes.flo.Link(); + } + if (source) { + link.set('source', source); + } + if (target) { + link.set('target', target); + } + link.set('type', joint.shapes.flo.LINK_TYPE); + if (metadata) { + link.attr('metadata', metadata); + } + if (props) { + Array.from(props.keys()).forEach(function (key) { return link.attr("props/" + key, props.get(key)); }); + } + if (graph) { + graph.addCell(link); + } + if (renderer && _.isFunction(renderer.initializeNewLink)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewLink(link, descriptor); + } + // prevent creation of link breaks + link.attr('.marker-vertices/display', 'none'); + return link; + }; + Factory.createDecoration = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var parent = params.parent; + var kind = params.kind; + var messages = params.messages; + var location = params.position; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + if (!location) { + location = { x: 0, y: 0 }; + } + var decoration; + if (renderer && _.isFunction(renderer.createDecoration)) { + decoration = renderer.createDecoration(kind, parent); + } + else { + decoration = new joint.shapes.flo.ErrorDecoration({ + attrs: { + image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, + } + }); + } + decoration.set('type', joint.shapes.flo.DECORATION_TYPE); + decoration.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + decoration.set('z', parent.get('z') + 1); + } + decoration.attr('./kind', kind); + decoration.attr('messages', messages); + if (graph) { + graph.addCell(decoration); + } + parent.embed(decoration); + if (renderer && _.isFunction(renderer.initializeNewDecoration)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewDecoration(decoration, descriptor); + } + return decoration; + }; + Factory.createHandle = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var parent = params.parent; + var kind = params.kind; + var location = params.position; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + var handle; + if (!location) { + location = { x: 0, y: 0 }; + } + if (renderer && _.isFunction(renderer.createHandle)) { + handle = renderer.createHandle(kind, parent); + } + else { + handle = new joint.shapes.flo.ErrorDecoration({ + size: HANDLE_SIZE, + attrs: { + 'image': { + 'xlink:href': HANDLE_ICON_MAP.get(kind) + } + } + }); + } + handle.set('type', joint.shapes.flo.HANDLE_TYPE); + handle.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + handle.set('z', parent.get('z') + 1); + } + handle.attr('./kind', kind); + if (graph) { + graph.addCell(handle); + } + parent.embed(handle); + if (renderer && _.isFunction(renderer.initializeNewHandle)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewHandle(handle, descriptor); + } + return handle; + }; + return Factory; + }()); + Shapes.Factory = Factory; +})(Shapes || (Shapes = {})); +//# sourceMappingURL=shapes.js.map \ No newline at end of file diff --git a/dist/esm5/spring-flo.js b/dist/esm5/spring-flo.js new file mode 100644 index 0000000..31c32cd --- /dev/null +++ b/dist/esm5/spring-flo.js @@ -0,0 +1,5 @@ +/** + * Generated bundle index. Do not edit. + */ +export * from './index'; +//# sourceMappingURL=spring-flo.js.map \ No newline at end of file diff --git a/dist/fesm2015/spring-flo.js b/dist/fesm2015/spring-flo.js new file mode 100644 index 0000000..7744b71 --- /dev/null +++ b/dist/fesm2015/spring-flo.js @@ -0,0 +1,3902 @@ +import * as _joint from 'jointjs'; +import * as _$ from 'jquery'; +import { isEqual, partial, debounce, cloneDeepWith, isObject, isPlainObject, template, isFunction, groupBy, each, isString, isNumber } from 'lodash'; +import { __decorate, __metadata, __param } from 'tslib'; +import { Component, ElementRef, Input, Output, EventEmitter, Inject, ViewEncapsulation, Directive, forwardRef, NgModule } from '@angular/core'; +import { Subject, BehaviorSubject, fromEvent, Observable } from 'rxjs'; +import { debounceTime, sampleTime, mergeMap } from 'rxjs/operators'; +import { DOCUMENT } from '@angular/platform-browser'; +import { CompositeDisposable, Disposable } from 'ts-disposables'; +import { fromTextArea, findModeByName } from 'codemirror-minified'; +import 'codemirror-minified/addon/lint/lint'; +import 'codemirror-minified/addon/hint/show-hint'; +import 'codemirror-minified/addon/display/placeholder'; +import 'codemirror-minified/addon/scroll/annotatescrollbar'; +import 'codemirror-minified/addon/scroll/simplescrollbars'; +import { NG_VALUE_ACCESSOR, FormGroup, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import 'codemirror-minified/mode/meta'; +import 'codemirror-minified/addon/edit/matchbrackets'; +import 'codemirror-minified/addon/edit/closebrackets'; +import 'codemirror-minified/addon/lint/javascript-lint'; +import 'codemirror-minified/addon/lint/coffeescript-lint'; +import 'codemirror-minified/addon/lint/json-lint'; +import 'codemirror-minified/addon/lint/yaml-lint'; +import 'codemirror-minified/mode/groovy/groovy'; +import 'codemirror-minified/mode/javascript/javascript'; +import 'codemirror-minified/mode/python/python'; +import 'codemirror-minified/mode/ruby/ruby'; +import 'codemirror-minified/mode/clike/clike'; +import 'codemirror-minified/mode/yaml/yaml'; +import 'codemirror-minified/mode/coffeescript/coffeescript'; +import { CommonModule } from '@angular/common'; + +const $ = _$; +var Flo; +(function (Flo) { + Flo.joint = _joint; + let DnDEventType; + (function (DnDEventType) { + DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; + DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; + })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); + let Severity; + (function (Severity) { + Severity[Severity["Error"] = 0] = "Error"; + Severity[Severity["Warning"] = 1] = "Warning"; + })(Severity = Flo.Severity || (Flo.Severity = {})); + function findMagnetByClass(view, className) { + if (className && className.startsWith('.')) { + className = className.substr(1); + } + const element = view.$('[magnet]').toArray().find((magnet) => magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByClass = findMagnetByClass; + function findMagnetByPort(view, port) { + const element = view.$('[magnet]').toArray().find((magnet) => magnet.getAttribute('port') === port); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByPort = findMagnetByPort; + /** + * Return the metadata for a particular palette entry in a particular group. + * @param name - name of the palette entry + * @param group - group in which the palette entry should exist (e.g. sinks) + * @return + */ + function getMetadata(metamodel, name, group) { + const groupObj = metamodel && group ? metamodel.get(group) : undefined; + if (name && groupObj && groupObj.get(name)) { + return metamodel.get(group).get(name); + } + else { + return { + name: name, + group: group, + unresolved: true, + get: (property) => new Promise(resolve => resolve()), + properties: () => Promise.resolve(new Map()) + }; + } + } + Flo.getMetadata = getMetadata; +})(Flo || (Flo = {})); + +const joint = Flo.joint; +const $$1 = _$; +const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); +const isFF = navigator.userAgent.indexOf('Firefox') > 0; +const IMAGE_W = 120; +const IMAGE_H = 35; +const ERROR_MARKER_SIZE = { width: 16, height: 16 }; +const HANDLE_SIZE = { width: 10, height: 10 }; +joint.shapes.flo = {}; +joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; +joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; +joint.shapes.flo.DECORATION_TYPE = 'decoration'; +joint.shapes.flo.HANDLE_TYPE = 'handle'; +const HANDLE_ICON_MAP = new Map(); +const REMOVE = 'remove'; +HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); +const DECORATION_ICON_MAP = new Map(); +const ERROR = 'error'; +DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); +joint.util.cloneDeep = (obj) => { + return cloneDeepWith(obj, (o) => { + if (isObject(o) && !isPlainObject(o)) { + return o; + } + }); +}; +joint.util.filter.redscale = (args) => { + let amount = Number.isFinite(args.amount) ? args.amount : 1; + return template('', { + a: 1 - 0.96 * amount, + b: 0.95 * amount, + c: 0.01 * amount, + d: 0.3 * amount, + e: 0.2 * amount, + f: 1 - 0.9 * amount, + g: 0.7 * amount, + h: 0.05 * amount, + i: 0.05 * amount, + k: 1 - 0.1 * amount + }); +}; +joint.util.filter.orangescale = (args) => { + let amount = Number.isFinite(args.amount) ? args.amount : 1; + return template('', { + a: 1.0 + 0.5 * amount, + b: 1.4 * amount, + c: 0.2 * amount, + d: 0.3 * amount, + e: 0.3 * amount, + f: 1 + 0.05 * amount, + g: 0.2 * amount, + h: 0.15 * amount, + i: 0.3 * amount, + k: 0.3 * amount, + l: 1 - 0.6 * amount + }); +}; +joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ + markup: '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.NODE_TYPE, + position: { x: 0, y: 0 }, + size: { width: IMAGE_W, height: IMAGE_H }, + attrs: { + '.': { magnet: false }, + // rounded edges around image + '.border': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + 'fill-opacity': 0, + stroke: '#eeeeee', + 'stroke-width': 0 + }, + '.box': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + //'fill-opacity': 0, // see through + stroke: '#6db33f', + fill: '#eeeeee', + 'stroke-width': 1 + }, + '.input-port': { + port: 'input', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.output-port': { + port: 'output', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.label': { + 'text-anchor': 'middle', + 'ref-x': 0.5, + // 'ref-y': -12, // jointjs specific: relative position to ref'd element + 'ref-y': 0.3, + ref: '.border', + fill: 'black', + 'font-size': 14 + }, + '.label2': { + 'text': '\u21d2', + 'text-anchor': 'middle', + 'ref-x': 0.15, + 'ref-y': 0.2, + ref: '.border', + // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', + fill: 'black', + 'font-size': 24 + }, + '.shape': {}, + '.image': { + width: IMAGE_W, + height: IMAGE_H + } + } + }, joint.shapes.basic.Generic.prototype.defaults) +}); +joint.shapes.flo.Link = joint.dia.Link.extend({ + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.LINK_TYPE, + attrs: { + '.connection': { stroke: '#34302d', 'stroke-width': 2 }, + // Lots of alternatives that have been played with: + // '.smoooth': true + // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, + // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, + // '.connection': { 'stroke':'black'}, + // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, + // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, + // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) + // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, + // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, + // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, + // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, + '.marker-arrowheads': { display: 'none' }, + '.tool-options': { display: 'none' } + }, + }, joint.dia.Link.prototype.defaults) +}); +joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ + options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), + _beforeArrowheadMove: function () { + if (this.model.get('source').id) { + this._oldSource = this.model.get('source'); + } + if (this.model.get('target').id) { + this._oldTarget = this.model.get('target'); + } + joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); + }, + _afterArrowheadMove: function () { + joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); + if (!this.model.get('source').id) { + if (this._oldSource) { + this.model.set('source', this._oldSource); + } + else { + this.model.remove(); + } + } + if (!this.model.get('target').id) { + if (this._oldTarget) { + this.model.set('target', this._oldTarget); + } + else { + this.model.remove(); + } + } + delete this._oldSource; + delete this._oldTarget; + } +}); +// TODO: must do cleanup for the `mainElementView' +joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ + // canShowTooltip: true, + beingDragged: false, + // _tempZorder: 0, + _tempOpacity: 1.0, + _hovering: false, + dragLinkStart: function (evt, magnet, x, y) { + this.model.startBatch('add-link'); + const linkView = this.addLinkFromMagnet(magnet, x, y); + // backwards compatiblity events + joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); + linkView.notify('link:pointerdown', evt, x, y); + /*** START MAIN DIFF ***/ + const sourceOrTarget = $$1(magnet).attr('port') === 'input' ? 'source' : 'target'; + linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); + /*** END MAIN DIFF ***/ + this.eventData(evt, { linkView: linkView }); + }, + addLinkFromMagnet: function (magnet, x, y) { + const paper = this.paper; + const graph = paper.model; + const link = paper.getDefaultLink(this, magnet); + let sourceEnd, targetEnd; + /*** START MAIN DIFF ***/ + if ($$1(magnet).attr('port') === 'input') { + sourceEnd = { x: x, y: y }; + targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); + } + else { + sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); + targetEnd = { x: x, y: y }; + } + /*** END MAIN DIFF ***/ + link.set({ + source: sourceEnd, + target: targetEnd + }).addTo(graph, { + async: false, + ui: true + }); + return link.findView(paper); + }, + // pointerdown: function(evt: any, x: number, y: number) { + // // this.canShowTooltip = false; + // // this.hideTooltip(); + // this.beingDragged = false; + // this._tempOpacity = this.model.attr('./opacity'); + // + // this.model.trigger('batch:start'); + // + // if ( // target is a valid magnet start linking + // evt.target.getAttribute('magnet') && + // this.paper.options.validateMagnet.call(this.paper, this, evt.target) + // ) { + // let link = this.paper.getDefaultLink(this, evt.target); + // if ($(evt.target).attr('port') === 'input') { + // link.set({ + // source: { x: x, y: y }, + // target: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // } + // }); + // } else { + // link.set({ + // source: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // }, + // target: { x: x, y: y } + // }); + // } + // this.paper.model.addCell(link); + // this._linkView = this.paper.findViewByModel(link); + // if ($(evt.target).attr('port') === 'input') { + // this._linkView.startArrowheadMove('source'); + // } else { + // this._linkView.startArrowheadMove('target'); + // } + // this.paper.__creatingLinkFromPort = true; + // } else { + // this._dx = x; + // this._dy = y; + // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); + // } + // }, + drag: function (evt, x, y) { + let interactive = isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : + this.options.interactive; + if (interactive !== false) { + this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DRAG, view: this, event: evt }); + } + joint.dia.ElementView.prototype.drag.apply(this, arguments); + }, + dragEnd: function (evt, x, y) { + this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DROP, view: this, event: evt }); + joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); + }, +}); +joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ + markup: '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.DECORATION_TYPE, + size: ERROR_MARKER_SIZE, + attrs: { + 'image': ERROR_MARKER_SIZE + } + }, joint.shapes.basic.Generic.prototype.defaults) +}); +var Constants; +(function (Constants) { + Constants.REMOVE_HANDLE_TYPE = REMOVE; + Constants.PROPERTIES_HANDLE_TYPE = 'properties'; + Constants.ERROR_DECORATION_KIND = ERROR; + Constants.PALETTE_CONTEXT = 'palette'; + Constants.CANVAS_CONTEXT = 'canvas'; + Constants.FEEDBACK_CONTEXT = 'feedback'; +})(Constants || (Constants = {})); +var Shapes; +(function (Shapes) { + class Factory { + /** + * Create a JointJS node that embeds extra metadata (properties). + */ + static createNode(params) { + let renderer = params.renderer; + let paper = params.paper; + let metadata = params.metadata; + let position = params.position; + let props = params.props; + let graph = params.graph || (params.paper ? params.paper.model : undefined); + let node; + if (!position) { + position = { x: 0, y: 0 }; + } + if (renderer && isFunction(renderer.createNode)) { + node = renderer.createNode(metadata, props); + } + else { + node = new joint.shapes.flo.Node(); + if (metadata) { + node.attr('.label/text', metadata.name); + } + } + node.set('type', joint.shapes.flo.NODE_TYPE); + if (position) { + node.set('position', position); + } + if (props) { + Array.from(props.keys()).forEach(key => node.attr(`props/${key}`, props.get(key))); + } + node.attr('metadata', metadata); + if (graph) { + graph.addCell(node); + } + if (renderer && isFunction(renderer.initializeNewNode)) { + let descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewNode(node, descriptor); + } + return node; + } + static createLink(params) { + let renderer = params.renderer; + let paper = params.paper; + let metadata = params.metadata; + let source = params.source; + let target = params.target; + let props = params.props; + let graph = params.graph || (params.paper ? params.paper.model : undefined); + let link; + if (renderer && isFunction(renderer.createLink)) { + link = renderer.createLink(source, target, metadata, props); + } + else { + link = new joint.shapes.flo.Link(); + } + if (source) { + link.set('source', source); + } + if (target) { + link.set('target', target); + } + link.set('type', joint.shapes.flo.LINK_TYPE); + if (metadata) { + link.attr('metadata', metadata); + } + if (props) { + Array.from(props.keys()).forEach(key => link.attr(`props/${key}`, props.get(key))); + } + if (graph) { + graph.addCell(link); + } + if (renderer && isFunction(renderer.initializeNewLink)) { + let descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewLink(link, descriptor); + } + // prevent creation of link breaks + link.attr('.marker-vertices/display', 'none'); + return link; + } + static createDecoration(params) { + let renderer = params.renderer; + let paper = params.paper; + let parent = params.parent; + let kind = params.kind; + let messages = params.messages; + let location = params.position; + let graph = params.graph || (params.paper ? params.paper.model : undefined); + if (!location) { + location = { x: 0, y: 0 }; + } + let decoration; + if (renderer && isFunction(renderer.createDecoration)) { + decoration = renderer.createDecoration(kind, parent); + } + else { + decoration = new joint.shapes.flo.ErrorDecoration({ + attrs: { + image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, + } + }); + } + decoration.set('type', joint.shapes.flo.DECORATION_TYPE); + decoration.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + decoration.set('z', parent.get('z') + 1); + } + decoration.attr('./kind', kind); + decoration.attr('messages', messages); + if (graph) { + graph.addCell(decoration); + } + parent.embed(decoration); + if (renderer && isFunction(renderer.initializeNewDecoration)) { + let descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewDecoration(decoration, descriptor); + } + return decoration; + } + static createHandle(params) { + let renderer = params.renderer; + let paper = params.paper; + let parent = params.parent; + let kind = params.kind; + let location = params.position; + let graph = params.graph || (params.paper ? params.paper.model : undefined); + let handle; + if (!location) { + location = { x: 0, y: 0 }; + } + if (renderer && isFunction(renderer.createHandle)) { + handle = renderer.createHandle(kind, parent); + } + else { + handle = new joint.shapes.flo.ErrorDecoration({ + size: HANDLE_SIZE, + attrs: { + 'image': { + 'xlink:href': HANDLE_ICON_MAP.get(kind) + } + } + }); + } + handle.set('type', joint.shapes.flo.HANDLE_TYPE); + handle.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + handle.set('z', parent.get('z') + 1); + } + handle.attr('./kind', kind); + if (graph) { + graph.addCell(handle); + } + parent.embed(handle); + if (renderer && isFunction(renderer.initializeNewHandle)) { + let descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewHandle(handle, descriptor); + } + return handle; + } + } + Shapes.Factory = Factory; +})(Shapes || (Shapes = {})); + +const joint$1 = Flo.joint; +const $$2 = _$; +const DEBOUNCE_TIME = 300; +joint$1.shapes.flo.PaletteGroupHeader = joint$1.shapes.basic.Generic.extend({ + // The path is the open/close arrow, defaults to vertical (open) + markup: '', + defaults: joint$1.util.deepSupplement({ + type: 'palette.groupheader', + size: { width: 170, height: 30 }, + position: { x: 0, y: 0 }, + attrs: { + 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, + 'text': { + text: '', + fill: '#eeeeee', + 'ref-x': 0.5, + 'ref-y': 7, + 'x-alignment': 'middle', + 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ + }, + 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } + }, + // custom properties + isOpen: true + }, joint$1.shapes.basic.Generic.prototype.defaults) +}); +let Palette = class Palette { + constructor(element, document) { + this.element = element; + this.document = document; + this._metamodelListener = { + metadataError: (data) => { }, + metadataAboutToChange: () => { }, + metadataChanged: () => this.rebuildPalette() + }; + this.initialized = false; + this._filterText = ''; + this.filterTextModel = new Subject(); + this.paletteEntryPadding = { width: 12, height: 12 }; + this.onPaletteEntryDrop = new EventEmitter(); + this.paletteReady = new EventEmitter(); + this.paletteFocus = new EventEmitter(); + this.mouseMoveHanlder = (e) => this.handleDrag(e); + this.mouseUpHanlder = (e) => this.handleMouseUp(e); + this.paletteGraph = new joint$1.dia.Graph(); + this.paletteGraph.set('type', Constants.PALETTE_CONTEXT); + this._filterText = ''; + this.closedGroups = new Set(); + } + set paletteSize(size) { + console.debug('Palette Size: ' + size); + if (this._paletteSize !== size) { + this._paletteSize = size; + this.rebuildPalette(); + } + } + onFocus() { + this.paletteFocus.emit(); + } + ngOnInit() { + let element = $$2('#palette-paper', this.element.nativeElement); + // Create the paper for the palette using the specified element view + this.palette = new joint$1.dia.Paper({ + el: element, + gridSize: 1, + model: this.paletteGraph, + height: $$2(this.element.nativeElement.parentNode).height(), + width: $$2(this.element.nativeElement.parentNode).width(), + elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView), + interactive: false + }); + this.palette.on('cell:pointerup', (cellview, evt) => { + if (this.viewBeingDragged) { + this.trigger({ + type: Flo.DnDEventType.DROP, + view: this.viewBeingDragged, + event: evt + }); + this.viewBeingDragged = undefined; + } + this.clickedElement = undefined; + $$2('#palette-floater').remove(); + if (this.floaterpaper) { + this.floaterpaper.remove(); + } + }); + // Toggle the header open/closed on a click + this.palette.on('cell:pointerclick', (cellview, event) => { + // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? + // Click position within the element would be: evt.offsetX, evt.offsetY + const cell = cellview.model; + if (cell.attributes.header) { + // Toggle the header open/closed + if (cell.get('isOpen')) { + this.rotateClosed(cell); + } + else { + this.rotateOpen(cell); + } + } + // TODO [palette] ensure other mouse handling events do nothing for headers + // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) + }); + $$2(this.document).on('mouseup', this.mouseUpHanlder); + if (this.metamodel) { + this.metamodel.load().then(data => { + this.buildPalette(data); + // Add listener to metamodel + if (this.metamodel && this.metamodel.subscribe) { + this.metamodel.subscribe(this._metamodelListener); + } + // Add debounced listener to filter text changes + this.filterTextModel + .pipe(debounceTime(DEBOUNCE_TIME)) + .subscribe((value) => this.rebuildPalette()); + this.initialized = true; + }); + } + else { + console.error('No Metamodel service specified for palette!'); + } + this._paletteSize = this._paletteSize || $$2(this.element.nativeElement.parentNode).width(); + } + ngOnDestroy() { + if (this.metamodel && this.metamodel.unsubscribe) { + this.metamodel.unsubscribe(this._metamodelListener); + } + $$2(this.document).off('mouseup', this.mouseUpHanlder); + this.palette.remove(); + } + ngOnChanges(changes) { + // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { + // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); + // } + } + createPaletteGroup(title, isOpen) { + let newGroupHeader = new joint$1.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); + newGroupHeader.set('header', title); + if (!isOpen) { + newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); + newGroupHeader.set('isOpen', false); + } + this.paletteGraph.addCell(newGroupHeader); + return newGroupHeader; + } + createPaletteEntry(title, metadata) { + return Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.palette, + metadata: metadata + }); + } + buildPalette(metamodel) { + let startTime = new Date().getTime(); + this.paletteReady.emit(false); + this.paletteGraph.clear(); + let filterText = this.filterText; + if (filterText) { + filterText = filterText.toLowerCase(); + } + let paletteNodes = []; + let groupAdded = new Set(); + let parentWidth = this._paletteSize; + console.debug(`Parent Width: ${parentWidth}`); + // The field closedGroups tells us which should not be shown + // Work out the list of active groups/nodes based on the filter text + this.metamodel.groups().forEach(group => { + if (metamodel && metamodel.has(group)) { + Array.from(metamodel.get(group).keys()).sort().forEach(name => { + let node = metamodel.get(group).get(name); + if (node) { + let nodeActive = !(node.metadata && node.metadata.noPaletteEntry); + if (nodeActive && filterText) { + nodeActive = false; + if (name.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + else if (group.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { + // nodeActive = true; + // } + // else if (node.properties) { + // Object.keys(node.properties).sort().forEach(function(propertyName) { + // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || + // (node.properties[propertyName].description && + // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { + // nodeActive=true; + // } + // }); + // } + } + if (nodeActive) { + if (!groupAdded.has(group)) { + let header = this.createPaletteGroup(group, !this.closedGroups.has(group)); + header.set('size', { width: parentWidth, height: 30 }); + paletteNodes.push(header); + groupAdded.add(group); + } + if (!this.closedGroups.has(group)) { + paletteNodes.push(this.createPaletteEntry(name, node)); + } + } + } + }); + } + }); + let cellWidth = 0, cellHeight = 0; + // Determine the size of the palette entry cell (width and height) + paletteNodes.forEach(pnode => { + if (pnode.attr('metadata/name')) { + let dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (cellWidth < dimension.width) { + cellWidth = dimension.width; + } + if (cellHeight < dimension.height) { + cellHeight = dimension.height; + } + } + }); + // Adjust the palette entry cell size with paddings. + cellWidth += 2 * this.paletteEntryPadding.width; + cellHeight += 2 * this.paletteEntryPadding.height; + // Align palette entries row to be at the center + let startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; + let xpos = startX; + let ypos = 0; + let prevNode; + // Layout palette entry nodes + paletteNodes.forEach(pnode => { + let dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (pnode.get('header')) { //attributes.attrs.header) { + // Palette entry header + xpos = startX; + pnode.set('position', { x: 0, y: ypos }); + ypos += dimension.height + 5; + } + else { + // Palette entry element + if (xpos + cellWidth > parentWidth) { + // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line + xpos = startX; + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + else { + // Enough real estate to place entry in a row - adjust y position + if (prevNode && prevNode.attr('metadata/name')) { + ypos -= cellHeight; + } + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + // increment x position and y position (can be reorganized) + xpos += cellWidth; + ypos += cellHeight; + } + prevNode = pnode; + }); + this.palette.setDimensions(parentWidth, ypos); + this.paletteReady.emit(true); + console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); + } + rebuildPalette() { + if (this.initialized && this.metamodel) { + this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); + } + } + set filterText(text) { + if (this._filterText !== text) { + this._filterText = text; + this.filterTextModel.next(text); + } + } + get filterText() { + return this._filterText; + } + getPaletteView(view) { + let self = this; + return view.extend({ + pointerdown: function ( /*evt, x, y*/) { + // Remove the tooltip + // $('.node-tooltip').remove(); + // TODO move metadata to the right place (not inside attrs I think) + self.clickedElement = this.model; + if (self.clickedElement && self.clickedElement.attr('metadata')) { + $$2(self.document).on('mousemove', self.mouseMoveHanlder); + } + }, + pointermove: function ( /*evt, x, y*/) { + // Nothing to prevent move within the palette canvas + }, + }); + } + handleMouseUp(event) { + $$2(this.document).off('mousemove', this.mouseMoveHanlder); + } + trigger(event) { + this.onPaletteEntryDrop.emit(event); + } + handleDrag(event) { + // TODO offsetX/Y not on firefox + // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); + // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); + if (this.clickedElement && this.clickedElement.attr('metadata')) { + if (!this.viewBeingDragged) { + let dataOfClickedElement = this.clickedElement.attr('metadata'); + // custom div if not already built. + $$2('
', { + id: 'palette-floater' + }).appendTo($$2('body')); + let floatergraph = new joint$1.dia.Graph(); + floatergraph.set('type', Constants.FEEDBACK_CONTEXT); + const parent = $$2('#palette-floater'); + this.floaterpaper = new joint$1.dia.Paper({ + el: $$2('#palette-floater'), + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView, + gridSize: 10, + model: floatergraph, + height: parent.height(), + width: parent.width(), + validateMagnet: () => false, + validateConnection: () => false + }); + // TODO float thing needs to be bigger otherwise icon label is missing + // Initiative drag and drop - create draggable element + let floaternode = Shapes.Factory.createNode({ + 'renderer': this.renderer, + 'paper': this.floaterpaper, + 'graph': floatergraph, + 'metadata': dataOfClickedElement + }); + // Only node view expected + let box = this.floaterpaper.findViewByModel(floaternode).getBBox(); + let size = floaternode.get('size'); + // Account for node real size including ports + floaternode.translate(box.width - size.width, box.height - size.height); + this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); + $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + } + else { + $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + this.trigger({ + type: Flo.DnDEventType.DRAG, + view: this.viewBeingDragged, + event: event + }); + } + } + } + /* + * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) + */ + rotateOpen(element) { + setTimeout(() => this.doRotateOpen(element, 90)); + } + doRotateOpen(element, angle) { + angle -= 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle <= 0) { + element.set('isOpen', true); + this.closedGroups.delete(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(() => this.doRotateOpen(element, angle), 10); + } + } + doRotateClose(element, angle) { + angle += 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle >= 90) { + element.set('isOpen', false); + this.closedGroups.add(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(() => this.doRotateClose(element, angle), 10); + } + } + // TODO better name for this function as this does the animation *and* updates the palette + /* + * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) + */ + rotateClosed(element) { + setTimeout(() => this.doRotateClose(element, 0)); + } +}; +__decorate([ + Input(), + __metadata("design:type", Object) +], Palette.prototype, "metamodel", void 0); +__decorate([ + Input(), + __metadata("design:type", Object) +], Palette.prototype, "renderer", void 0); +__decorate([ + Input(), + __metadata("design:type", Object) +], Palette.prototype, "paletteEntryPadding", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], Palette.prototype, "onPaletteEntryDrop", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], Palette.prototype, "paletteReady", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], Palette.prototype, "paletteFocus", void 0); +__decorate([ + Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) +], Palette.prototype, "paletteSize", null); +Palette = __decorate([ + Component({ + selector: 'flo-palette', + template: ` +
+ +
+
+
+
+ `, + styles: [` + /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */ + + #palette-floater { + /* TODO size relative to paper that goes on it? */ + opacity: 0.75; + width:170px; + height:60px; + background-color: transparent; + /* + background-color: #6db33f; + */ + float:left; + position: absolute; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + } + + #palette-floater.joint-paper > svg { + background-color: transparent; + } + + #palette-paper-container { + overflow-y: auto; + overflow-x: hidden; + background-color: white; + color: white; + } + + /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */ + + /* Palette START */ + + .palette-filter { + border: 3px solid #6db33f; + } + + .palette-filter-textfield { + width: 100%; + font-size:24px; + /* border: 3px solid #6db33f; + */ font-family: "Varela Round",sans-serif; + /* padding: 2px; */ + } + + .palette-paper { + background-color: #eeeeee; + /* + border-right: 7px solid; + */ + border-color: #6db33f; + /* width: 170px; + height:100%; + float: left; + */ + } + + /* Palette END */ + `], + encapsulation: ViewEncapsulation.None + }), + __param(1, Inject(DOCUMENT)), + __metadata("design:paramtypes", [ElementRef, Object]) +], Palette); + +const joint$2 = Flo.joint; +const $$3 = _$; +class Utils { + static fanRoute(graph, cell) { + if (cell instanceof joint$2.dia.Element) { + const links = graph.getConnectedLinks(cell); + const groupsOfOverlappingLinks = groupBy(links, (link) => { + // the key of the group is the model id of the link's source or target, but not our cell id. + const sourceId = link.get('source').id; + const targetId = link.get('target').id; + return cell.id !== sourceId ? sourceId : targetId; + }); + each(groupsOfOverlappingLinks, (group, key) => { + // If the member of the group has both source and target model adjust vertices. + let toRoute = {}; + if (key !== undefined) { + group.forEach((link) => { + if (link.get('source').id === cell.get('id') && link.get('target').id) { + toRoute[link.get('target').id] = link; + } + else if (link.get('target').id === cell.get('id') && link.get('source').id) { + toRoute[link.get('source').id] = link; + } + }); + Object.keys(toRoute).forEach(k => { + Utils.fanRoute(graph, toRoute[k]); + }); + } + }); + } + else if (cell instanceof joint$2.dia.Link) { + // The cell is a link. Let's find its source and target models. + let srcId = cell.get('source').id || cell.previous('source').id; + let trgId = cell.get('target').id || cell.previous('target').id; + // If one of the ends is not a model, the link has no siblings. + if (!srcId || !trgId) { + return; + } + const siblings = graph.getLinks().filter((sibling) => { + const _srcId = sibling.get('source').id; + const _trgId = sibling.get('target').id; + const vertices = sibling.get('vertices'); + const fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); + return ((_srcId === srcId && _trgId === trgId) || (_srcId === trgId && _trgId === srcId)) && fanRouted; + }); + switch (siblings.length) { + case 0: + // The link was removed and had no siblings. + break; + case 1: + // There is only one link between the source and target. No vertices needed. + let vertices = cell.get('vertices'); + if (vertices && vertices.length && cell.get('fanRouted')) { + cell.unset('vertices'); + } + break; + default: + // There is more than one siblings. We need to create vertices. + // First of all we'll find the middle point of the link. + let source = graph.getCell(srcId); + let target = graph.getCell(trgId); + if (!source || !target) { + // When clearing the graph it may happen that some nodes are gone and some are left + return; + } + let srcCenter = source.getBBox().center(); + let trgCenter = target.getBBox().center(); + let midPoint = joint$2.g.line(srcCenter, trgCenter).midpoint(); + // Then find the angle it forms. + let theta = srcCenter.theta(trgCenter); + // This is the maximum distance between links + let gap = 20; + siblings.forEach((sibling, index) => { + // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. + let offset = gap * Math.ceil(index / 2); + // Now we need the vertices to be placed at points which are 'offset' pixels distant + // from the first link and forms a perpendicular angle to it. And as index goes up + // alternate left and right. + // + // ^ odd indexes + // | + // |----> index 0 line (straight line between a source center and a target center. + // | + // v even indexes + let sign = index % 2 ? 1 : -1; + let angle = joint$2.g.toRad(theta + sign * 90); + // We found the vertex. + let vertex = joint$2.g.point.fromPolar(offset, angle, midPoint); + sibling.set('fanRouted', true); + sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); + }); + } + } + } + static isCustomPaperEvent(args) { + return args.length === 5 && + isString(args[0]) && + (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && + args[1] instanceof $$3.Event && + args[2] instanceof joint$2.dia.CellView && + isNumber(args[3]) && + isNumber(args[4]); + } +} + +const joint$3 = Flo.joint; +const $$4 = _$; +const SCROLLBAR_SIZE = 17; +let EditorComponent = class EditorComponent { + constructor(element) { + this.element = element; + /** + * Flag specifying whether the Flo-Editor is in read-only mode. + */ + this._readOnlyCanvas = false; + /** + * Grid size + */ + this._gridSize = 1; + this._hiddenPalette = false; + this.textToGraphEventEmitter = new EventEmitter(); + this.graphToTextEventEmitter = new EventEmitter(); + this._graphToTextSyncEnabled = true; + this.validationEventEmitter = new EventEmitter(); + this._disposables = new CompositeDisposable(); + this._dslText = ''; + this.textToGraphConversionCompleted = new Subject(); + this.graphToTextConversionCompleted = new Subject(); + this.paletteReady = new BehaviorSubject(false); + /** + * Min zoom percent value + */ + this.minZoom = 5; + /** + * Max zoom percent value + */ + this.maxZoom = 400; + /** + * Zoom percent increment/decrement step + */ + this.zoomStep = 5; + this.paperPadding = 0; + this.floApi = new EventEmitter(); + this.validationMarkers = new EventEmitter(); + this.contentValidated = new EventEmitter(); + this.dslChange = new EventEmitter(); + this._resizeHandler = () => this.autosizePaper(); + let self = this; + this.editorContext = new (class DefaultRunnableContext { + set zoomPercent(percent) { + self.zoomPercent = percent; + } + get zoomPercent() { + return self.zoomPercent; + } + set noPalette(noPalette) { + self.noPalette = noPalette; + } + get noPalette() { + return self.noPalette; + } + set gridSize(gridSize) { + self.gridSize = gridSize; + } + get gridSize() { + return self.gridSize; + } + set readOnlyCanvas(readOnly) { + self.readOnlyCanvas = readOnly; + } + get readOnlyCanvas() { + return self.readOnlyCanvas; + } + setDsl(dsl) { + self.dsl = dsl; + } + updateGraph() { + return self.updateGraphRepresentation(); + } + updateText() { + return self.updateTextRepresentation(); + } + performLayout() { + return self.doLayout(); + } + clearGraph() { + self.selection = undefined; + self.graph.clear(); + if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { + return self.metamodel.load().then(data => { + self.editor.setDefaultContent(this, data); + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + }); + } + else { + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + } + } + getGraph() { + return self.graph; + } + getPaper() { + return self.paper; + } + get graphToTextSync() { + return self.graphToTextSync; + } + set graphToTextSync(sync) { + self.graphToTextSync = sync; + } + getMinZoom() { + return self.minZoom; + } + getMaxZoom() { + return self.maxZoom; + } + getZoomStep() { + return self.zoomStep; + } + fitToPage() { + self.fitToPage(); + } + createNode(metadata, props, position) { + return self.createNode(metadata, props, position); + } + createLink(source, target, metadata, props) { + return self.createLink(source, target, metadata, props); + } + get selection() { + return self.selection; + } + set selection(newSelection) { + self.selection = newSelection; + } + deleteSelectedNode() { + if (self.selection) { + if (self.editor && self.editor.preDelete) { + self.editor.preDelete(self.editorContext, self.selection.model); + } + else { + if (self.selection.model instanceof joint$3.dia.Element) { + self.graph.getConnectedLinks(self.selection.model).forEach((l) => l.remove()); + } + } + self.selection.model.remove(); + self.selection = undefined; + } + } + get textToGraphConversionObservable() { + return self.textToGraphConversionCompleted; + } + get graphToTextConversionObservable() { + return self.graphToTextConversionCompleted; + } + get paletteReady() { + return self.paletteReady; + } + })(); + } + ngOnInit() { + this.initGraph(); + this.initPaper(); + this.initGraphListeners(); + this.initPaperListeners(); + this.initMetamodel(); + $$4(window).on('resize', this._resizeHandler); + this._disposables.add(Disposable.create(() => $$4(window).off('resize', this._resizeHandler))); + /* + * Execute resize to get the right size for the SVG element on the editor canvas. + * Executed via timeout to let angular render the DOM first and elements to have the right width and height + */ + window.setTimeout(this._resizeHandler); + this.floApi.emit(this.editorContext); + } + ngOnDestroy() { + this._disposables.dispose(); + } + get noPalette() { + return this._hiddenPalette; + } + set noPalette(hidden) { + this._hiddenPalette = hidden; + // If palette is not shown ensure that canvas starts from the left==0! + if (hidden) { + $$4('#paper-container', this.element.nativeElement).css('left', 0); + } + } + get graphToTextSync() { + return this._graphToTextSyncEnabled; + } + set graphToTextSync(sync) { + this._graphToTextSyncEnabled = sync; + // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion + // this.performGraphToTextSyncing(); + } + performGraphToTextSyncing() { + if (this._graphToTextSyncEnabled) { + this.graphToTextEventEmitter.emit(); + } + } + createHandle(element, kind, action, location) { + if (!location) { + let bbox = element.model.getBBox(); + location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); + } + let handle = Shapes.Factory.createHandle({ + renderer: this.renderer, + paper: this.paper, + parent: element.model, + kind: kind, + position: location + }); + const view = this.paper.findViewByModel(handle); + view.on('cell:pointerdown', () => { + if (action) { + action(); + } + }); + view.on('cell:mouseover', () => { + handle.attr('image/filter', { + name: 'dropShadow', + args: { dx: 1, dy: 1, blur: 1, color: 'black' } + }); + }); + view.on('cell:mouseout', () => { + handle.removeAttr('image/filter'); + }); + view.setInteractivity(false); + return handle; + } + removeEmbeddedChildrenOfType(element, types) { + let embeds = element.getEmbeddedCells(); + for (let i = 0; i < embeds.length; i++) { + if (types.indexOf(embeds[i].get('type')) >= 0) { + embeds[i].remove(); + } + } + } + get selection() { + return this._selection; + } + set selection(newSelection) { + if (newSelection && (newSelection.model.get('type') === joint$3.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint$3.shapes.flo.HANDLE_TYPE)) { + newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); + } + if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { + newSelection = undefined; + } + if (newSelection !== this._selection) { + if (this._selection) { + const elementview = this.paper.findViewByModel(this._selection.model); + if (elementview) { // May have been removed from the graph + this.removeEmbeddedChildrenOfType(elementview.model, joint$3.shapes.flo.HANDLE_TYPE); + elementview.unhighlight(); + } + } + if (newSelection) { + newSelection.highlight(); + if (this.editor && this.editor.createHandles) { + this.editor.createHandles(this.editorContext, (owner, kind, action, location) => this.createHandle(owner, kind, action, location), newSelection); + } + } + this._selection = newSelection; + } + } + get readOnlyCanvas() { + return this._readOnlyCanvas; + } + set readOnlyCanvas(value) { + if (this._readOnlyCanvas === value) { + // Nothing to do + return; + } + if (value) { + this.selection = undefined; + } + if (this.graph) { + this.graph.getLinks().forEach((link) => { + if (value) { + link.attr('.link-tools/display', 'none'); + link.attr('.marker-vertices/display', 'none'); + link.attr('.connection-wrap/display', 'none'); + } + else { + link.removeAttr('.link-tools/display'); + if (this.editor && this.editor.allowLinkVertexEdit) { + link.removeAttr('.marker-vertices/display'); + } + link.removeAttr('.connection-wrap/display'); + } + }); + } + this._readOnlyCanvas = value; + } + /** + * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + showDragFeedback(dragDescriptor) { + if (this.editor && this.editor.showDragFeedback) { + this.editor.showDragFeedback(this.editorContext, dragDescriptor); + } + else { + let magnet; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint$3.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint$3.V(magnet).addClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint$3.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint$3.V(magnet).addClass('dnd-target-feedback'); + } + } + } + } + } + /** + * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + hideDragFeedback(dragDescriptor) { + if (this.editor && this.editor.hideDragFeedback) { + this.editor.hideDragFeedback(this.editorContext, dragDescriptor); + } + else { + let magnet; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint$3.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint$3.V(magnet).removeClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint$3.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint$3.V(magnet).removeClass('dnd-target-feedback'); + } + } + } + } + } + /** + * Sets the new DnD info object - the descriptor for DnD + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + setDragDescriptor(dragDescriptor) { + if (this.highlighted === dragDescriptor) { + return; + } + if (this.highlighted && dragDescriptor && isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { + if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { + return; + } + if (this.highlighted.source && + dragDescriptor.source && + this.highlighted.target && + dragDescriptor.target && + this.highlighted.source.view.model === dragDescriptor.source.view.model && + this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && + this.highlighted.target.view.model === dragDescriptor.target.view.model && + this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { + return; + } + } + if (this.highlighted) { + this.hideDragFeedback(this.highlighted); + } + this.highlighted = dragDescriptor; + if (this.highlighted) { + this.showDragFeedback(this.highlighted); + } + } + /** + * Handles DnD events when a node is being dragged over canvas + * + * @param draggedView The Joint JS view object being dragged + * @param targetUnderMouse The Joint JS view under mouse cursor + * @param x X coordinate of the mouse on the canvas + * @param y Y coordinate of the mosue on the canvas + * @param context DnD context (palette or canvas) + */ + handleNodeDragging(draggedView, targetUnderMouse, x, y, sourceComponent) { + if (this.editor && this.editor.calculateDragDescriptor) { + this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint$3.g.point(x, y), sourceComponent)); + } + } + /** + * Handles DnD drop event when a node is being dragged and dropped on the main canvas + */ + handleNodeDropping() { + if (this.highlighted && this.editor && this.editor.handleNodeDropping) { + this.editor.handleNodeDropping(this.editorContext, this.highlighted); + } + this.setDragDescriptor(undefined); + } + /** + * Hides DOM Node (used to determine drop target DOM element) + * @param domNode DOM node to hide + * @returns + */ + _hideNode(domNode) { + let oldVisibility = { + visibility: domNode.style ? domNode.style.display : undefined, + children: [] + }; + for (let i = 0; i < domNode.children.length; i++) { + let node = domNode.children.item(i); + if (node instanceof HTMLElement) { + oldVisibility.children.push(this._hideNode(node)); + } + } + domNode.style.display = 'none'; + return oldVisibility; + } + /** + * Restored DOM node original visibility (used to determine drop target DOM element) + * @param domNode DOM node to restore visibility of + * @param oldVisibility original visibility parameter + */ + _restoreNodeVisibility(domNode, oldVisibility) { + if (domNode.style) { + domNode.style.display = oldVisibility.visibility; + } + let j = 0; + for (let i = 0; i < domNode.childNodes.length; i++) { + if (j < oldVisibility.children.length) { + let node = domNode.children.item(i); + if (node instanceof HTMLElement) { + this._restoreNodeVisibility(node, oldVisibility.children[j++]); + } + } + } + } + /** + * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. + * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location + * (bounding box of a link for testing is bad). + * The result of that is that links can only be the drop target when dragging from the palette currently. + * When DnDing shapes on the canvas drop target cannot be a link. + * + * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked + * - e.g. Drag-n-Drop) + */ + getTargetViewFromEvent(event, x, y, excludeViews = []) { + if (!x && !y) { + let l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); + x = l.x; + y = l.y; + } + // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing + // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); + // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); + // if (underMouse) { + // return underMouse; + // } + let oldVisibility = excludeViews.map(_x => this._hideNode(_x.el)); + let targetElement = document.elementFromPoint(event.clientX, event.clientY); + excludeViews.forEach((excluded, i) => { + this._restoreNodeVisibility(excluded.el, oldVisibility[i]); + }); + return this.paper.findView($$4(targetElement)); + } + handleDnDFromPalette(dndEvent) { + switch (dndEvent.type) { + case Flo.DnDEventType.DRAG: + this.handleDragFromPalette(dndEvent); + break; + case Flo.DnDEventType.DROP: + this.handleDropFromPalette(dndEvent); + break; + default: + break; + } + } + handleDragFromPalette(dnDEvent) { + console.debug('Dragging from palette'); + if (dnDEvent.view && !this.readOnlyCanvas) { + let location = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); + this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location.x, location.y, [dnDEvent.view]), location.x, location.y, Constants.PALETTE_CONTEXT); + } + } + createNode(metadata, props, position) { + return Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.paper, + metadata: metadata, + props: props, + position: position + }); + } + createLink(source, target, metadata, props) { + return Shapes.Factory.createLink({ + renderer: this.renderer, + paper: this.paper, + source: source, + target: target, + metadata: metadata, + props: props + }); + } + handleDropFromPalette(event) { + let cellview = event.view; + let evt = event.event; + if (this.paper.el === evt.target || $$4.contains(this.paper.el, evt.target)) { + if (this.readOnlyCanvas) { + this.setDragDescriptor(undefined); + } + else { + let metadata = cellview.model.attr('metadata'); + let props = cellview.model.attr('props'); + let position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); + /* Calculate target element before creating the new + * element under mouse location. Otherwise target + * element would be the newly created element because + * it's under the mouse pointer + */ + let targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); + let newNode = this.createNode(metadata, props, position); + let newView = this.paper.findViewByModel(newNode); + this.handleNodeDragging(newView, targetElement, position.x, position.y, Constants.PALETTE_CONTEXT); + this.handleNodeDropping(); + } + } + } + fitToContent(gridWidth, gridHeight, padding, opt) { + const paper = this.paper; + if (joint$3.util.isObject(gridWidth)) { + // first parameter is an option object + opt = gridWidth; + gridWidth = opt.gridWidth || 1; + gridHeight = opt.gridHeight || 1; + padding = opt.padding || 0; + } + else { + opt = opt || {}; + gridWidth = gridWidth || 1; + gridHeight = gridHeight || 1; + padding = padding || 0; + } + const paddingJson = joint$3.util.normalizeSides(padding); + // Calculate the paper size to accomodate all the graph's elements. + const bbox = joint$3.V(paper.viewport).getBBox(); + const currentScale = paper.scale(); + const currentTranslate = paper.translate(); + bbox.x *= currentScale.sx; + bbox.y *= currentScale.sy; + bbox.width *= currentScale.sx; + bbox.height *= currentScale.sy; + let calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; + let calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; + let tx = 0; + let ty = 0; + if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { + tx = (-bbox.x / gridWidth) * gridWidth; + tx += paddingJson.left; + } + else if (opt.allowNewOrigin === 'same') { + tx = currentTranslate.tx; + } + calcWidth += tx; + if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { + ty = (-bbox.y / gridHeight) * gridHeight; + ty += paddingJson.top; + } + else if (opt.allowNewOrigin === 'same') { + ty = currentTranslate.ty; + } + calcHeight += ty; + calcWidth += paddingJson.right; + calcHeight += paddingJson.bottom; + // Make sure the resulting width and height are greater than minimum. + calcWidth = Math.max(calcWidth, opt.minWidth || 0); + calcHeight = Math.max(calcHeight, opt.minHeight || 0); + // Make sure the resulting width and height are lesser than maximum. + calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); + calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); + const dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; + const originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; + // Change the dimensions only if there is a size discrepency or an origin change + if (originChange) { + paper.translate(tx, ty); + } + if (dimensionChange) { + paper.setDimensions(calcWidth, calcHeight); + } + } + autosizePaper() { + let parent = $$4('#paper-container', this.element.nativeElement); + const parentWidth = parent.innerWidth(); + const parentHeight = parent.innerHeight(); + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth - SCROLLBAR_SIZE, + minHeight: parentHeight - SCROLLBAR_SIZE, + allowNewOrigin: 'same' + }); + } + fitToPage() { + let parent = $$4('#paper-container', this.element.nativeElement); + let minScale = this.minZoom / 100; + let maxScale = 2; + const parentWidth = parent.innerWidth(); + const parentHeight = parent.innerHeight(); + this.paper.scaleContentToFit({ + padding: this.paperPadding, + minScaleX: minScale, + minScaleY: minScale, + maxScaleX: maxScale, + maxScaleY: maxScale, + fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } + }); + /** + * Size the canvas appropriately and allow origin movement + */ + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth, + minHeight: parentHeight, + maxWidth: parentWidth, + maxHeight: parentHeight, + allowNewOrigin: 'any' + }); + } + get zoomPercent() { + return Math.round(joint$3.V(this.paper.viewport).scale().sx * 100); + } + set zoomPercent(percent) { + if (!isNaN(percent)) { + if (percent < this.minZoom) { + percent = this.minZoom; + } + else if (percent >= this.maxZoom) { + percent = this.maxZoom; + } + else { + if (percent <= 0) { + percent = 0.00001; + } + } + this.paper.scale(percent / 100, percent / 100); + } + } + get gridSize() { + return this._gridSize; + } + set gridSize(size) { + if (!isNaN(size) && size >= 1) { + this._gridSize = size; + if (this.paper) { + this.paper.setGridSize(size); + } + } + } + validateContent() { + return new Promise(resolve => { + if (this.editor && this.editor.validate) { + return this.editor + .validate(this.graph, this.dsl, this.editorContext) + .then(allMarkers => { + this.graph.getCells() + .forEach((cell) => this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : [])); + this.validationMarkers.emit(allMarkers); + this.contentValidated.emit(true); + resolve(); + }); + } + else { + resolve(); + } + }); + } + markElement(cell, markers) { + let errorMessages = markers.map(m => m.message); + let errorCell = cell.getEmbeddedCells().find((e) => e.attr('./kind') === Constants.ERROR_DECORATION_KIND); + if (errorCell) { + if (errorMessages.length === 0) { + errorCell.remove(); + } + else { + // Without rewrite we merge this list with existing errors + errorCell.attr('messages', errorMessages, { rewrite: true }); + } + } + else if (errorMessages.length > 0) { + let error = Shapes.Factory.createDecoration({ + renderer: this.renderer, + paper: this.paper, + parent: cell, + kind: Constants.ERROR_DECORATION_KIND, + messages: errorMessages + }); + let pt; + const view = this.paper.findViewByModel(error); + if (cell instanceof joint$3.dia.Element) { + pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); + error.set('position', pt); + view.setInteractivity(false); + } + } + } + doLayout() { + if (this.renderer && this.renderer.layout) { + return this.renderer.layout(this.paper); + } + } + set dsl(dslText) { + if (this._dslText !== dslText) { + this._dslText = dslText; + this.textToGraphEventEmitter.emit(); + } + } + get dsl() { + return this._dslText; + } + /** + * Ask the server to parse the supplied text into a JSON graph of nodes and links, + * then update the view based on that new information. + */ + updateGraphRepresentation() { + console.debug(`Updating graph to represent '${this._dslText}'`); + if (this.metamodel && this.metamodel.textToGraph) { + return this.metamodel.textToGraph(this.editorContext, this._dslText).then(() => { + this.textToGraphConversionCompleted.next(); + return this.validateContent(); + }); + } + else { + this.textToGraphConversionCompleted.next(); + return this.validateContent(); + } + } + updateTextRepresentation() { + if (this.metamodel && this.metamodel.graphToText) { + return this.metamodel.graphToText(this.editorContext).then(text => { + if (this._dslText !== text) { + this._dslText = text; + this.dslChange.emit(text); + } + this.graphToTextConversionCompleted.next(); + return this.validateContent(); + }) + .catch(error => { + // Validation may reveal why the graph couldn't be + // converted so let it run + this.graphToTextConversionCompleted.next(); + return this.validateContent(); + }); + } + else { + this.graphToTextConversionCompleted.next(); + return this.validateContent(); + } + } + initMetamodel() { + this.metamodel.load().then(data => { + this.updateGraphRepresentation(); + let textSyncSubscription = this.graphToTextEventEmitter.pipe(debounceTime(100)).subscribe(() => { + if (this._graphToTextSyncEnabled) { + this.updateTextRepresentation(); + } + }); + this._disposables.add(Disposable.create(() => textSyncSubscription.unsubscribe())); + // Setup content validated event emitter. Emit not validated when graph to text conversion required + let graphValidatedSubscription1 = this.graphToTextEventEmitter.subscribe(() => this.contentValidated.emit(false)); + this._disposables.add(Disposable.create(() => graphValidatedSubscription1.unsubscribe)); + // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); + // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); + let graphSyncSubscription = this.textToGraphEventEmitter.pipe(debounceTime(300)).subscribe(() => this.updateGraphRepresentation()); + this._disposables.add(Disposable.create(() => graphSyncSubscription.unsubscribe())); + // Setup content validated event emitter. Emit not validated when text to graph conversion required + let graphValidatedSubscription2 = this.textToGraphEventEmitter.subscribe(() => this.contentValidated.emit(false)); + this._disposables.add(Disposable.create(() => graphValidatedSubscription2.unsubscribe)); + if (this.editor && this.editor.setDefaultContent) { + this.editor.setDefaultContent(this.editorContext, data); + } + }); + } + initGraph() { + this.graph = new joint$3.dia.Graph(); + this.graph.set('type', Constants.CANVAS_CONTEXT); + this.graph.set('paperPadding', this.paperPadding); + } + handleNodeCreation(node) { + node.on('change:size', this._resizeHandler); + node.on('change:position', this._resizeHandler); + if (node.attr('metadata')) { + node.on('change:attrs', (cell, attrs, changeData) => { + let propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + let propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (this.renderer && this.renderer.isSemanticProperty && this.renderer.isSemanticProperty(propAttr, node))) { + this.performGraphToTextSyncing(); + } + if (this.renderer && this.renderer.refreshVisuals) { + this.renderer.refreshVisuals(node, propAttr, this.paper); + } + } + }); + } + } + /** + * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples + * are 'change:source', 'change:target'. + */ + handleLinkEvent(event, link) { + if (this.renderer && this.renderer.handleLinkEvent) { + this.renderer.handleLinkEvent(this.editorContext, event, link); + } + } + handleLinkCreation(link) { + this.handleLinkEvent('add', link); + link.on('change:source', (l) => { + this.autosizePaper(); + let newSourceId = l.get('source').id; + let oldSourceId = l.previous('source').id; + if (newSourceId !== oldSourceId) { + this.performGraphToTextSyncing(); + } + this.handleLinkEvent('change:source', l); + }); + link.on('change:target', (l) => { + this.autosizePaper(); + let newTargetId = l.get('target').id; + let oldTargetId = l.previous('target').id; + if (newTargetId !== oldTargetId) { + this.performGraphToTextSyncing(); + } + this.handleLinkEvent('change:target', l); + }); + link.on('change:vertices', this._resizeHandler); + link.on('change:attrs', (cell, attrs, changeData) => { + let propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + let propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (this.renderer && this.renderer.isSemanticProperty && this.renderer.isSemanticProperty(propAttr, link))) { + let sourceId = link.get('source').id; + let targetId = link.get('target').id; + this.performGraphToTextSyncing(); + } + if (this.renderer && this.renderer.refreshVisuals) { + this.renderer.refreshVisuals(link, propAttr, this.paper); + } + } + }); + this.paper.findViewByModel(link).on('link:options', () => this.handleLinkEvent('options', link)); + if (this.readOnlyCanvas) { + link.attr('.link-tools/display', 'none'); + } + } + initGraphListeners() { + this.graph.on('add', (element) => { + if (element instanceof joint$3.dia.Link) { + this.handleLinkCreation(element); + } + else if (element instanceof joint$3.dia.Element) { + this.handleNodeCreation(element); + } + if (element.get('type') === joint$3.shapes.flo.NODE_TYPE || element.get('type') === joint$3.shapes.flo.LINK_TYPE) { + this.performGraphToTextSyncing(); + } + this.autosizePaper(); + }); + this.graph.on('remove', (element) => { + if (element instanceof joint$3.dia.Link) { + this.handleLinkEvent('remove', element); + } + if (this.selection && this.selection.model === element) { + this.selection = undefined; + } + if (element.isLink()) { + window.setTimeout(() => this.performGraphToTextSyncing(), 100); + } + else if (element.get('type') === joint$3.shapes.flo.NODE_TYPE) { + this.performGraphToTextSyncing(); + } + this.autosizePaper(); + }); + // Set if link is fan-routed. Should be called before routing call + this.graph.on('change:vertices', (link, changed, opt) => { + if (opt.fanRouted) { + link.set('fanRouted', true); + } + else { + link.unset('fanRouted'); + } + }); + // adjust vertices when a cell is removed or its source/target was changed + this.graph.on('add remove change:source change:target change:vertices change:position', partial(Utils.fanRoute, this.graph)); + } + initPaperListeners() { + // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element + this.paper.on('cell:pointerclick', (cellView) => { + if (!this.readOnlyCanvas) { + this.selection = cellView; + } + }); + this.paper.on('blank:pointerclick', () => { + this.selection = undefined; + }); + this.paper.on('scale', this._resizeHandler); + this.paper.on('all', function () { + if (Utils.isCustomPaperEvent(arguments)) { + arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); + } + }); + this.paper.on('dragging-node-over-canvas', (dndEvent) => { + console.debug(`Canvas DnD type = ${dndEvent.type}`); + let location = this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); + switch (dndEvent.type) { + case Flo.DnDEventType.DRAG: + this.handleNodeDragging(dndEvent.view, this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, Constants.CANVAS_CONTEXT); + break; + case Flo.DnDEventType.DROP: + this.handleNodeDropping(); + break; + default: + break; + } + }); + // JointJS now no longer grabs focus if working in a paper element - crude... + $$4('#flow-view', this.element.nativeElement).on('mousedown', () => { + $$4('#palette-filter-textfield', this.element.nativeElement).focus(); + }); + } + initPaper() { + let options = { + el: $$4('#paper', this.element.nativeElement), + gridSize: this._gridSize, + drawGrid: true, + model: this.graph, + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$3.shapes.flo.ElementView /*joint.dia.ElementView*/, + linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint$3.shapes.flo.LinkView, + // Enable link snapping within 25px lookup radius + snapLinks: { radius: 25 }, + defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ (cellView, magnet) => { + if (this.renderer && this.renderer.createLink) { + let linkEnd = { + id: cellView.model.id + }; + if (magnet) { + linkEnd.selector = cellView.getSelector(magnet, undefined); + } + if (magnet.getAttribute('port')) { + linkEnd.port = magnet.getAttribute('port'); + } + if (magnet.getAttribute('port') === 'input') { + return this.renderer.createLink(undefined, linkEnd); + } + else { + return this.renderer.createLink(linkEnd, undefined); + } + } + else { + return new joint$3.shapes.flo.Link(); + } + }, + // decide whether to create a link if the user clicks a magnet + validateMagnet: (cellView, magnet) => { + if (this.readOnlyCanvas) { + return false; + } + else { + if (this.editor && this.editor.validatePort) { + return this.editor.validatePort(this.editorContext, cellView, magnet); + } + else { + return true; + } + } + }, + interactive: (cellView, event) => { + if (this.readOnlyCanvas) { + return false; + } + else { + if (this.editor && this.editor.interactive) { + if (typeof this.editor.interactive === 'function') { + // Type for interactive is wrong in JointJS have to cast to + return this.editor.interactive(cellView, event); + } + else { + return this.editor.interactive; + } + } + return true; + } + }, + highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { + 'default': { + name: 'addClass', + options: { + className: 'highlighted' + } + } + }, + markAvailable: true + }; + if (this.renderer && this.renderer.getLinkAnchorPoint) { + options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; + } + if (this.editor && this.editor.validateLink) { + const self = this; + options.validateConnection = (cellViewS, magnetS, cellViewT, magnetT, end, linkView) => self.editor.validateLink(this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); + } + // The paper is what will represent the graph on the screen + this.paper = new joint$3.dia.Paper(options); + this._disposables.add(Disposable.create(() => this.paper.remove())); + } + updatePaletteReadyState(ready) { + this.paletteReady.next(ready); + } +}; +__decorate([ + Input(), + __metadata("design:type", Object) +], EditorComponent.prototype, "metamodel", void 0); +__decorate([ + Input(), + __metadata("design:type", Object) +], EditorComponent.prototype, "renderer", void 0); +__decorate([ + Input(), + __metadata("design:type", Object) +], EditorComponent.prototype, "editor", void 0); +__decorate([ + Input(), + __metadata("design:type", Number) +], EditorComponent.prototype, "paletteSize", void 0); +__decorate([ + Input(), + __metadata("design:type", Object) +], EditorComponent.prototype, "minZoom", void 0); +__decorate([ + Input(), + __metadata("design:type", Object) +], EditorComponent.prototype, "maxZoom", void 0); +__decorate([ + Input(), + __metadata("design:type", Object) +], EditorComponent.prototype, "zoomStep", void 0); +__decorate([ + Input(), + __metadata("design:type", Object) +], EditorComponent.prototype, "paperPadding", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], EditorComponent.prototype, "floApi", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], EditorComponent.prototype, "validationMarkers", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], EditorComponent.prototype, "contentValidated", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], EditorComponent.prototype, "dslChange", void 0); +__decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) +], EditorComponent.prototype, "dsl", null); +EditorComponent = __decorate([ + Component({ + selector: 'flo-editor', + template: ` + +
+
+
+ +
+ + + +
+ +
+
+
+ + + + + + + + + + +
+ + + + + +
+
+ +
+
+
+ `, + styles: [` + /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library + + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + /* + A complete list of SVG properties that can be set through CSS is here: + http://www.w3.org/TR/SVG/styling.html + + Important note: Presentation attributes have a lower precedence over CSS style rules. + */ + + + /* .viewport is a node wrapping all diagram elements in the paper */ + .joint-viewport { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + } + + .joint-paper > svg, + .joint-paper-background, + .joint-paper-grid { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } + + /* + 1. IE can't handle paths without the \`d\` attribute for bounding box calculation + 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will + break the links rendering. + + path:not([d]) { + display: none; + } + + */ + + + /* magnet is an element that can be either source or a target of a link */ + [magnet=true]:not(.joint-element) { + cursor: crosshair; + } + [magnet=true]:not(.joint-element):hover { + opacity: .7; + } + + /* + + Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class "element basic Rect". + This makes it possible to easilly style elements in CSS and have generic CSS rules applying to + the whole group of elements. Each plugin can provide its own stylesheet. + + */ + + .joint-element { + /* Give the user a hint that he can drag&drop the element. */ + cursor: move; + } + + .joint-element * { + user-drag: none; + } + + .joint-element .scalable * { + /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */ + vector-effect: non-scaling-stroke; + } + /* + + connection-wrap is a element of the joint.dia.Link that follows the .connection of that link. + In other words, the \`d\` attribute of the .connection-wrap contains the same data as the \`d\` attribute of the + .connection . The advantage of using .connection-wrap is to be able to catch pointer events + in the neighborhood of the .connection . This is especially handy if the .connection is + very thin. + + */ + + .marker-source, + .marker-target { + /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */ + vector-effect: non-scaling-stroke; + } + + /* Paper */ + .joint-paper { + position: relative; + } + /* Paper */ + + /* Highlighting */ + .joint-highlight-opacity { + opacity: 0.3; + } + /* Highlighting */ + + /* + + Vertex markers are \`\` elements that appear at connection vertex positions. + + */ + + .joint-link .connection-wrap, + .joint-link .connection { + fill: none; + } + + /* element wrapping .marker-vertex-group. */ + .marker-vertices { + opacity: 0; + cursor: move; + } + .marker-arrowheads { + opacity: 0; + cursor: move; + cursor: -webkit-grab; + cursor: -moz-grab; + /* display: none; */ /* setting \`display: none\` on .marker-arrowheads effectivelly switches of links reconnecting */ + } + .link-tools { + opacity: 0; + cursor: pointer; + } + .link-tools .tool-options { + display: none; /* by default, we don't display link options tool */ + } + .joint-link:hover .marker-vertices, + .joint-link:hover .marker-arrowheads, + .joint-link:hover .link-tools { + opacity: 1; + } + + /* element used to remove a vertex */ + .marker-vertex-remove { + cursor: pointer; + opacity: .1; + } + + .marker-vertex-group:hover .marker-vertex-remove { + opacity: 1; + } + + .marker-vertex-remove-area { + opacity: .1; + cursor: pointer; + } + .marker-vertex-group:hover .marker-vertex-remove-area { + opacity: 1; + } + + /* + Example of custom changes (in pure CSS only!): + + Do not show marker vertices at all: .marker-vertices { display: none; } + Do not allow adding new vertices: .connection-wrap { pointer-events: none; } + */ + + /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */ + .joint-element .fobj { + overflow: hidden; + } + .joint-element .fobj body { + background-color: transparent; + margin: 0px; + position: static; + } + .joint-element .fobj div { + text-align: center; + vertical-align: middle; + display: table-cell; + padding: 0px 5px 0px 5px; + } + + /* Paper */ + .joint-paper.joint-theme-dark { + background-color: #18191b; + } + /* Paper */ + + /* Links */ + .joint-link.joint-theme-dark .connection-wrap { + stroke: #8F8FF3; + stroke-width: 15; + stroke-linecap: round; + stroke-linejoin: round; + opacity: 0; + cursor: move; + } + .joint-link.joint-theme-dark .connection-wrap:hover { + opacity: .4; + stroke-opacity: .4; + } + .joint-link.joint-theme-dark .connection { + stroke-linejoin: round; + } + .joint-link.joint-theme-dark .link-tools .tool-remove circle { + fill: #F33636; + } + .joint-link.joint-theme-dark .link-tools .tool-remove path { + fill: white; + } + .joint-link.joint-theme-dark .link-tools [event="link:options"] circle { + fill: green; + } + /* element inside .marker-vertex-group element */ + .joint-link.joint-theme-dark .marker-vertex { + fill: #5652DB; + } + .joint-link.joint-theme-dark .marker-vertex:hover { + fill: #8E8CE1; + stroke: none; + } + .joint-link.joint-theme-dark .marker-arrowhead { + fill: #5652DB; + } + .joint-link.joint-theme-dark .marker-arrowhead:hover { + fill: #8E8CE1; + stroke: none; + } + /* element used to remove a vertex */ + .joint-link.joint-theme-dark .marker-vertex-remove-area { + fill: green; + stroke: darkgreen; + } + .joint-link.joint-theme-dark .marker-vertex-remove { + fill: white; + stroke: white; + } + /* Links */ + /* Paper */ + .joint-paper.joint-theme-default { + background-color: #FFFFFF; + } + /* Paper */ + + /* Links */ + .joint-link.joint-theme-default .connection-wrap { + stroke: #000000; + stroke-width: 15; + stroke-linecap: round; + stroke-linejoin: round; + opacity: 0; + cursor: move; + } + .joint-link.joint-theme-default .connection-wrap:hover { + opacity: .4; + stroke-opacity: .4; + } + .joint-link.joint-theme-default .connection { + stroke-linejoin: round; + } + .joint-link.joint-theme-default .link-tools .tool-remove circle { + fill: #FF0000; + } + .joint-link.joint-theme-default .link-tools .tool-remove path { + fill: #FFFFFF; + } + + /* element inside .marker-vertex-group element */ + .joint-link.joint-theme-default .marker-vertex { + fill: #1ABC9C; + } + .joint-link.joint-theme-default .marker-vertex:hover { + fill: #34495E; + stroke: none; + } + + .joint-link.joint-theme-default .marker-arrowhead { + fill: #1ABC9C; + } + .joint-link.joint-theme-default .marker-arrowhead:hover { + fill: #F39C12; + stroke: none; + } + + /* element used to remove a vertex */ + .joint-link.joint-theme-default .marker-vertex-remove { + fill: #FFFFFF; + } + /* Links */ + + @font-face { + font-family: 'lato-light'; + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); + font-weight: normal; + font-style: normal; + } + + /* Links */ + .joint-link.joint-theme-material .connection-wrap { + stroke: #000000; + stroke-width: 15; + stroke-linecap: round; + stroke-linejoin: round; + opacity: 0; + cursor: move; + } + .joint-link.joint-theme-material .connection-wrap:hover { + opacity: .4; + stroke-opacity: .4; + } + .joint-link.joint-theme-material .connection { + stroke-linejoin: round; + } + .joint-link.joint-theme-material .link-tools .tool-remove circle { + fill: #C64242; + } + .joint-link.joint-theme-material .link-tools .tool-remove path { + fill: #FFFFFF; + } + + /* element inside .marker-vertex-group element */ + .joint-link.joint-theme-material .marker-vertex { + fill: #d0d8e8; + } + .joint-link.joint-theme-material .marker-vertex:hover { + fill: #5fa9ee; + stroke: none; + } + + .joint-link.joint-theme-material .marker-arrowhead { + fill: #d0d8e8; + } + .joint-link.joint-theme-material .marker-arrowhead:hover { + fill: #5fa9ee; + stroke: none; + } + + /* element used to remove a vertex */ + .joint-link.joint-theme-material .marker-vertex-remove-area { + fill: #5fa9ee; + } + .joint-link.joint-theme-material .marker-vertex-remove { + fill: white; + } + /* Links */ + + /* Links */ + .joint-link.joint-theme-modern .connection-wrap { + stroke: #000000; + stroke-width: 15; + stroke-linecap: round; + stroke-linejoin: round; + opacity: 0; + cursor: move; + } + .joint-link.joint-theme-modern .connection-wrap:hover { + opacity: .4; + stroke-opacity: .4; + } + .joint-link.joint-theme-modern .connection { + stroke-linejoin: round; + } + .joint-link.joint-theme-modern .link-tools .tool-remove circle { + fill: #FF0000; + } + .joint-link.joint-theme-modern .link-tools .tool-remove path { + fill: #FFFFFF; + } + + /* element inside .marker-vertex-group element */ + .joint-link.joint-theme-modern .marker-vertex { + fill: #1ABC9C; + } + .joint-link.joint-theme-modern .marker-vertex:hover { + fill: #34495E; + stroke: none; + } + + .joint-link.joint-theme-modern .marker-arrowhead { + fill: #1ABC9C; + } + .joint-link.joint-theme-modern .marker-arrowhead:hover { + fill: #F39C12; + stroke: none; + } + + /* element used to remove a vertex */ + .joint-link.joint-theme-modern .marker-vertex-remove { + fill: white; + } + /* Links */ + flo-view { + width:100%; + height:100%; + margin: 0; + background-color: #eeeeee; + font-family: "Varela Round",sans-serif; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + } + + .canvas { + border: 1px solid; + border-color: #6db33f; + border-radius: 2px; + margin-top: 3px; + } + + /* Canvas contains the palette on the left and the paper on the right */ + + .paper { + padding: 0px; + background-color: #ffffff; + /* height: 100%; + width: 100%; + position: relative; + overflow: hidden; + *//* margin-left: 400px; */ + } + + #sidebar-resizer { + background-color: #34302d; + position: absolute; + top: 0; + bottom: 0; + width: 6px; + cursor: e-resize; + } + + #palette-container { + background-color: #EEE; + position: absolute; + top: 0; + bottom: 0; + left: 0; + overflow: auto; + } + + #paper-container { + position: absolute; + top: 0; + bottom: 0; + right: 0; + overflow: auto; + color: #FFF; + background-color: #FFF; + } + + /* Tooltip START */ + + .node-tooltip .tooltip-description { + margin-top: 5px; + margin-left: 0px; + margin-bottom: 5px; + } + + .node-tooltip { + display:none; + position:absolute; + border:1px solid #333; + background-color:#34302d;/*#161616;*/ + border-radius:5px; + padding:5px; + color:#fff; + /* font-size:12px Arial;*/ + font-family: "Varela Round",sans-serif; + font-size: 19px; + z-index: 100; + } + + .tooltip-title-type { + font-size: 24px; + font-weight: bold; + } + + .tooltip-title-group { + padding-left: 5px; + font-size: 20px; + font-style: italic; + } + + .node-tooltip-option-name { + font-family: monospace;/*"Varela Round",sans-serif;*/ + font-size: 17px; + font-weight: bold; + padding-right: 20px; + + } + + .node-tooltip-option-description { + font-family: "Varela Round",sans-serif; + font-size: 18px; + } + + /* Tooltip END */ + + + /* Validation Error Marker on Canvas START */ + + .error-tooltip p { + margin-top: 5px; + margin-left: 0px; + margin-bottom: 5px; + color:#fff; + } + .error-tooltip { + display:none; + position:absolute; + border:1px solid #333; + background-color:red;/*#161616;*/ + border-radius:5px; + padding:5px; + color:#fff; + /* font-size:12px Arial;*/ + font-family: "Varela Round",sans-serif; + font-size: 20px; + z-index: 100; + } + + /* Validation Error Marker on Canvas END */ + + /* Controls on Canvas START */ + + .canvas-controls-container { + position: absolute; + right: 15px; + top: 5px; + } + + .canvas-control { + background: transparent; + font-family: "Varela Round",sans-serif; + font-size: 11px; + vertical-align: middle; + margin: 0px; + } + + .zoom-canvas-control { + border: 0px; + padding: 0px; + margin: 0px; + outline: none; + } + + .zoom-canvas-input { + text-align: right; + font-weight:bold; + color: black; + background-color: transparent; + } + + .zoom-canvas-label { + padding-right: 4px; + color: black; + } + + /* Controls on Canvas END */ + + + + + /* START - FLO CANVAS STYLES - override joint js styles */ + + .highlighted { + outline: none; + } + + .joint-element.highlighted rect { + stroke: #34302d; + stroke-width: 3; + } + + .joint-type-handle { + cursor: pointer; + } + + .available-magnet { + stroke-width: 3; + } + + .link { + fill: none; + stroke: #ccc; + stroke-width: 1.5px; + } + + .link-tools .tool-options { + display: none; /* by default, we don't display link options tool */ + } + + /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */ + .link-tools .tool-options circle { + fill: transparent; + stroke: transparent; + } + + .link-tools .tool-options path { + fill: black; + stroke: black; + } + + .link-tools .tool-remove circle { + fill: red; + stroke: red; + } + + .link-tools .tool-remove path { + fill: white; + stroke: white; + } + + .link-tools-container { + stroke-width: 0; + fill: transparent; + } + + /* END - FLO CANVAS STYLES */ + `], + encapsulation: ViewEncapsulation.None + }), + __metadata("design:paramtypes", [ElementRef]) +], EditorComponent); + +const $$5 = _$; +let ResizerDirective = class ResizerDirective { + constructor(element, document) { + this.element = element; + this.document = document; + this.dragInProgress = false; + this.vertical = true; + this._subscriptions = new CompositeDisposable(); + this.sizeChange = new EventEmitter(); + this.mouseMoveHandler = (e) => { + if (this.dragInProgress) { + this.mousemove(e); + } + }; + } + set splitSize(splitSize) { + if (this.maxSplitSize && splitSize > this.maxSplitSize) { + splitSize = this.maxSplitSize; + } + if (this.vertical) { + // Handle vertical resizer + $$5(this.element.nativeElement).css({ + left: splitSize + 'px' + }); + $$5(this.first).css({ + width: splitSize + 'px' + }); + $$5(this.second).css({ + left: (splitSize + this._size) + 'px' + }); + } + else { + // Handle horizontal resizer + $$5(this.element.nativeElement).css({ + bottom: splitSize + 'px' + }); + $$5(this.first).css({ + bottom: (splitSize + this._size) + 'px' + }); + $$5(this.second).css({ + height: splitSize + 'px' + }); + } + this._splitSize = splitSize; + // Update the local field + this.sizeChange.emit(splitSize); + } + set resizerWidth(width) { + this._size = width; + this.vertical = true; + } + set resizerHeight(height) { + this._size = height; + this.vertical = false; + } + set resizerLeft(first) { + this.first = first; + } + set resizerTop(first) { + this.first = first; + } + set resizerRight(second) { + this.second = second; + } + set resizerBottom(second) { + this.second = second; + } + startDrag() { + this.dragInProgress = true; + } + mousemove(event) { + let size; + if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node + size = event.pageX - $$5(this.first).offset().left; + } + else { + // Handle horizontal resizer Calculate new size relative to palette container DOM node + size = window.innerHeight - event.pageY - $$5(this.second).offset().top; + } + this.splitSize = size; + } + ngOnInit() { + // Need to set left and right elements width and fire events on init when DOM is built + this.splitSize = this._splitSize; + let subscription1 = fromEvent($$5(this.document).get(0), 'mousemove') + .pipe(sampleTime(300)) + .subscribe(this.mouseMoveHandler); + this._subscriptions.add(Disposable.create(() => subscription1.unsubscribe())); + let subscription2 = fromEvent($$5(this.document).get(0), 'mouseup') + .subscribe(e => { + if (this.dragInProgress) { + this.mousemove(e); + this.dragInProgress = false; + } + }); + this._subscriptions.add(Disposable.create(() => subscription2.unsubscribe())); + } + ngOnDestroy() { + this._subscriptions.dispose(); + } +}; +__decorate([ + Input(), + __metadata("design:type", Number) +], ResizerDirective.prototype, "maxSplitSize", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], ResizerDirective.prototype, "sizeChange", void 0); +__decorate([ + Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) +], ResizerDirective.prototype, "splitSize", null); +__decorate([ + Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) +], ResizerDirective.prototype, "resizerWidth", null); +__decorate([ + Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) +], ResizerDirective.prototype, "resizerHeight", null); +__decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) +], ResizerDirective.prototype, "resizerLeft", null); +__decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) +], ResizerDirective.prototype, "resizerTop", null); +__decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) +], ResizerDirective.prototype, "resizerRight", null); +__decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) +], ResizerDirective.prototype, "resizerBottom", null); +ResizerDirective = __decorate([ + Directive({ + selector: '[resizer]', + host: { '(mousedown)': 'startDrag()' } + }), + __param(1, Inject(DOCUMENT)), + __metadata("design:paramtypes", [ElementRef, Object]) +], ResizerDirective); + +const $$6 = _$; +let DslEditorComponent = class DslEditorComponent { + constructor(element) { + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.debounce = 0; + this.dslChange = new EventEmitter(); + this.focus = new EventEmitter(); + this.blur = new EventEmitter(); + this.editor = new EventEmitter(); + this._dslChangedHandler = () => { + this._dsl = this.doc.getValue(); + this.dslChange.emit(this._dsl); + }; + } + set dsl(dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + let cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + } + set lintOptions(lintOptions) { + this._lint = lintOptions; + if (this.doc) { + this.doc.setOption('lint', this._lint); + } + } + set hintOptions(hintOptions) { + this._hint = hintOptions; + if (this.doc) { + this.doc.setOption('hintOptions', this._hint); + } + } + ngOnInit() { + let options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + electricChars: false, + smartIndent: false, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + if (this._hint) { + options.hintOptions = this._hint; + } + this.doc = fromTextArea($$6('#dsl-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this.debounce ? debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); + this.doc.on('focus', () => this.focus.emit()); + this.doc.on('blur', () => this.blur.emit()); + this.editor.emit(this.doc); + } + ngOnDestroy() { + } +}; +__decorate([ + Input('line-numbers'), + __metadata("design:type", Object) +], DslEditorComponent.prototype, "lineNumbers", void 0); +__decorate([ + Input('line-wrapping'), + __metadata("design:type", Object) +], DslEditorComponent.prototype, "lineWrapping", void 0); +__decorate([ + Input('scrollbar-style'), + __metadata("design:type", String) +], DslEditorComponent.prototype, "scrollbarStyle", void 0); +__decorate([ + Input(), + __metadata("design:type", String) +], DslEditorComponent.prototype, "placeholder", void 0); +__decorate([ + Input(), + __metadata("design:type", Object) +], DslEditorComponent.prototype, "debounce", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], DslEditorComponent.prototype, "dslChange", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], DslEditorComponent.prototype, "focus", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], DslEditorComponent.prototype, "blur", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], DslEditorComponent.prototype, "editor", void 0); +__decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) +], DslEditorComponent.prototype, "dsl", null); +__decorate([ + Input(), + __metadata("design:type", Object), + __metadata("design:paramtypes", [Object]) +], DslEditorComponent.prototype, "lintOptions", null); +__decorate([ + Input(), + __metadata("design:type", Object), + __metadata("design:paramtypes", [Object]) +], DslEditorComponent.prototype, "hintOptions", null); +DslEditorComponent = __decorate([ + Component({ + selector: 'dsl-editor', + template: ` + + `, + styles: [` + .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */ + + .CodeMirror { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + height: 100%; + } + .CodeMirror-hint { + max-width: 38em; + } + .CodeMirror-vertical-ruler-error { + background-color: rgba(188, 0, 0, 0.5); + } + .CodeMirror-vertical-ruler-warning { + background-color: rgba(255, 188, 0, 0.5); + } + + + /* Code Mirror related styles END */ + `], + encapsulation: ViewEncapsulation.None + }), + __metadata("design:paramtypes", [ElementRef]) +], DslEditorComponent); + +var CodeEditorComponent_1; +const $$7 = _$; +let CodeEditorComponent = CodeEditorComponent_1 = class CodeEditorComponent { + constructor(element) { + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.dslChange = new EventEmitter(); + this.focus = new EventEmitter(); + this.blur = new EventEmitter(); + this.editor = new EventEmitter(); + this._dslChangedHandler = () => { + this._dsl = this.doc.getValue(); + this.dslChange.emit(this._dsl); + if (this._onChangeHandler) { + this._onChangeHandler(this._dsl); + } + }; + } + set dsl(dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + let cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + } + set language(_language) { + if (this._language !== _language) { + this._language = _language; + this.loadEditorMode(); + } + } + ngOnInit() { + let options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + matchBrackets: true, + autoCloseBrackets: true, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + this.doc = fromTextArea($$7('#code-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this._dslChangedHandler); + this.doc.on('focus', () => { + this.focus.emit(); + if (this._onTouchHandler) { + this._onTouchHandler(); + } + }); + this.doc.on('blur', () => this.blur.emit()); + this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); + this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); + this.loadEditorMode(); + this.editor.emit(this.doc); + } + loadEditorMode() { + // CodeMirror doc object must be initialized + if (!this.doc) { + return; + } + const info = this._language ? findModeByName(this._language) : undefined; + // Set proper editor mode + if (info) { + this.doc.setOption('mode', info.mime); + // (CodeMirror).autoLoadMode(this.doc, info.mode); + } + else { + this.doc.setOption('mode', 'text/plain'); + } + // Set proper Lint mode + this.doc.setOption('lint', this.getLintOptions()); + } + ngOnDestroy() { + } + writeValue(obj) { + this.dsl = obj; + } + registerOnChange(fn) { + this._onChangeHandler = fn; + } + registerOnTouched(fn) { + this._onTouchHandler = fn; + } + getLintOptions() { + switch (this._language) { + case 'javascript': + case 'json': + case 'coffeescript': + case 'yaml': + return { + onUpdateLinting: (annotations) => { + const warnings = []; + const errors = []; + if (this.overviewRuler) { + if (Array.isArray(annotations)) { + annotations.forEach((a) => { + if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { + if (a.severity === 'error') { + errors.push(a); + } + else if (a.severity === 'warning') { + warnings.push(a); + } + } + }); + } + } + this.warningRuler.update(warnings); + this.errorRuler.update(errors); + } + }; + } + return false; + } +}; +__decorate([ + Input('line-numbers'), + __metadata("design:type", Object) +], CodeEditorComponent.prototype, "lineNumbers", void 0); +__decorate([ + Input('line-wrapping'), + __metadata("design:type", Object) +], CodeEditorComponent.prototype, "lineWrapping", void 0); +__decorate([ + Input('scrollbar-style'), + __metadata("design:type", String) +], CodeEditorComponent.prototype, "scrollbarStyle", void 0); +__decorate([ + Input(), + __metadata("design:type", String) +], CodeEditorComponent.prototype, "placeholder", void 0); +__decorate([ + Input('overview-ruler'), + __metadata("design:type", Boolean) +], CodeEditorComponent.prototype, "overviewRuler", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], CodeEditorComponent.prototype, "dslChange", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], CodeEditorComponent.prototype, "focus", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], CodeEditorComponent.prototype, "blur", void 0); +__decorate([ + Output(), + __metadata("design:type", Object) +], CodeEditorComponent.prototype, "editor", void 0); +__decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) +], CodeEditorComponent.prototype, "dsl", null); +__decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) +], CodeEditorComponent.prototype, "language", null); +CodeEditorComponent = CodeEditorComponent_1 = __decorate([ + Component({ + selector: 'code-editor', + template: ` +
+ +
+ `, + styles: [` + .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + height: 100%; + } + .CodeMirror-hint { + max-width: 38em; + } + .CodeMirror-vertical-ruler-error { + background-color: rgba(188, 0, 0, 0.5); + } + .CodeMirror-vertical-ruler-warning { + background-color: rgba(255, 188, 0, 0.5); + } + .CodeMirror-lint-tooltip { + z-index: 2000; + } + `], + encapsulation: ViewEncapsulation.None, + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CodeEditorComponent_1), + multi: true + } + ] + }), + __metadata("design:paramtypes", [ElementRef]) +], CodeEditorComponent); + +var Properties; +(function (Properties) { + let InputType; + (function (InputType) { + InputType[InputType["TEXT"] = 0] = "TEXT"; + InputType[InputType["NUMBER"] = 1] = "NUMBER"; + InputType[InputType["SELECT"] = 2] = "SELECT"; + InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; + InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; + InputType[InputType["EMAIL"] = 5] = "EMAIL"; + InputType[InputType["URL"] = 6] = "URL"; + InputType[InputType["CODE"] = 7] = "CODE"; + })(InputType = Properties.InputType || (Properties.InputType = {})); + class GenericControlModel { + constructor(_property, type, validation) { + this._property = _property; + this.type = type; + this.validation = validation; + } + get id() { + return this.property.id; + } + get name() { + return this.property.name; + } + get description() { + return this.property.description; + } + get defaultValue() { + return this.property.defaultValue; + } + get value() { + return this.getValue(); + } + set value(value) { + this.setValue(value); + } + get property() { + return this._property; + } + setValue(value) { + this.property.value = value; + } + getValue() { + return this.property.value; + } + } + Properties.GenericControlModel = GenericControlModel; + class CheckBoxControlModel extends GenericControlModel { + constructor(_property, validation) { + super(_property, InputType.CHECKBOX, validation); + } + getValue() { + const res = super.getValue(); + const type = typeof res; + switch (type) { + case 'boolean': + return res; + case 'string': + switch (res.trim().toLowerCase()) { + case 'true': + case '1': + return true; + case 'false': + case '0': + return false; + default: + return this.property.defaultValue; + } + case 'number': + const num = res; + if (num === 0) { + return false; + } + else if (num === 1) { + return true; + } + else { + return this.property.defaultValue; + } + } + return this.property.defaultValue; + } + } + Properties.CheckBoxControlModel = CheckBoxControlModel; + class AbstractCodeControlModel extends GenericControlModel { + constructor(_property, encode, decode, validation) { + super(_property, InputType.CODE, validation); + this.encode = encode; + this.decode = decode; + } + set value(value) { + if (value && this.encode) { + super.setValue(this.encode(value)); + } + else { + super.setValue(value); + } + } + get value() { + let dsl = super.getValue(); + if (dsl && this.decode) { + return this.decode(dsl); + } + else { + return dsl; + } + } + } + Properties.AbstractCodeControlModel = AbstractCodeControlModel; + class GenericCodeControlModel extends AbstractCodeControlModel { + constructor(_property, language, encode, decode, validation) { + super(_property, encode, decode, validation); + this.language = language; + } + } + Properties.GenericCodeControlModel = GenericCodeControlModel; + class CodeControlModelWithDynamicLanguageProperty extends AbstractCodeControlModel { + constructor(_property, _languagePropertyName, _groupModel, encode, decode, validation) { + super(_property, encode, decode, validation); + this._languagePropertyName = _languagePropertyName; + this._groupModel = _groupModel; + } + get language() { + const value = this.languageControlModel.value; + return value ? value : this.languageControlModel.defaultValue; + } + get languageControlModel() { + if (!this._langControlModel) { + // Cast to Properties.ControlModel from Properties.ControlModel | undefined + // Should not be undefined! + this._langControlModel = this._groupModel.getControlsModels().find(c => c.id === this._languagePropertyName); + } + return this._langControlModel; + } + } + Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; + class GenericListControlModel extends GenericControlModel { + constructor(property, validation) { + super(property, InputType.TEXT, validation); + } + get value() { + return this.property.value ? this.property.value.join(', ') : ''; + } + set value(value) { + this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; + } + } + Properties.GenericListControlModel = GenericListControlModel; + class SelectControlModel extends GenericControlModel { + constructor(_property, type, options) { + super(_property, type); + this.options = options; + if (_property.defaultValue === undefined) { + options.unshift({ + name: 'SELECT', + value: _property.defaultValue + }); + } + } + } + Properties.SelectControlModel = SelectControlModel; + class DefaultCellPropertiesSource { + constructor(cell) { + this.cell = cell; + } + getProperties() { + let metadata = this.cell.attr('metadata'); + return Promise.resolve(metadata.properties().then(propsMetadata => Array.from(propsMetadata.values()).map(m => this.createProperty(m)))); + } + createProperty(metadata) { + return { + id: metadata.id, + name: metadata.name, + type: metadata.type, + defaultValue: metadata.defaultValue, + attr: `props/${metadata.name}`, + value: this.cell.attr(`props/${metadata.name}`), + description: metadata.description, + valueOptions: metadata.options + }; + } + applyChanges(properties) { + this.cell.trigger('batch:start', { batchName: 'update properties' }); + properties.forEach(property => { + if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || + (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { + let currentValue = this.cell.attr(property.attr); + if (currentValue !== undefined && currentValue !== null) { + // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync + this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); + this.cell.removeAttr(property.attr); + } + } + else { + this.cell.attr(property.attr, property.value); + } + }); + this.cell.trigger('batch:stop', { batchName: 'update properties' }); + } + } + Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; + class PropertiesGroupModel { + constructor(propertiesSource) { + this.loading = true; + this.propertiesSource = propertiesSource; + } + load() { + this.loading = true; + this._loadedSubject = new Subject(); + this.propertiesSource.getProperties().then(properties => { + this.controlModels = properties.map(p => this.createControlModel(p)); + this.loading = false; + this._loadedSubject.next(true); + this._loadedSubject.complete(); + }); + } + get isLoading() { + return this.loading; + } + get loadedSubject() { + return this._loadedSubject; + } + getControlsModels() { + return this.controlModels; + } + createControlModel(property) { + return new GenericControlModel(property, InputType.TEXT); + } + applyChanges() { + if (this.loading) { + return; + } + let properties = this.controlModels.map(cm => cm.property); + this.propertiesSource.applyChanges(properties); + } + } + Properties.PropertiesGroupModel = PropertiesGroupModel; + let Validators; + (function (Validators) { + function uniqueResource(service, debounce$$1) { + return (control) => { + return new Observable(obs => { + if (control.valueChanges && control.value) { + control.valueChanges + .pipe(debounceTime(debounce$$1), mergeMap(value => service(value))) + .subscribe(() => { + obs.next({ uniqueResource: true }); + obs.complete(); + }, () => { + obs.next(undefined); + obs.complete(); + }); + } + else { + obs.next(undefined); + obs.complete(); + } + }); + }; + } + Validators.uniqueResource = uniqueResource; + function noneOf(excluded) { + return (control) => { + return excluded.find(e => e === control.value) ? { 'noneOf': { value: control.value } } : {}; + }; + } + Validators.noneOf = noneOf; + })(Validators = Properties.Validators || (Properties.Validators = {})); +})(Properties || (Properties = {})); + +let PropertiesGroupComponent = class PropertiesGroupComponent { + ngOnInit() { + if (this.propertiesGroupModel.isLoading) { + let subscription = this.propertiesGroupModel.loadedSubject.subscribe(loaded => { + if (loaded) { + subscription.unsubscribe(); + this.createGroupControls(); + } + }); + } + else { + this.createGroupControls(); + } + } + createGroupControls() { + this.propertiesGroupModel.getControlsModels().forEach(c => { + if (c.validation) { + this.form.addControl(c.id, new FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); + } + else { + this.form.addControl(c.id, new FormControl(c.value || '')); + } + }); + } +}; +__decorate([ + Input(), + __metadata("design:type", Properties.PropertiesGroupModel) +], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); +__decorate([ + Input(), + __metadata("design:type", FormGroup) +], PropertiesGroupComponent.prototype, "form", void 0); +PropertiesGroupComponent = __decorate([ + Component({ + selector: 'properties-group', + template: ` +
+ +
+ `, + encapsulation: ViewEncapsulation.None + }) +], PropertiesGroupComponent); + +let DynamicFormPropertyComponent = class DynamicFormPropertyComponent { + constructor() { } + get types() { + return Properties.InputType; + } + get control() { + return this.form.controls[this.model.id]; + } + get errorData() { + return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) + .filter(e => this.control.errors && this.control.errors[e.id]); + } +}; +__decorate([ + Input(), + __metadata("design:type", Object) +], DynamicFormPropertyComponent.prototype, "model", void 0); +__decorate([ + Input(), + __metadata("design:type", FormGroup) +], DynamicFormPropertyComponent.prototype, "form", void 0); +DynamicFormPropertyComponent = __decorate([ + Component({ + selector: 'df-property', + template: ` + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+
+
{{model.description}}
+
{{e.message}}
+
+ + + + `, + encapsulation: ViewEncapsulation.None + }), + __metadata("design:paramtypes", []) +], DynamicFormPropertyComponent); + +let FloModule = class FloModule { +}; +FloModule = __decorate([ + NgModule({ + imports: [ + FormsModule, + CommonModule, + ReactiveFormsModule + ], + declarations: [ + Palette, + EditorComponent, + ResizerDirective, + DslEditorComponent, + CodeEditorComponent, + PropertiesGroupComponent, + DynamicFormPropertyComponent + ], + exports: [ + EditorComponent, + DslEditorComponent, + DynamicFormPropertyComponent, + PropertiesGroupComponent + ] + }) +], FloModule); + +/** + * Generated bundle index. Do not edit. + */ + +export { FloModule, Palette, EditorComponent, DslEditorComponent, CodeEditorComponent, PropertiesGroupComponent, DynamicFormPropertyComponent, ResizerDirective, Flo, Properties, Constants, Shapes }; +//# sourceMappingURL=spring-flo.js.map diff --git a/dist/fesm5/spring-flo.js b/dist/fesm5/spring-flo.js new file mode 100644 index 0000000..f5f72c0 --- /dev/null +++ b/dist/fesm5/spring-flo.js @@ -0,0 +1,3326 @@ +import * as _joint from 'jointjs'; +import * as _$ from 'jquery'; +import { isEqual, partial, debounce, cloneDeepWith, isObject, isPlainObject, template, isFunction, groupBy, each, isString, isNumber } from 'lodash'; +import { __decorate, __metadata, __param, __extends } from 'tslib'; +import { Component, ElementRef, Input, Output, EventEmitter, Inject, ViewEncapsulation, Directive, forwardRef, NgModule } from '@angular/core'; +import { Subject, BehaviorSubject, fromEvent, Observable } from 'rxjs'; +import { debounceTime, sampleTime, mergeMap } from 'rxjs/operators'; +import { DOCUMENT } from '@angular/platform-browser'; +import { CompositeDisposable, Disposable } from 'ts-disposables'; +import { fromTextArea, findModeByName } from 'codemirror-minified'; +import 'codemirror-minified/addon/lint/lint'; +import 'codemirror-minified/addon/hint/show-hint'; +import 'codemirror-minified/addon/display/placeholder'; +import 'codemirror-minified/addon/scroll/annotatescrollbar'; +import 'codemirror-minified/addon/scroll/simplescrollbars'; +import { NG_VALUE_ACCESSOR, FormGroup, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import 'codemirror-minified/mode/meta'; +import 'codemirror-minified/addon/edit/matchbrackets'; +import 'codemirror-minified/addon/edit/closebrackets'; +import 'codemirror-minified/addon/lint/javascript-lint'; +import 'codemirror-minified/addon/lint/coffeescript-lint'; +import 'codemirror-minified/addon/lint/json-lint'; +import 'codemirror-minified/addon/lint/yaml-lint'; +import 'codemirror-minified/mode/groovy/groovy'; +import 'codemirror-minified/mode/javascript/javascript'; +import 'codemirror-minified/mode/python/python'; +import 'codemirror-minified/mode/ruby/ruby'; +import 'codemirror-minified/mode/clike/clike'; +import 'codemirror-minified/mode/yaml/yaml'; +import 'codemirror-minified/mode/coffeescript/coffeescript'; +import { CommonModule } from '@angular/common'; + +var $ = _$; +var Flo; +(function (Flo) { + Flo.joint = _joint; + var DnDEventType; + (function (DnDEventType) { + DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; + DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; + })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); + var Severity; + (function (Severity) { + Severity[Severity["Error"] = 0] = "Error"; + Severity[Severity["Warning"] = 1] = "Warning"; + })(Severity = Flo.Severity || (Flo.Severity = {})); + function findMagnetByClass(view, className) { + if (className && className.startsWith('.')) { + className = className.substr(1); + } + var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0; }); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByClass = findMagnetByClass; + function findMagnetByPort(view, port) { + var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('port') === port; }); + if (element) { + return view.findMagnet($(element)); + } + } + Flo.findMagnetByPort = findMagnetByPort; + /** + * Return the metadata for a particular palette entry in a particular group. + * @param name - name of the palette entry + * @param group - group in which the palette entry should exist (e.g. sinks) + * @return + */ + function getMetadata(metamodel, name, group) { + var groupObj = metamodel && group ? metamodel.get(group) : undefined; + if (name && groupObj && groupObj.get(name)) { + return metamodel.get(group).get(name); + } + else { + return { + name: name, + group: group, + unresolved: true, + get: function (property) { return new Promise(function (resolve) { return resolve(); }); }, + properties: function () { return Promise.resolve(new Map()); } + }; + } + } + Flo.getMetadata = getMetadata; +})(Flo || (Flo = {})); + +var joint = Flo.joint; +var $$1 = _$; +var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); +var isFF = navigator.userAgent.indexOf('Firefox') > 0; +var IMAGE_W = 120; +var IMAGE_H = 35; +var ERROR_MARKER_SIZE = { width: 16, height: 16 }; +var HANDLE_SIZE = { width: 10, height: 10 }; +joint.shapes.flo = {}; +joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; +joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; +joint.shapes.flo.DECORATION_TYPE = 'decoration'; +joint.shapes.flo.HANDLE_TYPE = 'handle'; +var HANDLE_ICON_MAP = new Map(); +var REMOVE = 'remove'; +HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); +var DECORATION_ICON_MAP = new Map(); +var ERROR = 'error'; +DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); +joint.util.cloneDeep = function (obj) { + return cloneDeepWith(obj, function (o) { + if (isObject(o) && !isPlainObject(o)) { + return o; + } + }); +}; +joint.util.filter.redscale = function (args) { + var amount = Number.isFinite(args.amount) ? args.amount : 1; + return template('', { + a: 1 - 0.96 * amount, + b: 0.95 * amount, + c: 0.01 * amount, + d: 0.3 * amount, + e: 0.2 * amount, + f: 1 - 0.9 * amount, + g: 0.7 * amount, + h: 0.05 * amount, + i: 0.05 * amount, + k: 1 - 0.1 * amount + }); +}; +joint.util.filter.orangescale = function (args) { + var amount = Number.isFinite(args.amount) ? args.amount : 1; + return template('', { + a: 1.0 + 0.5 * amount, + b: 1.4 * amount, + c: 0.2 * amount, + d: 0.3 * amount, + e: 0.3 * amount, + f: 1 + 0.05 * amount, + g: 0.2 * amount, + h: 0.15 * amount, + i: 0.3 * amount, + k: 0.3 * amount, + l: 1 - 0.6 * amount + }); +}; +joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ + markup: '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.NODE_TYPE, + position: { x: 0, y: 0 }, + size: { width: IMAGE_W, height: IMAGE_H }, + attrs: { + '.': { magnet: false }, + // rounded edges around image + '.border': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + 'fill-opacity': 0, + stroke: '#eeeeee', + 'stroke-width': 0 + }, + '.box': { + width: IMAGE_W, + height: IMAGE_H, + rx: 3, + ry: 3, + //'fill-opacity': 0, // see through + stroke: '#6db33f', + fill: '#eeeeee', + 'stroke-width': 1 + }, + '.input-port': { + port: 'input', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.output-port': { + port: 'output', + height: 8, width: 8, + magnet: true, + fill: '#eeeeee', + transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', + stroke: '#34302d', + 'stroke-width': 1 + }, + '.label': { + 'text-anchor': 'middle', + 'ref-x': 0.5, + // 'ref-y': -12, // jointjs specific: relative position to ref'd element + 'ref-y': 0.3, + ref: '.border', + fill: 'black', + 'font-size': 14 + }, + '.label2': { + 'text': '\u21d2', + 'text-anchor': 'middle', + 'ref-x': 0.15, + 'ref-y': 0.2, + ref: '.border', + // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', + fill: 'black', + 'font-size': 24 + }, + '.shape': {}, + '.image': { + width: IMAGE_W, + height: IMAGE_H + } + } + }, joint.shapes.basic.Generic.prototype.defaults) +}); +joint.shapes.flo.Link = joint.dia.Link.extend({ + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.LINK_TYPE, + attrs: { + '.connection': { stroke: '#34302d', 'stroke-width': 2 }, + // Lots of alternatives that have been played with: + // '.smoooth': true + // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, + // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, + // '.connection': { 'stroke':'black'}, + // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, + // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, + // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) + // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, + // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, + // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, + // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, + '.marker-arrowheads': { display: 'none' }, + '.tool-options': { display: 'none' } + }, + }, joint.dia.Link.prototype.defaults) +}); +joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ + options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), + _beforeArrowheadMove: function () { + if (this.model.get('source').id) { + this._oldSource = this.model.get('source'); + } + if (this.model.get('target').id) { + this._oldTarget = this.model.get('target'); + } + joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); + }, + _afterArrowheadMove: function () { + joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); + if (!this.model.get('source').id) { + if (this._oldSource) { + this.model.set('source', this._oldSource); + } + else { + this.model.remove(); + } + } + if (!this.model.get('target').id) { + if (this._oldTarget) { + this.model.set('target', this._oldTarget); + } + else { + this.model.remove(); + } + } + delete this._oldSource; + delete this._oldTarget; + } +}); +// TODO: must do cleanup for the `mainElementView' +joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ + // canShowTooltip: true, + beingDragged: false, + // _tempZorder: 0, + _tempOpacity: 1.0, + _hovering: false, + dragLinkStart: function (evt, magnet, x, y) { + this.model.startBatch('add-link'); + var linkView = this.addLinkFromMagnet(magnet, x, y); + // backwards compatiblity events + joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); + linkView.notify('link:pointerdown', evt, x, y); + /*** START MAIN DIFF ***/ + var sourceOrTarget = $$1(magnet).attr('port') === 'input' ? 'source' : 'target'; + linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); + /*** END MAIN DIFF ***/ + this.eventData(evt, { linkView: linkView }); + }, + addLinkFromMagnet: function (magnet, x, y) { + var paper = this.paper; + var graph = paper.model; + var link = paper.getDefaultLink(this, magnet); + var sourceEnd, targetEnd; + /*** START MAIN DIFF ***/ + if ($$1(magnet).attr('port') === 'input') { + sourceEnd = { x: x, y: y }; + targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); + } + else { + sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); + targetEnd = { x: x, y: y }; + } + /*** END MAIN DIFF ***/ + link.set({ + source: sourceEnd, + target: targetEnd + }).addTo(graph, { + async: false, + ui: true + }); + return link.findView(paper); + }, + // pointerdown: function(evt: any, x: number, y: number) { + // // this.canShowTooltip = false; + // // this.hideTooltip(); + // this.beingDragged = false; + // this._tempOpacity = this.model.attr('./opacity'); + // + // this.model.trigger('batch:start'); + // + // if ( // target is a valid magnet start linking + // evt.target.getAttribute('magnet') && + // this.paper.options.validateMagnet.call(this.paper, this, evt.target) + // ) { + // let link = this.paper.getDefaultLink(this, evt.target); + // if ($(evt.target).attr('port') === 'input') { + // link.set({ + // source: { x: x, y: y }, + // target: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // } + // }); + // } else { + // link.set({ + // source: { + // id: this.model.id, + // selector: this.getSelector(evt.target), + // port: evt.target.getAttribute('port') + // }, + // target: { x: x, y: y } + // }); + // } + // this.paper.model.addCell(link); + // this._linkView = this.paper.findViewByModel(link); + // if ($(evt.target).attr('port') === 'input') { + // this._linkView.startArrowheadMove('source'); + // } else { + // this._linkView.startArrowheadMove('target'); + // } + // this.paper.__creatingLinkFromPort = true; + // } else { + // this._dx = x; + // this._dy = y; + // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); + // } + // }, + drag: function (evt, x, y) { + var interactive = isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : + this.options.interactive; + if (interactive !== false) { + this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DRAG, view: this, event: evt }); + } + joint.dia.ElementView.prototype.drag.apply(this, arguments); + }, + dragEnd: function (evt, x, y) { + this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DROP, view: this, event: evt }); + joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); + }, +}); +joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ + markup: '', + defaults: joint.util.deepSupplement({ + type: joint.shapes.flo.DECORATION_TYPE, + size: ERROR_MARKER_SIZE, + attrs: { + 'image': ERROR_MARKER_SIZE + } + }, joint.shapes.basic.Generic.prototype.defaults) +}); +var Constants; +(function (Constants) { + Constants.REMOVE_HANDLE_TYPE = REMOVE; + Constants.PROPERTIES_HANDLE_TYPE = 'properties'; + Constants.ERROR_DECORATION_KIND = ERROR; + Constants.PALETTE_CONTEXT = 'palette'; + Constants.CANVAS_CONTEXT = 'canvas'; + Constants.FEEDBACK_CONTEXT = 'feedback'; +})(Constants || (Constants = {})); +var Shapes; +(function (Shapes) { + var Factory = /** @class */ (function () { + function Factory() { + } + /** + * Create a JointJS node that embeds extra metadata (properties). + */ + Factory.createNode = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var metadata = params.metadata; + var position = params.position; + var props = params.props; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + var node; + if (!position) { + position = { x: 0, y: 0 }; + } + if (renderer && isFunction(renderer.createNode)) { + node = renderer.createNode(metadata, props); + } + else { + node = new joint.shapes.flo.Node(); + if (metadata) { + node.attr('.label/text', metadata.name); + } + } + node.set('type', joint.shapes.flo.NODE_TYPE); + if (position) { + node.set('position', position); + } + if (props) { + Array.from(props.keys()).forEach(function (key) { return node.attr("props/" + key, props.get(key)); }); + } + node.attr('metadata', metadata); + if (graph) { + graph.addCell(node); + } + if (renderer && isFunction(renderer.initializeNewNode)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewNode(node, descriptor); + } + return node; + }; + Factory.createLink = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var metadata = params.metadata; + var source = params.source; + var target = params.target; + var props = params.props; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + var link; + if (renderer && isFunction(renderer.createLink)) { + link = renderer.createLink(source, target, metadata, props); + } + else { + link = new joint.shapes.flo.Link(); + } + if (source) { + link.set('source', source); + } + if (target) { + link.set('target', target); + } + link.set('type', joint.shapes.flo.LINK_TYPE); + if (metadata) { + link.attr('metadata', metadata); + } + if (props) { + Array.from(props.keys()).forEach(function (key) { return link.attr("props/" + key, props.get(key)); }); + } + if (graph) { + graph.addCell(link); + } + if (renderer && isFunction(renderer.initializeNewLink)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewLink(link, descriptor); + } + // prevent creation of link breaks + link.attr('.marker-vertices/display', 'none'); + return link; + }; + Factory.createDecoration = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var parent = params.parent; + var kind = params.kind; + var messages = params.messages; + var location = params.position; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + if (!location) { + location = { x: 0, y: 0 }; + } + var decoration; + if (renderer && isFunction(renderer.createDecoration)) { + decoration = renderer.createDecoration(kind, parent); + } + else { + decoration = new joint.shapes.flo.ErrorDecoration({ + attrs: { + image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, + } + }); + } + decoration.set('type', joint.shapes.flo.DECORATION_TYPE); + decoration.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + decoration.set('z', parent.get('z') + 1); + } + decoration.attr('./kind', kind); + decoration.attr('messages', messages); + if (graph) { + graph.addCell(decoration); + } + parent.embed(decoration); + if (renderer && isFunction(renderer.initializeNewDecoration)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewDecoration(decoration, descriptor); + } + return decoration; + }; + Factory.createHandle = function (params) { + var renderer = params.renderer; + var paper = params.paper; + var parent = params.parent; + var kind = params.kind; + var location = params.position; + var graph = params.graph || (params.paper ? params.paper.model : undefined); + var handle; + if (!location) { + location = { x: 0, y: 0 }; + } + if (renderer && isFunction(renderer.createHandle)) { + handle = renderer.createHandle(kind, parent); + } + else { + handle = new joint.shapes.flo.ErrorDecoration({ + size: HANDLE_SIZE, + attrs: { + 'image': { + 'xlink:href': HANDLE_ICON_MAP.get(kind) + } + } + }); + } + handle.set('type', joint.shapes.flo.HANDLE_TYPE); + handle.set('position', location); + if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { + handle.set('z', parent.get('z') + 1); + } + handle.attr('./kind', kind); + if (graph) { + graph.addCell(handle); + } + parent.embed(handle); + if (renderer && isFunction(renderer.initializeNewHandle)) { + var descriptor = { + paper: paper, + graph: graph + }; + renderer.initializeNewHandle(handle, descriptor); + } + return handle; + }; + return Factory; + }()); + Shapes.Factory = Factory; +})(Shapes || (Shapes = {})); + +var joint$1 = Flo.joint; +var $$2 = _$; +var DEBOUNCE_TIME = 300; +joint$1.shapes.flo.PaletteGroupHeader = joint$1.shapes.basic.Generic.extend({ + // The path is the open/close arrow, defaults to vertical (open) + markup: '', + defaults: joint$1.util.deepSupplement({ + type: 'palette.groupheader', + size: { width: 170, height: 30 }, + position: { x: 0, y: 0 }, + attrs: { + 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, + 'text': { + text: '', + fill: '#eeeeee', + 'ref-x': 0.5, + 'ref-y': 7, + 'x-alignment': 'middle', + 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ + }, + 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } + }, + // custom properties + isOpen: true + }, joint$1.shapes.basic.Generic.prototype.defaults) +}); +var Palette = /** @class */ (function () { + function Palette(element, document) { + var _this = this; + this.element = element; + this.document = document; + this._metamodelListener = { + metadataError: function (data) { }, + metadataAboutToChange: function () { }, + metadataChanged: function () { return _this.rebuildPalette(); } + }; + this.initialized = false; + this._filterText = ''; + this.filterTextModel = new Subject(); + this.paletteEntryPadding = { width: 12, height: 12 }; + this.onPaletteEntryDrop = new EventEmitter(); + this.paletteReady = new EventEmitter(); + this.paletteFocus = new EventEmitter(); + this.mouseMoveHanlder = function (e) { return _this.handleDrag(e); }; + this.mouseUpHanlder = function (e) { return _this.handleMouseUp(e); }; + this.paletteGraph = new joint$1.dia.Graph(); + this.paletteGraph.set('type', Constants.PALETTE_CONTEXT); + this._filterText = ''; + this.closedGroups = new Set(); + } + Object.defineProperty(Palette.prototype, "paletteSize", { + set: function (size) { + console.debug('Palette Size: ' + size); + if (this._paletteSize !== size) { + this._paletteSize = size; + this.rebuildPalette(); + } + }, + enumerable: true, + configurable: true + }); + Palette.prototype.onFocus = function () { + this.paletteFocus.emit(); + }; + Palette.prototype.ngOnInit = function () { + var _this = this; + var element = $$2('#palette-paper', this.element.nativeElement); + // Create the paper for the palette using the specified element view + this.palette = new joint$1.dia.Paper({ + el: element, + gridSize: 1, + model: this.paletteGraph, + height: $$2(this.element.nativeElement.parentNode).height(), + width: $$2(this.element.nativeElement.parentNode).width(), + elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView), + interactive: false + }); + this.palette.on('cell:pointerup', function (cellview, evt) { + if (_this.viewBeingDragged) { + _this.trigger({ + type: Flo.DnDEventType.DROP, + view: _this.viewBeingDragged, + event: evt + }); + _this.viewBeingDragged = undefined; + } + _this.clickedElement = undefined; + $$2('#palette-floater').remove(); + if (_this.floaterpaper) { + _this.floaterpaper.remove(); + } + }); + // Toggle the header open/closed on a click + this.palette.on('cell:pointerclick', function (cellview, event) { + // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? + // Click position within the element would be: evt.offsetX, evt.offsetY + var cell = cellview.model; + if (cell.attributes.header) { + // Toggle the header open/closed + if (cell.get('isOpen')) { + _this.rotateClosed(cell); + } + else { + _this.rotateOpen(cell); + } + } + // TODO [palette] ensure other mouse handling events do nothing for headers + // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) + }); + $$2(this.document).on('mouseup', this.mouseUpHanlder); + if (this.metamodel) { + this.metamodel.load().then(function (data) { + _this.buildPalette(data); + // Add listener to metamodel + if (_this.metamodel && _this.metamodel.subscribe) { + _this.metamodel.subscribe(_this._metamodelListener); + } + // Add debounced listener to filter text changes + _this.filterTextModel + .pipe(debounceTime(DEBOUNCE_TIME)) + .subscribe(function (value) { return _this.rebuildPalette(); }); + _this.initialized = true; + }); + } + else { + console.error('No Metamodel service specified for palette!'); + } + this._paletteSize = this._paletteSize || $$2(this.element.nativeElement.parentNode).width(); + }; + Palette.prototype.ngOnDestroy = function () { + if (this.metamodel && this.metamodel.unsubscribe) { + this.metamodel.unsubscribe(this._metamodelListener); + } + $$2(this.document).off('mouseup', this.mouseUpHanlder); + this.palette.remove(); + }; + Palette.prototype.ngOnChanges = function (changes) { + // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { + // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); + // } + }; + Palette.prototype.createPaletteGroup = function (title, isOpen) { + var newGroupHeader = new joint$1.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); + newGroupHeader.set('header', title); + if (!isOpen) { + newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); + newGroupHeader.set('isOpen', false); + } + this.paletteGraph.addCell(newGroupHeader); + return newGroupHeader; + }; + Palette.prototype.createPaletteEntry = function (title, metadata) { + return Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.palette, + metadata: metadata + }); + }; + Palette.prototype.buildPalette = function (metamodel) { + var _this = this; + var startTime = new Date().getTime(); + this.paletteReady.emit(false); + this.paletteGraph.clear(); + var filterText = this.filterText; + if (filterText) { + filterText = filterText.toLowerCase(); + } + var paletteNodes = []; + var groupAdded = new Set(); + var parentWidth = this._paletteSize; + console.debug("Parent Width: " + parentWidth); + // The field closedGroups tells us which should not be shown + // Work out the list of active groups/nodes based on the filter text + this.metamodel.groups().forEach(function (group) { + if (metamodel && metamodel.has(group)) { + Array.from(metamodel.get(group).keys()).sort().forEach(function (name) { + var node = metamodel.get(group).get(name); + if (node) { + var nodeActive = !(node.metadata && node.metadata.noPaletteEntry); + if (nodeActive && filterText) { + nodeActive = false; + if (name.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + else if (group.toLowerCase().indexOf(filterText) !== -1) { + nodeActive = true; + } + // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { + // nodeActive = true; + // } + // else if (node.properties) { + // Object.keys(node.properties).sort().forEach(function(propertyName) { + // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || + // (node.properties[propertyName].description && + // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { + // nodeActive=true; + // } + // }); + // } + } + if (nodeActive) { + if (!groupAdded.has(group)) { + var header = _this.createPaletteGroup(group, !_this.closedGroups.has(group)); + header.set('size', { width: parentWidth, height: 30 }); + paletteNodes.push(header); + groupAdded.add(group); + } + if (!_this.closedGroups.has(group)) { + paletteNodes.push(_this.createPaletteEntry(name, node)); + } + } + } + }); + } + }); + var cellWidth = 0, cellHeight = 0; + // Determine the size of the palette entry cell (width and height) + paletteNodes.forEach(function (pnode) { + if (pnode.attr('metadata/name')) { + var dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (cellWidth < dimension.width) { + cellWidth = dimension.width; + } + if (cellHeight < dimension.height) { + cellHeight = dimension.height; + } + } + }); + // Adjust the palette entry cell size with paddings. + cellWidth += 2 * this.paletteEntryPadding.width; + cellHeight += 2 * this.paletteEntryPadding.height; + // Align palette entries row to be at the center + var startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; + var xpos = startX; + var ypos = 0; + var prevNode; + // Layout palette entry nodes + paletteNodes.forEach(function (pnode) { + var dimension = { + width: pnode.get('size').width, + height: pnode.get('size').height + }; + if (pnode.get('header')) { //attributes.attrs.header) { + // Palette entry header + xpos = startX; + pnode.set('position', { x: 0, y: ypos }); + ypos += dimension.height + 5; + } + else { + // Palette entry element + if (xpos + cellWidth > parentWidth) { + // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line + xpos = startX; + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + else { + // Enough real estate to place entry in a row - adjust y position + if (prevNode && prevNode.attr('metadata/name')) { + ypos -= cellHeight; + } + pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); + } + // increment x position and y position (can be reorganized) + xpos += cellWidth; + ypos += cellHeight; + } + prevNode = pnode; + }); + this.palette.setDimensions(parentWidth, ypos); + this.paletteReady.emit(true); + console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); + }; + Palette.prototype.rebuildPalette = function () { + var _this = this; + if (this.initialized && this.metamodel) { + this.metamodel.load().then(function (metamodel) { return _this.buildPalette(metamodel); }); + } + }; + Object.defineProperty(Palette.prototype, "filterText", { + get: function () { + return this._filterText; + }, + set: function (text) { + if (this._filterText !== text) { + this._filterText = text; + this.filterTextModel.next(text); + } + }, + enumerable: true, + configurable: true + }); + Palette.prototype.getPaletteView = function (view) { + var self = this; + return view.extend({ + pointerdown: function ( /*evt, x, y*/) { + // Remove the tooltip + // $('.node-tooltip').remove(); + // TODO move metadata to the right place (not inside attrs I think) + self.clickedElement = this.model; + if (self.clickedElement && self.clickedElement.attr('metadata')) { + $$2(self.document).on('mousemove', self.mouseMoveHanlder); + } + }, + pointermove: function ( /*evt, x, y*/) { + // Nothing to prevent move within the palette canvas + }, + }); + }; + Palette.prototype.handleMouseUp = function (event) { + $$2(this.document).off('mousemove', this.mouseMoveHanlder); + }; + Palette.prototype.trigger = function (event) { + this.onPaletteEntryDrop.emit(event); + }; + Palette.prototype.handleDrag = function (event) { + // TODO offsetX/Y not on firefox + // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); + // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); + if (this.clickedElement && this.clickedElement.attr('metadata')) { + if (!this.viewBeingDragged) { + var dataOfClickedElement = this.clickedElement.attr('metadata'); + // custom div if not already built. + $$2('
', { + id: 'palette-floater' + }).appendTo($$2('body')); + var floatergraph = new joint$1.dia.Graph(); + floatergraph.set('type', Constants.FEEDBACK_CONTEXT); + var parent_1 = $$2('#palette-floater'); + this.floaterpaper = new joint$1.dia.Paper({ + el: $$2('#palette-floater'), + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView, + gridSize: 10, + model: floatergraph, + height: parent_1.height(), + width: parent_1.width(), + validateMagnet: function () { return false; }, + validateConnection: function () { return false; } + }); + // TODO float thing needs to be bigger otherwise icon label is missing + // Initiative drag and drop - create draggable element + var floaternode = Shapes.Factory.createNode({ + 'renderer': this.renderer, + 'paper': this.floaterpaper, + 'graph': floatergraph, + 'metadata': dataOfClickedElement + }); + // Only node view expected + var box = this.floaterpaper.findViewByModel(floaternode).getBBox(); + var size = floaternode.get('size'); + // Account for node real size including ports + floaternode.translate(box.width - size.width, box.height - size.height); + this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); + $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + } + else { + $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); + this.trigger({ + type: Flo.DnDEventType.DRAG, + view: this.viewBeingDragged, + event: event + }); + } + } + }; + /* + * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) + */ + Palette.prototype.rotateOpen = function (element) { + var _this = this; + setTimeout(function () { return _this.doRotateOpen(element, 90); }); + }; + Palette.prototype.doRotateOpen = function (element, angle) { + var _this = this; + angle -= 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle <= 0) { + element.set('isOpen', true); + this.closedGroups.delete(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(function () { return _this.doRotateOpen(element, angle); }, 10); + } + }; + Palette.prototype.doRotateClose = function (element, angle) { + var _this = this; + angle += 10; + element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); + if (angle >= 90) { + element.set('isOpen', false); + this.closedGroups.add(element.get('header')); + this.rebuildPalette(); + } + else { + setTimeout(function () { return _this.doRotateClose(element, angle); }, 10); + } + }; + // TODO better name for this function as this does the animation *and* updates the palette + /* + * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) + */ + Palette.prototype.rotateClosed = function (element) { + var _this = this; + setTimeout(function () { return _this.doRotateClose(element, 0); }); + }; + __decorate([ + Input(), + __metadata("design:type", Object) + ], Palette.prototype, "metamodel", void 0); + __decorate([ + Input(), + __metadata("design:type", Object) + ], Palette.prototype, "renderer", void 0); + __decorate([ + Input(), + __metadata("design:type", Object) + ], Palette.prototype, "paletteEntryPadding", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], Palette.prototype, "onPaletteEntryDrop", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], Palette.prototype, "paletteReady", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], Palette.prototype, "paletteFocus", void 0); + __decorate([ + Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) + ], Palette.prototype, "paletteSize", null); + Palette = __decorate([ + Component({ + selector: 'flo-palette', + template: "\n
\n \n
\n
\n
\n
\n ", + styles: ["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "], + encapsulation: ViewEncapsulation.None + }), + __param(1, Inject(DOCUMENT)), + __metadata("design:paramtypes", [ElementRef, Object]) + ], Palette); + return Palette; +}()); + +var joint$2 = Flo.joint; +var $$3 = _$; +var Utils = /** @class */ (function () { + function Utils() { + } + Utils.fanRoute = function (graph, cell) { + if (cell instanceof joint$2.dia.Element) { + var links = graph.getConnectedLinks(cell); + var groupsOfOverlappingLinks = groupBy(links, function (link) { + // the key of the group is the model id of the link's source or target, but not our cell id. + var sourceId = link.get('source').id; + var targetId = link.get('target').id; + return cell.id !== sourceId ? sourceId : targetId; + }); + each(groupsOfOverlappingLinks, function (group, key) { + // If the member of the group has both source and target model adjust vertices. + var toRoute = {}; + if (key !== undefined) { + group.forEach(function (link) { + if (link.get('source').id === cell.get('id') && link.get('target').id) { + toRoute[link.get('target').id] = link; + } + else if (link.get('target').id === cell.get('id') && link.get('source').id) { + toRoute[link.get('source').id] = link; + } + }); + Object.keys(toRoute).forEach(function (k) { + Utils.fanRoute(graph, toRoute[k]); + }); + } + }); + } + else if (cell instanceof joint$2.dia.Link) { + // The cell is a link. Let's find its source and target models. + var srcId_1 = cell.get('source').id || cell.previous('source').id; + var trgId_1 = cell.get('target').id || cell.previous('target').id; + // If one of the ends is not a model, the link has no siblings. + if (!srcId_1 || !trgId_1) { + return; + } + var siblings = graph.getLinks().filter(function (sibling) { + var _srcId = sibling.get('source').id; + var _trgId = sibling.get('target').id; + var vertices = sibling.get('vertices'); + var fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); + return ((_srcId === srcId_1 && _trgId === trgId_1) || (_srcId === trgId_1 && _trgId === srcId_1)) && fanRouted; + }); + switch (siblings.length) { + case 0: + // The link was removed and had no siblings. + break; + case 1: + // There is only one link between the source and target. No vertices needed. + var vertices = cell.get('vertices'); + if (vertices && vertices.length && cell.get('fanRouted')) { + cell.unset('vertices'); + } + break; + default: + // There is more than one siblings. We need to create vertices. + // First of all we'll find the middle point of the link. + var source = graph.getCell(srcId_1); + var target = graph.getCell(trgId_1); + if (!source || !target) { + // When clearing the graph it may happen that some nodes are gone and some are left + return; + } + var srcCenter = source.getBBox().center(); + var trgCenter = target.getBBox().center(); + var midPoint_1 = joint$2.g.line(srcCenter, trgCenter).midpoint(); + // Then find the angle it forms. + var theta_1 = srcCenter.theta(trgCenter); + // This is the maximum distance between links + var gap_1 = 20; + siblings.forEach(function (sibling, index) { + // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. + var offset = gap_1 * Math.ceil(index / 2); + // Now we need the vertices to be placed at points which are 'offset' pixels distant + // from the first link and forms a perpendicular angle to it. And as index goes up + // alternate left and right. + // + // ^ odd indexes + // | + // |----> index 0 line (straight line between a source center and a target center. + // | + // v even indexes + var sign = index % 2 ? 1 : -1; + var angle = joint$2.g.toRad(theta_1 + sign * 90); + // We found the vertex. + var vertex = joint$2.g.point.fromPolar(offset, angle, midPoint_1); + sibling.set('fanRouted', true); + sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); + }); + } + } + }; + Utils.isCustomPaperEvent = function (args) { + return args.length === 5 && + isString(args[0]) && + (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && + args[1] instanceof $$3.Event && + args[2] instanceof joint$2.dia.CellView && + isNumber(args[3]) && + isNumber(args[4]); + }; + return Utils; +}()); + +var joint$3 = Flo.joint; +var $$4 = _$; +var SCROLLBAR_SIZE = 17; +var EditorComponent = /** @class */ (function () { + function EditorComponent(element) { + var _this = this; + this.element = element; + /** + * Flag specifying whether the Flo-Editor is in read-only mode. + */ + this._readOnlyCanvas = false; + /** + * Grid size + */ + this._gridSize = 1; + this._hiddenPalette = false; + this.textToGraphEventEmitter = new EventEmitter(); + this.graphToTextEventEmitter = new EventEmitter(); + this._graphToTextSyncEnabled = true; + this.validationEventEmitter = new EventEmitter(); + this._disposables = new CompositeDisposable(); + this._dslText = ''; + this.textToGraphConversionCompleted = new Subject(); + this.graphToTextConversionCompleted = new Subject(); + this.paletteReady = new BehaviorSubject(false); + /** + * Min zoom percent value + */ + this.minZoom = 5; + /** + * Max zoom percent value + */ + this.maxZoom = 400; + /** + * Zoom percent increment/decrement step + */ + this.zoomStep = 5; + this.paperPadding = 0; + this.floApi = new EventEmitter(); + this.validationMarkers = new EventEmitter(); + this.contentValidated = new EventEmitter(); + this.dslChange = new EventEmitter(); + this._resizeHandler = function () { return _this.autosizePaper(); }; + var self = this; + this.editorContext = new (/** @class */ (function () { + function DefaultRunnableContext() { + } + Object.defineProperty(DefaultRunnableContext.prototype, "zoomPercent", { + get: function () { + return self.zoomPercent; + }, + set: function (percent) { + self.zoomPercent = percent; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "noPalette", { + get: function () { + return self.noPalette; + }, + set: function (noPalette) { + self.noPalette = noPalette; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "gridSize", { + get: function () { + return self.gridSize; + }, + set: function (gridSize) { + self.gridSize = gridSize; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "readOnlyCanvas", { + get: function () { + return self.readOnlyCanvas; + }, + set: function (readOnly) { + self.readOnlyCanvas = readOnly; + }, + enumerable: true, + configurable: true + }); + DefaultRunnableContext.prototype.setDsl = function (dsl) { + self.dsl = dsl; + }; + DefaultRunnableContext.prototype.updateGraph = function () { + return self.updateGraphRepresentation(); + }; + DefaultRunnableContext.prototype.updateText = function () { + return self.updateTextRepresentation(); + }; + DefaultRunnableContext.prototype.performLayout = function () { + return self.doLayout(); + }; + DefaultRunnableContext.prototype.clearGraph = function () { + var _this = this; + self.selection = undefined; + self.graph.clear(); + if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { + return self.metamodel.load().then(function (data) { + self.editor.setDefaultContent(_this, data); + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + }); + } + else { + if (!self.graphToTextSync) { + return self.updateTextRepresentation(); + } + } + }; + DefaultRunnableContext.prototype.getGraph = function () { + return self.graph; + }; + DefaultRunnableContext.prototype.getPaper = function () { + return self.paper; + }; + Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextSync", { + get: function () { + return self.graphToTextSync; + }, + set: function (sync) { + self.graphToTextSync = sync; + }, + enumerable: true, + configurable: true + }); + DefaultRunnableContext.prototype.getMinZoom = function () { + return self.minZoom; + }; + DefaultRunnableContext.prototype.getMaxZoom = function () { + return self.maxZoom; + }; + DefaultRunnableContext.prototype.getZoomStep = function () { + return self.zoomStep; + }; + DefaultRunnableContext.prototype.fitToPage = function () { + self.fitToPage(); + }; + DefaultRunnableContext.prototype.createNode = function (metadata, props, position) { + return self.createNode(metadata, props, position); + }; + DefaultRunnableContext.prototype.createLink = function (source, target, metadata, props) { + return self.createLink(source, target, metadata, props); + }; + Object.defineProperty(DefaultRunnableContext.prototype, "selection", { + get: function () { + return self.selection; + }, + set: function (newSelection) { + self.selection = newSelection; + }, + enumerable: true, + configurable: true + }); + DefaultRunnableContext.prototype.deleteSelectedNode = function () { + if (self.selection) { + if (self.editor && self.editor.preDelete) { + self.editor.preDelete(self.editorContext, self.selection.model); + } + else { + if (self.selection.model instanceof joint$3.dia.Element) { + self.graph.getConnectedLinks(self.selection.model).forEach(function (l) { return l.remove(); }); + } + } + self.selection.model.remove(); + self.selection = undefined; + } + }; + Object.defineProperty(DefaultRunnableContext.prototype, "textToGraphConversionObservable", { + get: function () { + return self.textToGraphConversionCompleted; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextConversionObservable", { + get: function () { + return self.graphToTextConversionCompleted; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DefaultRunnableContext.prototype, "paletteReady", { + get: function () { + return self.paletteReady; + }, + enumerable: true, + configurable: true + }); + return DefaultRunnableContext; + }()))(); + } + EditorComponent.prototype.ngOnInit = function () { + var _this = this; + this.initGraph(); + this.initPaper(); + this.initGraphListeners(); + this.initPaperListeners(); + this.initMetamodel(); + $$4(window).on('resize', this._resizeHandler); + this._disposables.add(Disposable.create(function () { return $$4(window).off('resize', _this._resizeHandler); })); + /* + * Execute resize to get the right size for the SVG element on the editor canvas. + * Executed via timeout to let angular render the DOM first and elements to have the right width and height + */ + window.setTimeout(this._resizeHandler); + this.floApi.emit(this.editorContext); + }; + EditorComponent.prototype.ngOnDestroy = function () { + this._disposables.dispose(); + }; + Object.defineProperty(EditorComponent.prototype, "noPalette", { + get: function () { + return this._hiddenPalette; + }, + set: function (hidden) { + this._hiddenPalette = hidden; + // If palette is not shown ensure that canvas starts from the left==0! + if (hidden) { + $$4('#paper-container', this.element.nativeElement).css('left', 0); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EditorComponent.prototype, "graphToTextSync", { + get: function () { + return this._graphToTextSyncEnabled; + }, + set: function (sync) { + this._graphToTextSyncEnabled = sync; + // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion + // this.performGraphToTextSyncing(); + }, + enumerable: true, + configurable: true + }); + EditorComponent.prototype.performGraphToTextSyncing = function () { + if (this._graphToTextSyncEnabled) { + this.graphToTextEventEmitter.emit(); + } + }; + EditorComponent.prototype.createHandle = function (element, kind, action, location) { + if (!location) { + var bbox = element.model.getBBox(); + location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); + } + var handle = Shapes.Factory.createHandle({ + renderer: this.renderer, + paper: this.paper, + parent: element.model, + kind: kind, + position: location + }); + var view = this.paper.findViewByModel(handle); + view.on('cell:pointerdown', function () { + if (action) { + action(); + } + }); + view.on('cell:mouseover', function () { + handle.attr('image/filter', { + name: 'dropShadow', + args: { dx: 1, dy: 1, blur: 1, color: 'black' } + }); + }); + view.on('cell:mouseout', function () { + handle.removeAttr('image/filter'); + }); + view.setInteractivity(false); + return handle; + }; + EditorComponent.prototype.removeEmbeddedChildrenOfType = function (element, types) { + var embeds = element.getEmbeddedCells(); + for (var i = 0; i < embeds.length; i++) { + if (types.indexOf(embeds[i].get('type')) >= 0) { + embeds[i].remove(); + } + } + }; + Object.defineProperty(EditorComponent.prototype, "selection", { + get: function () { + return this._selection; + }, + set: function (newSelection) { + var _this = this; + if (newSelection && (newSelection.model.get('type') === joint$3.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint$3.shapes.flo.HANDLE_TYPE)) { + newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); + } + if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { + newSelection = undefined; + } + if (newSelection !== this._selection) { + if (this._selection) { + var elementview = this.paper.findViewByModel(this._selection.model); + if (elementview) { // May have been removed from the graph + this.removeEmbeddedChildrenOfType(elementview.model, joint$3.shapes.flo.HANDLE_TYPE); + elementview.unhighlight(); + } + } + if (newSelection) { + newSelection.highlight(); + if (this.editor && this.editor.createHandles) { + this.editor.createHandles(this.editorContext, function (owner, kind, action, location) { return _this.createHandle(owner, kind, action, location); }, newSelection); + } + } + this._selection = newSelection; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EditorComponent.prototype, "readOnlyCanvas", { + get: function () { + return this._readOnlyCanvas; + }, + set: function (value) { + var _this = this; + if (this._readOnlyCanvas === value) { + // Nothing to do + return; + } + if (value) { + this.selection = undefined; + } + if (this.graph) { + this.graph.getLinks().forEach(function (link) { + if (value) { + link.attr('.link-tools/display', 'none'); + link.attr('.marker-vertices/display', 'none'); + link.attr('.connection-wrap/display', 'none'); + } + else { + link.removeAttr('.link-tools/display'); + if (_this.editor && _this.editor.allowLinkVertexEdit) { + link.removeAttr('.marker-vertices/display'); + } + link.removeAttr('.connection-wrap/display'); + } + }); + } + this._readOnlyCanvas = value; + }, + enumerable: true, + configurable: true + }); + /** + * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + EditorComponent.prototype.showDragFeedback = function (dragDescriptor) { + if (this.editor && this.editor.showDragFeedback) { + this.editor.showDragFeedback(this.editorContext, dragDescriptor); + } + else { + var magnet = void 0; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint$3.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint$3.V(magnet).addClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint$3.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint$3.V(magnet).addClass('dnd-target-feedback'); + } + } + } + } + }; + /** + * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + EditorComponent.prototype.hideDragFeedback = function (dragDescriptor) { + if (this.editor && this.editor.hideDragFeedback) { + this.editor.hideDragFeedback(this.editorContext, dragDescriptor); + } + else { + var magnet = void 0; + if (dragDescriptor.source && dragDescriptor.source.view) { + joint$3.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); + if (dragDescriptor.source.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); + if (magnet) { + joint$3.V(magnet).removeClass('dnd-source-feedback'); + } + } + } + if (dragDescriptor.target && dragDescriptor.target.view) { + joint$3.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); + if (dragDescriptor.target.cssClassSelector) { + magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); + if (magnet) { + joint$3.V(magnet).removeClass('dnd-target-feedback'); + } + } + } + } + }; + /** + * Sets the new DnD info object - the descriptor for DnD + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + EditorComponent.prototype.setDragDescriptor = function (dragDescriptor) { + if (this.highlighted === dragDescriptor) { + return; + } + if (this.highlighted && dragDescriptor && isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { + if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { + return; + } + if (this.highlighted.source && + dragDescriptor.source && + this.highlighted.target && + dragDescriptor.target && + this.highlighted.source.view.model === dragDescriptor.source.view.model && + this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && + this.highlighted.target.view.model === dragDescriptor.target.view.model && + this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { + return; + } + } + if (this.highlighted) { + this.hideDragFeedback(this.highlighted); + } + this.highlighted = dragDescriptor; + if (this.highlighted) { + this.showDragFeedback(this.highlighted); + } + }; + /** + * Handles DnD events when a node is being dragged over canvas + * + * @param draggedView The Joint JS view object being dragged + * @param targetUnderMouse The Joint JS view under mouse cursor + * @param x X coordinate of the mouse on the canvas + * @param y Y coordinate of the mosue on the canvas + * @param context DnD context (palette or canvas) + */ + EditorComponent.prototype.handleNodeDragging = function (draggedView, targetUnderMouse, x, y, sourceComponent) { + if (this.editor && this.editor.calculateDragDescriptor) { + this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint$3.g.point(x, y), sourceComponent)); + } + }; + /** + * Handles DnD drop event when a node is being dragged and dropped on the main canvas + */ + EditorComponent.prototype.handleNodeDropping = function () { + if (this.highlighted && this.editor && this.editor.handleNodeDropping) { + this.editor.handleNodeDropping(this.editorContext, this.highlighted); + } + this.setDragDescriptor(undefined); + }; + /** + * Hides DOM Node (used to determine drop target DOM element) + * @param domNode DOM node to hide + * @returns + */ + EditorComponent.prototype._hideNode = function (domNode) { + var oldVisibility = { + visibility: domNode.style ? domNode.style.display : undefined, + children: [] + }; + for (var i = 0; i < domNode.children.length; i++) { + var node = domNode.children.item(i); + if (node instanceof HTMLElement) { + oldVisibility.children.push(this._hideNode(node)); + } + } + domNode.style.display = 'none'; + return oldVisibility; + }; + /** + * Restored DOM node original visibility (used to determine drop target DOM element) + * @param domNode DOM node to restore visibility of + * @param oldVisibility original visibility parameter + */ + EditorComponent.prototype._restoreNodeVisibility = function (domNode, oldVisibility) { + if (domNode.style) { + domNode.style.display = oldVisibility.visibility; + } + var j = 0; + for (var i = 0; i < domNode.childNodes.length; i++) { + if (j < oldVisibility.children.length) { + var node = domNode.children.item(i); + if (node instanceof HTMLElement) { + this._restoreNodeVisibility(node, oldVisibility.children[j++]); + } + } + } + }; + /** + * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. + * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location + * (bounding box of a link for testing is bad). + * The result of that is that links can only be the drop target when dragging from the palette currently. + * When DnDing shapes on the canvas drop target cannot be a link. + * + * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked + * - e.g. Drag-n-Drop) + */ + EditorComponent.prototype.getTargetViewFromEvent = function (event, x, y, excludeViews) { + var _this = this; + if (excludeViews === void 0) { excludeViews = []; } + if (!x && !y) { + var l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); + x = l.x; + y = l.y; + } + // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing + // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); + // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); + // if (underMouse) { + // return underMouse; + // } + var oldVisibility = excludeViews.map(function (_x) { return _this._hideNode(_x.el); }); + var targetElement = document.elementFromPoint(event.clientX, event.clientY); + excludeViews.forEach(function (excluded, i) { + _this._restoreNodeVisibility(excluded.el, oldVisibility[i]); + }); + return this.paper.findView($$4(targetElement)); + }; + EditorComponent.prototype.handleDnDFromPalette = function (dndEvent) { + switch (dndEvent.type) { + case Flo.DnDEventType.DRAG: + this.handleDragFromPalette(dndEvent); + break; + case Flo.DnDEventType.DROP: + this.handleDropFromPalette(dndEvent); + break; + default: + break; + } + }; + EditorComponent.prototype.handleDragFromPalette = function (dnDEvent) { + console.debug('Dragging from palette'); + if (dnDEvent.view && !this.readOnlyCanvas) { + var location_1 = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); + this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location_1.x, location_1.y, [dnDEvent.view]), location_1.x, location_1.y, Constants.PALETTE_CONTEXT); + } + }; + EditorComponent.prototype.createNode = function (metadata, props, position) { + return Shapes.Factory.createNode({ + renderer: this.renderer, + paper: this.paper, + metadata: metadata, + props: props, + position: position + }); + }; + EditorComponent.prototype.createLink = function (source, target, metadata, props) { + return Shapes.Factory.createLink({ + renderer: this.renderer, + paper: this.paper, + source: source, + target: target, + metadata: metadata, + props: props + }); + }; + EditorComponent.prototype.handleDropFromPalette = function (event) { + var cellview = event.view; + var evt = event.event; + if (this.paper.el === evt.target || $$4.contains(this.paper.el, evt.target)) { + if (this.readOnlyCanvas) { + this.setDragDescriptor(undefined); + } + else { + var metadata = cellview.model.attr('metadata'); + var props = cellview.model.attr('props'); + var position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); + /* Calculate target element before creating the new + * element under mouse location. Otherwise target + * element would be the newly created element because + * it's under the mouse pointer + */ + var targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); + var newNode = this.createNode(metadata, props, position); + var newView = this.paper.findViewByModel(newNode); + this.handleNodeDragging(newView, targetElement, position.x, position.y, Constants.PALETTE_CONTEXT); + this.handleNodeDropping(); + } + } + }; + EditorComponent.prototype.fitToContent = function (gridWidth, gridHeight, padding, opt) { + var paper = this.paper; + if (joint$3.util.isObject(gridWidth)) { + // first parameter is an option object + opt = gridWidth; + gridWidth = opt.gridWidth || 1; + gridHeight = opt.gridHeight || 1; + padding = opt.padding || 0; + } + else { + opt = opt || {}; + gridWidth = gridWidth || 1; + gridHeight = gridHeight || 1; + padding = padding || 0; + } + var paddingJson = joint$3.util.normalizeSides(padding); + // Calculate the paper size to accomodate all the graph's elements. + var bbox = joint$3.V(paper.viewport).getBBox(); + var currentScale = paper.scale(); + var currentTranslate = paper.translate(); + bbox.x *= currentScale.sx; + bbox.y *= currentScale.sy; + bbox.width *= currentScale.sx; + bbox.height *= currentScale.sy; + var calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; + var calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; + var tx = 0; + var ty = 0; + if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { + tx = (-bbox.x / gridWidth) * gridWidth; + tx += paddingJson.left; + } + else if (opt.allowNewOrigin === 'same') { + tx = currentTranslate.tx; + } + calcWidth += tx; + if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { + ty = (-bbox.y / gridHeight) * gridHeight; + ty += paddingJson.top; + } + else if (opt.allowNewOrigin === 'same') { + ty = currentTranslate.ty; + } + calcHeight += ty; + calcWidth += paddingJson.right; + calcHeight += paddingJson.bottom; + // Make sure the resulting width and height are greater than minimum. + calcWidth = Math.max(calcWidth, opt.minWidth || 0); + calcHeight = Math.max(calcHeight, opt.minHeight || 0); + // Make sure the resulting width and height are lesser than maximum. + calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); + calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); + var dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; + var originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; + // Change the dimensions only if there is a size discrepency or an origin change + if (originChange) { + paper.translate(tx, ty); + } + if (dimensionChange) { + paper.setDimensions(calcWidth, calcHeight); + } + }; + EditorComponent.prototype.autosizePaper = function () { + var parent = $$4('#paper-container', this.element.nativeElement); + var parentWidth = parent.innerWidth(); + var parentHeight = parent.innerHeight(); + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth - SCROLLBAR_SIZE, + minHeight: parentHeight - SCROLLBAR_SIZE, + allowNewOrigin: 'same' + }); + }; + EditorComponent.prototype.fitToPage = function () { + var parent = $$4('#paper-container', this.element.nativeElement); + var minScale = this.minZoom / 100; + var maxScale = 2; + var parentWidth = parent.innerWidth(); + var parentHeight = parent.innerHeight(); + this.paper.scaleContentToFit({ + padding: this.paperPadding, + minScaleX: minScale, + minScaleY: minScale, + maxScaleX: maxScale, + maxScaleY: maxScale, + fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } + }); + /** + * Size the canvas appropriately and allow origin movement + */ + this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { + minWidth: parentWidth, + minHeight: parentHeight, + maxWidth: parentWidth, + maxHeight: parentHeight, + allowNewOrigin: 'any' + }); + }; + Object.defineProperty(EditorComponent.prototype, "zoomPercent", { + get: function () { + return Math.round(joint$3.V(this.paper.viewport).scale().sx * 100); + }, + set: function (percent) { + if (!isNaN(percent)) { + if (percent < this.minZoom) { + percent = this.minZoom; + } + else if (percent >= this.maxZoom) { + percent = this.maxZoom; + } + else { + if (percent <= 0) { + percent = 0.00001; + } + } + this.paper.scale(percent / 100, percent / 100); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EditorComponent.prototype, "gridSize", { + get: function () { + return this._gridSize; + }, + set: function (size) { + if (!isNaN(size) && size >= 1) { + this._gridSize = size; + if (this.paper) { + this.paper.setGridSize(size); + } + } + }, + enumerable: true, + configurable: true + }); + EditorComponent.prototype.validateContent = function () { + var _this = this; + return new Promise(function (resolve) { + if (_this.editor && _this.editor.validate) { + return _this.editor + .validate(_this.graph, _this.dsl, _this.editorContext) + .then(function (allMarkers) { + _this.graph.getCells() + .forEach(function (cell) { return _this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : []); }); + _this.validationMarkers.emit(allMarkers); + _this.contentValidated.emit(true); + resolve(); + }); + } + else { + resolve(); + } + }); + }; + EditorComponent.prototype.markElement = function (cell, markers) { + var errorMessages = markers.map(function (m) { return m.message; }); + var errorCell = cell.getEmbeddedCells().find(function (e) { return e.attr('./kind') === Constants.ERROR_DECORATION_KIND; }); + if (errorCell) { + if (errorMessages.length === 0) { + errorCell.remove(); + } + else { + // Without rewrite we merge this list with existing errors + errorCell.attr('messages', errorMessages, { rewrite: true }); + } + } + else if (errorMessages.length > 0) { + var error = Shapes.Factory.createDecoration({ + renderer: this.renderer, + paper: this.paper, + parent: cell, + kind: Constants.ERROR_DECORATION_KIND, + messages: errorMessages + }); + var pt = void 0; + var view = this.paper.findViewByModel(error); + if (cell instanceof joint$3.dia.Element) { + pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); + error.set('position', pt); + view.setInteractivity(false); + } + } + }; + EditorComponent.prototype.doLayout = function () { + if (this.renderer && this.renderer.layout) { + return this.renderer.layout(this.paper); + } + }; + Object.defineProperty(EditorComponent.prototype, "dsl", { + get: function () { + return this._dslText; + }, + set: function (dslText) { + if (this._dslText !== dslText) { + this._dslText = dslText; + this.textToGraphEventEmitter.emit(); + } + }, + enumerable: true, + configurable: true + }); + /** + * Ask the server to parse the supplied text into a JSON graph of nodes and links, + * then update the view based on that new information. + */ + EditorComponent.prototype.updateGraphRepresentation = function () { + var _this = this; + console.debug("Updating graph to represent '" + this._dslText + "'"); + if (this.metamodel && this.metamodel.textToGraph) { + return this.metamodel.textToGraph(this.editorContext, this._dslText).then(function () { + _this.textToGraphConversionCompleted.next(); + return _this.validateContent(); + }); + } + else { + this.textToGraphConversionCompleted.next(); + return this.validateContent(); + } + }; + EditorComponent.prototype.updateTextRepresentation = function () { + var _this = this; + if (this.metamodel && this.metamodel.graphToText) { + return this.metamodel.graphToText(this.editorContext).then(function (text) { + if (_this._dslText !== text) { + _this._dslText = text; + _this.dslChange.emit(text); + } + _this.graphToTextConversionCompleted.next(); + return _this.validateContent(); + }) + .catch(function (error) { + // Validation may reveal why the graph couldn't be + // converted so let it run + _this.graphToTextConversionCompleted.next(); + return _this.validateContent(); + }); + } + else { + this.graphToTextConversionCompleted.next(); + return this.validateContent(); + } + }; + EditorComponent.prototype.initMetamodel = function () { + var _this = this; + this.metamodel.load().then(function (data) { + _this.updateGraphRepresentation(); + var textSyncSubscription = _this.graphToTextEventEmitter.pipe(debounceTime(100)).subscribe(function () { + if (_this._graphToTextSyncEnabled) { + _this.updateTextRepresentation(); + } + }); + _this._disposables.add(Disposable.create(function () { return textSyncSubscription.unsubscribe(); })); + // Setup content validated event emitter. Emit not validated when graph to text conversion required + var graphValidatedSubscription1 = _this.graphToTextEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); + _this._disposables.add(Disposable.create(function () { return graphValidatedSubscription1.unsubscribe; })); + // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); + // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); + var graphSyncSubscription = _this.textToGraphEventEmitter.pipe(debounceTime(300)).subscribe(function () { return _this.updateGraphRepresentation(); }); + _this._disposables.add(Disposable.create(function () { return graphSyncSubscription.unsubscribe(); })); + // Setup content validated event emitter. Emit not validated when text to graph conversion required + var graphValidatedSubscription2 = _this.textToGraphEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); + _this._disposables.add(Disposable.create(function () { return graphValidatedSubscription2.unsubscribe; })); + if (_this.editor && _this.editor.setDefaultContent) { + _this.editor.setDefaultContent(_this.editorContext, data); + } + }); + }; + EditorComponent.prototype.initGraph = function () { + this.graph = new joint$3.dia.Graph(); + this.graph.set('type', Constants.CANVAS_CONTEXT); + this.graph.set('paperPadding', this.paperPadding); + }; + EditorComponent.prototype.handleNodeCreation = function (node) { + var _this = this; + node.on('change:size', this._resizeHandler); + node.on('change:position', this._resizeHandler); + if (node.attr('metadata')) { + node.on('change:attrs', function (cell, attrs, changeData) { + var propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, node))) { + _this.performGraphToTextSyncing(); + } + if (_this.renderer && _this.renderer.refreshVisuals) { + _this.renderer.refreshVisuals(node, propAttr, _this.paper); + } + } + }); + } + }; + /** + * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples + * are 'change:source', 'change:target'. + */ + EditorComponent.prototype.handleLinkEvent = function (event, link) { + if (this.renderer && this.renderer.handleLinkEvent) { + this.renderer.handleLinkEvent(this.editorContext, event, link); + } + }; + EditorComponent.prototype.handleLinkCreation = function (link) { + var _this = this; + this.handleLinkEvent('add', link); + link.on('change:source', function (l) { + _this.autosizePaper(); + var newSourceId = l.get('source').id; + var oldSourceId = l.previous('source').id; + if (newSourceId !== oldSourceId) { + _this.performGraphToTextSyncing(); + } + _this.handleLinkEvent('change:source', l); + }); + link.on('change:target', function (l) { + _this.autosizePaper(); + var newTargetId = l.get('target').id; + var oldTargetId = l.previous('target').id; + if (newTargetId !== oldTargetId) { + _this.performGraphToTextSyncing(); + } + _this.handleLinkEvent('change:target', l); + }); + link.on('change:vertices', this._resizeHandler); + link.on('change:attrs', function (cell, attrs, changeData) { + var propertyPath = changeData ? changeData.propertyPath : undefined; + if (propertyPath) { + var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); + if (propAttr.indexOf('metadata') === 0 || + propAttr.indexOf('props') === 0 || + (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, link))) { + var sourceId = link.get('source').id; + var targetId = link.get('target').id; + _this.performGraphToTextSyncing(); + } + if (_this.renderer && _this.renderer.refreshVisuals) { + _this.renderer.refreshVisuals(link, propAttr, _this.paper); + } + } + }); + this.paper.findViewByModel(link).on('link:options', function () { return _this.handleLinkEvent('options', link); }); + if (this.readOnlyCanvas) { + link.attr('.link-tools/display', 'none'); + } + }; + EditorComponent.prototype.initGraphListeners = function () { + var _this = this; + this.graph.on('add', function (element) { + if (element instanceof joint$3.dia.Link) { + _this.handleLinkCreation(element); + } + else if (element instanceof joint$3.dia.Element) { + _this.handleNodeCreation(element); + } + if (element.get('type') === joint$3.shapes.flo.NODE_TYPE || element.get('type') === joint$3.shapes.flo.LINK_TYPE) { + _this.performGraphToTextSyncing(); + } + _this.autosizePaper(); + }); + this.graph.on('remove', function (element) { + if (element instanceof joint$3.dia.Link) { + _this.handleLinkEvent('remove', element); + } + if (_this.selection && _this.selection.model === element) { + _this.selection = undefined; + } + if (element.isLink()) { + window.setTimeout(function () { return _this.performGraphToTextSyncing(); }, 100); + } + else if (element.get('type') === joint$3.shapes.flo.NODE_TYPE) { + _this.performGraphToTextSyncing(); + } + _this.autosizePaper(); + }); + // Set if link is fan-routed. Should be called before routing call + this.graph.on('change:vertices', function (link, changed, opt) { + if (opt.fanRouted) { + link.set('fanRouted', true); + } + else { + link.unset('fanRouted'); + } + }); + // adjust vertices when a cell is removed or its source/target was changed + this.graph.on('add remove change:source change:target change:vertices change:position', partial(Utils.fanRoute, this.graph)); + }; + EditorComponent.prototype.initPaperListeners = function () { + var _this = this; + // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element + this.paper.on('cell:pointerclick', function (cellView) { + if (!_this.readOnlyCanvas) { + _this.selection = cellView; + } + }); + this.paper.on('blank:pointerclick', function () { + _this.selection = undefined; + }); + this.paper.on('scale', this._resizeHandler); + this.paper.on('all', function () { + if (Utils.isCustomPaperEvent(arguments)) { + arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); + } + }); + this.paper.on('dragging-node-over-canvas', function (dndEvent) { + console.debug("Canvas DnD type = " + dndEvent.type); + var location = _this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); + switch (dndEvent.type) { + case Flo.DnDEventType.DRAG: + _this.handleNodeDragging(dndEvent.view, _this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, Constants.CANVAS_CONTEXT); + break; + case Flo.DnDEventType.DROP: + _this.handleNodeDropping(); + break; + default: + break; + } + }); + // JointJS now no longer grabs focus if working in a paper element - crude... + $$4('#flow-view', this.element.nativeElement).on('mousedown', function () { + $$4('#palette-filter-textfield', _this.element.nativeElement).focus(); + }); + }; + EditorComponent.prototype.initPaper = function () { + var _this = this; + var options = { + el: $$4('#paper', this.element.nativeElement), + gridSize: this._gridSize, + drawGrid: true, + model: this.graph, + elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$3.shapes.flo.ElementView /*joint.dia.ElementView*/, + linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint$3.shapes.flo.LinkView, + // Enable link snapping within 25px lookup radius + snapLinks: { radius: 25 }, + defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ function (cellView, magnet) { + if (_this.renderer && _this.renderer.createLink) { + var linkEnd = { + id: cellView.model.id + }; + if (magnet) { + linkEnd.selector = cellView.getSelector(magnet, undefined); + } + if (magnet.getAttribute('port')) { + linkEnd.port = magnet.getAttribute('port'); + } + if (magnet.getAttribute('port') === 'input') { + return _this.renderer.createLink(undefined, linkEnd); + } + else { + return _this.renderer.createLink(linkEnd, undefined); + } + } + else { + return new joint$3.shapes.flo.Link(); + } + }, + // decide whether to create a link if the user clicks a magnet + validateMagnet: function (cellView, magnet) { + if (_this.readOnlyCanvas) { + return false; + } + else { + if (_this.editor && _this.editor.validatePort) { + return _this.editor.validatePort(_this.editorContext, cellView, magnet); + } + else { + return true; + } + } + }, + interactive: function (cellView, event) { + if (_this.readOnlyCanvas) { + return false; + } + else { + if (_this.editor && _this.editor.interactive) { + if (typeof _this.editor.interactive === 'function') { + // Type for interactive is wrong in JointJS have to cast to + return _this.editor.interactive(cellView, event); + } + else { + return _this.editor.interactive; + } + } + return true; + } + }, + highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { + 'default': { + name: 'addClass', + options: { + className: 'highlighted' + } + } + }, + markAvailable: true + }; + if (this.renderer && this.renderer.getLinkAnchorPoint) { + options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; + } + if (this.editor && this.editor.validateLink) { + var self_1 = this; + options.validateConnection = function (cellViewS, magnetS, cellViewT, magnetT, end, linkView) { + return self_1.editor.validateLink(_this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); + }; + } + // The paper is what will represent the graph on the screen + this.paper = new joint$3.dia.Paper(options); + this._disposables.add(Disposable.create(function () { return _this.paper.remove(); })); + }; + EditorComponent.prototype.updatePaletteReadyState = function (ready) { + this.paletteReady.next(ready); + }; + __decorate([ + Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "metamodel", void 0); + __decorate([ + Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "renderer", void 0); + __decorate([ + Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "editor", void 0); + __decorate([ + Input(), + __metadata("design:type", Number) + ], EditorComponent.prototype, "paletteSize", void 0); + __decorate([ + Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "minZoom", void 0); + __decorate([ + Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "maxZoom", void 0); + __decorate([ + Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "zoomStep", void 0); + __decorate([ + Input(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "paperPadding", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "floApi", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "validationMarkers", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "contentValidated", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], EditorComponent.prototype, "dslChange", void 0); + __decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], EditorComponent.prototype, "dsl", null); + EditorComponent = __decorate([ + Component({ + selector: 'flo-editor', + template: "\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ", + styles: ["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "], + encapsulation: ViewEncapsulation.None + }), + __metadata("design:paramtypes", [ElementRef]) + ], EditorComponent); + return EditorComponent; +}()); + +var $$5 = _$; +var ResizerDirective = /** @class */ (function () { + function ResizerDirective(element, document) { + var _this = this; + this.element = element; + this.document = document; + this.dragInProgress = false; + this.vertical = true; + this._subscriptions = new CompositeDisposable(); + this.sizeChange = new EventEmitter(); + this.mouseMoveHandler = function (e) { + if (_this.dragInProgress) { + _this.mousemove(e); + } + }; + } + Object.defineProperty(ResizerDirective.prototype, "splitSize", { + set: function (splitSize) { + if (this.maxSplitSize && splitSize > this.maxSplitSize) { + splitSize = this.maxSplitSize; + } + if (this.vertical) { + // Handle vertical resizer + $$5(this.element.nativeElement).css({ + left: splitSize + 'px' + }); + $$5(this.first).css({ + width: splitSize + 'px' + }); + $$5(this.second).css({ + left: (splitSize + this._size) + 'px' + }); + } + else { + // Handle horizontal resizer + $$5(this.element.nativeElement).css({ + bottom: splitSize + 'px' + }); + $$5(this.first).css({ + bottom: (splitSize + this._size) + 'px' + }); + $$5(this.second).css({ + height: splitSize + 'px' + }); + } + this._splitSize = splitSize; + // Update the local field + this.sizeChange.emit(splitSize); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerWidth", { + set: function (width) { + this._size = width; + this.vertical = true; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerHeight", { + set: function (height) { + this._size = height; + this.vertical = false; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerLeft", { + set: function (first) { + this.first = first; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerTop", { + set: function (first) { + this.first = first; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerRight", { + set: function (second) { + this.second = second; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ResizerDirective.prototype, "resizerBottom", { + set: function (second) { + this.second = second; + }, + enumerable: true, + configurable: true + }); + ResizerDirective.prototype.startDrag = function () { + this.dragInProgress = true; + }; + ResizerDirective.prototype.mousemove = function (event) { + var size; + if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node + size = event.pageX - $$5(this.first).offset().left; + } + else { + // Handle horizontal resizer Calculate new size relative to palette container DOM node + size = window.innerHeight - event.pageY - $$5(this.second).offset().top; + } + this.splitSize = size; + }; + ResizerDirective.prototype.ngOnInit = function () { + // Need to set left and right elements width and fire events on init when DOM is built + var _this = this; + this.splitSize = this._splitSize; + var subscription1 = fromEvent($$5(this.document).get(0), 'mousemove') + .pipe(sampleTime(300)) + .subscribe(this.mouseMoveHandler); + this._subscriptions.add(Disposable.create(function () { return subscription1.unsubscribe(); })); + var subscription2 = fromEvent($$5(this.document).get(0), 'mouseup') + .subscribe(function (e) { + if (_this.dragInProgress) { + _this.mousemove(e); + _this.dragInProgress = false; + } + }); + this._subscriptions.add(Disposable.create(function () { return subscription2.unsubscribe(); })); + }; + ResizerDirective.prototype.ngOnDestroy = function () { + this._subscriptions.dispose(); + }; + __decorate([ + Input(), + __metadata("design:type", Number) + ], ResizerDirective.prototype, "maxSplitSize", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], ResizerDirective.prototype, "sizeChange", void 0); + __decorate([ + Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) + ], ResizerDirective.prototype, "splitSize", null); + __decorate([ + Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) + ], ResizerDirective.prototype, "resizerWidth", null); + __decorate([ + Input(), + __metadata("design:type", Number), + __metadata("design:paramtypes", [Number]) + ], ResizerDirective.prototype, "resizerHeight", null); + __decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerLeft", null); + __decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerTop", null); + __decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerRight", null); + __decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], ResizerDirective.prototype, "resizerBottom", null); + ResizerDirective = __decorate([ + Directive({ + selector: '[resizer]', + host: { '(mousedown)': 'startDrag()' } + }), + __param(1, Inject(DOCUMENT)), + __metadata("design:paramtypes", [ElementRef, Object]) + ], ResizerDirective); + return ResizerDirective; +}()); + +var $$6 = _$; +var DslEditorComponent = /** @class */ (function () { + function DslEditorComponent(element) { + var _this = this; + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.debounce = 0; + this.dslChange = new EventEmitter(); + this.focus = new EventEmitter(); + this.blur = new EventEmitter(); + this.editor = new EventEmitter(); + this._dslChangedHandler = function () { + _this._dsl = _this.doc.getValue(); + _this.dslChange.emit(_this._dsl); + }; + } + Object.defineProperty(DslEditorComponent.prototype, "dsl", { + set: function (dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + var cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DslEditorComponent.prototype, "lintOptions", { + set: function (lintOptions) { + this._lint = lintOptions; + if (this.doc) { + this.doc.setOption('lint', this._lint); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DslEditorComponent.prototype, "hintOptions", { + set: function (hintOptions) { + this._hint = hintOptions; + if (this.doc) { + this.doc.setOption('hintOptions', this._hint); + } + }, + enumerable: true, + configurable: true + }); + DslEditorComponent.prototype.ngOnInit = function () { + var _this = this; + var options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + electricChars: false, + smartIndent: false, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + if (this._hint) { + options.hintOptions = this._hint; + } + this.doc = fromTextArea($$6('#dsl-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this.debounce ? debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); + this.doc.on('focus', function () { return _this.focus.emit(); }); + this.doc.on('blur', function () { return _this.blur.emit(); }); + this.editor.emit(this.doc); + }; + DslEditorComponent.prototype.ngOnDestroy = function () { + }; + __decorate([ + Input('line-numbers'), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "lineNumbers", void 0); + __decorate([ + Input('line-wrapping'), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "lineWrapping", void 0); + __decorate([ + Input('scrollbar-style'), + __metadata("design:type", String) + ], DslEditorComponent.prototype, "scrollbarStyle", void 0); + __decorate([ + Input(), + __metadata("design:type", String) + ], DslEditorComponent.prototype, "placeholder", void 0); + __decorate([ + Input(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "debounce", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "dslChange", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "focus", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "blur", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], DslEditorComponent.prototype, "editor", void 0); + __decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], DslEditorComponent.prototype, "dsl", null); + __decorate([ + Input(), + __metadata("design:type", Object), + __metadata("design:paramtypes", [Object]) + ], DslEditorComponent.prototype, "lintOptions", null); + __decorate([ + Input(), + __metadata("design:type", Object), + __metadata("design:paramtypes", [Object]) + ], DslEditorComponent.prototype, "hintOptions", null); + DslEditorComponent = __decorate([ + Component({ + selector: 'dsl-editor', + template: "\n \n ", + styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "], + encapsulation: ViewEncapsulation.None + }), + __metadata("design:paramtypes", [ElementRef]) + ], DslEditorComponent); + return DslEditorComponent; +}()); + +var $$7 = _$; +var CodeEditorComponent = /** @class */ (function () { + function CodeEditorComponent(element) { + var _this = this; + this.element = element; + this._dsl = ''; + this._lint = false; + this.lineNumbers = false; + this.lineWrapping = false; + this.dslChange = new EventEmitter(); + this.focus = new EventEmitter(); + this.blur = new EventEmitter(); + this.editor = new EventEmitter(); + this._dslChangedHandler = function () { + _this._dsl = _this.doc.getValue(); + _this.dslChange.emit(_this._dsl); + if (_this._onChangeHandler) { + _this._onChangeHandler(_this._dsl); + } + }; + } + CodeEditorComponent_1 = CodeEditorComponent; + Object.defineProperty(CodeEditorComponent.prototype, "dsl", { + set: function (dsl) { + this._dsl = dsl; + if (this.doc && this._dsl !== this.doc.getValue()) { + var cursorPosition = this.doc.getCursor(); + this.doc.setValue(this._dsl || ''); + this.doc.setCursor(cursorPosition); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CodeEditorComponent.prototype, "language", { + set: function (_language) { + if (this._language !== _language) { + this._language = _language; + this.loadEditorMode(); + } + }, + enumerable: true, + configurable: true + }); + CodeEditorComponent.prototype.ngOnInit = function () { + var _this = this; + var options = { + value: this._dsl || '', + gutters: ['CodeMirror-lint-markers'], + extraKeys: { 'Ctrl-Space': 'autocomplete' }, + lineNumbers: this.lineNumbers, + lineWrapping: this.lineWrapping, + matchBrackets: true, + autoCloseBrackets: true, + }; + if (this.scrollbarStyle) { + options.scrollbarStyle = this.scrollbarStyle; + } + if (this._lint) { + options.lint = this._lint; + } + this.doc = fromTextArea($$7('#code-editor-host', this.element.nativeElement)[0], options); + if (this.placeholder) { + this.doc.setOption('placeholder', this.placeholder); + } + // Turns out "value" in the option doesn't set it. + this.doc.setValue(this._dsl || ''); + this.doc.on('change', this._dslChangedHandler); + this.doc.on('focus', function () { + _this.focus.emit(); + if (_this._onTouchHandler) { + _this._onTouchHandler(); + } + }); + this.doc.on('blur', function () { return _this.blur.emit(); }); + this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); + this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); + this.loadEditorMode(); + this.editor.emit(this.doc); + }; + CodeEditorComponent.prototype.loadEditorMode = function () { + // CodeMirror doc object must be initialized + if (!this.doc) { + return; + } + var info = this._language ? findModeByName(this._language) : undefined; + // Set proper editor mode + if (info) { + this.doc.setOption('mode', info.mime); + // (CodeMirror).autoLoadMode(this.doc, info.mode); + } + else { + this.doc.setOption('mode', 'text/plain'); + } + // Set proper Lint mode + this.doc.setOption('lint', this.getLintOptions()); + }; + CodeEditorComponent.prototype.ngOnDestroy = function () { + }; + CodeEditorComponent.prototype.writeValue = function (obj) { + this.dsl = obj; + }; + CodeEditorComponent.prototype.registerOnChange = function (fn) { + this._onChangeHandler = fn; + }; + CodeEditorComponent.prototype.registerOnTouched = function (fn) { + this._onTouchHandler = fn; + }; + CodeEditorComponent.prototype.getLintOptions = function () { + var _this = this; + switch (this._language) { + case 'javascript': + case 'json': + case 'coffeescript': + case 'yaml': + return { + onUpdateLinting: function (annotations) { + var warnings = []; + var errors = []; + if (_this.overviewRuler) { + if (Array.isArray(annotations)) { + annotations.forEach(function (a) { + if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { + if (a.severity === 'error') { + errors.push(a); + } + else if (a.severity === 'warning') { + warnings.push(a); + } + } + }); + } + } + _this.warningRuler.update(warnings); + _this.errorRuler.update(errors); + } + }; + } + return false; + }; + var CodeEditorComponent_1; + __decorate([ + Input('line-numbers'), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "lineNumbers", void 0); + __decorate([ + Input('line-wrapping'), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "lineWrapping", void 0); + __decorate([ + Input('scrollbar-style'), + __metadata("design:type", String) + ], CodeEditorComponent.prototype, "scrollbarStyle", void 0); + __decorate([ + Input(), + __metadata("design:type", String) + ], CodeEditorComponent.prototype, "placeholder", void 0); + __decorate([ + Input('overview-ruler'), + __metadata("design:type", Boolean) + ], CodeEditorComponent.prototype, "overviewRuler", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "dslChange", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "focus", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "blur", void 0); + __decorate([ + Output(), + __metadata("design:type", Object) + ], CodeEditorComponent.prototype, "editor", void 0); + __decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], CodeEditorComponent.prototype, "dsl", null); + __decorate([ + Input(), + __metadata("design:type", String), + __metadata("design:paramtypes", [String]) + ], CodeEditorComponent.prototype, "language", null); + CodeEditorComponent = CodeEditorComponent_1 = __decorate([ + Component({ + selector: 'code-editor', + template: "\n
\n \n
\n ", + styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "], + encapsulation: ViewEncapsulation.None, + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(function () { return CodeEditorComponent_1; }), + multi: true + } + ] + }), + __metadata("design:paramtypes", [ElementRef]) + ], CodeEditorComponent); + return CodeEditorComponent; +}()); + +var Properties; +(function (Properties) { + var InputType; + (function (InputType) { + InputType[InputType["TEXT"] = 0] = "TEXT"; + InputType[InputType["NUMBER"] = 1] = "NUMBER"; + InputType[InputType["SELECT"] = 2] = "SELECT"; + InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; + InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; + InputType[InputType["EMAIL"] = 5] = "EMAIL"; + InputType[InputType["URL"] = 6] = "URL"; + InputType[InputType["CODE"] = 7] = "CODE"; + })(InputType = Properties.InputType || (Properties.InputType = {})); + var GenericControlModel = /** @class */ (function () { + function GenericControlModel(_property, type, validation) { + this._property = _property; + this.type = type; + this.validation = validation; + } + Object.defineProperty(GenericControlModel.prototype, "id", { + get: function () { + return this.property.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "name", { + get: function () { + return this.property.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "description", { + get: function () { + return this.property.description; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "defaultValue", { + get: function () { + return this.property.defaultValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "value", { + get: function () { + return this.getValue(); + }, + set: function (value) { + this.setValue(value); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(GenericControlModel.prototype, "property", { + get: function () { + return this._property; + }, + enumerable: true, + configurable: true + }); + GenericControlModel.prototype.setValue = function (value) { + this.property.value = value; + }; + GenericControlModel.prototype.getValue = function () { + return this.property.value; + }; + return GenericControlModel; + }()); + Properties.GenericControlModel = GenericControlModel; + var CheckBoxControlModel = /** @class */ (function (_super) { + __extends(CheckBoxControlModel, _super); + function CheckBoxControlModel(_property, validation) { + return _super.call(this, _property, InputType.CHECKBOX, validation) || this; + } + CheckBoxControlModel.prototype.getValue = function () { + var res = _super.prototype.getValue.call(this); + var type = typeof res; + switch (type) { + case 'boolean': + return res; + case 'string': + switch (res.trim().toLowerCase()) { + case 'true': + case '1': + return true; + case 'false': + case '0': + return false; + default: + return this.property.defaultValue; + } + case 'number': + var num = res; + if (num === 0) { + return false; + } + else if (num === 1) { + return true; + } + else { + return this.property.defaultValue; + } + } + return this.property.defaultValue; + }; + return CheckBoxControlModel; + }(GenericControlModel)); + Properties.CheckBoxControlModel = CheckBoxControlModel; + var AbstractCodeControlModel = /** @class */ (function (_super) { + __extends(AbstractCodeControlModel, _super); + function AbstractCodeControlModel(_property, encode, decode, validation) { + var _this = _super.call(this, _property, InputType.CODE, validation) || this; + _this.encode = encode; + _this.decode = decode; + return _this; + } + Object.defineProperty(AbstractCodeControlModel.prototype, "value", { + get: function () { + var dsl = _super.prototype.getValue.call(this); + if (dsl && this.decode) { + return this.decode(dsl); + } + else { + return dsl; + } + }, + set: function (value) { + if (value && this.encode) { + _super.prototype.setValue.call(this, this.encode(value)); + } + else { + _super.prototype.setValue.call(this, value); + } + }, + enumerable: true, + configurable: true + }); + return AbstractCodeControlModel; + }(GenericControlModel)); + Properties.AbstractCodeControlModel = AbstractCodeControlModel; + var GenericCodeControlModel = /** @class */ (function (_super) { + __extends(GenericCodeControlModel, _super); + function GenericCodeControlModel(_property, language, encode, decode, validation) { + var _this = _super.call(this, _property, encode, decode, validation) || this; + _this.language = language; + return _this; + } + return GenericCodeControlModel; + }(AbstractCodeControlModel)); + Properties.GenericCodeControlModel = GenericCodeControlModel; + var CodeControlModelWithDynamicLanguageProperty = /** @class */ (function (_super) { + __extends(CodeControlModelWithDynamicLanguageProperty, _super); + function CodeControlModelWithDynamicLanguageProperty(_property, _languagePropertyName, _groupModel, encode, decode, validation) { + var _this = _super.call(this, _property, encode, decode, validation) || this; + _this._languagePropertyName = _languagePropertyName; + _this._groupModel = _groupModel; + return _this; + } + Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "language", { + get: function () { + var value = this.languageControlModel.value; + return value ? value : this.languageControlModel.defaultValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "languageControlModel", { + get: function () { + var _this = this; + if (!this._langControlModel) { + // Cast to Properties.ControlModel from Properties.ControlModel | undefined + // Should not be undefined! + this._langControlModel = this._groupModel.getControlsModels().find(function (c) { return c.id === _this._languagePropertyName; }); + } + return this._langControlModel; + }, + enumerable: true, + configurable: true + }); + return CodeControlModelWithDynamicLanguageProperty; + }(AbstractCodeControlModel)); + Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; + var GenericListControlModel = /** @class */ (function (_super) { + __extends(GenericListControlModel, _super); + function GenericListControlModel(property, validation) { + return _super.call(this, property, InputType.TEXT, validation) || this; + } + Object.defineProperty(GenericListControlModel.prototype, "value", { + get: function () { + return this.property.value ? this.property.value.join(', ') : ''; + }, + set: function (value) { + this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; + }, + enumerable: true, + configurable: true + }); + return GenericListControlModel; + }(GenericControlModel)); + Properties.GenericListControlModel = GenericListControlModel; + var SelectControlModel = /** @class */ (function (_super) { + __extends(SelectControlModel, _super); + function SelectControlModel(_property, type, options) { + var _this = _super.call(this, _property, type) || this; + _this.options = options; + if (_property.defaultValue === undefined) { + options.unshift({ + name: 'SELECT', + value: _property.defaultValue + }); + } + return _this; + } + return SelectControlModel; + }(GenericControlModel)); + Properties.SelectControlModel = SelectControlModel; + var DefaultCellPropertiesSource = /** @class */ (function () { + function DefaultCellPropertiesSource(cell) { + this.cell = cell; + } + DefaultCellPropertiesSource.prototype.getProperties = function () { + var _this = this; + var metadata = this.cell.attr('metadata'); + return Promise.resolve(metadata.properties().then(function (propsMetadata) { return Array.from(propsMetadata.values()).map(function (m) { return _this.createProperty(m); }); })); + }; + DefaultCellPropertiesSource.prototype.createProperty = function (metadata) { + return { + id: metadata.id, + name: metadata.name, + type: metadata.type, + defaultValue: metadata.defaultValue, + attr: "props/" + metadata.name, + value: this.cell.attr("props/" + metadata.name), + description: metadata.description, + valueOptions: metadata.options + }; + }; + DefaultCellPropertiesSource.prototype.applyChanges = function (properties) { + var _this = this; + this.cell.trigger('batch:start', { batchName: 'update properties' }); + properties.forEach(function (property) { + if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || + (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { + var currentValue = _this.cell.attr(property.attr); + if (currentValue !== undefined && currentValue !== null) { + // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync + _this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); + _this.cell.removeAttr(property.attr); + } + } + else { + _this.cell.attr(property.attr, property.value); + } + }); + this.cell.trigger('batch:stop', { batchName: 'update properties' }); + }; + return DefaultCellPropertiesSource; + }()); + Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; + var PropertiesGroupModel = /** @class */ (function () { + function PropertiesGroupModel(propertiesSource) { + this.loading = true; + this.propertiesSource = propertiesSource; + } + PropertiesGroupModel.prototype.load = function () { + var _this = this; + this.loading = true; + this._loadedSubject = new Subject(); + this.propertiesSource.getProperties().then(function (properties) { + _this.controlModels = properties.map(function (p) { return _this.createControlModel(p); }); + _this.loading = false; + _this._loadedSubject.next(true); + _this._loadedSubject.complete(); + }); + }; + Object.defineProperty(PropertiesGroupModel.prototype, "isLoading", { + get: function () { + return this.loading; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PropertiesGroupModel.prototype, "loadedSubject", { + get: function () { + return this._loadedSubject; + }, + enumerable: true, + configurable: true + }); + PropertiesGroupModel.prototype.getControlsModels = function () { + return this.controlModels; + }; + PropertiesGroupModel.prototype.createControlModel = function (property) { + return new GenericControlModel(property, InputType.TEXT); + }; + PropertiesGroupModel.prototype.applyChanges = function () { + if (this.loading) { + return; + } + var properties = this.controlModels.map(function (cm) { return cm.property; }); + this.propertiesSource.applyChanges(properties); + }; + return PropertiesGroupModel; + }()); + Properties.PropertiesGroupModel = PropertiesGroupModel; + var Validators; + (function (Validators) { + function uniqueResource(service, debounce$$1) { + return function (control) { + return new Observable(function (obs) { + if (control.valueChanges && control.value) { + control.valueChanges + .pipe(debounceTime(debounce$$1), mergeMap(function (value) { return service(value); })) + .subscribe(function () { + obs.next({ uniqueResource: true }); + obs.complete(); + }, function () { + obs.next(undefined); + obs.complete(); + }); + } + else { + obs.next(undefined); + obs.complete(); + } + }); + }; + } + Validators.uniqueResource = uniqueResource; + function noneOf(excluded) { + return function (control) { + return excluded.find(function (e) { return e === control.value; }) ? { 'noneOf': { value: control.value } } : {}; + }; + } + Validators.noneOf = noneOf; + })(Validators = Properties.Validators || (Properties.Validators = {})); +})(Properties || (Properties = {})); + +var PropertiesGroupComponent = /** @class */ (function () { + function PropertiesGroupComponent() { + } + PropertiesGroupComponent.prototype.ngOnInit = function () { + var _this = this; + if (this.propertiesGroupModel.isLoading) { + var subscription_1 = this.propertiesGroupModel.loadedSubject.subscribe(function (loaded) { + if (loaded) { + subscription_1.unsubscribe(); + _this.createGroupControls(); + } + }); + } + else { + this.createGroupControls(); + } + }; + PropertiesGroupComponent.prototype.createGroupControls = function () { + var _this = this; + this.propertiesGroupModel.getControlsModels().forEach(function (c) { + if (c.validation) { + _this.form.addControl(c.id, new FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); + } + else { + _this.form.addControl(c.id, new FormControl(c.value || '')); + } + }); + }; + __decorate([ + Input(), + __metadata("design:type", Properties.PropertiesGroupModel) + ], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); + __decorate([ + Input(), + __metadata("design:type", FormGroup) + ], PropertiesGroupComponent.prototype, "form", void 0); + PropertiesGroupComponent = __decorate([ + Component({ + selector: 'properties-group', + template: "\n
\n \n
\n ", + encapsulation: ViewEncapsulation.None + }) + ], PropertiesGroupComponent); + return PropertiesGroupComponent; +}()); + +var DynamicFormPropertyComponent = /** @class */ (function () { + function DynamicFormPropertyComponent() { + } + Object.defineProperty(DynamicFormPropertyComponent.prototype, "types", { + get: function () { + return Properties.InputType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DynamicFormPropertyComponent.prototype, "control", { + get: function () { + return this.form.controls[this.model.id]; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DynamicFormPropertyComponent.prototype, "errorData", { + get: function () { + var _this = this; + return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) + .filter(function (e) { return _this.control.errors && _this.control.errors[e.id]; }); + }, + enumerable: true, + configurable: true + }); + __decorate([ + Input(), + __metadata("design:type", Object) + ], DynamicFormPropertyComponent.prototype, "model", void 0); + __decorate([ + Input(), + __metadata("design:type", FormGroup) + ], DynamicFormPropertyComponent.prototype, "form", void 0); + DynamicFormPropertyComponent = __decorate([ + Component({ + selector: 'df-property', + template: "\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ", + encapsulation: ViewEncapsulation.None + }), + __metadata("design:paramtypes", []) + ], DynamicFormPropertyComponent); + return DynamicFormPropertyComponent; +}()); + +var FloModule = /** @class */ (function () { + function FloModule() { + } + FloModule = __decorate([ + NgModule({ + imports: [ + FormsModule, + CommonModule, + ReactiveFormsModule + ], + declarations: [ + Palette, + EditorComponent, + ResizerDirective, + DslEditorComponent, + CodeEditorComponent, + PropertiesGroupComponent, + DynamicFormPropertyComponent + ], + exports: [ + EditorComponent, + DslEditorComponent, + DynamicFormPropertyComponent, + PropertiesGroupComponent + ] + }) + ], FloModule); + return FloModule; +}()); + +/** + * Generated bundle index. Do not edit. + */ + +export { FloModule, Palette, EditorComponent, DslEditorComponent, CodeEditorComponent, PropertiesGroupComponent, DynamicFormPropertyComponent, ResizerDirective, Flo, Properties, Constants, Shapes }; +//# sourceMappingURL=spring-flo.js.map diff --git a/dist/package.json b/dist/package.json new file mode 100644 index 0000000..7cf7af3 --- /dev/null +++ b/dist/package.json @@ -0,0 +1,109 @@ +{ + "name": "spring-flo", + "version": "0.8.9", + "description": "Library for quickly building text DSL visualization diagram editor", + "main": "./bundles/spring-flo.umd.js", + "module": "./fesm5/spring-flo.js", + "es2015": "./fesm2015/spring-flo.js", + "esm5": "./esm5/spring-flo.js", + "esm2015": "./esm2015/spring-flo.js", + "fesm5": "./fesm5/spring-flo.js", + "fesm2015": "./fesm2015/spring-flo.js", + "typings": "./out-tsc/spring-flo.d.ts", + "author": "", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/spring-projects/spring-flo.git" + }, + "engines": { + "node": ">= 6.9.0", + "npm": ">= 3.0.0" + }, + "scripts": { + "clean": "rimraf out-tsc dist/*", + "prebuild": "npm run clean", + "build": "node build.js", + "build-demo": "tsc -p src/demo/", + "build-demo:watch": "tsc -p src/demo/ -w", + "serve": "lite-server -c=bs-config.json", + "prestart": "npm run build-demo", + "start": "concurrently \"npm run build-demo:watch\" \"npm run serve\"", + "build-test": "tsc -p src/lib/tsconfig.spec.json", + "build-test:watch": "tsc -p src/lib/tsconfig.spec.json -w", + "pretest": "npm run build-test", + "test": "concurrently \"npm run build-test:watch\" \"karma start karma.conf.js\"", + "pretest:once": "npm run build-test", + "test:once": "karma start karma.conf.js --single-run", + "preintegration": "npm run build && cd integration && npm run clean && npm install", + "integration": "npm run integration:aot && npm run integration:jit", + "integration:jit": "cd integration && npm run e2e", + "integration:aot": "cd integration && npm run e2e:aot", + "lint": "tslint ./src/**/*.ts -t verbose", + "release": "standard-version" + }, + "dependencies": { + "codemirror-minified": "5.44.0", + "jointjs": "2.2.1", + "ts-disposables": "2.2.3" + }, + "peerDependencies": { + "@angular/core": ">=6.0.0 <8.0.0", + "@angular/forms": ">=6.0.0 < 8.0.0", + "@angular/platform-browser": ">=6.0.0 <8.0.0", + "rxjs": ">=6.0.0 <7.0.0" + }, + "devDependencies": { + "@angular/animations": "7.2.10", + "@angular/common": "7.2.10", + "@angular/compiler": "7.2.10", + "@angular/compiler-cli": "7.2.10", + "@angular/core": "7.2.10", + "@angular/forms": "7.2.10", + "@angular/platform-browser": "7.2.10", + "@angular/platform-browser-dynamic": "7.2.10", + "@angular/platform-server": "7.2.10", + "@types/backbone": "1.3.42", + "@types/codemirror": "0.0.64", + "@types/jasmine": "2.5.36", + "@types/jquery": "3.3.4", + "@types/lodash": "4.14.123", + "@types/node": "6.0.46", + "camelcase": "4.0.0", + "chalk": "2.4.1", + "codemirror-minified": "5.44.0", + "concurrently": "4.0.1", + "core-js": "2.6.5", + "glob": "7.1.1", + "gulp": "3.9.1", + "gulp-inline-ng2-template": "5.0.1", + "jasmine-core": "2.5.2", + "jointjs": "2.2.1", + "jquery": "3.1.1", + "jshint": "2.10.2", + "karma": "1.5.0", + "karma-chrome-launcher": "2.0.0", + "karma-cli": "1.0.1", + "karma-html-reporter": "0.2.7", + "karma-jasmine": "1.1.0", + "karma-jasmine-html-reporter": "0.2.2", + "lite-server": "2.4.0", + "ngx-bootstrap": "2.0.5", + "node-sass": "4.9.0", + "rimraf": "2.6.1", + "rollup": "0.62.0", + "rollup-plugin-commonjs": "9.1.3", + "rollup-plugin-node-resolve": "3.3.0", + "rollup-plugin-sourcemaps": "0.4.2", + "rxjs": "6.3.3", + "shelljs": "0.8.1", + "standard-version": "4.0.0", + "systemjs": "0.21.4", + "ts-disposables": "2.2.3", + "tslint": "5.12.1", + "typescript": "3.1.4", + "uglify-js": "3.3.23", + "zone.js": "0.8.29", + "rxjs-compat": "^6.4.0" + } +} \ No newline at end of file From 02b04ea279c75d826c76a8b79a8241f31f00bba7 Mon Sep 17 00:00:00 2001 From: hakhan88 Date: Thu, 13 Jun 2019 00:18:46 +0800 Subject: [PATCH 05/10] update out tsc --- .gitignore | 1 - .../code-editor/code-editor.component.d.ts | 52 +++++ dist/out-tsc/directives/resizer.d.ts | 27 +++ .../dsl-editor/dsl-editor.component.d.ts | 30 +++ dist/out-tsc/editor/editor-utils.d.ts | 5 + dist/out-tsc/editor/editor.component.d.ts | 180 ++++++++++++++++++ dist/out-tsc/index.d.ts | 11 ++ dist/out-tsc/module.d.ts | 2 + dist/out-tsc/palette/palette.component.d.ts | 51 +++++ .../properties/df.property.component.d.ts | 10 + .../properties.group.component.d.ts | 9 + dist/out-tsc/shared/flo-common.d.ts | 179 +++++++++++++++++ dist/out-tsc/shared/flo-properties.d.ts | 125 ++++++++++++ dist/out-tsc/shared/shapes.d.ts | 48 +++++ dist/out-tsc/spring-flo.d.ts | 4 + dist/out-tsc/spring-flo.metadata.json | 1 + 16 files changed, 734 insertions(+), 1 deletion(-) create mode 100644 dist/out-tsc/code-editor/code-editor.component.d.ts create mode 100644 dist/out-tsc/directives/resizer.d.ts create mode 100644 dist/out-tsc/dsl-editor/dsl-editor.component.d.ts create mode 100644 dist/out-tsc/editor/editor-utils.d.ts create mode 100644 dist/out-tsc/editor/editor.component.d.ts create mode 100644 dist/out-tsc/index.d.ts create mode 100644 dist/out-tsc/module.d.ts create mode 100644 dist/out-tsc/palette/palette.component.d.ts create mode 100644 dist/out-tsc/properties/df.property.component.d.ts create mode 100644 dist/out-tsc/properties/properties.group.component.d.ts create mode 100644 dist/out-tsc/shared/flo-common.d.ts create mode 100644 dist/out-tsc/shared/flo-properties.d.ts create mode 100644 dist/out-tsc/shared/shapes.d.ts create mode 100644 dist/out-tsc/spring-flo.d.ts create mode 100644 dist/out-tsc/spring-flo.metadata.json diff --git a/.gitignore b/.gitignore index 3cf2312..34b32f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ node_modules/ -out-tsc/ debug.log npm-debug.log src/**/*.js diff --git a/dist/out-tsc/code-editor/code-editor.component.d.ts b/dist/out-tsc/code-editor/code-editor.component.d.ts new file mode 100644 index 0000000..2bb359e --- /dev/null +++ b/dist/out-tsc/code-editor/code-editor.component.d.ts @@ -0,0 +1,52 @@ +import { ElementRef, OnInit, OnDestroy } from '@angular/core'; +import { ControlValueAccessor } from '@angular/forms'; +import 'codemirror-minified/mode/meta'; +import 'codemirror-minified/addon/lint/lint'; +import 'codemirror-minified/addon/hint/show-hint'; +import 'codemirror-minified/addon/edit/matchbrackets'; +import 'codemirror-minified/addon/edit/closebrackets'; +import 'codemirror-minified/addon/display/placeholder'; +import 'codemirror-minified/addon/scroll/annotatescrollbar'; +import 'codemirror-minified/addon/scroll/simplescrollbars'; +import 'codemirror-minified/addon/lint/javascript-lint'; +import 'codemirror-minified/addon/lint/coffeescript-lint'; +import 'codemirror-minified/addon/lint/json-lint'; +import 'codemirror-minified/addon/lint/yaml-lint'; +import 'codemirror-minified/mode/groovy/groovy'; +import 'codemirror-minified/mode/javascript/javascript'; +import 'codemirror-minified/mode/python/python'; +import 'codemirror-minified/mode/ruby/ruby'; +import 'codemirror-minified/mode/clike/clike'; +import 'codemirror-minified/mode/yaml/yaml'; +import 'codemirror-minified/mode/coffeescript/coffeescript'; +export declare class CodeEditorComponent implements OnInit, OnDestroy, ControlValueAccessor { + private element; + private doc; + private _dsl; + private _lint; + private _language; + private errorRuler; + private warningRuler; + private _onChangeHandler; + private _onTouchHandler; + private lineNumbers; + private lineWrapping; + private scrollbarStyle; + private placeholder; + private overviewRuler; + private dslChange; + private focus; + private blur; + private editor; + private _dslChangedHandler; + constructor(element: ElementRef); + dsl: string; + language: string; + ngOnInit(): void; + private loadEditorMode; + ngOnDestroy(): void; + writeValue(obj: any): void; + registerOnChange(fn: (_: any) => void): void; + registerOnTouched(fn: () => void): void; + private getLintOptions; +} diff --git a/dist/out-tsc/directives/resizer.d.ts b/dist/out-tsc/directives/resizer.d.ts new file mode 100644 index 0000000..376e2b5 --- /dev/null +++ b/dist/out-tsc/directives/resizer.d.ts @@ -0,0 +1,27 @@ +import { EventEmitter, ElementRef, OnInit, OnDestroy } from '@angular/core'; +export declare class ResizerDirective implements OnInit, OnDestroy { + private element; + private document; + private dragInProgress; + private vertical; + private first; + private second; + private _size; + private _splitSize; + private _subscriptions; + maxSplitSize: number; + sizeChange: EventEmitter; + private mouseMoveHandler; + splitSize: number; + resizerWidth: number; + resizerHeight: number; + resizerLeft: string; + resizerTop: string; + resizerRight: string; + resizerBottom: string; + constructor(element: ElementRef, document: any); + startDrag(): void; + private mousemove; + ngOnInit(): void; + ngOnDestroy(): void; +} diff --git a/dist/out-tsc/dsl-editor/dsl-editor.component.d.ts b/dist/out-tsc/dsl-editor/dsl-editor.component.d.ts new file mode 100644 index 0000000..fcb1229 --- /dev/null +++ b/dist/out-tsc/dsl-editor/dsl-editor.component.d.ts @@ -0,0 +1,30 @@ +import { ElementRef, OnInit, OnDestroy } from '@angular/core'; +import * as CodeMirror from 'codemirror-minified'; +import 'codemirror-minified/addon/lint/lint'; +import 'codemirror-minified/addon/hint/show-hint'; +import 'codemirror-minified/addon/display/placeholder'; +import 'codemirror-minified/addon/scroll/annotatescrollbar'; +import 'codemirror-minified/addon/scroll/simplescrollbars'; +export declare class DslEditorComponent implements OnInit, OnDestroy { + private element; + private doc; + private _dsl; + private _lint; + private _hint; + private lineNumbers; + private lineWrapping; + private scrollbarStyle; + private placeholder; + private debounce; + private dslChange; + private focus; + private blur; + private editor; + private _dslChangedHandler; + constructor(element: ElementRef); + dsl: string; + lintOptions: boolean | CodeMirror.LintOptions; + hintOptions: any; + ngOnInit(): void; + ngOnDestroy(): void; +} diff --git a/dist/out-tsc/editor/editor-utils.d.ts b/dist/out-tsc/editor/editor-utils.d.ts new file mode 100644 index 0000000..3d5c091 --- /dev/null +++ b/dist/out-tsc/editor/editor-utils.d.ts @@ -0,0 +1,5 @@ +import { dia } from 'jointjs'; +export declare class Utils { + static fanRoute(graph: dia.Graph, cell: dia.Cell): void; + static isCustomPaperEvent(args: any): boolean; +} diff --git a/dist/out-tsc/editor/editor.component.d.ts b/dist/out-tsc/editor/editor.component.d.ts new file mode 100644 index 0000000..9748bd8 --- /dev/null +++ b/dist/out-tsc/editor/editor.component.d.ts @@ -0,0 +1,180 @@ +import { ElementRef, EventEmitter, OnInit, OnDestroy } from '@angular/core'; +import { dia } from 'jointjs'; +import { Flo } from '../shared/flo-common'; +export interface VisibilityState { + visibility: string; + children: Array; +} +export declare class EditorComponent implements OnInit, OnDestroy { + private element; + /** + * Joint JS Graph object representing the Graph model + */ + private graph; + /** + * Joint JS Paper object representing the canvas control containing the graph view + */ + private paper; + /** + * Currently selected element + */ + private _selection; + /** + * Current DnD descriptor for frag in progress + */ + private highlighted; + /** + * Flag specifying whether the Flo-Editor is in read-only mode. + */ + private _readOnlyCanvas; + /** + * Grid size + */ + private _gridSize; + private _hiddenPalette; + private editorContext; + private textToGraphEventEmitter; + private graphToTextEventEmitter; + private _graphToTextSyncEnabled; + private validationEventEmitter; + private _disposables; + private _dslText; + private textToGraphConversionCompleted; + private graphToTextConversionCompleted; + private paletteReady; + /** + * Metamodel. Retrieves metadata about elements that can be shown in Flo + */ + metamodel: Flo.Metamodel; + /** + * Renders elements. + */ + renderer: Flo.Renderer; + /** + * Editor. Provides domain specific editing capabilities on top of standard Flo features + */ + editor: Flo.Editor; + /** + * Size (Width) of the palette + */ + paletteSize: number; + /** + * Min zoom percent value + */ + minZoom: number; + /** + * Max zoom percent value + */ + maxZoom: number; + /** + * Zoom percent increment/decrement step + */ + zoomStep: number; + paperPadding: number; + floApi: EventEmitter; + validationMarkers: EventEmitter>; + contentValidated: EventEmitter; + private dslChange; + private _resizeHandler; + constructor(element: ElementRef); + ngOnInit(): void; + ngOnDestroy(): void; + noPalette: boolean; + graphToTextSync: boolean; + private performGraphToTextSyncing; + createHandle(element: dia.CellView, kind: string, action: () => void, location: dia.Point): dia.Element; + removeEmbeddedChildrenOfType(element: dia.Cell, types: Array): void; + selection: dia.CellView; + readOnlyCanvas: boolean; + /** + * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + showDragFeedback(dragDescriptor: Flo.DnDDescriptor): void; + /** + * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + hideDragFeedback(dragDescriptor: Flo.DnDDescriptor): void; + /** + * Sets the new DnD info object - the descriptor for DnD + * + * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is + * being dragged over at the moment (drop target) + */ + setDragDescriptor(dragDescriptor?: Flo.DnDDescriptor): void; + /** + * Handles DnD events when a node is being dragged over canvas + * + * @param draggedView The Joint JS view object being dragged + * @param targetUnderMouse The Joint JS view under mouse cursor + * @param x X coordinate of the mouse on the canvas + * @param y Y coordinate of the mosue on the canvas + * @param context DnD context (palette or canvas) + */ + handleNodeDragging(draggedView: dia.CellView, targetUnderMouse: dia.CellView, x: number, y: number, sourceComponent: string): void; + /** + * Handles DnD drop event when a node is being dragged and dropped on the main canvas + */ + handleNodeDropping(): void; + /** + * Hides DOM Node (used to determine drop target DOM element) + * @param domNode DOM node to hide + * @returns + */ + private _hideNode; + /** + * Restored DOM node original visibility (used to determine drop target DOM element) + * @param domNode DOM node to restore visibility of + * @param oldVisibility original visibility parameter + */ + _restoreNodeVisibility(domNode: HTMLElement, oldVisibility: VisibilityState): void; + /** + * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. + * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location + * (bounding box of a link for testing is bad). + * The result of that is that links can only be the drop target when dragging from the palette currently. + * When DnDing shapes on the canvas drop target cannot be a link. + * + * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked + * - e.g. Drag-n-Drop) + */ + getTargetViewFromEvent(event: MouseEvent, x: number, y: number, excludeViews?: Array): dia.CellView; + handleDnDFromPalette(dndEvent: Flo.DnDEvent): void; + handleDragFromPalette(dnDEvent: Flo.DnDEvent): void; + createNode(metadata: Flo.ElementMetadata, props: Map, position: dia.Point): dia.Element; + createLink(source: Flo.LinkEnd, target: Flo.LinkEnd, metadata: Flo.ElementMetadata, props: Map): dia.Link; + handleDropFromPalette(event: Flo.DnDEvent): void; + private fitToContent; + autosizePaper(): void; + fitToPage(): void; + zoomPercent: number; + gridSize: number; + validateContent(): Promise; + markElement(cell: dia.Cell, markers: Array): void; + doLayout(): Promise; + dsl: string; + /** + * Ask the server to parse the supplied text into a JSON graph of nodes and links, + * then update the view based on that new information. + */ + updateGraphRepresentation(): Promise; + updateTextRepresentation(): Promise; + initMetamodel(): void; + initGraph(): void; + handleNodeCreation(node: dia.Element): void; + /** + * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples + * are 'change:source', 'change:target'. + */ + handleLinkEvent(event: string, link: dia.Link): void; + handleLinkCreation(link: dia.Link): void; + initGraphListeners(): void; + initPaperListeners(): void; + initPaper(): void; + updatePaletteReadyState(ready: boolean): void; +} diff --git a/dist/out-tsc/index.d.ts b/dist/out-tsc/index.d.ts new file mode 100644 index 0000000..af70569 --- /dev/null +++ b/dist/out-tsc/index.d.ts @@ -0,0 +1,11 @@ +export { FloModule } from './module'; +export { Palette } from './palette/palette.component'; +export { EditorComponent } from './editor/editor.component'; +export { DslEditorComponent } from './dsl-editor/dsl-editor.component'; +export { CodeEditorComponent } from './code-editor/code-editor.component'; +export { PropertiesGroupComponent } from './properties/properties.group.component'; +export { DynamicFormPropertyComponent } from './properties/df.property.component'; +export { ResizerDirective } from './directives/resizer'; +export * from './shared/flo-common'; +export * from './shared/flo-properties'; +export * from './shared/shapes'; diff --git a/dist/out-tsc/module.d.ts b/dist/out-tsc/module.d.ts new file mode 100644 index 0000000..0071cea --- /dev/null +++ b/dist/out-tsc/module.d.ts @@ -0,0 +1,2 @@ +export declare class FloModule { +} diff --git a/dist/out-tsc/palette/palette.component.d.ts b/dist/out-tsc/palette/palette.component.d.ts new file mode 100644 index 0000000..955d06a --- /dev/null +++ b/dist/out-tsc/palette/palette.component.d.ts @@ -0,0 +1,51 @@ +import { ElementRef, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core'; +import { dia } from 'jointjs'; +import { Flo } from '../shared/flo-common'; +export declare class Palette implements OnInit, OnDestroy, OnChanges { + private element; + private document; + private _metamodelListener; + /** + * The names of any groups in the palette that have been deliberately closed (the arrow clicked on) + */ + private closedGroups; + /** + * Model of the clicked element + */ + private clickedElement; + private viewBeingDragged; + private initialized; + private _paletteSize; + private _filterText; + private paletteGraph; + private palette; + private floaterpaper; + private filterTextModel; + metamodel: Flo.Metamodel; + renderer: Flo.Renderer; + paletteEntryPadding: dia.Size; + onPaletteEntryDrop: EventEmitter; + paletteReady: EventEmitter; + paletteFocus: EventEmitter; + private mouseMoveHanlder; + private mouseUpHanlder; + paletteSize: number; + constructor(element: ElementRef, document: any); + onFocus(): void; + ngOnInit(): void; + ngOnDestroy(): void; + ngOnChanges(changes: SimpleChanges): void; + private createPaletteGroup; + private createPaletteEntry; + private buildPalette; + rebuildPalette(): void; + filterText: string; + private getPaletteView; + private handleMouseUp; + private trigger; + private handleDrag; + private rotateOpen; + private doRotateOpen; + private doRotateClose; + private rotateClosed; +} diff --git a/dist/out-tsc/properties/df.property.component.d.ts b/dist/out-tsc/properties/df.property.component.d.ts new file mode 100644 index 0000000..c5923dc --- /dev/null +++ b/dist/out-tsc/properties/df.property.component.d.ts @@ -0,0 +1,10 @@ +import { FormGroup, AbstractControl } from '@angular/forms'; +import { Properties } from '../shared/flo-properties'; +export declare class DynamicFormPropertyComponent { + model: Properties.ControlModel; + form: FormGroup; + constructor(); + readonly types: typeof Properties.InputType; + readonly control: AbstractControl; + readonly errorData: Properties.ErrorData[]; +} diff --git a/dist/out-tsc/properties/properties.group.component.d.ts b/dist/out-tsc/properties/properties.group.component.d.ts new file mode 100644 index 0000000..4d310bb --- /dev/null +++ b/dist/out-tsc/properties/properties.group.component.d.ts @@ -0,0 +1,9 @@ +import { OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { Properties } from '../shared/flo-properties'; +export declare class PropertiesGroupComponent implements OnInit { + propertiesGroupModel: Properties.PropertiesGroupModel; + form: FormGroup; + ngOnInit(): void; + createGroupControls(): void; +} diff --git a/dist/out-tsc/shared/flo-common.d.ts b/dist/out-tsc/shared/flo-common.d.ts new file mode 100644 index 0000000..9fcba14 --- /dev/null +++ b/dist/out-tsc/shared/flo-common.d.ts @@ -0,0 +1,179 @@ +import { dia, g } from 'jointjs'; +import { Observable } from 'rxjs'; +export declare namespace Flo { + const joint: any; + enum DnDEventType { + DRAG = 0, + DROP = 1 + } + interface DnDEvent { + type: DnDEventType; + view: dia.CellView; + event: MouseEvent; + } + interface PropertyMetadata { + readonly id: string; + readonly name: string; + readonly description?: string; + readonly defaultValue?: any; + readonly type?: string; + readonly [propName: string]: any; + } + interface ExtraMetadata { + readonly titleProperty?: string; + readonly noEditableProps?: boolean; + readonly noPaletteEntry?: boolean; + readonly unselectable?: boolean; + readonly [propName: string]: any; + readonly allowAdditionalProperties?: boolean; + } + interface ElementMetadata { + readonly name: string; + readonly group: string; + readonly metadata?: ExtraMetadata; + readonly [propName: string]: any; + description?(): Promise; + get(property: String): Promise; + properties(): Promise>; + } + interface ViewerDescriptor { + readonly graph?: dia.Graph; + readonly paper?: dia.Paper; + } + interface MetamodelListener { + metadataError(data: any): void; + metadataAboutToChange(): void; + metadataChanged(): void; + } + interface Metamodel { + textToGraph(flo: EditorContext, dsl: string): Promise; + graphToText(flo: EditorContext): Promise; + load(): Promise>>; + groups(): Array; + refresh?(): Promise>>; + subscribe?(listener: MetamodelListener): void; + unsubscribe?(listener: MetamodelListener): void; + isValidPropertyValue?(element: dia.Element, property: string, value: any): boolean; + } + interface CreationParams { + metadata?: ElementMetadata; + props?: Map; + } + interface ElementCreationParams extends CreationParams { + position?: dia.Point; + } + interface LinkCreationParams extends CreationParams { + source: string; + target: string; + } + interface EmbeddedChildCreationParams extends CreationParams { + parent: dia.Cell; + position?: dia.Point; + } + interface DecorationCreationParams extends EmbeddedChildCreationParams { + kind: string; + messages: Array; + } + interface HandleCreationParams extends EmbeddedChildCreationParams { + kind: string; + } + interface Renderer { + createNode?(metadata: ElementMetadata, props?: Map): dia.Element; + createLink?(source: LinkEnd, target: LinkEnd, metadata?: ElementMetadata, props?: Map): dia.Link; + createHandle?(kind: string, parent: dia.Cell): dia.Element; + createDecoration?(kind: string, parent: dia.Cell): dia.Element; + initializeNewNode?(node: dia.Element, viewerDescriptor: ViewerDescriptor): void; + initializeNewLink?(link: dia.Link, viewerDescriptor: ViewerDescriptor): void; + initializeNewHandle?(handle: dia.Element, viewerDescriptor: ViewerDescriptor): void; + initializeNewDecoration?(decoration: dia.Element, viewerDescriptor: ViewerDescriptor): void; + getNodeView?(): dia.ElementView; + getLinkView?(): dia.LinkView; + layout?(paper: dia.Paper): Promise; + handleLinkEvent?(context: EditorContext, event: string, link: dia.Link): void; + isSemanticProperty?(propertyPath: string, element: dia.Cell): boolean; + refreshVisuals?(cell: dia.Cell, propertyPath: string, paper: dia.Paper): void; + getLinkAnchorPoint?(linkView: dia.LinkView, view: dia.ElementView, port: SVGElement, reference: dia.Point): dia.Point; + } + interface EditorContext { + readonly textToGraphConversionObservable: Observable; + readonly graphToTextConversionObservable: Observable; + readonly paletteReady: Observable; + zoomPercent: number; + gridSize: number; + readOnlyCanvas: boolean; + selection: dia.CellView; + graphToTextSync: boolean; + noPalette: boolean; + setDsl(dsl: string): void; + updateGraph(): Promise; + updateText(): Promise; + performLayout(): Promise; + clearGraph(): Promise; + getGraph(): dia.Graph; + getPaper(): dia.Paper; + getMinZoom(): number; + getMaxZoom(): number; + getZoomStep(): number; + fitToPage(): void; + createNode(metadata: ElementMetadata, props?: Map, position?: dia.Point): dia.Element; + createLink(source: LinkEnd, target: LinkEnd, metadata?: ElementMetadata, props?: Map): dia.Link; + deleteSelectedNode(): void; + [propName: string]: any; + } + interface LinkEndDescriptor { + view: dia.CellView; + cssClassSelector?: string; + } + interface DnDDescriptor { + sourceComponent?: string; + range?: number; + source?: LinkEndDescriptor; + target?: LinkEndDescriptor; + } + interface LinkEnd { + id: string | number; + selector?: string; + port?: string; + } + enum Severity { + Error = 0, + Warning = 1 + } + interface Marker { + severity: Severity; + message: string; + range?: Range; + } + interface Position { + ch: number; + line: number; + } + interface Range { + start: Position; + end: Position; + } + interface Editor { + interactive?: ((cellView: dia.CellView, event: string) => boolean) | boolean | dia.CellView.InteractivityOptions; + allowLinkVertexEdit?: boolean; + highlighting?: any; + createHandles?(context: EditorContext, createHandle: (owner: dia.CellView, kind: string, action: () => void, location: dia.Point) => void, owner: dia.CellView): void; + validatePort?(context: EditorContext, view: dia.CellView, magnet: SVGElement): boolean; + validateLink?(context: EditorContext, cellViewS: dia.CellView, portS: SVGElement, cellViewT: dia.CellView, portT: SVGElement, isSource: boolean, linkView: dia.LinkView): boolean; + calculateDragDescriptor?(context: EditorContext, draggedView: dia.CellView, targetUnderMouse: dia.CellView, coordinate: g.Point, sourceComponent: string): DnDDescriptor; + handleNodeDropping?(context: EditorContext, dragDescriptor: DnDDescriptor): void; + showDragFeedback?(context: EditorContext, dragDescriptor: DnDDescriptor): void; + hideDragFeedback?(context: EditorContext, dragDescriptor: DnDDescriptor): void; + validate?(graph: dia.Graph, dsl: string, flo: EditorContext): Promise>>; + preDelete?(context: EditorContext, deletedElement: dia.Cell): void; + setDefaultContent?(editorContext: EditorContext, data: Map>): void; + } + function findMagnetByClass(view: dia.CellView, className: string): SVGElement | undefined; + function findMagnetByPort(view: dia.CellView, port: string): SVGElement | undefined; + /** + * Return the metadata for a particular palette entry in a particular group. + * @param name - name of the palette entry + * @param group - group in which the palette entry should exist (e.g. sinks) + * @return + */ + function getMetadata(metamodel: Map>, name: string, group: string): ElementMetadata | undefined; +} diff --git a/dist/out-tsc/shared/flo-properties.d.ts b/dist/out-tsc/shared/flo-properties.d.ts new file mode 100644 index 0000000..17b3497 --- /dev/null +++ b/dist/out-tsc/shared/flo-properties.d.ts @@ -0,0 +1,125 @@ +import { dia } from 'jointjs'; +import { ValidatorFn, AsyncValidatorFn } from '@angular/forms'; +import { Flo } from './flo-common'; +import { Subject, Observable } from 'rxjs'; +export declare namespace Properties { + enum InputType { + TEXT = 0, + NUMBER = 1, + SELECT = 2, + CHECKBOX = 3, + PASSWORD = 4, + EMAIL = 5, + URL = 6, + CODE = 7 + } + interface Property { + readonly id: string; + readonly name: string; + readonly type?: string; + readonly description?: string; + readonly defaultValue?: any; + value?: any; + readonly valueOptions?: any[]; + readonly [propName: string]: any; + } + interface SelectOption { + name: string; + value: any; + } + interface ErrorData { + id: string; + message: string; + } + interface Validation { + validator?: ValidatorFn | ValidatorFn[] | null; + asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null; + errorData?: Array; + } + interface ControlModel { + readonly type: InputType; + readonly id: string; + value: T; + readonly defaultValue: T; + readonly name?: string; + readonly description?: string; + readonly property: Property; + readonly validation?: Validation; + } + interface CodeControlModel extends ControlModel { + readonly language: string; + } + class GenericControlModel implements ControlModel { + private _property; + type: InputType; + validation?: Validation; + constructor(_property: Property, type: InputType, validation?: Validation); + readonly id: string; + readonly name: string; + readonly description: string; + readonly defaultValue: any; + value: T; + readonly property: Property; + protected setValue(value: T): void; + protected getValue(): T; + } + class CheckBoxControlModel extends GenericControlModel { + constructor(_property: Property, validation?: Validation); + protected getValue(): any; + } + abstract class AbstractCodeControlModel extends GenericControlModel implements CodeControlModel { + private encode?; + private decode?; + abstract language: string; + constructor(_property: Property, encode?: (s: string) => string, decode?: (s: string) => string, validation?: Validation); + value: string; + } + class GenericCodeControlModel extends AbstractCodeControlModel { + language: string; + constructor(_property: Property, language: string, encode?: (s: string) => string, decode?: (s: string) => string, validation?: Validation); + } + class CodeControlModelWithDynamicLanguageProperty extends AbstractCodeControlModel { + private _languagePropertyName; + private _groupModel; + private _langControlModel; + constructor(_property: Properties.Property, _languagePropertyName: string, _groupModel: Properties.PropertiesGroupModel, encode?: (s: string) => string, decode?: (s: string) => string, validation?: Validation); + readonly language: string; + readonly languageControlModel: Properties.ControlModel; + } + class GenericListControlModel extends GenericControlModel { + constructor(property: Property, validation?: Validation); + value: string; + } + class SelectControlModel extends GenericControlModel { + options: Array; + constructor(_property: Property, type: InputType, options: Array); + } + interface PropertiesSource { + getProperties(): Promise; + applyChanges(properties: Property[]): void; + } + class DefaultCellPropertiesSource implements PropertiesSource { + protected cell: dia.Cell; + constructor(cell: dia.Cell); + getProperties(): Promise>; + protected createProperty(metadata: Flo.PropertyMetadata): Property; + applyChanges(properties: Property[]): void; + } + class PropertiesGroupModel { + protected propertiesSource: PropertiesSource; + protected controlModels: Array>; + protected loading: boolean; + protected _loadedSubject: Subject; + constructor(propertiesSource: PropertiesSource); + load(): void; + readonly isLoading: boolean; + readonly loadedSubject: Subject; + getControlsModels(): ControlModel[]; + protected createControlModel(property: Property): ControlModel; + applyChanges(): void; + } + namespace Validators { + function uniqueResource(service: (value: any) => Observable, debounce: number): AsyncValidatorFn; + function noneOf(excluded: Array): ValidatorFn; + } +} diff --git a/dist/out-tsc/shared/shapes.d.ts b/dist/out-tsc/shared/shapes.d.ts new file mode 100644 index 0000000..142af21 --- /dev/null +++ b/dist/out-tsc/shared/shapes.d.ts @@ -0,0 +1,48 @@ +import { dia } from 'jointjs'; +import { Flo } from './flo-common'; +export declare namespace Constants { + const REMOVE_HANDLE_TYPE = "remove"; + const PROPERTIES_HANDLE_TYPE = "properties"; + const ERROR_DECORATION_KIND = "error"; + const PALETTE_CONTEXT = "palette"; + const CANVAS_CONTEXT = "canvas"; + const FEEDBACK_CONTEXT = "feedback"; +} +export declare namespace Shapes { + interface CreationParams extends Flo.CreationParams { + renderer?: Flo.Renderer; + paper?: dia.Paper; + graph?: dia.Graph; + } + interface ElementCreationParams extends CreationParams { + position?: dia.Point; + } + interface LinkCreationParams extends CreationParams { + source: Flo.LinkEnd; + target: Flo.LinkEnd; + } + interface EmbeddedChildCreationParams extends CreationParams { + parent: dia.Cell; + position?: dia.Point; + } + interface DecorationCreationParams extends EmbeddedChildCreationParams { + kind: string; + messages: Array; + } + interface HandleCreationParams extends EmbeddedChildCreationParams { + kind: string; + } + interface FilterOptions { + amount: number; + [propName: string]: any; + } + class Factory { + /** + * Create a JointJS node that embeds extra metadata (properties). + */ + static createNode(params: ElementCreationParams): dia.Element; + static createLink(params: LinkCreationParams): dia.Link; + static createDecoration(params: DecorationCreationParams): dia.Element; + static createHandle(params: HandleCreationParams): dia.Element; + } +} diff --git a/dist/out-tsc/spring-flo.d.ts b/dist/out-tsc/spring-flo.d.ts new file mode 100644 index 0000000..67ff29a --- /dev/null +++ b/dist/out-tsc/spring-flo.d.ts @@ -0,0 +1,4 @@ +/** + * Generated bundle index. Do not edit. + */ +export * from './index'; diff --git a/dist/out-tsc/spring-flo.metadata.json b/dist/out-tsc/spring-flo.metadata.json new file mode 100644 index 0000000..688daff --- /dev/null +++ b/dist/out-tsc/spring-flo.metadata.json @@ -0,0 +1 @@ +{"__symbolic":"module","version":4,"exports":[{"from":"./shared/flo-common"},{"from":"./shared/flo-properties"},{"from":"./shared/shapes"}],"metadata":{"FloModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":12,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@angular/forms","name":"FormsModule","line":14,"character":4},{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":15,"character":4},{"__symbolic":"reference","module":"@angular/forms","name":"ReactiveFormsModule","line":16,"character":4}],"declarations":[{"__symbolic":"reference","name":"Palette"},{"__symbolic":"reference","name":"EditorComponent"},{"__symbolic":"reference","name":"ResizerDirective"},{"__symbolic":"reference","name":"DslEditorComponent"},{"__symbolic":"reference","name":"CodeEditorComponent"},{"__symbolic":"reference","name":"PropertiesGroupComponent"},{"__symbolic":"reference","name":"DynamicFormPropertyComponent"}],"exports":[{"__symbolic":"reference","name":"EditorComponent"},{"__symbolic":"reference","name":"DslEditorComponent"},{"__symbolic":"reference","name":"DynamicFormPropertyComponent"},{"__symbolic":"reference","name":"PropertiesGroupComponent"}]}]}],"members":{}},"Palette":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":37,"character":1},"arguments":[{"selector":"flo-palette","template":"\n
\n \n
\n
\n
\n
\n ","styles":["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":109,"character":17},"member":"None"}}]}],"members":{"metamodel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":145,"character":3}}]}],"renderer":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":148,"character":3}}]}],"paletteEntryPadding":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":151,"character":3}}]}],"onPaletteEntryDrop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":154,"character":3}}]}],"paletteReady":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":157,"character":3}}]}],"paletteFocus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":160,"character":3}}]}],"paletteSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":166,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":175,"character":44},"arguments":[{"__symbolic":"reference","module":"@angular/platform-browser","name":"DOCUMENT","line":175,"character":51}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":175,"character":31},{"__symbolic":"reference","name":"any"}]}],"onFocus":[{"__symbolic":"method"}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"createPaletteGroup":[{"__symbolic":"method"}],"createPaletteEntry":[{"__symbolic":"method"}],"buildPalette":[{"__symbolic":"method"}],"rebuildPalette":[{"__symbolic":"method"}],"getPaletteView":[{"__symbolic":"method"}],"handleMouseUp":[{"__symbolic":"method"}],"trigger":[{"__symbolic":"method"}],"handleDrag":[{"__symbolic":"method"}],"rotateOpen":[{"__symbolic":"method"}],"doRotateOpen":[{"__symbolic":"method"}],"doRotateClose":[{"__symbolic":"method"}],"rotateClosed":[{"__symbolic":"method"}]}},"EditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":20,"character":1},"arguments":[{"selector":"flo-editor","template":"\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ","styles":["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":693,"character":17},"member":"None"}}]}],"members":{"metamodel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":752,"character":3}}]}],"renderer":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":758,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":764,"character":3}}]}],"paletteSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":770,"character":3}}]}],"minZoom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":776,"character":3}}]}],"maxZoom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":782,"character":3}}]}],"zoomStep":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":788,"character":3}}]}],"paperPadding":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":791,"character":3}}]}],"floApi":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":794,"character":3}}]}],"validationMarkers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":797,"character":3}}]}],"contentValidated":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":800,"character":3}}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":803,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":808,"character":31}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"performGraphToTextSyncing":[{"__symbolic":"method"}],"createHandle":[{"__symbolic":"method"}],"removeEmbeddedChildrenOfType":[{"__symbolic":"method"}],"showDragFeedback":[{"__symbolic":"method"}],"hideDragFeedback":[{"__symbolic":"method"}],"setDragDescriptor":[{"__symbolic":"method"}],"handleNodeDragging":[{"__symbolic":"method"}],"handleNodeDropping":[{"__symbolic":"method"}],"_hideNode":[{"__symbolic":"method"}],"_restoreNodeVisibility":[{"__symbolic":"method"}],"getTargetViewFromEvent":[{"__symbolic":"method"}],"handleDnDFromPalette":[{"__symbolic":"method"}],"handleDragFromPalette":[{"__symbolic":"method"}],"createNode":[{"__symbolic":"method"}],"createLink":[{"__symbolic":"method"}],"handleDropFromPalette":[{"__symbolic":"method"}],"fitToContent":[{"__symbolic":"method"}],"autosizePaper":[{"__symbolic":"method"}],"fitToPage":[{"__symbolic":"method"}],"validateContent":[{"__symbolic":"method"}],"markElement":[{"__symbolic":"method"}],"doLayout":[{"__symbolic":"method"}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":1577,"character":3}}]}],"updateGraphRepresentation":[{"__symbolic":"method"}],"updateTextRepresentation":[{"__symbolic":"method"}],"initMetamodel":[{"__symbolic":"method"}],"initGraph":[{"__symbolic":"method"}],"handleNodeCreation":[{"__symbolic":"method"}],"handleLinkEvent":[{"__symbolic":"method"}],"handleLinkCreation":[{"__symbolic":"method"}],"initGraphListeners":[{"__symbolic":"method"}],"initPaperListeners":[{"__symbolic":"method"}],"initPaper":[{"__symbolic":"method"}],"updatePaletteReadyState":[{"__symbolic":"method"}]}},"DslEditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":13,"character":1},"arguments":[{"selector":"dsl-editor","template":"\n \n ","styles":["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":42,"character":17},"member":"None"}}]}],"members":{"lineNumbers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":54,"character":3},"arguments":["line-numbers"]}]}],"lineWrapping":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3},"arguments":["line-wrapping"]}]}],"scrollbarStyle":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3},"arguments":["scrollbar-style"]}]}],"placeholder":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":63,"character":3}}]}],"debounce":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":66,"character":3}}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":69,"character":3}}]}],"focus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":72,"character":3}}]}],"blur":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":75,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":78,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":86,"character":31}]}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":88,"character":3}}]}],"lintOptions":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":98,"character":3}}]}],"hintOptions":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":106,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}},"CodeEditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":35,"character":1},"arguments":[{"selector":"code-editor","template":"\n
\n \n
\n ","styles":["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":64,"character":17},"member":"None"},"providers":[{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":67,"character":15},"useExisting":{"__symbolic":"reference","name":"CodeEditorComponent"},"multi":true}]}]}],"members":{"lineNumbers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":91,"character":3},"arguments":["line-numbers"]}]}],"lineWrapping":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":94,"character":3},"arguments":["line-wrapping"]}]}],"scrollbarStyle":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":97,"character":3},"arguments":["scrollbar-style"]}]}],"placeholder":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":100,"character":3}}]}],"overviewRuler":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":103,"character":3},"arguments":["overview-ruler"]}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":106,"character":3}}]}],"focus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":109,"character":3}}]}],"blur":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":112,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":115,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":126,"character":31}]}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":128,"character":3}}]}],"language":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":138,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"loadEditorMode":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"registerOnChange":[{"__symbolic":"method"}],"registerOnTouched":[{"__symbolic":"method"}],"getLintOptions":[{"__symbolic":"method"}]}},"PropertiesGroupComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"properties-group","template":"\n
\n \n
\n ","encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":11,"character":17},"member":"None"}}]}],"members":{"propertiesGroupModel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":18,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"createGroupControls":[{"__symbolic":"method"}]}},"DynamicFormPropertyComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"df-property","template":"\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ","encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":54,"character":17},"member":"None"}}]}],"members":{"model":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":58,"character":3}}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":61,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor"}]}},"ResizerDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":9,"character":1},"arguments":[{"selector":"[resizer]","host":{"(mousedown)":"startDrag()","$quoted$":["(mousedown)"]}}]}],"members":{"maxSplitSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":21,"character":3}}]}],"sizeChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":24,"character":3}}]}],"splitSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"resizerWidth":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":72,"character":3}}]}],"resizerHeight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":78,"character":3}}]}],"resizerLeft":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":84,"character":3}}]}],"resizerTop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":89,"character":3}}]}],"resizerRight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":94,"character":3}}]}],"resizerBottom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":99,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":104,"character":44},"arguments":[{"__symbolic":"reference","module":"@angular/platform-browser","name":"DOCUMENT","line":104,"character":51}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":104,"character":31},{"__symbolic":"reference","name":"any"}]}],"startDrag":[{"__symbolic":"method"}],"mousemove":[{"__symbolic":"method"}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}}},"origins":{"FloModule":"./module","Palette":"./palette/palette.component","EditorComponent":"./editor/editor.component","DslEditorComponent":"./dsl-editor/dsl-editor.component","CodeEditorComponent":"./code-editor/code-editor.component","PropertiesGroupComponent":"./properties/properties.group.component","DynamicFormPropertyComponent":"./properties/df.property.component","ResizerDirective":"./directives/resizer"},"importAs":"spring-flo"} \ No newline at end of file From 60871534d6312617aa32d3bc5304d9ee38aa853f Mon Sep 17 00:00:00 2001 From: Haris khan Date: Tue, 25 Jun 2019 18:08:01 +0800 Subject: [PATCH 06/10] put back dist and out-tsc in git ignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 34b32f0..86be9b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ +dist/ node_modules/ +out-tsc/ debug.log npm-debug.log src/**/*.js From c8ef741b916f671842e5ad8495fc0cc1ff87d9f2 Mon Sep 17 00:00:00 2001 From: hakhan88 Date: Tue, 25 Jun 2019 18:11:38 +0800 Subject: [PATCH 07/10] Delete LICENSE --- dist/LICENSE | 202 --------------------------------------------------- 1 file changed, 202 deletions(-) delete mode 100644 dist/LICENSE diff --git a/dist/LICENSE b/dist/LICENSE deleted file mode 100644 index 62589ed..0000000 --- a/dist/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. From 4ed363b5eac8abab685984da2bf764126716bcd8 Mon Sep 17 00:00:00 2001 From: hakhan88 Date: Tue, 25 Jun 2019 18:12:07 +0800 Subject: [PATCH 08/10] Delete README.md --- dist/README.md | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 dist/README.md diff --git a/dist/README.md b/dist/README.md deleted file mode 100644 index f254ae1..0000000 --- a/dist/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Spring Flo - -[![macOS Build Status](https://travis-ci.org/spring-projects/spring-flo.svg?branch=master)](https://travis-ci.org/spring-projects/spring-flo) [![Dependency Status](https://david-dm.org/spring-projects/spring-flo.svg)](https://david-dm.org/spring-projects/spring-flo) - -Spring Flo is a JavaScript library that offers a basic embeddable HTML5 visual builder for pipelines and simple graphs. This library is used as the basis of the stream builder in Spring Cloud Data Flow. - -[![dataflow ui](docs/Flo.png)](https://cloud.spring.io/spring-cloud-dataflow/) - -Here is a [youtube video](https://www.youtube.com/watch?v=78CgV46OstI) of Spring Flo in action. - -## Consuming Spring Flo - -Refer to the [wiki](https://github.com/spring-projects/spring-flo/wiki) for more information on how to embed it in an application. - -## Build - -Spring Flo is built using NPM commands. Simplest way to build is via `npm run build` to build the project and run the tests (Prerequisite for th build is `npm install` executed before the build command is). Build results are produced under the __dist__ folder. - -## Getting Help - -If you have any questions, issues, feedback or feature request please [raise an issue](https://github.com/spring-projects/spring-flo/issues). - -## Samples - -A small self contained sample usage of Spring Flo is available in the [demo](https://github.com/spring-projects/spring-flo/tree/master/src/demo) sub folder. Execute `npm start` to run the sample. The [Spring Cloud Data Flow UI](https://github.com/spring-cloud/spring-cloud-dataflow-ui) at github shows a larger scale usage of Spring Flo. - -## Contributing - -Pull requests are welcome, but before accepting them we will need you to sign the [Contributors Agreement](https://support.springsource.com/spring_committer_signup). - -## License - -Spring Flo is Open Source software released under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0.html). From 477e2c28bf4c4a38d1f9037931a5c0404c6f662b Mon Sep 17 00:00:00 2001 From: Haris khan Date: Tue, 25 Jun 2019 18:13:12 +0800 Subject: [PATCH 09/10] put back dist and out-tsc in git ignore --- dist/bundles/spring-flo.umd.js | 3351 -------------- dist/bundles/spring-flo.umd.min.js | 1 - .../code-editor/code-editor.component.js | 249 -- dist/esm2015/directives/resizer.js | 161 - .../dsl-editor/dsl-editor.component.js | 168 - dist/esm2015/editor/editor-utils.js | 108 - dist/esm2015/editor/editor.component.js | 1778 -------- dist/esm2015/index.js | 12 - dist/esm2015/module.js | 39 - dist/esm2015/palette/palette.component.js | 511 --- .../properties/df.property.component.js | 82 - .../properties/properties.group.component.js | 50 - dist/esm2015/shared/flo-common.js | 57 - dist/esm2015/shared/flo-properties.js | 273 -- dist/esm2015/shared/shapes.js | 494 --- dist/esm2015/spring-flo.js | 5 - dist/esm2015/spring-flo.metadata.json | 1 - .../esm5/code-editor/code-editor.component.js | 237 - dist/esm5/directives/resizer.js | 192 - dist/esm5/dsl-editor/dsl-editor.component.js | 158 - dist/esm5/editor/editor-utils.js | 112 - dist/esm5/editor/editor.component.js | 1195 ----- dist/esm5/index.js | 12 - dist/esm5/module.js | 42 - dist/esm5/palette/palette.component.js | 460 -- dist/esm5/properties/df.property.component.js | 50 - .../properties/properties.group.component.js | 51 - dist/esm5/shared/flo-common.js | 57 - dist/esm5/shared/flo-properties.js | 345 -- dist/esm5/shared/shapes.js | 497 --- dist/esm5/spring-flo.js | 5 - dist/fesm2015/spring-flo.js | 3902 ----------------- dist/fesm5/spring-flo.js | 3326 -------------- .../code-editor/code-editor.component.d.ts | 52 - dist/out-tsc/directives/resizer.d.ts | 27 - .../dsl-editor/dsl-editor.component.d.ts | 30 - dist/out-tsc/editor/editor-utils.d.ts | 5 - dist/out-tsc/editor/editor.component.d.ts | 180 - dist/out-tsc/index.d.ts | 11 - dist/out-tsc/module.d.ts | 2 - dist/out-tsc/palette/palette.component.d.ts | 51 - .../properties/df.property.component.d.ts | 10 - .../properties.group.component.d.ts | 9 - dist/out-tsc/shared/flo-common.d.ts | 179 - dist/out-tsc/shared/flo-properties.d.ts | 125 - dist/out-tsc/shared/shapes.d.ts | 48 - dist/out-tsc/spring-flo.d.ts | 4 - dist/out-tsc/spring-flo.metadata.json | 1 - dist/package.json | 109 - 49 files changed, 18824 deletions(-) delete mode 100644 dist/bundles/spring-flo.umd.js delete mode 100644 dist/bundles/spring-flo.umd.min.js delete mode 100644 dist/esm2015/code-editor/code-editor.component.js delete mode 100644 dist/esm2015/directives/resizer.js delete mode 100644 dist/esm2015/dsl-editor/dsl-editor.component.js delete mode 100644 dist/esm2015/editor/editor-utils.js delete mode 100644 dist/esm2015/editor/editor.component.js delete mode 100644 dist/esm2015/index.js delete mode 100644 dist/esm2015/module.js delete mode 100644 dist/esm2015/palette/palette.component.js delete mode 100644 dist/esm2015/properties/df.property.component.js delete mode 100644 dist/esm2015/properties/properties.group.component.js delete mode 100644 dist/esm2015/shared/flo-common.js delete mode 100644 dist/esm2015/shared/flo-properties.js delete mode 100644 dist/esm2015/shared/shapes.js delete mode 100644 dist/esm2015/spring-flo.js delete mode 100644 dist/esm2015/spring-flo.metadata.json delete mode 100644 dist/esm5/code-editor/code-editor.component.js delete mode 100644 dist/esm5/directives/resizer.js delete mode 100644 dist/esm5/dsl-editor/dsl-editor.component.js delete mode 100644 dist/esm5/editor/editor-utils.js delete mode 100644 dist/esm5/editor/editor.component.js delete mode 100644 dist/esm5/index.js delete mode 100644 dist/esm5/module.js delete mode 100644 dist/esm5/palette/palette.component.js delete mode 100644 dist/esm5/properties/df.property.component.js delete mode 100644 dist/esm5/properties/properties.group.component.js delete mode 100644 dist/esm5/shared/flo-common.js delete mode 100644 dist/esm5/shared/flo-properties.js delete mode 100644 dist/esm5/shared/shapes.js delete mode 100644 dist/esm5/spring-flo.js delete mode 100644 dist/fesm2015/spring-flo.js delete mode 100644 dist/fesm5/spring-flo.js delete mode 100644 dist/out-tsc/code-editor/code-editor.component.d.ts delete mode 100644 dist/out-tsc/directives/resizer.d.ts delete mode 100644 dist/out-tsc/dsl-editor/dsl-editor.component.d.ts delete mode 100644 dist/out-tsc/editor/editor-utils.d.ts delete mode 100644 dist/out-tsc/editor/editor.component.d.ts delete mode 100644 dist/out-tsc/index.d.ts delete mode 100644 dist/out-tsc/module.d.ts delete mode 100644 dist/out-tsc/palette/palette.component.d.ts delete mode 100644 dist/out-tsc/properties/df.property.component.d.ts delete mode 100644 dist/out-tsc/properties/properties.group.component.d.ts delete mode 100644 dist/out-tsc/shared/flo-common.d.ts delete mode 100644 dist/out-tsc/shared/flo-properties.d.ts delete mode 100644 dist/out-tsc/shared/shapes.d.ts delete mode 100644 dist/out-tsc/spring-flo.d.ts delete mode 100644 dist/out-tsc/spring-flo.metadata.json delete mode 100644 dist/package.json diff --git a/dist/bundles/spring-flo.umd.js b/dist/bundles/spring-flo.umd.js deleted file mode 100644 index 726255f..0000000 --- a/dist/bundles/spring-flo.umd.js +++ /dev/null @@ -1,3351 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jointjs'), require('jquery'), require('lodash'), require('@angular/core'), require('rxjs'), require('rxjs/operators'), require('@angular/platform-browser'), require('ts-disposables'), require('codemirror-minified'), require('codemirror-minified/addon/lint/lint'), require('codemirror-minified/addon/hint/show-hint'), require('codemirror-minified/addon/display/placeholder'), require('codemirror-minified/addon/scroll/annotatescrollbar'), require('codemirror-minified/addon/scroll/simplescrollbars'), require('@angular/forms'), require('codemirror-minified/mode/meta'), require('codemirror-minified/addon/edit/matchbrackets'), require('codemirror-minified/addon/edit/closebrackets'), require('codemirror-minified/addon/lint/javascript-lint'), require('codemirror-minified/addon/lint/coffeescript-lint'), require('codemirror-minified/addon/lint/json-lint'), require('codemirror-minified/addon/lint/yaml-lint'), require('codemirror-minified/mode/groovy/groovy'), require('codemirror-minified/mode/javascript/javascript'), require('codemirror-minified/mode/python/python'), require('codemirror-minified/mode/ruby/ruby'), require('codemirror-minified/mode/clike/clike'), require('codemirror-minified/mode/yaml/yaml'), require('codemirror-minified/mode/coffeescript/coffeescript'), require('@angular/common')) : - typeof define === 'function' && define.amd ? define('spring-flo', ['exports', 'jointjs', 'jquery', 'lodash', '@angular/core', 'rxjs', 'rxjs/operators', '@angular/platform-browser', 'ts-disposables', 'codemirror-minified', 'codemirror-minified/addon/lint/lint', 'codemirror-minified/addon/hint/show-hint', 'codemirror-minified/addon/display/placeholder', 'codemirror-minified/addon/scroll/annotatescrollbar', 'codemirror-minified/addon/scroll/simplescrollbars', '@angular/forms', 'codemirror-minified/mode/meta', 'codemirror-minified/addon/edit/matchbrackets', 'codemirror-minified/addon/edit/closebrackets', 'codemirror-minified/addon/lint/javascript-lint', 'codemirror-minified/addon/lint/coffeescript-lint', 'codemirror-minified/addon/lint/json-lint', 'codemirror-minified/addon/lint/yaml-lint', 'codemirror-minified/mode/groovy/groovy', 'codemirror-minified/mode/javascript/javascript', 'codemirror-minified/mode/python/python', 'codemirror-minified/mode/ruby/ruby', 'codemirror-minified/mode/clike/clike', 'codemirror-minified/mode/yaml/yaml', 'codemirror-minified/mode/coffeescript/coffeescript', '@angular/common'], factory) : - (factory((global.ng = global.ng || {}, global.ng['spring-flo'] = {}),global.jointjs,global.jquery,global.lodash,global.ng.core,global.rxjs,global.rxjs.operators,global.ng.browser,global['ts-disposables'],global['codemirror-minified'],global['codemirror-minified/addon/lint/lint'],global['codemirror-minified/addon/hint/show-hint'],global['codemirror-minified/addon/edit/closebrackets'],global['codemirror-minified/addon/scroll/annotatescrollbar'],global['codemirror-minified/addon/scroll/simplescrollbars'],global.ng.forms,global['codemirror-minified/mode/meta'],global['codemirror-minified/addon/edit/matchbrackets'],global['codemirror-minified/addon/edit/closebrackets'],global['codemirror-minified/addon/lint/javascript-lint'],global['codemirror-minified/addon/lint/coffeescript-lint'],global['codemirror-minified/addon/lint/json-lint'],global['codemirror-minified/addon/lint/yaml-lint'],global['codemirror-minified/mode/groovy/groovy'],global['codemirror-minified/mode/javascript/javascript'],global['codemirror-minified/mode/python/python'],global['codemirror-minified/mode/ruby/ruby'],global['codemirror-minified/mode/clike/clike'],global['codemirror-minified/mode/yaml/yaml'],global['codemirror-minified/mode/coffeescript/coffeescript'],global.ng.common)); -}(this, (function (exports,_joint,_$,lodash,core,rxjs,operators,platformBrowser,tsDisposables,codemirrorMinified,lint,showHint,placeholder,annotatescrollbar,simplescrollbars,forms,meta,matchbrackets,closebrackets,javascriptLint,coffeescriptLint,jsonLint,yamlLint,groovy,javascript,python,ruby,clike,yaml,coffeescript,common) { 'use strict'; - - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. All rights reserved. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use - this file except in compliance with the License. You may obtain a copy of the - License at http://www.apache.org/licenses/LICENSE-2.0 - - THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED - WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, - MERCHANTABLITY OR NON-INFRINGEMENT. - - See the Apache Version 2.0 License for specific language governing permissions - and limitations under the License. - ***************************************************************************** */ - /* global Reflect, Promise */ - - var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - - function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - } - - function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } - } - - function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); - } - - var $ = _$; - - (function (Flo) { - Flo.joint = _joint; - var DnDEventType; - (function (DnDEventType) { - DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; - DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; - })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); - var Severity; - (function (Severity) { - Severity[Severity["Error"] = 0] = "Error"; - Severity[Severity["Warning"] = 1] = "Warning"; - })(Severity = Flo.Severity || (Flo.Severity = {})); - function findMagnetByClass(view, className) { - if (className && className.startsWith('.')) { - className = className.substr(1); - } - var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0; }); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByClass = findMagnetByClass; - function findMagnetByPort(view, port) { - var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('port') === port; }); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByPort = findMagnetByPort; - /** - * Return the metadata for a particular palette entry in a particular group. - * @param name - name of the palette entry - * @param group - group in which the palette entry should exist (e.g. sinks) - * @return - */ - function getMetadata(metamodel, name, group) { - var groupObj = metamodel && group ? metamodel.get(group) : undefined; - if (name && groupObj && groupObj.get(name)) { - return metamodel.get(group).get(name); - } - else { - return { - name: name, - group: group, - unresolved: true, - get: function (property) { return new Promise(function (resolve) { return resolve(); }); }, - properties: function () { return Promise.resolve(new Map()); } - }; - } - } - Flo.getMetadata = getMetadata; - })(exports.Flo || (exports.Flo = {})); - - var joint = exports.Flo.joint; - var $$1 = _$; - var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); - var isFF = navigator.userAgent.indexOf('Firefox') > 0; - var IMAGE_W = 120; - var IMAGE_H = 35; - var ERROR_MARKER_SIZE = { width: 16, height: 16 }; - var HANDLE_SIZE = { width: 10, height: 10 }; - joint.shapes.flo = {}; - joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; - joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; - joint.shapes.flo.DECORATION_TYPE = 'decoration'; - joint.shapes.flo.HANDLE_TYPE = 'handle'; - var HANDLE_ICON_MAP = new Map(); - var REMOVE = 'remove'; - HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); - var DECORATION_ICON_MAP = new Map(); - var ERROR = 'error'; - DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); - joint.util.cloneDeep = function (obj) { - return lodash.cloneDeepWith(obj, function (o) { - if (lodash.isObject(o) && !lodash.isPlainObject(o)) { - return o; - } - }); - }; - joint.util.filter.redscale = function (args) { - var amount = Number.isFinite(args.amount) ? args.amount : 1; - return lodash.template('', { - a: 1 - 0.96 * amount, - b: 0.95 * amount, - c: 0.01 * amount, - d: 0.3 * amount, - e: 0.2 * amount, - f: 1 - 0.9 * amount, - g: 0.7 * amount, - h: 0.05 * amount, - i: 0.05 * amount, - k: 1 - 0.1 * amount - }); - }; - joint.util.filter.orangescale = function (args) { - var amount = Number.isFinite(args.amount) ? args.amount : 1; - return lodash.template('', { - a: 1.0 + 0.5 * amount, - b: 1.4 * amount, - c: 0.2 * amount, - d: 0.3 * amount, - e: 0.3 * amount, - f: 1 + 0.05 * amount, - g: 0.2 * amount, - h: 0.15 * amount, - i: 0.3 * amount, - k: 0.3 * amount, - l: 1 - 0.6 * amount - }); - }; - joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ - markup: '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.NODE_TYPE, - position: { x: 0, y: 0 }, - size: { width: IMAGE_W, height: IMAGE_H }, - attrs: { - '.': { magnet: false }, - // rounded edges around image - '.border': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - 'fill-opacity': 0, - stroke: '#eeeeee', - 'stroke-width': 0 - }, - '.box': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - //'fill-opacity': 0, // see through - stroke: '#6db33f', - fill: '#eeeeee', - 'stroke-width': 1 - }, - '.input-port': { - port: 'input', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.output-port': { - port: 'output', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.label': { - 'text-anchor': 'middle', - 'ref-x': 0.5, - // 'ref-y': -12, // jointjs specific: relative position to ref'd element - 'ref-y': 0.3, - ref: '.border', - fill: 'black', - 'font-size': 14 - }, - '.label2': { - 'text': '\u21d2', - 'text-anchor': 'middle', - 'ref-x': 0.15, - 'ref-y': 0.2, - ref: '.border', - // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', - fill: 'black', - 'font-size': 24 - }, - '.shape': {}, - '.image': { - width: IMAGE_W, - height: IMAGE_H - } - } - }, joint.shapes.basic.Generic.prototype.defaults) - }); - joint.shapes.flo.Link = joint.dia.Link.extend({ - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.LINK_TYPE, - attrs: { - '.connection': { stroke: '#34302d', 'stroke-width': 2 }, - // Lots of alternatives that have been played with: - // '.smoooth': true - // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, - // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, - // '.connection': { 'stroke':'black'}, - // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, - // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, - // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) - // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, - // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, - // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, - // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, - '.marker-arrowheads': { display: 'none' }, - '.tool-options': { display: 'none' } - }, - }, joint.dia.Link.prototype.defaults) - }); - joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ - options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), - _beforeArrowheadMove: function () { - if (this.model.get('source').id) { - this._oldSource = this.model.get('source'); - } - if (this.model.get('target').id) { - this._oldTarget = this.model.get('target'); - } - joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); - }, - _afterArrowheadMove: function () { - joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); - if (!this.model.get('source').id) { - if (this._oldSource) { - this.model.set('source', this._oldSource); - } - else { - this.model.remove(); - } - } - if (!this.model.get('target').id) { - if (this._oldTarget) { - this.model.set('target', this._oldTarget); - } - else { - this.model.remove(); - } - } - delete this._oldSource; - delete this._oldTarget; - } - }); - // TODO: must do cleanup for the `mainElementView' - joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ - // canShowTooltip: true, - beingDragged: false, - // _tempZorder: 0, - _tempOpacity: 1.0, - _hovering: false, - dragLinkStart: function (evt, magnet, x, y) { - this.model.startBatch('add-link'); - var linkView = this.addLinkFromMagnet(magnet, x, y); - // backwards compatiblity events - joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); - linkView.notify('link:pointerdown', evt, x, y); - /*** START MAIN DIFF ***/ - var sourceOrTarget = $$1(magnet).attr('port') === 'input' ? 'source' : 'target'; - linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); - /*** END MAIN DIFF ***/ - this.eventData(evt, { linkView: linkView }); - }, - addLinkFromMagnet: function (magnet, x, y) { - var paper = this.paper; - var graph = paper.model; - var link = paper.getDefaultLink(this, magnet); - var sourceEnd, targetEnd; - /*** START MAIN DIFF ***/ - if ($$1(magnet).attr('port') === 'input') { - sourceEnd = { x: x, y: y }; - targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); - } - else { - sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); - targetEnd = { x: x, y: y }; - } - /*** END MAIN DIFF ***/ - link.set({ - source: sourceEnd, - target: targetEnd - }).addTo(graph, { - async: false, - ui: true - }); - return link.findView(paper); - }, - // pointerdown: function(evt: any, x: number, y: number) { - // // this.canShowTooltip = false; - // // this.hideTooltip(); - // this.beingDragged = false; - // this._tempOpacity = this.model.attr('./opacity'); - // - // this.model.trigger('batch:start'); - // - // if ( // target is a valid magnet start linking - // evt.target.getAttribute('magnet') && - // this.paper.options.validateMagnet.call(this.paper, this, evt.target) - // ) { - // let link = this.paper.getDefaultLink(this, evt.target); - // if ($(evt.target).attr('port') === 'input') { - // link.set({ - // source: { x: x, y: y }, - // target: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // } - // }); - // } else { - // link.set({ - // source: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // }, - // target: { x: x, y: y } - // }); - // } - // this.paper.model.addCell(link); - // this._linkView = this.paper.findViewByModel(link); - // if ($(evt.target).attr('port') === 'input') { - // this._linkView.startArrowheadMove('source'); - // } else { - // this._linkView.startArrowheadMove('target'); - // } - // this.paper.__creatingLinkFromPort = true; - // } else { - // this._dx = x; - // this._dy = y; - // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); - // } - // }, - drag: function (evt, x, y) { - var interactive = lodash.isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : - this.options.interactive; - if (interactive !== false) { - this.paper.trigger('dragging-node-over-canvas', { type: exports.Flo.DnDEventType.DRAG, view: this, event: evt }); - } - joint.dia.ElementView.prototype.drag.apply(this, arguments); - }, - dragEnd: function (evt, x, y) { - this.paper.trigger('dragging-node-over-canvas', { type: exports.Flo.DnDEventType.DROP, view: this, event: evt }); - joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); - }, - }); - joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ - markup: '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.DECORATION_TYPE, - size: ERROR_MARKER_SIZE, - attrs: { - 'image': ERROR_MARKER_SIZE - } - }, joint.shapes.basic.Generic.prototype.defaults) - }); - - (function (Constants) { - Constants.REMOVE_HANDLE_TYPE = REMOVE; - Constants.PROPERTIES_HANDLE_TYPE = 'properties'; - Constants.ERROR_DECORATION_KIND = ERROR; - Constants.PALETTE_CONTEXT = 'palette'; - Constants.CANVAS_CONTEXT = 'canvas'; - Constants.FEEDBACK_CONTEXT = 'feedback'; - })(exports.Constants || (exports.Constants = {})); - - (function (Shapes) { - var Factory = /** @class */ (function () { - function Factory() { - } - /** - * Create a JointJS node that embeds extra metadata (properties). - */ - Factory.createNode = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var metadata = params.metadata; - var position = params.position; - var props = params.props; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - var node; - if (!position) { - position = { x: 0, y: 0 }; - } - if (renderer && lodash.isFunction(renderer.createNode)) { - node = renderer.createNode(metadata, props); - } - else { - node = new joint.shapes.flo.Node(); - if (metadata) { - node.attr('.label/text', metadata.name); - } - } - node.set('type', joint.shapes.flo.NODE_TYPE); - if (position) { - node.set('position', position); - } - if (props) { - Array.from(props.keys()).forEach(function (key) { return node.attr("props/" + key, props.get(key)); }); - } - node.attr('metadata', metadata); - if (graph) { - graph.addCell(node); - } - if (renderer && lodash.isFunction(renderer.initializeNewNode)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewNode(node, descriptor); - } - return node; - }; - Factory.createLink = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var metadata = params.metadata; - var source = params.source; - var target = params.target; - var props = params.props; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - var link; - if (renderer && lodash.isFunction(renderer.createLink)) { - link = renderer.createLink(source, target, metadata, props); - } - else { - link = new joint.shapes.flo.Link(); - } - if (source) { - link.set('source', source); - } - if (target) { - link.set('target', target); - } - link.set('type', joint.shapes.flo.LINK_TYPE); - if (metadata) { - link.attr('metadata', metadata); - } - if (props) { - Array.from(props.keys()).forEach(function (key) { return link.attr("props/" + key, props.get(key)); }); - } - if (graph) { - graph.addCell(link); - } - if (renderer && lodash.isFunction(renderer.initializeNewLink)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewLink(link, descriptor); - } - // prevent creation of link breaks - link.attr('.marker-vertices/display', 'none'); - return link; - }; - Factory.createDecoration = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var parent = params.parent; - var kind = params.kind; - var messages = params.messages; - var location = params.position; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - if (!location) { - location = { x: 0, y: 0 }; - } - var decoration; - if (renderer && lodash.isFunction(renderer.createDecoration)) { - decoration = renderer.createDecoration(kind, parent); - } - else { - decoration = new joint.shapes.flo.ErrorDecoration({ - attrs: { - image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, - } - }); - } - decoration.set('type', joint.shapes.flo.DECORATION_TYPE); - decoration.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - decoration.set('z', parent.get('z') + 1); - } - decoration.attr('./kind', kind); - decoration.attr('messages', messages); - if (graph) { - graph.addCell(decoration); - } - parent.embed(decoration); - if (renderer && lodash.isFunction(renderer.initializeNewDecoration)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewDecoration(decoration, descriptor); - } - return decoration; - }; - Factory.createHandle = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var parent = params.parent; - var kind = params.kind; - var location = params.position; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - var handle; - if (!location) { - location = { x: 0, y: 0 }; - } - if (renderer && lodash.isFunction(renderer.createHandle)) { - handle = renderer.createHandle(kind, parent); - } - else { - handle = new joint.shapes.flo.ErrorDecoration({ - size: HANDLE_SIZE, - attrs: { - 'image': { - 'xlink:href': HANDLE_ICON_MAP.get(kind) - } - } - }); - } - handle.set('type', joint.shapes.flo.HANDLE_TYPE); - handle.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - handle.set('z', parent.get('z') + 1); - } - handle.attr('./kind', kind); - if (graph) { - graph.addCell(handle); - } - parent.embed(handle); - if (renderer && lodash.isFunction(renderer.initializeNewHandle)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewHandle(handle, descriptor); - } - return handle; - }; - return Factory; - }()); - Shapes.Factory = Factory; - })(exports.Shapes || (exports.Shapes = {})); - - var joint$1 = exports.Flo.joint; - var $$2 = _$; - var DEBOUNCE_TIME = 300; - joint$1.shapes.flo.PaletteGroupHeader = joint$1.shapes.basic.Generic.extend({ - // The path is the open/close arrow, defaults to vertical (open) - markup: '', - defaults: joint$1.util.deepSupplement({ - type: 'palette.groupheader', - size: { width: 170, height: 30 }, - position: { x: 0, y: 0 }, - attrs: { - 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, - 'text': { - text: '', - fill: '#eeeeee', - 'ref-x': 0.5, - 'ref-y': 7, - 'x-alignment': 'middle', - 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ - }, - 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } - }, - // custom properties - isOpen: true - }, joint$1.shapes.basic.Generic.prototype.defaults) - }); - var Palette = /** @class */ (function () { - function Palette(element, document) { - var _this = this; - this.element = element; - this.document = document; - this._metamodelListener = { - metadataError: function (data) { }, - metadataAboutToChange: function () { }, - metadataChanged: function () { return _this.rebuildPalette(); } - }; - this.initialized = false; - this._filterText = ''; - this.filterTextModel = new rxjs.Subject(); - this.paletteEntryPadding = { width: 12, height: 12 }; - this.onPaletteEntryDrop = new core.EventEmitter(); - this.paletteReady = new core.EventEmitter(); - this.paletteFocus = new core.EventEmitter(); - this.mouseMoveHanlder = function (e) { return _this.handleDrag(e); }; - this.mouseUpHanlder = function (e) { return _this.handleMouseUp(e); }; - this.paletteGraph = new joint$1.dia.Graph(); - this.paletteGraph.set('type', exports.Constants.PALETTE_CONTEXT); - this._filterText = ''; - this.closedGroups = new Set(); - } - Object.defineProperty(Palette.prototype, "paletteSize", { - set: function (size) { - console.debug('Palette Size: ' + size); - if (this._paletteSize !== size) { - this._paletteSize = size; - this.rebuildPalette(); - } - }, - enumerable: true, - configurable: true - }); - Palette.prototype.onFocus = function () { - this.paletteFocus.emit(); - }; - Palette.prototype.ngOnInit = function () { - var _this = this; - var element = $$2('#palette-paper', this.element.nativeElement); - // Create the paper for the palette using the specified element view - this.palette = new joint$1.dia.Paper({ - el: element, - gridSize: 1, - model: this.paletteGraph, - height: $$2(this.element.nativeElement.parentNode).height(), - width: $$2(this.element.nativeElement.parentNode).width(), - elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView), - interactive: false - }); - this.palette.on('cell:pointerup', function (cellview, evt) { - if (_this.viewBeingDragged) { - _this.trigger({ - type: exports.Flo.DnDEventType.DROP, - view: _this.viewBeingDragged, - event: evt - }); - _this.viewBeingDragged = undefined; - } - _this.clickedElement = undefined; - $$2('#palette-floater').remove(); - if (_this.floaterpaper) { - _this.floaterpaper.remove(); - } - }); - // Toggle the header open/closed on a click - this.palette.on('cell:pointerclick', function (cellview, event) { - // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? - // Click position within the element would be: evt.offsetX, evt.offsetY - var cell = cellview.model; - if (cell.attributes.header) { - // Toggle the header open/closed - if (cell.get('isOpen')) { - _this.rotateClosed(cell); - } - else { - _this.rotateOpen(cell); - } - } - // TODO [palette] ensure other mouse handling events do nothing for headers - // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) - }); - $$2(this.document).on('mouseup', this.mouseUpHanlder); - if (this.metamodel) { - this.metamodel.load().then(function (data) { - _this.buildPalette(data); - // Add listener to metamodel - if (_this.metamodel && _this.metamodel.subscribe) { - _this.metamodel.subscribe(_this._metamodelListener); - } - // Add debounced listener to filter text changes - _this.filterTextModel - .pipe(operators.debounceTime(DEBOUNCE_TIME)) - .subscribe(function (value) { return _this.rebuildPalette(); }); - _this.initialized = true; - }); - } - else { - console.error('No Metamodel service specified for palette!'); - } - this._paletteSize = this._paletteSize || $$2(this.element.nativeElement.parentNode).width(); - }; - Palette.prototype.ngOnDestroy = function () { - if (this.metamodel && this.metamodel.unsubscribe) { - this.metamodel.unsubscribe(this._metamodelListener); - } - $$2(this.document).off('mouseup', this.mouseUpHanlder); - this.palette.remove(); - }; - Palette.prototype.ngOnChanges = function (changes) { - // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { - // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); - // } - }; - Palette.prototype.createPaletteGroup = function (title, isOpen) { - var newGroupHeader = new joint$1.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); - newGroupHeader.set('header', title); - if (!isOpen) { - newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); - newGroupHeader.set('isOpen', false); - } - this.paletteGraph.addCell(newGroupHeader); - return newGroupHeader; - }; - Palette.prototype.createPaletteEntry = function (title, metadata) { - return exports.Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.palette, - metadata: metadata - }); - }; - Palette.prototype.buildPalette = function (metamodel) { - var _this = this; - var startTime = new Date().getTime(); - this.paletteReady.emit(false); - this.paletteGraph.clear(); - var filterText = this.filterText; - if (filterText) { - filterText = filterText.toLowerCase(); - } - var paletteNodes = []; - var groupAdded = new Set(); - var parentWidth = this._paletteSize; - console.debug("Parent Width: " + parentWidth); - // The field closedGroups tells us which should not be shown - // Work out the list of active groups/nodes based on the filter text - this.metamodel.groups().forEach(function (group) { - if (metamodel && metamodel.has(group)) { - Array.from(metamodel.get(group).keys()).sort().forEach(function (name) { - var node = metamodel.get(group).get(name); - if (node) { - var nodeActive = !(node.metadata && node.metadata.noPaletteEntry); - if (nodeActive && filterText) { - nodeActive = false; - if (name.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - else if (group.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { - // nodeActive = true; - // } - // else if (node.properties) { - // Object.keys(node.properties).sort().forEach(function(propertyName) { - // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || - // (node.properties[propertyName].description && - // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { - // nodeActive=true; - // } - // }); - // } - } - if (nodeActive) { - if (!groupAdded.has(group)) { - var header = _this.createPaletteGroup(group, !_this.closedGroups.has(group)); - header.set('size', { width: parentWidth, height: 30 }); - paletteNodes.push(header); - groupAdded.add(group); - } - if (!_this.closedGroups.has(group)) { - paletteNodes.push(_this.createPaletteEntry(name, node)); - } - } - } - }); - } - }); - var cellWidth = 0, cellHeight = 0; - // Determine the size of the palette entry cell (width and height) - paletteNodes.forEach(function (pnode) { - if (pnode.attr('metadata/name')) { - var dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (cellWidth < dimension.width) { - cellWidth = dimension.width; - } - if (cellHeight < dimension.height) { - cellHeight = dimension.height; - } - } - }); - // Adjust the palette entry cell size with paddings. - cellWidth += 2 * this.paletteEntryPadding.width; - cellHeight += 2 * this.paletteEntryPadding.height; - // Align palette entries row to be at the center - var startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; - var xpos = startX; - var ypos = 0; - var prevNode; - // Layout palette entry nodes - paletteNodes.forEach(function (pnode) { - var dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (pnode.get('header')) { //attributes.attrs.header) { - // Palette entry header - xpos = startX; - pnode.set('position', { x: 0, y: ypos }); - ypos += dimension.height + 5; - } - else { - // Palette entry element - if (xpos + cellWidth > parentWidth) { - // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line - xpos = startX; - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - else { - // Enough real estate to place entry in a row - adjust y position - if (prevNode && prevNode.attr('metadata/name')) { - ypos -= cellHeight; - } - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - // increment x position and y position (can be reorganized) - xpos += cellWidth; - ypos += cellHeight; - } - prevNode = pnode; - }); - this.palette.setDimensions(parentWidth, ypos); - this.paletteReady.emit(true); - console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); - }; - Palette.prototype.rebuildPalette = function () { - var _this = this; - if (this.initialized && this.metamodel) { - this.metamodel.load().then(function (metamodel) { return _this.buildPalette(metamodel); }); - } - }; - Object.defineProperty(Palette.prototype, "filterText", { - get: function () { - return this._filterText; - }, - set: function (text) { - if (this._filterText !== text) { - this._filterText = text; - this.filterTextModel.next(text); - } - }, - enumerable: true, - configurable: true - }); - Palette.prototype.getPaletteView = function (view) { - var self = this; - return view.extend({ - pointerdown: function ( /*evt, x, y*/) { - // Remove the tooltip - // $('.node-tooltip').remove(); - // TODO move metadata to the right place (not inside attrs I think) - self.clickedElement = this.model; - if (self.clickedElement && self.clickedElement.attr('metadata')) { - $$2(self.document).on('mousemove', self.mouseMoveHanlder); - } - }, - pointermove: function ( /*evt, x, y*/) { - // Nothing to prevent move within the palette canvas - }, - }); - }; - Palette.prototype.handleMouseUp = function (event) { - $$2(this.document).off('mousemove', this.mouseMoveHanlder); - }; - Palette.prototype.trigger = function (event) { - this.onPaletteEntryDrop.emit(event); - }; - Palette.prototype.handleDrag = function (event) { - // TODO offsetX/Y not on firefox - // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); - // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); - if (this.clickedElement && this.clickedElement.attr('metadata')) { - if (!this.viewBeingDragged) { - var dataOfClickedElement = this.clickedElement.attr('metadata'); - // custom div if not already built. - $$2('
', { - id: 'palette-floater' - }).appendTo($$2('body')); - var floatergraph = new joint$1.dia.Graph(); - floatergraph.set('type', exports.Constants.FEEDBACK_CONTEXT); - var parent_1 = $$2('#palette-floater'); - this.floaterpaper = new joint$1.dia.Paper({ - el: $$2('#palette-floater'), - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView, - gridSize: 10, - model: floatergraph, - height: parent_1.height(), - width: parent_1.width(), - validateMagnet: function () { return false; }, - validateConnection: function () { return false; } - }); - // TODO float thing needs to be bigger otherwise icon label is missing - // Initiative drag and drop - create draggable element - var floaternode = exports.Shapes.Factory.createNode({ - 'renderer': this.renderer, - 'paper': this.floaterpaper, - 'graph': floatergraph, - 'metadata': dataOfClickedElement - }); - // Only node view expected - var box = this.floaterpaper.findViewByModel(floaternode).getBBox(); - var size = floaternode.get('size'); - // Account for node real size including ports - floaternode.translate(box.width - size.width, box.height - size.height); - this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); - $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - } - else { - $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - this.trigger({ - type: exports.Flo.DnDEventType.DRAG, - view: this.viewBeingDragged, - event: event - }); - } - } - }; - /* - * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) - */ - Palette.prototype.rotateOpen = function (element) { - var _this = this; - setTimeout(function () { return _this.doRotateOpen(element, 90); }); - }; - Palette.prototype.doRotateOpen = function (element, angle) { - var _this = this; - angle -= 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle <= 0) { - element.set('isOpen', true); - this.closedGroups.delete(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(function () { return _this.doRotateOpen(element, angle); }, 10); - } - }; - Palette.prototype.doRotateClose = function (element, angle) { - var _this = this; - angle += 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle >= 90) { - element.set('isOpen', false); - this.closedGroups.add(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(function () { return _this.doRotateClose(element, angle); }, 10); - } - }; - // TODO better name for this function as this does the animation *and* updates the palette - /* - * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) - */ - Palette.prototype.rotateClosed = function (element) { - var _this = this; - setTimeout(function () { return _this.doRotateClose(element, 0); }); - }; - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], Palette.prototype, "metamodel", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], Palette.prototype, "renderer", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], Palette.prototype, "paletteEntryPadding", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], Palette.prototype, "onPaletteEntryDrop", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], Palette.prototype, "paletteReady", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], Palette.prototype, "paletteFocus", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) - ], Palette.prototype, "paletteSize", null); - Palette = __decorate([ - core.Component({ - selector: 'flo-palette', - template: "\n
\n \n
\n
\n
\n
\n ", - styles: ["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "], - encapsulation: core.ViewEncapsulation.None - }), - __param(1, core.Inject(platformBrowser.DOCUMENT)), - __metadata("design:paramtypes", [core.ElementRef, Object]) - ], Palette); - return Palette; - }()); - - var joint$2 = exports.Flo.joint; - var $$3 = _$; - var Utils = /** @class */ (function () { - function Utils() { - } - Utils.fanRoute = function (graph, cell) { - if (cell instanceof joint$2.dia.Element) { - var links = graph.getConnectedLinks(cell); - var groupsOfOverlappingLinks = lodash.groupBy(links, function (link) { - // the key of the group is the model id of the link's source or target, but not our cell id. - var sourceId = link.get('source').id; - var targetId = link.get('target').id; - return cell.id !== sourceId ? sourceId : targetId; - }); - lodash.each(groupsOfOverlappingLinks, function (group, key) { - // If the member of the group has both source and target model adjust vertices. - var toRoute = {}; - if (key !== undefined) { - group.forEach(function (link) { - if (link.get('source').id === cell.get('id') && link.get('target').id) { - toRoute[link.get('target').id] = link; - } - else if (link.get('target').id === cell.get('id') && link.get('source').id) { - toRoute[link.get('source').id] = link; - } - }); - Object.keys(toRoute).forEach(function (k) { - Utils.fanRoute(graph, toRoute[k]); - }); - } - }); - } - else if (cell instanceof joint$2.dia.Link) { - // The cell is a link. Let's find its source and target models. - var srcId_1 = cell.get('source').id || cell.previous('source').id; - var trgId_1 = cell.get('target').id || cell.previous('target').id; - // If one of the ends is not a model, the link has no siblings. - if (!srcId_1 || !trgId_1) { - return; - } - var siblings = graph.getLinks().filter(function (sibling) { - var _srcId = sibling.get('source').id; - var _trgId = sibling.get('target').id; - var vertices = sibling.get('vertices'); - var fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); - return ((_srcId === srcId_1 && _trgId === trgId_1) || (_srcId === trgId_1 && _trgId === srcId_1)) && fanRouted; - }); - switch (siblings.length) { - case 0: - // The link was removed and had no siblings. - break; - case 1: - // There is only one link between the source and target. No vertices needed. - var vertices = cell.get('vertices'); - if (vertices && vertices.length && cell.get('fanRouted')) { - cell.unset('vertices'); - } - break; - default: - // There is more than one siblings. We need to create vertices. - // First of all we'll find the middle point of the link. - var source = graph.getCell(srcId_1); - var target = graph.getCell(trgId_1); - if (!source || !target) { - // When clearing the graph it may happen that some nodes are gone and some are left - return; - } - var srcCenter = source.getBBox().center(); - var trgCenter = target.getBBox().center(); - var midPoint_1 = joint$2.g.line(srcCenter, trgCenter).midpoint(); - // Then find the angle it forms. - var theta_1 = srcCenter.theta(trgCenter); - // This is the maximum distance between links - var gap_1 = 20; - siblings.forEach(function (sibling, index) { - // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. - var offset = gap_1 * Math.ceil(index / 2); - // Now we need the vertices to be placed at points which are 'offset' pixels distant - // from the first link and forms a perpendicular angle to it. And as index goes up - // alternate left and right. - // - // ^ odd indexes - // | - // |----> index 0 line (straight line between a source center and a target center. - // | - // v even indexes - var sign = index % 2 ? 1 : -1; - var angle = joint$2.g.toRad(theta_1 + sign * 90); - // We found the vertex. - var vertex = joint$2.g.point.fromPolar(offset, angle, midPoint_1); - sibling.set('fanRouted', true); - sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); - }); - } - } - }; - Utils.isCustomPaperEvent = function (args) { - return args.length === 5 && - lodash.isString(args[0]) && - (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && - args[1] instanceof $$3.Event && - args[2] instanceof joint$2.dia.CellView && - lodash.isNumber(args[3]) && - lodash.isNumber(args[4]); - }; - return Utils; - }()); - - var joint$3 = exports.Flo.joint; - var $$4 = _$; - var SCROLLBAR_SIZE = 17; - var EditorComponent = /** @class */ (function () { - function EditorComponent(element) { - var _this = this; - this.element = element; - /** - * Flag specifying whether the Flo-Editor is in read-only mode. - */ - this._readOnlyCanvas = false; - /** - * Grid size - */ - this._gridSize = 1; - this._hiddenPalette = false; - this.textToGraphEventEmitter = new core.EventEmitter(); - this.graphToTextEventEmitter = new core.EventEmitter(); - this._graphToTextSyncEnabled = true; - this.validationEventEmitter = new core.EventEmitter(); - this._disposables = new tsDisposables.CompositeDisposable(); - this._dslText = ''; - this.textToGraphConversionCompleted = new rxjs.Subject(); - this.graphToTextConversionCompleted = new rxjs.Subject(); - this.paletteReady = new rxjs.BehaviorSubject(false); - /** - * Min zoom percent value - */ - this.minZoom = 5; - /** - * Max zoom percent value - */ - this.maxZoom = 400; - /** - * Zoom percent increment/decrement step - */ - this.zoomStep = 5; - this.paperPadding = 0; - this.floApi = new core.EventEmitter(); - this.validationMarkers = new core.EventEmitter(); - this.contentValidated = new core.EventEmitter(); - this.dslChange = new core.EventEmitter(); - this._resizeHandler = function () { return _this.autosizePaper(); }; - var self = this; - this.editorContext = new (/** @class */ (function () { - function DefaultRunnableContext() { - } - Object.defineProperty(DefaultRunnableContext.prototype, "zoomPercent", { - get: function () { - return self.zoomPercent; - }, - set: function (percent) { - self.zoomPercent = percent; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "noPalette", { - get: function () { - return self.noPalette; - }, - set: function (noPalette) { - self.noPalette = noPalette; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "gridSize", { - get: function () { - return self.gridSize; - }, - set: function (gridSize) { - self.gridSize = gridSize; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "readOnlyCanvas", { - get: function () { - return self.readOnlyCanvas; - }, - set: function (readOnly) { - self.readOnlyCanvas = readOnly; - }, - enumerable: true, - configurable: true - }); - DefaultRunnableContext.prototype.setDsl = function (dsl) { - self.dsl = dsl; - }; - DefaultRunnableContext.prototype.updateGraph = function () { - return self.updateGraphRepresentation(); - }; - DefaultRunnableContext.prototype.updateText = function () { - return self.updateTextRepresentation(); - }; - DefaultRunnableContext.prototype.performLayout = function () { - return self.doLayout(); - }; - DefaultRunnableContext.prototype.clearGraph = function () { - var _this = this; - self.selection = undefined; - self.graph.clear(); - if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { - return self.metamodel.load().then(function (data) { - self.editor.setDefaultContent(_this, data); - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - }); - } - else { - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - } - }; - DefaultRunnableContext.prototype.getGraph = function () { - return self.graph; - }; - DefaultRunnableContext.prototype.getPaper = function () { - return self.paper; - }; - Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextSync", { - get: function () { - return self.graphToTextSync; - }, - set: function (sync) { - self.graphToTextSync = sync; - }, - enumerable: true, - configurable: true - }); - DefaultRunnableContext.prototype.getMinZoom = function () { - return self.minZoom; - }; - DefaultRunnableContext.prototype.getMaxZoom = function () { - return self.maxZoom; - }; - DefaultRunnableContext.prototype.getZoomStep = function () { - return self.zoomStep; - }; - DefaultRunnableContext.prototype.fitToPage = function () { - self.fitToPage(); - }; - DefaultRunnableContext.prototype.createNode = function (metadata, props, position) { - return self.createNode(metadata, props, position); - }; - DefaultRunnableContext.prototype.createLink = function (source, target, metadata, props) { - return self.createLink(source, target, metadata, props); - }; - Object.defineProperty(DefaultRunnableContext.prototype, "selection", { - get: function () { - return self.selection; - }, - set: function (newSelection) { - self.selection = newSelection; - }, - enumerable: true, - configurable: true - }); - DefaultRunnableContext.prototype.deleteSelectedNode = function () { - if (self.selection) { - if (self.editor && self.editor.preDelete) { - self.editor.preDelete(self.editorContext, self.selection.model); - } - else { - if (self.selection.model instanceof joint$3.dia.Element) { - self.graph.getConnectedLinks(self.selection.model).forEach(function (l) { return l.remove(); }); - } - } - self.selection.model.remove(); - self.selection = undefined; - } - }; - Object.defineProperty(DefaultRunnableContext.prototype, "textToGraphConversionObservable", { - get: function () { - return self.textToGraphConversionCompleted; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextConversionObservable", { - get: function () { - return self.graphToTextConversionCompleted; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "paletteReady", { - get: function () { - return self.paletteReady; - }, - enumerable: true, - configurable: true - }); - return DefaultRunnableContext; - }()))(); - } - EditorComponent.prototype.ngOnInit = function () { - var _this = this; - this.initGraph(); - this.initPaper(); - this.initGraphListeners(); - this.initPaperListeners(); - this.initMetamodel(); - $$4(window).on('resize', this._resizeHandler); - this._disposables.add(tsDisposables.Disposable.create(function () { return $$4(window).off('resize', _this._resizeHandler); })); - /* - * Execute resize to get the right size for the SVG element on the editor canvas. - * Executed via timeout to let angular render the DOM first and elements to have the right width and height - */ - window.setTimeout(this._resizeHandler); - this.floApi.emit(this.editorContext); - }; - EditorComponent.prototype.ngOnDestroy = function () { - this._disposables.dispose(); - }; - Object.defineProperty(EditorComponent.prototype, "noPalette", { - get: function () { - return this._hiddenPalette; - }, - set: function (hidden) { - this._hiddenPalette = hidden; - // If palette is not shown ensure that canvas starts from the left==0! - if (hidden) { - $$4('#paper-container', this.element.nativeElement).css('left', 0); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(EditorComponent.prototype, "graphToTextSync", { - get: function () { - return this._graphToTextSyncEnabled; - }, - set: function (sync) { - this._graphToTextSyncEnabled = sync; - // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion - // this.performGraphToTextSyncing(); - }, - enumerable: true, - configurable: true - }); - EditorComponent.prototype.performGraphToTextSyncing = function () { - if (this._graphToTextSyncEnabled) { - this.graphToTextEventEmitter.emit(); - } - }; - EditorComponent.prototype.createHandle = function (element, kind, action, location) { - if (!location) { - var bbox = element.model.getBBox(); - location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); - } - var handle = exports.Shapes.Factory.createHandle({ - renderer: this.renderer, - paper: this.paper, - parent: element.model, - kind: kind, - position: location - }); - var view = this.paper.findViewByModel(handle); - view.on('cell:pointerdown', function () { - if (action) { - action(); - } - }); - view.on('cell:mouseover', function () { - handle.attr('image/filter', { - name: 'dropShadow', - args: { dx: 1, dy: 1, blur: 1, color: 'black' } - }); - }); - view.on('cell:mouseout', function () { - handle.removeAttr('image/filter'); - }); - view.setInteractivity(false); - return handle; - }; - EditorComponent.prototype.removeEmbeddedChildrenOfType = function (element, types) { - var embeds = element.getEmbeddedCells(); - for (var i = 0; i < embeds.length; i++) { - if (types.indexOf(embeds[i].get('type')) >= 0) { - embeds[i].remove(); - } - } - }; - Object.defineProperty(EditorComponent.prototype, "selection", { - get: function () { - return this._selection; - }, - set: function (newSelection) { - var _this = this; - if (newSelection && (newSelection.model.get('type') === joint$3.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint$3.shapes.flo.HANDLE_TYPE)) { - newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); - } - if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { - newSelection = undefined; - } - if (newSelection !== this._selection) { - if (this._selection) { - var elementview = this.paper.findViewByModel(this._selection.model); - if (elementview) { // May have been removed from the graph - this.removeEmbeddedChildrenOfType(elementview.model, joint$3.shapes.flo.HANDLE_TYPE); - elementview.unhighlight(); - } - } - if (newSelection) { - newSelection.highlight(); - if (this.editor && this.editor.createHandles) { - this.editor.createHandles(this.editorContext, function (owner, kind, action, location) { return _this.createHandle(owner, kind, action, location); }, newSelection); - } - } - this._selection = newSelection; - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(EditorComponent.prototype, "readOnlyCanvas", { - get: function () { - return this._readOnlyCanvas; - }, - set: function (value) { - var _this = this; - if (this._readOnlyCanvas === value) { - // Nothing to do - return; - } - if (value) { - this.selection = undefined; - } - if (this.graph) { - this.graph.getLinks().forEach(function (link) { - if (value) { - link.attr('.link-tools/display', 'none'); - link.attr('.marker-vertices/display', 'none'); - link.attr('.connection-wrap/display', 'none'); - } - else { - link.removeAttr('.link-tools/display'); - if (_this.editor && _this.editor.allowLinkVertexEdit) { - link.removeAttr('.marker-vertices/display'); - } - link.removeAttr('.connection-wrap/display'); - } - }); - } - this._readOnlyCanvas = value; - }, - enumerable: true, - configurable: true - }); - /** - * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - EditorComponent.prototype.showDragFeedback = function (dragDescriptor) { - if (this.editor && this.editor.showDragFeedback) { - this.editor.showDragFeedback(this.editorContext, dragDescriptor); - } - else { - var magnet = void 0; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint$3.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = exports.Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint$3.V(magnet).addClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint$3.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = exports.Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint$3.V(magnet).addClass('dnd-target-feedback'); - } - } - } - } - }; - /** - * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - EditorComponent.prototype.hideDragFeedback = function (dragDescriptor) { - if (this.editor && this.editor.hideDragFeedback) { - this.editor.hideDragFeedback(this.editorContext, dragDescriptor); - } - else { - var magnet = void 0; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint$3.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = exports.Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint$3.V(magnet).removeClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint$3.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = exports.Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint$3.V(magnet).removeClass('dnd-target-feedback'); - } - } - } - } - }; - /** - * Sets the new DnD info object - the descriptor for DnD - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - EditorComponent.prototype.setDragDescriptor = function (dragDescriptor) { - if (this.highlighted === dragDescriptor) { - return; - } - if (this.highlighted && dragDescriptor && lodash.isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { - if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { - return; - } - if (this.highlighted.source && - dragDescriptor.source && - this.highlighted.target && - dragDescriptor.target && - this.highlighted.source.view.model === dragDescriptor.source.view.model && - this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && - this.highlighted.target.view.model === dragDescriptor.target.view.model && - this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { - return; - } - } - if (this.highlighted) { - this.hideDragFeedback(this.highlighted); - } - this.highlighted = dragDescriptor; - if (this.highlighted) { - this.showDragFeedback(this.highlighted); - } - }; - /** - * Handles DnD events when a node is being dragged over canvas - * - * @param draggedView The Joint JS view object being dragged - * @param targetUnderMouse The Joint JS view under mouse cursor - * @param x X coordinate of the mouse on the canvas - * @param y Y coordinate of the mosue on the canvas - * @param context DnD context (palette or canvas) - */ - EditorComponent.prototype.handleNodeDragging = function (draggedView, targetUnderMouse, x, y, sourceComponent) { - if (this.editor && this.editor.calculateDragDescriptor) { - this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint$3.g.point(x, y), sourceComponent)); - } - }; - /** - * Handles DnD drop event when a node is being dragged and dropped on the main canvas - */ - EditorComponent.prototype.handleNodeDropping = function () { - if (this.highlighted && this.editor && this.editor.handleNodeDropping) { - this.editor.handleNodeDropping(this.editorContext, this.highlighted); - } - this.setDragDescriptor(undefined); - }; - /** - * Hides DOM Node (used to determine drop target DOM element) - * @param domNode DOM node to hide - * @returns - */ - EditorComponent.prototype._hideNode = function (domNode) { - var oldVisibility = { - visibility: domNode.style ? domNode.style.display : undefined, - children: [] - }; - for (var i = 0; i < domNode.children.length; i++) { - var node = domNode.children.item(i); - if (node instanceof HTMLElement) { - oldVisibility.children.push(this._hideNode(node)); - } - } - domNode.style.display = 'none'; - return oldVisibility; - }; - /** - * Restored DOM node original visibility (used to determine drop target DOM element) - * @param domNode DOM node to restore visibility of - * @param oldVisibility original visibility parameter - */ - EditorComponent.prototype._restoreNodeVisibility = function (domNode, oldVisibility) { - if (domNode.style) { - domNode.style.display = oldVisibility.visibility; - } - var j = 0; - for (var i = 0; i < domNode.childNodes.length; i++) { - if (j < oldVisibility.children.length) { - var node = domNode.children.item(i); - if (node instanceof HTMLElement) { - this._restoreNodeVisibility(node, oldVisibility.children[j++]); - } - } - } - }; - /** - * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. - * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location - * (bounding box of a link for testing is bad). - * The result of that is that links can only be the drop target when dragging from the palette currently. - * When DnDing shapes on the canvas drop target cannot be a link. - * - * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked - * - e.g. Drag-n-Drop) - */ - EditorComponent.prototype.getTargetViewFromEvent = function (event, x, y, excludeViews) { - var _this = this; - if (excludeViews === void 0) { excludeViews = []; } - if (!x && !y) { - var l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); - x = l.x; - y = l.y; - } - // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing - // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); - // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); - // if (underMouse) { - // return underMouse; - // } - var oldVisibility = excludeViews.map(function (_x) { return _this._hideNode(_x.el); }); - var targetElement = document.elementFromPoint(event.clientX, event.clientY); - excludeViews.forEach(function (excluded, i) { - _this._restoreNodeVisibility(excluded.el, oldVisibility[i]); - }); - return this.paper.findView($$4(targetElement)); - }; - EditorComponent.prototype.handleDnDFromPalette = function (dndEvent) { - switch (dndEvent.type) { - case exports.Flo.DnDEventType.DRAG: - this.handleDragFromPalette(dndEvent); - break; - case exports.Flo.DnDEventType.DROP: - this.handleDropFromPalette(dndEvent); - break; - default: - break; - } - }; - EditorComponent.prototype.handleDragFromPalette = function (dnDEvent) { - console.debug('Dragging from palette'); - if (dnDEvent.view && !this.readOnlyCanvas) { - var location_1 = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); - this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location_1.x, location_1.y, [dnDEvent.view]), location_1.x, location_1.y, exports.Constants.PALETTE_CONTEXT); - } - }; - EditorComponent.prototype.createNode = function (metadata, props, position) { - return exports.Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.paper, - metadata: metadata, - props: props, - position: position - }); - }; - EditorComponent.prototype.createLink = function (source, target, metadata, props) { - return exports.Shapes.Factory.createLink({ - renderer: this.renderer, - paper: this.paper, - source: source, - target: target, - metadata: metadata, - props: props - }); - }; - EditorComponent.prototype.handleDropFromPalette = function (event) { - var cellview = event.view; - var evt = event.event; - if (this.paper.el === evt.target || $$4.contains(this.paper.el, evt.target)) { - if (this.readOnlyCanvas) { - this.setDragDescriptor(undefined); - } - else { - var metadata = cellview.model.attr('metadata'); - var props = cellview.model.attr('props'); - var position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); - /* Calculate target element before creating the new - * element under mouse location. Otherwise target - * element would be the newly created element because - * it's under the mouse pointer - */ - var targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); - var newNode = this.createNode(metadata, props, position); - var newView = this.paper.findViewByModel(newNode); - this.handleNodeDragging(newView, targetElement, position.x, position.y, exports.Constants.PALETTE_CONTEXT); - this.handleNodeDropping(); - } - } - }; - EditorComponent.prototype.fitToContent = function (gridWidth, gridHeight, padding, opt) { - var paper = this.paper; - if (joint$3.util.isObject(gridWidth)) { - // first parameter is an option object - opt = gridWidth; - gridWidth = opt.gridWidth || 1; - gridHeight = opt.gridHeight || 1; - padding = opt.padding || 0; - } - else { - opt = opt || {}; - gridWidth = gridWidth || 1; - gridHeight = gridHeight || 1; - padding = padding || 0; - } - var paddingJson = joint$3.util.normalizeSides(padding); - // Calculate the paper size to accomodate all the graph's elements. - var bbox = joint$3.V(paper.viewport).getBBox(); - var currentScale = paper.scale(); - var currentTranslate = paper.translate(); - bbox.x *= currentScale.sx; - bbox.y *= currentScale.sy; - bbox.width *= currentScale.sx; - bbox.height *= currentScale.sy; - var calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; - var calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; - var tx = 0; - var ty = 0; - if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { - tx = (-bbox.x / gridWidth) * gridWidth; - tx += paddingJson.left; - } - else if (opt.allowNewOrigin === 'same') { - tx = currentTranslate.tx; - } - calcWidth += tx; - if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { - ty = (-bbox.y / gridHeight) * gridHeight; - ty += paddingJson.top; - } - else if (opt.allowNewOrigin === 'same') { - ty = currentTranslate.ty; - } - calcHeight += ty; - calcWidth += paddingJson.right; - calcHeight += paddingJson.bottom; - // Make sure the resulting width and height are greater than minimum. - calcWidth = Math.max(calcWidth, opt.minWidth || 0); - calcHeight = Math.max(calcHeight, opt.minHeight || 0); - // Make sure the resulting width and height are lesser than maximum. - calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); - calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); - var dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; - var originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; - // Change the dimensions only if there is a size discrepency or an origin change - if (originChange) { - paper.translate(tx, ty); - } - if (dimensionChange) { - paper.setDimensions(calcWidth, calcHeight); - } - }; - EditorComponent.prototype.autosizePaper = function () { - var parent = $$4('#paper-container', this.element.nativeElement); - var parentWidth = parent.innerWidth(); - var parentHeight = parent.innerHeight(); - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth - SCROLLBAR_SIZE, - minHeight: parentHeight - SCROLLBAR_SIZE, - allowNewOrigin: 'same' - }); - }; - EditorComponent.prototype.fitToPage = function () { - var parent = $$4('#paper-container', this.element.nativeElement); - var minScale = this.minZoom / 100; - var maxScale = 2; - var parentWidth = parent.innerWidth(); - var parentHeight = parent.innerHeight(); - this.paper.scaleContentToFit({ - padding: this.paperPadding, - minScaleX: minScale, - minScaleY: minScale, - maxScaleX: maxScale, - maxScaleY: maxScale, - fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } - }); - /** - * Size the canvas appropriately and allow origin movement - */ - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth, - minHeight: parentHeight, - maxWidth: parentWidth, - maxHeight: parentHeight, - allowNewOrigin: 'any' - }); - }; - Object.defineProperty(EditorComponent.prototype, "zoomPercent", { - get: function () { - return Math.round(joint$3.V(this.paper.viewport).scale().sx * 100); - }, - set: function (percent) { - if (!isNaN(percent)) { - if (percent < this.minZoom) { - percent = this.minZoom; - } - else if (percent >= this.maxZoom) { - percent = this.maxZoom; - } - else { - if (percent <= 0) { - percent = 0.00001; - } - } - this.paper.scale(percent / 100, percent / 100); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(EditorComponent.prototype, "gridSize", { - get: function () { - return this._gridSize; - }, - set: function (size) { - if (!isNaN(size) && size >= 1) { - this._gridSize = size; - if (this.paper) { - this.paper.setGridSize(size); - } - } - }, - enumerable: true, - configurable: true - }); - EditorComponent.prototype.validateContent = function () { - var _this = this; - return new Promise(function (resolve) { - if (_this.editor && _this.editor.validate) { - return _this.editor - .validate(_this.graph, _this.dsl, _this.editorContext) - .then(function (allMarkers) { - _this.graph.getCells() - .forEach(function (cell) { return _this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : []); }); - _this.validationMarkers.emit(allMarkers); - _this.contentValidated.emit(true); - resolve(); - }); - } - else { - resolve(); - } - }); - }; - EditorComponent.prototype.markElement = function (cell, markers) { - var errorMessages = markers.map(function (m) { return m.message; }); - var errorCell = cell.getEmbeddedCells().find(function (e) { return e.attr('./kind') === exports.Constants.ERROR_DECORATION_KIND; }); - if (errorCell) { - if (errorMessages.length === 0) { - errorCell.remove(); - } - else { - // Without rewrite we merge this list with existing errors - errorCell.attr('messages', errorMessages, { rewrite: true }); - } - } - else if (errorMessages.length > 0) { - var error = exports.Shapes.Factory.createDecoration({ - renderer: this.renderer, - paper: this.paper, - parent: cell, - kind: exports.Constants.ERROR_DECORATION_KIND, - messages: errorMessages - }); - var pt = void 0; - var view = this.paper.findViewByModel(error); - if (cell instanceof joint$3.dia.Element) { - pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); - error.set('position', pt); - view.setInteractivity(false); - } - } - }; - EditorComponent.prototype.doLayout = function () { - if (this.renderer && this.renderer.layout) { - return this.renderer.layout(this.paper); - } - }; - Object.defineProperty(EditorComponent.prototype, "dsl", { - get: function () { - return this._dslText; - }, - set: function (dslText) { - if (this._dslText !== dslText) { - this._dslText = dslText; - this.textToGraphEventEmitter.emit(); - } - }, - enumerable: true, - configurable: true - }); - /** - * Ask the server to parse the supplied text into a JSON graph of nodes and links, - * then update the view based on that new information. - */ - EditorComponent.prototype.updateGraphRepresentation = function () { - var _this = this; - console.debug("Updating graph to represent '" + this._dslText + "'"); - if (this.metamodel && this.metamodel.textToGraph) { - return this.metamodel.textToGraph(this.editorContext, this._dslText).then(function () { - _this.textToGraphConversionCompleted.next(); - return _this.validateContent(); - }); - } - else { - this.textToGraphConversionCompleted.next(); - return this.validateContent(); - } - }; - EditorComponent.prototype.updateTextRepresentation = function () { - var _this = this; - if (this.metamodel && this.metamodel.graphToText) { - return this.metamodel.graphToText(this.editorContext).then(function (text) { - if (_this._dslText !== text) { - _this._dslText = text; - _this.dslChange.emit(text); - } - _this.graphToTextConversionCompleted.next(); - return _this.validateContent(); - }) - .catch(function (error) { - // Validation may reveal why the graph couldn't be - // converted so let it run - _this.graphToTextConversionCompleted.next(); - return _this.validateContent(); - }); - } - else { - this.graphToTextConversionCompleted.next(); - return this.validateContent(); - } - }; - EditorComponent.prototype.initMetamodel = function () { - var _this = this; - this.metamodel.load().then(function (data) { - _this.updateGraphRepresentation(); - var textSyncSubscription = _this.graphToTextEventEmitter.pipe(operators.debounceTime(100)).subscribe(function () { - if (_this._graphToTextSyncEnabled) { - _this.updateTextRepresentation(); - } - }); - _this._disposables.add(tsDisposables.Disposable.create(function () { return textSyncSubscription.unsubscribe(); })); - // Setup content validated event emitter. Emit not validated when graph to text conversion required - var graphValidatedSubscription1 = _this.graphToTextEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); - _this._disposables.add(tsDisposables.Disposable.create(function () { return graphValidatedSubscription1.unsubscribe; })); - // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); - // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); - var graphSyncSubscription = _this.textToGraphEventEmitter.pipe(operators.debounceTime(300)).subscribe(function () { return _this.updateGraphRepresentation(); }); - _this._disposables.add(tsDisposables.Disposable.create(function () { return graphSyncSubscription.unsubscribe(); })); - // Setup content validated event emitter. Emit not validated when text to graph conversion required - var graphValidatedSubscription2 = _this.textToGraphEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); - _this._disposables.add(tsDisposables.Disposable.create(function () { return graphValidatedSubscription2.unsubscribe; })); - if (_this.editor && _this.editor.setDefaultContent) { - _this.editor.setDefaultContent(_this.editorContext, data); - } - }); - }; - EditorComponent.prototype.initGraph = function () { - this.graph = new joint$3.dia.Graph(); - this.graph.set('type', exports.Constants.CANVAS_CONTEXT); - this.graph.set('paperPadding', this.paperPadding); - }; - EditorComponent.prototype.handleNodeCreation = function (node) { - var _this = this; - node.on('change:size', this._resizeHandler); - node.on('change:position', this._resizeHandler); - if (node.attr('metadata')) { - node.on('change:attrs', function (cell, attrs, changeData) { - var propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, node))) { - _this.performGraphToTextSyncing(); - } - if (_this.renderer && _this.renderer.refreshVisuals) { - _this.renderer.refreshVisuals(node, propAttr, _this.paper); - } - } - }); - } - }; - /** - * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples - * are 'change:source', 'change:target'. - */ - EditorComponent.prototype.handleLinkEvent = function (event, link) { - if (this.renderer && this.renderer.handleLinkEvent) { - this.renderer.handleLinkEvent(this.editorContext, event, link); - } - }; - EditorComponent.prototype.handleLinkCreation = function (link) { - var _this = this; - this.handleLinkEvent('add', link); - link.on('change:source', function (l) { - _this.autosizePaper(); - var newSourceId = l.get('source').id; - var oldSourceId = l.previous('source').id; - if (newSourceId !== oldSourceId) { - _this.performGraphToTextSyncing(); - } - _this.handleLinkEvent('change:source', l); - }); - link.on('change:target', function (l) { - _this.autosizePaper(); - var newTargetId = l.get('target').id; - var oldTargetId = l.previous('target').id; - if (newTargetId !== oldTargetId) { - _this.performGraphToTextSyncing(); - } - _this.handleLinkEvent('change:target', l); - }); - link.on('change:vertices', this._resizeHandler); - link.on('change:attrs', function (cell, attrs, changeData) { - var propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, link))) { - var sourceId = link.get('source').id; - var targetId = link.get('target').id; - _this.performGraphToTextSyncing(); - } - if (_this.renderer && _this.renderer.refreshVisuals) { - _this.renderer.refreshVisuals(link, propAttr, _this.paper); - } - } - }); - this.paper.findViewByModel(link).on('link:options', function () { return _this.handleLinkEvent('options', link); }); - if (this.readOnlyCanvas) { - link.attr('.link-tools/display', 'none'); - } - }; - EditorComponent.prototype.initGraphListeners = function () { - var _this = this; - this.graph.on('add', function (element) { - if (element instanceof joint$3.dia.Link) { - _this.handleLinkCreation(element); - } - else if (element instanceof joint$3.dia.Element) { - _this.handleNodeCreation(element); - } - if (element.get('type') === joint$3.shapes.flo.NODE_TYPE || element.get('type') === joint$3.shapes.flo.LINK_TYPE) { - _this.performGraphToTextSyncing(); - } - _this.autosizePaper(); - }); - this.graph.on('remove', function (element) { - if (element instanceof joint$3.dia.Link) { - _this.handleLinkEvent('remove', element); - } - if (_this.selection && _this.selection.model === element) { - _this.selection = undefined; - } - if (element.isLink()) { - window.setTimeout(function () { return _this.performGraphToTextSyncing(); }, 100); - } - else if (element.get('type') === joint$3.shapes.flo.NODE_TYPE) { - _this.performGraphToTextSyncing(); - } - _this.autosizePaper(); - }); - // Set if link is fan-routed. Should be called before routing call - this.graph.on('change:vertices', function (link, changed, opt) { - if (opt.fanRouted) { - link.set('fanRouted', true); - } - else { - link.unset('fanRouted'); - } - }); - // adjust vertices when a cell is removed or its source/target was changed - this.graph.on('add remove change:source change:target change:vertices change:position', lodash.partial(Utils.fanRoute, this.graph)); - }; - EditorComponent.prototype.initPaperListeners = function () { - var _this = this; - // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element - this.paper.on('cell:pointerclick', function (cellView) { - if (!_this.readOnlyCanvas) { - _this.selection = cellView; - } - }); - this.paper.on('blank:pointerclick', function () { - _this.selection = undefined; - }); - this.paper.on('scale', this._resizeHandler); - this.paper.on('all', function () { - if (Utils.isCustomPaperEvent(arguments)) { - arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); - } - }); - this.paper.on('dragging-node-over-canvas', function (dndEvent) { - console.debug("Canvas DnD type = " + dndEvent.type); - var location = _this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); - switch (dndEvent.type) { - case exports.Flo.DnDEventType.DRAG: - _this.handleNodeDragging(dndEvent.view, _this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, exports.Constants.CANVAS_CONTEXT); - break; - case exports.Flo.DnDEventType.DROP: - _this.handleNodeDropping(); - break; - default: - break; - } - }); - // JointJS now no longer grabs focus if working in a paper element - crude... - $$4('#flow-view', this.element.nativeElement).on('mousedown', function () { - $$4('#palette-filter-textfield', _this.element.nativeElement).focus(); - }); - }; - EditorComponent.prototype.initPaper = function () { - var _this = this; - var options = { - el: $$4('#paper', this.element.nativeElement), - gridSize: this._gridSize, - drawGrid: true, - model: this.graph, - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$3.shapes.flo.ElementView /*joint.dia.ElementView*/, - linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint$3.shapes.flo.LinkView, - // Enable link snapping within 25px lookup radius - snapLinks: { radius: 25 }, - defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ function (cellView, magnet) { - if (_this.renderer && _this.renderer.createLink) { - var linkEnd = { - id: cellView.model.id - }; - if (magnet) { - linkEnd.selector = cellView.getSelector(magnet, undefined); - } - if (magnet.getAttribute('port')) { - linkEnd.port = magnet.getAttribute('port'); - } - if (magnet.getAttribute('port') === 'input') { - return _this.renderer.createLink(undefined, linkEnd); - } - else { - return _this.renderer.createLink(linkEnd, undefined); - } - } - else { - return new joint$3.shapes.flo.Link(); - } - }, - // decide whether to create a link if the user clicks a magnet - validateMagnet: function (cellView, magnet) { - if (_this.readOnlyCanvas) { - return false; - } - else { - if (_this.editor && _this.editor.validatePort) { - return _this.editor.validatePort(_this.editorContext, cellView, magnet); - } - else { - return true; - } - } - }, - interactive: function (cellView, event) { - if (_this.readOnlyCanvas) { - return false; - } - else { - if (_this.editor && _this.editor.interactive) { - if (typeof _this.editor.interactive === 'function') { - // Type for interactive is wrong in JointJS have to cast to - return _this.editor.interactive(cellView, event); - } - else { - return _this.editor.interactive; - } - } - return true; - } - }, - highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { - 'default': { - name: 'addClass', - options: { - className: 'highlighted' - } - } - }, - markAvailable: true - }; - if (this.renderer && this.renderer.getLinkAnchorPoint) { - options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; - } - if (this.editor && this.editor.validateLink) { - var self_1 = this; - options.validateConnection = function (cellViewS, magnetS, cellViewT, magnetT, end, linkView) { - return self_1.editor.validateLink(_this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); - }; - } - // The paper is what will represent the graph on the screen - this.paper = new joint$3.dia.Paper(options); - this._disposables.add(tsDisposables.Disposable.create(function () { return _this.paper.remove(); })); - }; - EditorComponent.prototype.updatePaletteReadyState = function (ready) { - this.paletteReady.next(ready); - }; - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "metamodel", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "renderer", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "editor", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Number) - ], EditorComponent.prototype, "paletteSize", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "minZoom", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "maxZoom", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "zoomStep", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "paperPadding", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "floApi", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "validationMarkers", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "contentValidated", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "dslChange", void 0); - __decorate([ - core.Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], EditorComponent.prototype, "dsl", null); - EditorComponent = __decorate([ - core.Component({ - selector: 'flo-editor', - template: "\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ", - styles: ["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "], - encapsulation: core.ViewEncapsulation.None - }), - __metadata("design:paramtypes", [core.ElementRef]) - ], EditorComponent); - return EditorComponent; - }()); - - var $$5 = _$; - var ResizerDirective = /** @class */ (function () { - function ResizerDirective(element, document) { - var _this = this; - this.element = element; - this.document = document; - this.dragInProgress = false; - this.vertical = true; - this._subscriptions = new tsDisposables.CompositeDisposable(); - this.sizeChange = new core.EventEmitter(); - this.mouseMoveHandler = function (e) { - if (_this.dragInProgress) { - _this.mousemove(e); - } - }; - } - Object.defineProperty(ResizerDirective.prototype, "splitSize", { - set: function (splitSize) { - if (this.maxSplitSize && splitSize > this.maxSplitSize) { - splitSize = this.maxSplitSize; - } - if (this.vertical) { - // Handle vertical resizer - $$5(this.element.nativeElement).css({ - left: splitSize + 'px' - }); - $$5(this.first).css({ - width: splitSize + 'px' - }); - $$5(this.second).css({ - left: (splitSize + this._size) + 'px' - }); - } - else { - // Handle horizontal resizer - $$5(this.element.nativeElement).css({ - bottom: splitSize + 'px' - }); - $$5(this.first).css({ - bottom: (splitSize + this._size) + 'px' - }); - $$5(this.second).css({ - height: splitSize + 'px' - }); - } - this._splitSize = splitSize; - // Update the local field - this.sizeChange.emit(splitSize); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerWidth", { - set: function (width) { - this._size = width; - this.vertical = true; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerHeight", { - set: function (height) { - this._size = height; - this.vertical = false; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerLeft", { - set: function (first) { - this.first = first; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerTop", { - set: function (first) { - this.first = first; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerRight", { - set: function (second) { - this.second = second; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerBottom", { - set: function (second) { - this.second = second; - }, - enumerable: true, - configurable: true - }); - ResizerDirective.prototype.startDrag = function () { - this.dragInProgress = true; - }; - ResizerDirective.prototype.mousemove = function (event) { - var size; - if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node - size = event.pageX - $$5(this.first).offset().left; - } - else { - // Handle horizontal resizer Calculate new size relative to palette container DOM node - size = window.innerHeight - event.pageY - $$5(this.second).offset().top; - } - this.splitSize = size; - }; - ResizerDirective.prototype.ngOnInit = function () { - // Need to set left and right elements width and fire events on init when DOM is built - var _this = this; - this.splitSize = this._splitSize; - var subscription1 = rxjs.fromEvent($$5(this.document).get(0), 'mousemove') - .pipe(operators.sampleTime(300)) - .subscribe(this.mouseMoveHandler); - this._subscriptions.add(tsDisposables.Disposable.create(function () { return subscription1.unsubscribe(); })); - var subscription2 = rxjs.fromEvent($$5(this.document).get(0), 'mouseup') - .subscribe(function (e) { - if (_this.dragInProgress) { - _this.mousemove(e); - _this.dragInProgress = false; - } - }); - this._subscriptions.add(tsDisposables.Disposable.create(function () { return subscription2.unsubscribe(); })); - }; - ResizerDirective.prototype.ngOnDestroy = function () { - this._subscriptions.dispose(); - }; - __decorate([ - core.Input(), - __metadata("design:type", Number) - ], ResizerDirective.prototype, "maxSplitSize", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], ResizerDirective.prototype, "sizeChange", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) - ], ResizerDirective.prototype, "splitSize", null); - __decorate([ - core.Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) - ], ResizerDirective.prototype, "resizerWidth", null); - __decorate([ - core.Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) - ], ResizerDirective.prototype, "resizerHeight", null); - __decorate([ - core.Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerLeft", null); - __decorate([ - core.Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerTop", null); - __decorate([ - core.Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerRight", null); - __decorate([ - core.Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerBottom", null); - ResizerDirective = __decorate([ - core.Directive({ - selector: '[resizer]', - host: { '(mousedown)': 'startDrag()' } - }), - __param(1, core.Inject(platformBrowser.DOCUMENT)), - __metadata("design:paramtypes", [core.ElementRef, Object]) - ], ResizerDirective); - return ResizerDirective; - }()); - - var $$6 = _$; - var DslEditorComponent = /** @class */ (function () { - function DslEditorComponent(element) { - var _this = this; - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.debounce = 0; - this.dslChange = new core.EventEmitter(); - this.focus = new core.EventEmitter(); - this.blur = new core.EventEmitter(); - this.editor = new core.EventEmitter(); - this._dslChangedHandler = function () { - _this._dsl = _this.doc.getValue(); - _this.dslChange.emit(_this._dsl); - }; - } - Object.defineProperty(DslEditorComponent.prototype, "dsl", { - set: function (dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - var cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DslEditorComponent.prototype, "lintOptions", { - set: function (lintOptions) { - this._lint = lintOptions; - if (this.doc) { - this.doc.setOption('lint', this._lint); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DslEditorComponent.prototype, "hintOptions", { - set: function (hintOptions) { - this._hint = hintOptions; - if (this.doc) { - this.doc.setOption('hintOptions', this._hint); - } - }, - enumerable: true, - configurable: true - }); - DslEditorComponent.prototype.ngOnInit = function () { - var _this = this; - var options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - electricChars: false, - smartIndent: false, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - if (this._hint) { - options.hintOptions = this._hint; - } - this.doc = codemirrorMinified.fromTextArea($$6('#dsl-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this.debounce ? lodash.debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); - this.doc.on('focus', function () { return _this.focus.emit(); }); - this.doc.on('blur', function () { return _this.blur.emit(); }); - this.editor.emit(this.doc); - }; - DslEditorComponent.prototype.ngOnDestroy = function () { - }; - __decorate([ - core.Input('line-numbers'), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "lineNumbers", void 0); - __decorate([ - core.Input('line-wrapping'), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "lineWrapping", void 0); - __decorate([ - core.Input('scrollbar-style'), - __metadata("design:type", String) - ], DslEditorComponent.prototype, "scrollbarStyle", void 0); - __decorate([ - core.Input(), - __metadata("design:type", String) - ], DslEditorComponent.prototype, "placeholder", void 0); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "debounce", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "dslChange", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "focus", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "blur", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "editor", void 0); - __decorate([ - core.Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], DslEditorComponent.prototype, "dsl", null); - __decorate([ - core.Input(), - __metadata("design:type", Object), - __metadata("design:paramtypes", [Object]) - ], DslEditorComponent.prototype, "lintOptions", null); - __decorate([ - core.Input(), - __metadata("design:type", Object), - __metadata("design:paramtypes", [Object]) - ], DslEditorComponent.prototype, "hintOptions", null); - DslEditorComponent = __decorate([ - core.Component({ - selector: 'dsl-editor', - template: "\n \n ", - styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "], - encapsulation: core.ViewEncapsulation.None - }), - __metadata("design:paramtypes", [core.ElementRef]) - ], DslEditorComponent); - return DslEditorComponent; - }()); - - var $$7 = _$; - var CodeEditorComponent = /** @class */ (function () { - function CodeEditorComponent(element) { - var _this = this; - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.dslChange = new core.EventEmitter(); - this.focus = new core.EventEmitter(); - this.blur = new core.EventEmitter(); - this.editor = new core.EventEmitter(); - this._dslChangedHandler = function () { - _this._dsl = _this.doc.getValue(); - _this.dslChange.emit(_this._dsl); - if (_this._onChangeHandler) { - _this._onChangeHandler(_this._dsl); - } - }; - } - CodeEditorComponent_1 = CodeEditorComponent; - Object.defineProperty(CodeEditorComponent.prototype, "dsl", { - set: function (dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - var cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CodeEditorComponent.prototype, "language", { - set: function (_language) { - if (this._language !== _language) { - this._language = _language; - this.loadEditorMode(); - } - }, - enumerable: true, - configurable: true - }); - CodeEditorComponent.prototype.ngOnInit = function () { - var _this = this; - var options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - matchBrackets: true, - autoCloseBrackets: true, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - this.doc = codemirrorMinified.fromTextArea($$7('#code-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this._dslChangedHandler); - this.doc.on('focus', function () { - _this.focus.emit(); - if (_this._onTouchHandler) { - _this._onTouchHandler(); - } - }); - this.doc.on('blur', function () { return _this.blur.emit(); }); - this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); - this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); - this.loadEditorMode(); - this.editor.emit(this.doc); - }; - CodeEditorComponent.prototype.loadEditorMode = function () { - // CodeMirror doc object must be initialized - if (!this.doc) { - return; - } - var info = this._language ? codemirrorMinified.findModeByName(this._language) : undefined; - // Set proper editor mode - if (info) { - this.doc.setOption('mode', info.mime); - // (CodeMirror).autoLoadMode(this.doc, info.mode); - } - else { - this.doc.setOption('mode', 'text/plain'); - } - // Set proper Lint mode - this.doc.setOption('lint', this.getLintOptions()); - }; - CodeEditorComponent.prototype.ngOnDestroy = function () { - }; - CodeEditorComponent.prototype.writeValue = function (obj) { - this.dsl = obj; - }; - CodeEditorComponent.prototype.registerOnChange = function (fn) { - this._onChangeHandler = fn; - }; - CodeEditorComponent.prototype.registerOnTouched = function (fn) { - this._onTouchHandler = fn; - }; - CodeEditorComponent.prototype.getLintOptions = function () { - var _this = this; - switch (this._language) { - case 'javascript': - case 'json': - case 'coffeescript': - case 'yaml': - return { - onUpdateLinting: function (annotations) { - var warnings = []; - var errors = []; - if (_this.overviewRuler) { - if (Array.isArray(annotations)) { - annotations.forEach(function (a) { - if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { - if (a.severity === 'error') { - errors.push(a); - } - else if (a.severity === 'warning') { - warnings.push(a); - } - } - }); - } - } - _this.warningRuler.update(warnings); - _this.errorRuler.update(errors); - } - }; - } - return false; - }; - var CodeEditorComponent_1; - __decorate([ - core.Input('line-numbers'), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "lineNumbers", void 0); - __decorate([ - core.Input('line-wrapping'), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "lineWrapping", void 0); - __decorate([ - core.Input('scrollbar-style'), - __metadata("design:type", String) - ], CodeEditorComponent.prototype, "scrollbarStyle", void 0); - __decorate([ - core.Input(), - __metadata("design:type", String) - ], CodeEditorComponent.prototype, "placeholder", void 0); - __decorate([ - core.Input('overview-ruler'), - __metadata("design:type", Boolean) - ], CodeEditorComponent.prototype, "overviewRuler", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "dslChange", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "focus", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "blur", void 0); - __decorate([ - core.Output(), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "editor", void 0); - __decorate([ - core.Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], CodeEditorComponent.prototype, "dsl", null); - __decorate([ - core.Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], CodeEditorComponent.prototype, "language", null); - CodeEditorComponent = CodeEditorComponent_1 = __decorate([ - core.Component({ - selector: 'code-editor', - template: "\n
\n \n
\n ", - styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "], - encapsulation: core.ViewEncapsulation.None, - providers: [ - { - provide: forms.NG_VALUE_ACCESSOR, - useExisting: core.forwardRef(function () { return CodeEditorComponent_1; }), - multi: true - } - ] - }), - __metadata("design:paramtypes", [core.ElementRef]) - ], CodeEditorComponent); - return CodeEditorComponent; - }()); - - - (function (Properties) { - var InputType; - (function (InputType) { - InputType[InputType["TEXT"] = 0] = "TEXT"; - InputType[InputType["NUMBER"] = 1] = "NUMBER"; - InputType[InputType["SELECT"] = 2] = "SELECT"; - InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; - InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; - InputType[InputType["EMAIL"] = 5] = "EMAIL"; - InputType[InputType["URL"] = 6] = "URL"; - InputType[InputType["CODE"] = 7] = "CODE"; - })(InputType = Properties.InputType || (Properties.InputType = {})); - var GenericControlModel = /** @class */ (function () { - function GenericControlModel(_property, type, validation) { - this._property = _property; - this.type = type; - this.validation = validation; - } - Object.defineProperty(GenericControlModel.prototype, "id", { - get: function () { - return this.property.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "name", { - get: function () { - return this.property.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "description", { - get: function () { - return this.property.description; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "defaultValue", { - get: function () { - return this.property.defaultValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "value", { - get: function () { - return this.getValue(); - }, - set: function (value) { - this.setValue(value); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "property", { - get: function () { - return this._property; - }, - enumerable: true, - configurable: true - }); - GenericControlModel.prototype.setValue = function (value) { - this.property.value = value; - }; - GenericControlModel.prototype.getValue = function () { - return this.property.value; - }; - return GenericControlModel; - }()); - Properties.GenericControlModel = GenericControlModel; - var CheckBoxControlModel = /** @class */ (function (_super) { - __extends(CheckBoxControlModel, _super); - function CheckBoxControlModel(_property, validation) { - return _super.call(this, _property, InputType.CHECKBOX, validation) || this; - } - CheckBoxControlModel.prototype.getValue = function () { - var res = _super.prototype.getValue.call(this); - var type = typeof res; - switch (type) { - case 'boolean': - return res; - case 'string': - switch (res.trim().toLowerCase()) { - case 'true': - case '1': - return true; - case 'false': - case '0': - return false; - default: - return this.property.defaultValue; - } - case 'number': - var num = res; - if (num === 0) { - return false; - } - else if (num === 1) { - return true; - } - else { - return this.property.defaultValue; - } - } - return this.property.defaultValue; - }; - return CheckBoxControlModel; - }(GenericControlModel)); - Properties.CheckBoxControlModel = CheckBoxControlModel; - var AbstractCodeControlModel = /** @class */ (function (_super) { - __extends(AbstractCodeControlModel, _super); - function AbstractCodeControlModel(_property, encode, decode, validation) { - var _this = _super.call(this, _property, InputType.CODE, validation) || this; - _this.encode = encode; - _this.decode = decode; - return _this; - } - Object.defineProperty(AbstractCodeControlModel.prototype, "value", { - get: function () { - var dsl = _super.prototype.getValue.call(this); - if (dsl && this.decode) { - return this.decode(dsl); - } - else { - return dsl; - } - }, - set: function (value) { - if (value && this.encode) { - _super.prototype.setValue.call(this, this.encode(value)); - } - else { - _super.prototype.setValue.call(this, value); - } - }, - enumerable: true, - configurable: true - }); - return AbstractCodeControlModel; - }(GenericControlModel)); - Properties.AbstractCodeControlModel = AbstractCodeControlModel; - var GenericCodeControlModel = /** @class */ (function (_super) { - __extends(GenericCodeControlModel, _super); - function GenericCodeControlModel(_property, language, encode, decode, validation) { - var _this = _super.call(this, _property, encode, decode, validation) || this; - _this.language = language; - return _this; - } - return GenericCodeControlModel; - }(AbstractCodeControlModel)); - Properties.GenericCodeControlModel = GenericCodeControlModel; - var CodeControlModelWithDynamicLanguageProperty = /** @class */ (function (_super) { - __extends(CodeControlModelWithDynamicLanguageProperty, _super); - function CodeControlModelWithDynamicLanguageProperty(_property, _languagePropertyName, _groupModel, encode, decode, validation) { - var _this = _super.call(this, _property, encode, decode, validation) || this; - _this._languagePropertyName = _languagePropertyName; - _this._groupModel = _groupModel; - return _this; - } - Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "language", { - get: function () { - var value = this.languageControlModel.value; - return value ? value : this.languageControlModel.defaultValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "languageControlModel", { - get: function () { - var _this = this; - if (!this._langControlModel) { - // Cast to Properties.ControlModel from Properties.ControlModel | undefined - // Should not be undefined! - this._langControlModel = this._groupModel.getControlsModels().find(function (c) { return c.id === _this._languagePropertyName; }); - } - return this._langControlModel; - }, - enumerable: true, - configurable: true - }); - return CodeControlModelWithDynamicLanguageProperty; - }(AbstractCodeControlModel)); - Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; - var GenericListControlModel = /** @class */ (function (_super) { - __extends(GenericListControlModel, _super); - function GenericListControlModel(property, validation) { - return _super.call(this, property, InputType.TEXT, validation) || this; - } - Object.defineProperty(GenericListControlModel.prototype, "value", { - get: function () { - return this.property.value ? this.property.value.join(', ') : ''; - }, - set: function (value) { - this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; - }, - enumerable: true, - configurable: true - }); - return GenericListControlModel; - }(GenericControlModel)); - Properties.GenericListControlModel = GenericListControlModel; - var SelectControlModel = /** @class */ (function (_super) { - __extends(SelectControlModel, _super); - function SelectControlModel(_property, type, options) { - var _this = _super.call(this, _property, type) || this; - _this.options = options; - if (_property.defaultValue === undefined) { - options.unshift({ - name: 'SELECT', - value: _property.defaultValue - }); - } - return _this; - } - return SelectControlModel; - }(GenericControlModel)); - Properties.SelectControlModel = SelectControlModel; - var DefaultCellPropertiesSource = /** @class */ (function () { - function DefaultCellPropertiesSource(cell) { - this.cell = cell; - } - DefaultCellPropertiesSource.prototype.getProperties = function () { - var _this = this; - var metadata = this.cell.attr('metadata'); - return Promise.resolve(metadata.properties().then(function (propsMetadata) { return Array.from(propsMetadata.values()).map(function (m) { return _this.createProperty(m); }); })); - }; - DefaultCellPropertiesSource.prototype.createProperty = function (metadata) { - return { - id: metadata.id, - name: metadata.name, - type: metadata.type, - defaultValue: metadata.defaultValue, - attr: "props/" + metadata.name, - value: this.cell.attr("props/" + metadata.name), - description: metadata.description, - valueOptions: metadata.options - }; - }; - DefaultCellPropertiesSource.prototype.applyChanges = function (properties) { - var _this = this; - this.cell.trigger('batch:start', { batchName: 'update properties' }); - properties.forEach(function (property) { - if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || - (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { - var currentValue = _this.cell.attr(property.attr); - if (currentValue !== undefined && currentValue !== null) { - // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync - _this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); - _this.cell.removeAttr(property.attr); - } - } - else { - _this.cell.attr(property.attr, property.value); - } - }); - this.cell.trigger('batch:stop', { batchName: 'update properties' }); - }; - return DefaultCellPropertiesSource; - }()); - Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; - var PropertiesGroupModel = /** @class */ (function () { - function PropertiesGroupModel(propertiesSource) { - this.loading = true; - this.propertiesSource = propertiesSource; - } - PropertiesGroupModel.prototype.load = function () { - var _this = this; - this.loading = true; - this._loadedSubject = new rxjs.Subject(); - this.propertiesSource.getProperties().then(function (properties) { - _this.controlModels = properties.map(function (p) { return _this.createControlModel(p); }); - _this.loading = false; - _this._loadedSubject.next(true); - _this._loadedSubject.complete(); - }); - }; - Object.defineProperty(PropertiesGroupModel.prototype, "isLoading", { - get: function () { - return this.loading; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(PropertiesGroupModel.prototype, "loadedSubject", { - get: function () { - return this._loadedSubject; - }, - enumerable: true, - configurable: true - }); - PropertiesGroupModel.prototype.getControlsModels = function () { - return this.controlModels; - }; - PropertiesGroupModel.prototype.createControlModel = function (property) { - return new GenericControlModel(property, InputType.TEXT); - }; - PropertiesGroupModel.prototype.applyChanges = function () { - if (this.loading) { - return; - } - var properties = this.controlModels.map(function (cm) { return cm.property; }); - this.propertiesSource.applyChanges(properties); - }; - return PropertiesGroupModel; - }()); - Properties.PropertiesGroupModel = PropertiesGroupModel; - var Validators; - (function (Validators) { - function uniqueResource(service, debounce$$1) { - return function (control) { - return new rxjs.Observable(function (obs) { - if (control.valueChanges && control.value) { - control.valueChanges - .pipe(operators.debounceTime(debounce$$1), operators.mergeMap(function (value) { return service(value); })) - .subscribe(function () { - obs.next({ uniqueResource: true }); - obs.complete(); - }, function () { - obs.next(undefined); - obs.complete(); - }); - } - else { - obs.next(undefined); - obs.complete(); - } - }); - }; - } - Validators.uniqueResource = uniqueResource; - function noneOf(excluded) { - return function (control) { - return excluded.find(function (e) { return e === control.value; }) ? { 'noneOf': { value: control.value } } : {}; - }; - } - Validators.noneOf = noneOf; - })(Validators = Properties.Validators || (Properties.Validators = {})); - })(exports.Properties || (exports.Properties = {})); - - var PropertiesGroupComponent = /** @class */ (function () { - function PropertiesGroupComponent() { - } - PropertiesGroupComponent.prototype.ngOnInit = function () { - var _this = this; - if (this.propertiesGroupModel.isLoading) { - var subscription_1 = this.propertiesGroupModel.loadedSubject.subscribe(function (loaded) { - if (loaded) { - subscription_1.unsubscribe(); - _this.createGroupControls(); - } - }); - } - else { - this.createGroupControls(); - } - }; - PropertiesGroupComponent.prototype.createGroupControls = function () { - var _this = this; - this.propertiesGroupModel.getControlsModels().forEach(function (c) { - if (c.validation) { - _this.form.addControl(c.id, new forms.FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); - } - else { - _this.form.addControl(c.id, new forms.FormControl(c.value || '')); - } - }); - }; - __decorate([ - core.Input(), - __metadata("design:type", exports.Properties.PropertiesGroupModel) - ], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); - __decorate([ - core.Input(), - __metadata("design:type", forms.FormGroup) - ], PropertiesGroupComponent.prototype, "form", void 0); - PropertiesGroupComponent = __decorate([ - core.Component({ - selector: 'properties-group', - template: "\n
\n \n
\n ", - encapsulation: core.ViewEncapsulation.None - }) - ], PropertiesGroupComponent); - return PropertiesGroupComponent; - }()); - - var DynamicFormPropertyComponent = /** @class */ (function () { - function DynamicFormPropertyComponent() { - } - Object.defineProperty(DynamicFormPropertyComponent.prototype, "types", { - get: function () { - return exports.Properties.InputType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DynamicFormPropertyComponent.prototype, "control", { - get: function () { - return this.form.controls[this.model.id]; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DynamicFormPropertyComponent.prototype, "errorData", { - get: function () { - var _this = this; - return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) - .filter(function (e) { return _this.control.errors && _this.control.errors[e.id]; }); - }, - enumerable: true, - configurable: true - }); - __decorate([ - core.Input(), - __metadata("design:type", Object) - ], DynamicFormPropertyComponent.prototype, "model", void 0); - __decorate([ - core.Input(), - __metadata("design:type", forms.FormGroup) - ], DynamicFormPropertyComponent.prototype, "form", void 0); - DynamicFormPropertyComponent = __decorate([ - core.Component({ - selector: 'df-property', - template: "\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ", - encapsulation: core.ViewEncapsulation.None - }), - __metadata("design:paramtypes", []) - ], DynamicFormPropertyComponent); - return DynamicFormPropertyComponent; - }()); - - var FloModule = /** @class */ (function () { - function FloModule() { - } - FloModule = __decorate([ - core.NgModule({ - imports: [ - forms.FormsModule, - common.CommonModule, - forms.ReactiveFormsModule - ], - declarations: [ - Palette, - EditorComponent, - ResizerDirective, - DslEditorComponent, - CodeEditorComponent, - PropertiesGroupComponent, - DynamicFormPropertyComponent - ], - exports: [ - EditorComponent, - DslEditorComponent, - DynamicFormPropertyComponent, - PropertiesGroupComponent - ] - }) - ], FloModule); - return FloModule; - }()); - - exports.FloModule = FloModule; - exports.Palette = Palette; - exports.EditorComponent = EditorComponent; - exports.DslEditorComponent = DslEditorComponent; - exports.CodeEditorComponent = CodeEditorComponent; - exports.PropertiesGroupComponent = PropertiesGroupComponent; - exports.DynamicFormPropertyComponent = DynamicFormPropertyComponent; - exports.ResizerDirective = ResizerDirective; - - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); -//# sourceMappingURL=spring-flo.umd.js.map diff --git a/dist/bundles/spring-flo.umd.min.js b/dist/bundles/spring-flo.umd.min.js deleted file mode 100644 index bc043f2..0000000 --- a/dist/bundles/spring-flo.umd.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?factory(exports,require("jointjs"),require("jquery"),require("lodash"),require("@angular/core"),require("rxjs"),require("rxjs/operators"),require("@angular/platform-browser"),require("ts-disposables"),require("codemirror-minified"),require("codemirror-minified/addon/lint/lint"),require("codemirror-minified/addon/hint/show-hint"),require("codemirror-minified/addon/display/placeholder"),require("codemirror-minified/addon/scroll/annotatescrollbar"),require("codemirror-minified/addon/scroll/simplescrollbars"),require("@angular/forms"),require("codemirror-minified/mode/meta"),require("codemirror-minified/addon/edit/matchbrackets"),require("codemirror-minified/addon/edit/closebrackets"),require("codemirror-minified/addon/lint/javascript-lint"),require("codemirror-minified/addon/lint/coffeescript-lint"),require("codemirror-minified/addon/lint/json-lint"),require("codemirror-minified/addon/lint/yaml-lint"),require("codemirror-minified/mode/groovy/groovy"),require("codemirror-minified/mode/javascript/javascript"),require("codemirror-minified/mode/python/python"),require("codemirror-minified/mode/ruby/ruby"),require("codemirror-minified/mode/clike/clike"),require("codemirror-minified/mode/yaml/yaml"),require("codemirror-minified/mode/coffeescript/coffeescript"),require("@angular/common")):"function"==typeof define&&define.amd?define("spring-flo",["exports","jointjs","jquery","lodash","@angular/core","rxjs","rxjs/operators","@angular/platform-browser","ts-disposables","codemirror-minified","codemirror-minified/addon/lint/lint","codemirror-minified/addon/hint/show-hint","codemirror-minified/addon/display/placeholder","codemirror-minified/addon/scroll/annotatescrollbar","codemirror-minified/addon/scroll/simplescrollbars","@angular/forms","codemirror-minified/mode/meta","codemirror-minified/addon/edit/matchbrackets","codemirror-minified/addon/edit/closebrackets","codemirror-minified/addon/lint/javascript-lint","codemirror-minified/addon/lint/coffeescript-lint","codemirror-minified/addon/lint/json-lint","codemirror-minified/addon/lint/yaml-lint","codemirror-minified/mode/groovy/groovy","codemirror-minified/mode/javascript/javascript","codemirror-minified/mode/python/python","codemirror-minified/mode/ruby/ruby","codemirror-minified/mode/clike/clike","codemirror-minified/mode/yaml/yaml","codemirror-minified/mode/coffeescript/coffeescript","@angular/common"],factory):factory((global.ng=global.ng||{},global.ng["spring-flo"]={}),global.jointjs,global.jquery,global.lodash,global.ng.core,global.rxjs,global.rxjs.operators,global.ng.browser,global["ts-disposables"],global["codemirror-minified"],global["codemirror-minified/addon/lint/lint"],global["codemirror-minified/addon/hint/show-hint"],global["codemirror-minified/addon/edit/closebrackets"],global["codemirror-minified/addon/scroll/annotatescrollbar"],global["codemirror-minified/addon/scroll/simplescrollbars"],global.ng.forms,global["codemirror-minified/mode/meta"],global["codemirror-minified/addon/edit/matchbrackets"],global["codemirror-minified/addon/edit/closebrackets"],global["codemirror-minified/addon/lint/javascript-lint"],global["codemirror-minified/addon/lint/coffeescript-lint"],global["codemirror-minified/addon/lint/json-lint"],global["codemirror-minified/addon/lint/yaml-lint"],global["codemirror-minified/mode/groovy/groovy"],global["codemirror-minified/mode/javascript/javascript"],global["codemirror-minified/mode/python/python"],global["codemirror-minified/mode/ruby/ruby"],global["codemirror-minified/mode/clike/clike"],global["codemirror-minified/mode/yaml/yaml"],global["codemirror-minified/mode/coffeescript/coffeescript"],global.ng.common)}(this,function(exports,_joint,_$,lodash,core,rxjs,operators,platformBrowser,tsDisposables,codemirrorMinified,lint,showHint,placeholder,annotatescrollbar,simplescrollbars,forms,meta,matchbrackets,closebrackets,javascriptLint,coffeescriptLint,jsonLint,yamlLint,groovy,javascript,python,ruby,clike,yaml,coffeescript,common){"use strict";var extendStatics=function(d,b){return(extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b}||function(d,b){for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p])})(d,b)};function __extends(d,b){function __(){this.constructor=d}extendStatics(d,b),d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)}function __decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;0<=i;i--)(d=decorators[i])&&(r=(c<3?d(r):3',{a:1-.96*amount,b:.95*amount,c:.01*amount,d:.3*amount,e:.2*amount,f:1-.9*amount,g:.7*amount,h:.05*amount,i:.05*amount,k:1-.1*amount})},joint.util.filter.orangescale=function(args){var amount=Number.isFinite(args.amount)?args.amount:1;return lodash.template('',{a:1+.5*amount,b:1.4*amount,c:.2*amount,d:.3*amount,e:.3*amount,f:1+.05*amount,g:.2*amount,h:.15*amount,i:.3*amount,k:.3*amount,l:1-.6*amount})},joint.shapes.flo.Node=joint.shapes.basic.Generic.extend({markup:'',defaults:joint.util.deepSupplement({type:joint.shapes.flo.NODE_TYPE,position:{x:0,y:0},size:{width:120,height:35},attrs:{".":{magnet:!1},".border":{width:120,height:35,rx:3,ry:3,"fill-opacity":0,stroke:"#eeeeee","stroke-width":0},".box":{width:120,height:35,rx:3,ry:3,stroke:"#6db33f",fill:"#eeeeee","stroke-width":1},".input-port":{port:"input",height:8,width:8,magnet:!0,fill:"#eeeeee",transform:"translate(-4,13.5)",stroke:"#34302d","stroke-width":1},".output-port":{port:"output",height:8,width:8,magnet:!0,fill:"#eeeeee",transform:"translate(116,13.5)",stroke:"#34302d","stroke-width":1},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":.3,ref:".border",fill:"black","font-size":14},".label2":{text:"⇒","text-anchor":"middle","ref-x":.15,"ref-y":.2,ref:".border",fill:"black","font-size":24},".shape":{},".image":{width:120,height:35}}},joint.shapes.basic.Generic.prototype.defaults)}),joint.shapes.flo.Link=joint.dia.Link.extend({defaults:joint.util.deepSupplement({type:joint.shapes.flo.LINK_TYPE,attrs:{".connection":{stroke:"#34302d","stroke-width":2},".marker-arrowheads":{display:"none"},".tool-options":{display:"none"}}},joint.dia.Link.prototype.defaults)}),joint.shapes.flo.LinkView=joint.dia.LinkView.extend({options:joint.util.deepSupplement({},joint.dia.LinkView.prototype.options),_beforeArrowheadMove:function(){this.model.get("source").id&&(this._oldSource=this.model.get("source")),this.model.get("target").id&&(this._oldTarget=this.model.get("target")),joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this,arguments)},_afterArrowheadMove:function(){joint.dia.LinkView.prototype._afterArrowheadMove.apply(this,arguments),this.model.get("source").id||(this._oldSource?this.model.set("source",this._oldSource):this.model.remove()),this.model.get("target").id||(this._oldTarget?this.model.set("target",this._oldTarget):this.model.remove()),delete this._oldSource,delete this._oldTarget}}),joint.shapes.flo.ElementView=joint.dia.ElementView.extend({beingDragged:!1,_tempOpacity:1,_hovering:!1,dragLinkStart:function(evt,magnet,x,y){this.model.startBatch("add-link");var linkView=this.addLinkFromMagnet(magnet,x,y);joint.dia.CellView.prototype.pointerdown.apply(linkView,[evt,x,y]),linkView.notify("link:pointerdown",evt,x,y);var sourceOrTarget="input"===$$1(magnet).attr("port")?"source":"target";linkView.eventData(evt,linkView.startArrowheadMove(sourceOrTarget,{whenNotAllowed:"remove"})),this.eventData(evt,{linkView:linkView})},addLinkFromMagnet:function(magnet,x,y){var sourceEnd,targetEnd,paper=this.paper,graph=paper.model,link=paper.getDefaultLink(this,magnet);return"input"===$$1(magnet).attr("port")?(sourceEnd={x:x,y:y},targetEnd=this.getLinkEnd(magnet,x,y,link,"target")):(sourceEnd=this.getLinkEnd(magnet,x,y,link,"source"),targetEnd={x:x,y:y}),link.set({source:sourceEnd,target:targetEnd}).addTo(graph,{async:!1,ui:!0}),link.findView(paper)},drag:function(evt,x,y){!1!==(lodash.isFunction(this.options.interactive)?this.options.interactive(this,"pointermove"):this.options.interactive)&&this.paper.trigger("dragging-node-over-canvas",{type:exports.Flo.DnDEventType.DRAG,view:this,event:evt}),joint.dia.ElementView.prototype.drag.apply(this,arguments)},dragEnd:function(evt,x,y){this.paper.trigger("dragging-node-over-canvas",{type:exports.Flo.DnDEventType.DROP,view:this,event:evt}),joint.dia.ElementView.prototype.dragEnd.apply(this,arguments)}}),joint.shapes.flo.ErrorDecoration=joint.shapes.basic.Generic.extend({markup:'',defaults:joint.util.deepSupplement({type:joint.shapes.flo.DECORATION_TYPE,size:ERROR_MARKER_SIZE,attrs:{image:ERROR_MARKER_SIZE}},joint.shapes.basic.Generic.prototype.defaults)}),(Constants=exports.Constants||(exports.Constants={})).REMOVE_HANDLE_TYPE="remove",Constants.PROPERTIES_HANDLE_TYPE="properties",Constants.ERROR_DECORATION_KIND="error",Constants.PALETTE_CONTEXT="palette",Constants.CANVAS_CONTEXT="canvas",Constants.FEEDBACK_CONTEXT="feedback",Shapes=exports.Shapes||(exports.Shapes={}),Factory=function(){function Factory(){}return Factory.createNode=function(params){var node,renderer=params.renderer,paper=params.paper,metadata=params.metadata,position=params.position,props=params.props,graph=params.graph||(params.paper?params.paper.model:void 0);if(position||(position={x:0,y:0}),renderer&&lodash.isFunction(renderer.createNode)?node=renderer.createNode(metadata,props):(node=new joint.shapes.flo.Node,metadata&&node.attr(".label/text",metadata.name)),node.set("type",joint.shapes.flo.NODE_TYPE),position&&node.set("position",position),props&&Array.from(props.keys()).forEach(function(key){return node.attr("props/"+key,props.get(key))}),node.attr("metadata",metadata),graph&&graph.addCell(node),renderer&&lodash.isFunction(renderer.initializeNewNode)){var descriptor={paper:paper,graph:graph};renderer.initializeNewNode(node,descriptor)}return node},Factory.createLink=function(params){var link,renderer=params.renderer,paper=params.paper,metadata=params.metadata,source=params.source,target=params.target,props=params.props,graph=params.graph||(params.paper?params.paper.model:void 0);if(link=renderer&&lodash.isFunction(renderer.createLink)?renderer.createLink(source,target,metadata,props):new joint.shapes.flo.Link,source&&link.set("source",source),target&&link.set("target",target),link.set("type",joint.shapes.flo.LINK_TYPE),metadata&&link.attr("metadata",metadata),props&&Array.from(props.keys()).forEach(function(key){return link.attr("props/"+key,props.get(key))}),graph&&graph.addCell(link),renderer&&lodash.isFunction(renderer.initializeNewLink)){var descriptor={paper:paper,graph:graph};renderer.initializeNewLink(link,descriptor)}return link.attr(".marker-vertices/display","none"),link},Factory.createDecoration=function(params){var decoration,renderer=params.renderer,paper=params.paper,parent=params.parent,kind=params.kind,messages=params.messages,location=params.position,graph=params.graph||(params.paper?params.paper.model:void 0);if(location||(location={x:0,y:0}),(decoration=renderer&&lodash.isFunction(renderer.createDecoration)?renderer.createDecoration(kind,parent):new joint.shapes.flo.ErrorDecoration({attrs:{image:{"xlink:href":DECORATION_ICON_MAP.get(kind)}}})).set("type",joint.shapes.flo.DECORATION_TYPE),decoration.set("position",location),(isChrome||isFF)&&parent&&"number"==typeof parent.get("z")&&decoration.set("z",parent.get("z")+1),decoration.attr("./kind",kind),decoration.attr("messages",messages),graph&&graph.addCell(decoration),parent.embed(decoration),renderer&&lodash.isFunction(renderer.initializeNewDecoration)){var descriptor={paper:paper,graph:graph};renderer.initializeNewDecoration(decoration,descriptor)}return decoration},Factory.createHandle=function(params){var handle,renderer=params.renderer,paper=params.paper,parent=params.parent,kind=params.kind,location=params.position,graph=params.graph||(params.paper?params.paper.model:void 0);if(location||(location={x:0,y:0}),(handle=renderer&&lodash.isFunction(renderer.createHandle)?renderer.createHandle(kind,parent):new joint.shapes.flo.ErrorDecoration({size:HANDLE_SIZE,attrs:{image:{"xlink:href":HANDLE_ICON_MAP.get(kind)}}})).set("type",joint.shapes.flo.HANDLE_TYPE),handle.set("position",location),(isChrome||isFF)&&parent&&"number"==typeof parent.get("z")&&handle.set("z",parent.get("z")+1),handle.attr("./kind",kind),graph&&graph.addCell(handle),parent.embed(handle),renderer&&lodash.isFunction(renderer.initializeNewHandle)){var descriptor={paper:paper,graph:graph};renderer.initializeNewHandle(handle,descriptor)}return handle},Factory}(),Shapes.Factory=Factory;var joint$1=exports.Flo.joint,$$2=_$;joint$1.shapes.flo.PaletteGroupHeader=joint$1.shapes.basic.Generic.extend({markup:'',defaults:joint$1.util.deepSupplement({type:"palette.groupheader",size:{width:170,height:30},position:{x:0,y:0},attrs:{rect:{fill:"#34302d","stroke-width":1,stroke:"#6db33f","follow-scale":!0,width:80,height:40},text:{text:"",fill:"#eeeeee","ref-x":.5,"ref-y":7,"x-alignment":"middle","font-size":18},path:{fill:"white","stroke-width":2,stroke:"white"}},isOpen:!0},joint$1.shapes.basic.Generic.prototype.defaults)});var Palette=function(){function Palette(element,document){var _this=this;this.element=element,this.document=document,this._metamodelListener={metadataError:function(data){},metadataAboutToChange:function(){},metadataChanged:function(){return _this.rebuildPalette()}},this.initialized=!1,this._filterText="",this.filterTextModel=new rxjs.Subject,this.paletteEntryPadding={width:12,height:12},this.onPaletteEntryDrop=new core.EventEmitter,this.paletteReady=new core.EventEmitter,this.paletteFocus=new core.EventEmitter,this.mouseMoveHanlder=function(e){return _this.handleDrag(e)},this.mouseUpHanlder=function(e){return _this.handleMouseUp(e)},this.paletteGraph=new joint$1.dia.Graph,this.paletteGraph.set("type",exports.Constants.PALETTE_CONTEXT),this._filterText="",this.closedGroups=new Set}return Object.defineProperty(Palette.prototype,"paletteSize",{set:function(size){console.debug("Palette Size: "+size),this._paletteSize!==size&&(this._paletteSize=size,this.rebuildPalette())},enumerable:!0,configurable:!0}),Palette.prototype.onFocus=function(){this.paletteFocus.emit()},Palette.prototype.ngOnInit=function(){var _this=this,element=$$2("#palette-paper",this.element.nativeElement);this.palette=new joint$1.dia.Paper({el:element,gridSize:1,model:this.paletteGraph,height:$$2(this.element.nativeElement.parentNode).height(),width:$$2(this.element.nativeElement.parentNode).width(),elementView:this.getPaletteView(this.renderer&&this.renderer.getNodeView?this.renderer.getNodeView():joint$1.dia.ElementView),interactive:!1}),this.palette.on("cell:pointerup",function(cellview,evt){_this.viewBeingDragged&&(_this.trigger({type:exports.Flo.DnDEventType.DROP,view:_this.viewBeingDragged,event:evt}),_this.viewBeingDragged=void 0),_this.clickedElement=void 0,$$2("#palette-floater").remove(),_this.floaterpaper&&_this.floaterpaper.remove()}),this.palette.on("cell:pointerclick",function(cellview,event){var cell=cellview.model;cell.attributes.header&&(cell.get("isOpen")?_this.rotateClosed(cell):_this.rotateOpen(cell))}),$$2(this.document).on("mouseup",this.mouseUpHanlder),this.metamodel?this.metamodel.load().then(function(data){_this.buildPalette(data),_this.metamodel&&_this.metamodel.subscribe&&_this.metamodel.subscribe(_this._metamodelListener),_this.filterTextModel.pipe(operators.debounceTime(300)).subscribe(function(value){return _this.rebuildPalette()}),_this.initialized=!0}):console.error("No Metamodel service specified for palette!"),this._paletteSize=this._paletteSize||$$2(this.element.nativeElement.parentNode).width()},Palette.prototype.ngOnDestroy=function(){this.metamodel&&this.metamodel.unsubscribe&&this.metamodel.unsubscribe(this._metamodelListener),$$2(this.document).off("mouseup",this.mouseUpHanlder),this.palette.remove()},Palette.prototype.ngOnChanges=function(changes){},Palette.prototype.createPaletteGroup=function(title,isOpen){var newGroupHeader=new joint$1.shapes.flo.PaletteGroupHeader({attrs:{text:{text:title}}});return newGroupHeader.set("header",title),isOpen||(newGroupHeader.attr({path:{transform:"rotate(-90,15,13)"}}),newGroupHeader.set("isOpen",!1)),this.paletteGraph.addCell(newGroupHeader),newGroupHeader},Palette.prototype.createPaletteEntry=function(title,metadata){return exports.Shapes.Factory.createNode({renderer:this.renderer,paper:this.palette,metadata:metadata})},Palette.prototype.buildPalette=function(metamodel){var _this=this,startTime=(new Date).getTime();this.paletteReady.emit(!1),this.paletteGraph.clear();var filterText=this.filterText;filterText&&(filterText=filterText.toLowerCase());var paletteNodes=[],groupAdded=new Set,parentWidth=this._paletteSize;console.debug("Parent Width: "+parentWidth),this.metamodel.groups().forEach(function(group){metamodel&&metamodel.has(group)&&Array.from(metamodel.get(group).keys()).sort().forEach(function(name){var node=metamodel.get(group).get(name);if(node){var nodeActive=!(node.metadata&&node.metadata.noPaletteEntry);if(nodeActive&&filterText&&(nodeActive=!1,-1!==name.toLowerCase().indexOf(filterText)?nodeActive=!0:-1!==group.toLowerCase().indexOf(filterText)&&(nodeActive=!0)),nodeActive){if(!groupAdded.has(group)){var header=_this.createPaletteGroup(group,!_this.closedGroups.has(group));header.set("size",{width:parentWidth,height:30}),paletteNodes.push(header),groupAdded.add(group)}_this.closedGroups.has(group)||paletteNodes.push(_this.createPaletteEntry(name,node))}}})});var cellWidth=0,cellHeight=0;paletteNodes.forEach(function(pnode){if(pnode.attr("metadata/name")){var dimension={width:pnode.get("size").width,height:pnode.get("size").height};cellWidth",{id:"palette-floater"}).appendTo($$2("body"));var floatergraph=new joint$1.dia.Graph;floatergraph.set("type",exports.Constants.FEEDBACK_CONTEXT);var parent_1=$$2("#palette-floater");this.floaterpaper=new joint$1.dia.Paper({el:$$2("#palette-floater"),elementView:this.renderer&&this.renderer.getNodeView?this.renderer.getNodeView():joint$1.dia.ElementView,gridSize:10,model:floatergraph,height:parent_1.height(),width:parent_1.width(),validateMagnet:function(){return!1},validateConnection:function(){return!1}});var floaternode=exports.Shapes.Factory.createNode({renderer:this.renderer,paper:this.floaterpaper,graph:floatergraph,metadata:dataOfClickedElement}),box=this.floaterpaper.findViewByModel(floaternode).getBBox(),size=floaternode.get("size");floaternode.translate(box.width-size.width,box.height-size.height),this.viewBeingDragged=this.floaterpaper.findViewByModel(floaternode),$$2("#palette-floater").offset({left:event.pageX+5,top:event.pageY+5})}},Palette.prototype.rotateOpen=function(element){var _this=this;setTimeout(function(){return _this.doRotateOpen(element,90)})},Palette.prototype.doRotateOpen=function(element,angle){var _this=this;angle-=10,element.attr({path:{transform:"rotate(-"+angle+",15,13)"}}),angle<=0?(element.set("isOpen",!0),this.closedGroups.delete(element.get("header")),this.rebuildPalette()):setTimeout(function(){return _this.doRotateOpen(element,angle)},10)},Palette.prototype.doRotateClose=function(element,angle){var _this=this;angle+=10,element.attr({path:{transform:"rotate(-"+angle+",15,13)"}}),90<=angle?(element.set("isOpen",!1),this.closedGroups.add(element.get("header")),this.rebuildPalette()):setTimeout(function(){return _this.doRotateClose(element,angle)},10)},Palette.prototype.rotateClosed=function(element){var _this=this;setTimeout(function(){return _this.doRotateClose(element,0)})},__decorate([core.Input(),__metadata("design:type",Object)],Palette.prototype,"metamodel",void 0),__decorate([core.Input(),__metadata("design:type",Object)],Palette.prototype,"renderer",void 0),__decorate([core.Input(),__metadata("design:type",Object)],Palette.prototype,"paletteEntryPadding",void 0),__decorate([core.Output(),__metadata("design:type",Object)],Palette.prototype,"onPaletteEntryDrop",void 0),__decorate([core.Output(),__metadata("design:type",Object)],Palette.prototype,"paletteReady",void 0),__decorate([core.Output(),__metadata("design:type",Object)],Palette.prototype,"paletteFocus",void 0),__decorate([core.Input(),__metadata("design:type",Number),__metadata("design:paramtypes",[Number])],Palette.prototype,"paletteSize",null),Palette=__decorate([core.Component({selector:"flo-palette",template:'\n
\n \n
\n
\n
\n
\n ',styles:['\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: "Varela Round",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n '],encapsulation:core.ViewEncapsulation.None}),__param(1,core.Inject(platformBrowser.DOCUMENT)),__metadata("design:paramtypes",[core.ElementRef,Object])],Palette)}(),joint$2=exports.Flo.joint,$$3=_$,Utils=function(){function Utils(){}return Utils.fanRoute=function(graph,cell){if(cell instanceof joint$2.dia.Element){var links=graph.getConnectedLinks(cell),groupsOfOverlappingLinks=lodash.groupBy(links,function(link){var sourceId=link.get("source").id,targetId=link.get("target").id;return cell.id!==sourceId?sourceId:targetId});lodash.each(groupsOfOverlappingLinks,function(group,key){var toRoute={};void 0!==key&&(group.forEach(function(link){link.get("source").id===cell.get("id")&&link.get("target").id?toRoute[link.get("target").id]=link:link.get("target").id===cell.get("id")&&link.get("source").id&&(toRoute[link.get("source").id]=link)}),Object.keys(toRoute).forEach(function(k){Utils.fanRoute(graph,toRoute[k])}))})}else if(cell instanceof joint$2.dia.Link){var srcId_1=cell.get("source").id||cell.previous("source").id,trgId_1=cell.get("target").id||cell.previous("target").id;if(!srcId_1||!trgId_1)return;var siblings=graph.getLinks().filter(function(sibling){var _srcId=sibling.get("source").id,_trgId=sibling.get("target").id,vertices=sibling.get("vertices"),fanRouted=!vertices||0===vertices.length||sibling.get("fanRouted");return(_srcId===srcId_1&&_trgId===trgId_1||_srcId===trgId_1&&_trgId===srcId_1)&&fanRouted});switch(siblings.length){case 0:break;case 1:var vertices=cell.get("vertices");vertices&&vertices.length&&cell.get("fanRouted")&&cell.unset("vertices");break;default:var source=graph.getCell(srcId_1),target=graph.getCell(trgId_1);if(!source||!target)return;var srcCenter=source.getBBox().center(),trgCenter=target.getBBox().center(),midPoint_1=joint$2.g.line(srcCenter,trgCenter).midpoint(),theta_1=srcCenter.theta(trgCenter);siblings.forEach(function(sibling,index){var offset=20*Math.ceil(index/2),sign=index%2?1:-1,angle=joint$2.g.toRad(theta_1+90*sign),vertex=joint$2.g.point.fromPolar(offset,angle,midPoint_1);sibling.set("fanRouted",!0),sibling.set("vertices",[{x:vertex.x,y:vertex.y}],{fanRouted:!0})})}}},Utils.isCustomPaperEvent=function(args){return 5===args.length&&lodash.isString(args[0])&&(0===args[0].indexOf("link:")||0===args[0].indexOf("element:"))&&args[1]instanceof $$3.Event&&args[2]instanceof joint$2.dia.CellView&&lodash.isNumber(args[3])&&lodash.isNumber(args[4])},Utils}(),joint$3=exports.Flo.joint,$$4=_$,EditorComponent=function(){function EditorComponent(element){var _this=this;this.element=element,this._readOnlyCanvas=!1,this._gridSize=1,this._hiddenPalette=!1,this.textToGraphEventEmitter=new core.EventEmitter,this.graphToTextEventEmitter=new core.EventEmitter,this._graphToTextSyncEnabled=!0,this.validationEventEmitter=new core.EventEmitter,this._disposables=new tsDisposables.CompositeDisposable,this._dslText="",this.textToGraphConversionCompleted=new rxjs.Subject,this.graphToTextConversionCompleted=new rxjs.Subject,this.paletteReady=new rxjs.BehaviorSubject(!1),this.minZoom=5,this.maxZoom=400,this.zoomStep=5,this.paperPadding=0,this.floApi=new core.EventEmitter,this.validationMarkers=new core.EventEmitter,this.contentValidated=new core.EventEmitter,this.dslChange=new core.EventEmitter,this._resizeHandler=function(){return _this.autosizePaper()};var self=this;this.editorContext=new(function(){function DefaultRunnableContext(){}return Object.defineProperty(DefaultRunnableContext.prototype,"zoomPercent",{get:function(){return self.zoomPercent},set:function(percent){self.zoomPercent=percent},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"noPalette",{get:function(){return self.noPalette},set:function(noPalette){self.noPalette=noPalette},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"gridSize",{get:function(){return self.gridSize},set:function(gridSize){self.gridSize=gridSize},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"readOnlyCanvas",{get:function(){return self.readOnlyCanvas},set:function(readOnly){self.readOnlyCanvas=readOnly},enumerable:!0,configurable:!0}),DefaultRunnableContext.prototype.setDsl=function(dsl){self.dsl=dsl},DefaultRunnableContext.prototype.updateGraph=function(){return self.updateGraphRepresentation()},DefaultRunnableContext.prototype.updateText=function(){return self.updateTextRepresentation()},DefaultRunnableContext.prototype.performLayout=function(){return self.doLayout()},DefaultRunnableContext.prototype.clearGraph=function(){var _this=this;return self.selection=void 0,self.graph.clear(),self.metamodel&&self.metamodel.load&&self.editor&&self.editor.setDefaultContent?self.metamodel.load().then(function(data){if(self.editor.setDefaultContent(_this,data),!self.graphToTextSync)return self.updateTextRepresentation()}):self.graphToTextSync?void 0:self.updateTextRepresentation()},DefaultRunnableContext.prototype.getGraph=function(){return self.graph},DefaultRunnableContext.prototype.getPaper=function(){return self.paper},Object.defineProperty(DefaultRunnableContext.prototype,"graphToTextSync",{get:function(){return self.graphToTextSync},set:function(sync){self.graphToTextSync=sync},enumerable:!0,configurable:!0}),DefaultRunnableContext.prototype.getMinZoom=function(){return self.minZoom},DefaultRunnableContext.prototype.getMaxZoom=function(){return self.maxZoom},DefaultRunnableContext.prototype.getZoomStep=function(){return self.zoomStep},DefaultRunnableContext.prototype.fitToPage=function(){self.fitToPage()},DefaultRunnableContext.prototype.createNode=function(metadata,props,position){return self.createNode(metadata,props,position)},DefaultRunnableContext.prototype.createLink=function(source,target,metadata,props){return self.createLink(source,target,metadata,props)},Object.defineProperty(DefaultRunnableContext.prototype,"selection",{get:function(){return self.selection},set:function(newSelection){self.selection=newSelection},enumerable:!0,configurable:!0}),DefaultRunnableContext.prototype.deleteSelectedNode=function(){self.selection&&(self.editor&&self.editor.preDelete?self.editor.preDelete(self.editorContext,self.selection.model):self.selection.model instanceof joint$3.dia.Element&&self.graph.getConnectedLinks(self.selection.model).forEach(function(l){return l.remove()}),self.selection.model.remove(),self.selection=void 0)},Object.defineProperty(DefaultRunnableContext.prototype,"textToGraphConversionObservable",{get:function(){return self.textToGraphConversionCompleted},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"graphToTextConversionObservable",{get:function(){return self.graphToTextConversionCompleted},enumerable:!0,configurable:!0}),Object.defineProperty(DefaultRunnableContext.prototype,"paletteReady",{get:function(){return self.paletteReady},enumerable:!0,configurable:!0}),DefaultRunnableContext}())}return EditorComponent.prototype.ngOnInit=function(){var _this=this;this.initGraph(),this.initPaper(),this.initGraphListeners(),this.initPaperListeners(),this.initMetamodel(),$$4(window).on("resize",this._resizeHandler),this._disposables.add(tsDisposables.Disposable.create(function(){return $$4(window).off("resize",_this._resizeHandler)})),window.setTimeout(this._resizeHandler),this.floApi.emit(this.editorContext)},EditorComponent.prototype.ngOnDestroy=function(){this._disposables.dispose()},Object.defineProperty(EditorComponent.prototype,"noPalette",{get:function(){return this._hiddenPalette},set:function(hidden){(this._hiddenPalette=hidden)&&$$4("#paper-container",this.element.nativeElement).css("left",0)},enumerable:!0,configurable:!0}),Object.defineProperty(EditorComponent.prototype,"graphToTextSync",{get:function(){return this._graphToTextSyncEnabled},set:function(sync){this._graphToTextSyncEnabled=sync},enumerable:!0,configurable:!0}),EditorComponent.prototype.performGraphToTextSyncing=function(){this._graphToTextSyncEnabled&&this.graphToTextEventEmitter.emit()},EditorComponent.prototype.createHandle=function(element,kind,action,location){if(!location){var bbox=element.model.getBBox();location=bbox.origin().offset(bbox.width/2,bbox.height/2)}var handle=exports.Shapes.Factory.createHandle({renderer:this.renderer,paper:this.paper,parent:element.model,kind:kind,position:location}),view=this.paper.findViewByModel(handle);return view.on("cell:pointerdown",function(){action&&action()}),view.on("cell:mouseover",function(){handle.attr("image/filter",{name:"dropShadow",args:{dx:1,dy:1,blur:1,color:"black"}})}),view.on("cell:mouseout",function(){handle.removeAttr("image/filter")}),view.setInteractivity(!1),handle},EditorComponent.prototype.removeEmbeddedChildrenOfType=function(element,types){for(var embeds=element.getEmbeddedCells(),i=0;i=this.maxZoom?percent=this.maxZoom:percent<=0&&(percent=1e-5),this.paper.scale(percent/100,percent/100))},enumerable:!0,configurable:!0}),Object.defineProperty(EditorComponent.prototype,"gridSize",{get:function(){return this._gridSize},set:function(size){!isNaN(size)&&1<=size&&(this._gridSize=size,this.paper&&this.paper.setGridSize(size))},enumerable:!0,configurable:!0}),EditorComponent.prototype.validateContent=function(){var _this=this;return new Promise(function(resolve){if(_this.editor&&_this.editor.validate)return _this.editor.validate(_this.graph,_this.dsl,_this.editorContext).then(function(allMarkers){_this.graph.getCells().forEach(function(cell){return _this.markElement(cell,allMarkers.has(cell.id)?allMarkers.get(cell.id):[])}),_this.validationMarkers.emit(allMarkers),_this.contentValidated.emit(!0),resolve()});resolve()})},EditorComponent.prototype.markElement=function(cell,markers){var errorMessages=markers.map(function(m){return m.message}),errorCell=cell.getEmbeddedCells().find(function(e){return e.attr("./kind")===exports.Constants.ERROR_DECORATION_KIND});if(errorCell)0===errorMessages.length?errorCell.remove():errorCell.attr("messages",errorMessages,{rewrite:!0});else if(0\n
\n
\n
\n \n
\n\n \n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ',styles:['\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can\'t handle paths without the `d` attribute for bounding box calculation\n 2. IE can\'t even handle \'d\' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class "element basic Rect".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don\'t display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event="link:options"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: \'lato-light\';\n src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAHhgABMAAAAA3HwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABqAAAABwAAAAcaLe9KEdERUYAAAHEAAAAHgAAACABFgAER1BPUwAAAeQAAAo1AAARwtKX0BJHU1VCAAAMHAAAACwAAAAwuP+4/k9TLzIAAAxIAAAAWQAAAGDX0nerY21hcAAADKQAAAGJAAAB4hcJdWJjdnQgAAAOMAAAADoAAAA6DvoItmZwZ20AAA5sAAABsQAAAmVTtC+nZ2FzcAAAECAAAAAIAAAACAAAABBnbHlmAAAQKAAAXMoAAK3EsE/AsWhlYWQAAGz0AAAAMgAAADYOCCHIaGhlYQAAbSgAAAAgAAAAJA9hCBNobXR4AABtSAAAAkEAAAOkn9Zh6WxvY2EAAG+MAAAByAAAAdTkvg14bWF4cAAAcVQAAAAgAAAAIAIGAetuYW1lAABxdAAABDAAAAxGYqFiYXBvc3QAAHWkAAAB7wAAAtpTFoINcHJlcAAAd5QAAADBAAABOUVnCXh3ZWJmAAB4WAAAAAYAAAAGuclXKQAAAAEAAAAAzD2izwAAAADJKrAQAAAAANNPakh42mNgZGBg4ANiCQYQYGJgBMIXQMwC5jEAAA5CARsAAHjafddrjFTlHcfxP+KCAl1XbKLhRWnqUmpp1Yba4GXV1ktXK21dby0erZumiWmFZLuNMaQQElgWJ00mtNxRQMXLcntz3GUIjsYcNiEmE5PNhoFl2GQgzKvJvOnLJk4/M4DiGzL57v/szJzn/P6/53ee80zMiIg5cXc8GNc9+vhTz0bna/3/WBUL4nrvR7MZrc+vPp7xt7/8fVXc0Dpqc31c1643xIyu/e1vvhpTMTWjHlPX/XXmbXi3o7tjbNY/O7pnvTv7ldm7bvh9R/eNKzq658Sc385+Zea7c9+avWvens7bZtQ7xjq/uOl6r+fVLZ1fXP5vuqur6983benqao0587aO7tbf9tHYN6/W+N+8XKf9mreno7s1zpVXe7z26+rjS695e2be1hq3pfvS39b/7XcejTnNvuhqdsTNzZ6Yr97i/+7ml7FIXawuwVLcg/tiWdyPHi4+rD7W/Dx+3RyJXjyBZ/AcVhlrNdZivXE2YAgbMYxNeBM5Y27FNmzHDuzEbuxzjfeMvx/v4wN8iI8wggOucxCHcBhHkGIUYziKAo7hODJjnlDHjXuKrjKm9HsO046rOI+Fui/rvKzzss7LOi/rsqbLmi5ruqzpskZ9mfoy9WXqy9SXqS9TX6auRl2Nuhp1Nepq1NWoq1FXo65GXY26GnU16srU1WJJzKJnLjrbczJIzTg149SMUzNOzXgsa/bGfbi/mY+e5uvxsOMVzXXxYrMUL6krnbvKuYPqanWNulbNOXcrtmE7dmAndmOfcTJ1XD3lu2Wcdt4ZnEWl7dMgnwb5NBgX/f8DanskqEJxD8U9kjQoRYNSVJGgymWlWyitxQPNk9Qm8WBzkuItVPZQ2ENdKyUVKalISUVKKlJSkZKKlFQoS6hKqOmhpjVrgxT1UNRj9lpKeuKVmCWPc5p7Y67aia7mI/zbQs0j1OyN7zVHYyFul97u5gR1e/k6wdeJuLP5Gm8neDsh05vN9mazvdlsb44nm9X4TfONeNq5fXjGe8+qz6nPqy80t8cfqPyj4xXN6Ugcv6S+3CzESjpW0TCovuHz1Y7XOF6rrnf9DRjCRgxjE95Ejo6t2Ibt2IGd2I33XHc/3scH+BAfYQQHcBCHcBhHkOJj1x5Vx3AUBRzDcXzisyI+xWfIXOOE90/RWMZpes9gio9nVXPK9UdkYYssbJGFLXHRe92y8KUZqMrCl/Edee5UuyRqPm7x/iIsaw7Jw4QsVGXhiCyksjARv/T9fqx0ziDWYL3vbMAQNmIYm/Am9jl3HKd97wymXOOsWsE5xxfVn1HUR00fJX2yUInbvdvt7MVYgju9lqr3tJXl4l5n3sf/+5sZdQOU7TWnBfNpLo2xyhiD6mp1jbpWzTl3K7ZhO3ZgJ3bjLeO9jT3Y277HBvhbpXyAvxX+VnTQp4M+6vuo7+Nrha8VvlZ00Rc3Ut7vyv2u2u+K/c7sd2a/b/b7Zr9v9sddnM9xu5fbvdzOyXsm75m8L+R8TsbvkOtUrlO5TuU5k+dMnlN5zuQ5ledMjjNZzbif436O+znu57if436O+zk5S+UslbNUzlI5S+UslbNMzlI5S+UslbNUzlI5S+Usk7NMzjI5y2QsNWu9ZqvX/TqHO11Wr/m4xfEirMcGDGEjhrEJb2LK987hp9w5+a05vTKfv25e0OsFvV5wD0/o84IeL7hXC+Z03Fo5bl7HOXuSsyc5e/Kac3nAuQdxCIdxBClGMYajKOAYjqM1zyfUU8YtYxpVnMevYtZXEzEXneiKe3SxMOart+upW64XYwmW4h4sa74gmX2S+bpkLpPMPh1O63Bah9O6m9bdtM7e0dkRnb0TK429yriD6mp1jbpWzfl8K7ZhO3ZgJ3Zjn7EPGOcgDuEwjiDFKMZwFAUcw3Fkzjuhjjv3lPHLOO1aZzClp7NqBeccT/usivO46L07zPywmb/VzN9q5ofN/LCs9lmHSzqs6rCqw6oOqzqsSsWwVAxLxbBUDEvFsFQMS8WwtbFkbSxZG0vWxpK1sWRtLFkbS7qq6qqqq6quqrqq6qqqq6quqrqq6qqqq6quWnNXlbJbpYwuczJpTibNyaQ5mTQnk+ZkwopR5eckPyf5OcnPSX5O8nOSn5NWgKoVoGoFqFoBqryajGe+vldv/tb9mrhfE1caat+vi9UluLO51BWHXHEoHvvqfzzp5kk3T7o9l+51Hyfu44Q/3e7jhEfd7uPEc+kh93IiEb0SMeC59Gep6PVcGpKKXvd4IhW9EtF7zXs95/tbsQ3bsQM7sRvv0bMf7+MDfIiPMIIDdBzEIRzGEaT42HVH1TEcRQHHcByf+KyIT/EZMtc44f1TNJZxZb2YRhXn8fDlJ3/xqid/nrM1zuY5W7QC/pCjRU7ul6pRDtY5WOdgnYO7OVfnWp1jZy4/sWvtJ/Zq9dLTusahIoeKHCpyqMihIoeKHCpK3ajUjUrdqNSNSt2o1I1K3SgX6lyoc6HOhToX6lyoc6DOgToH6hyoc6DOgbpu67qt6bZ21ZM3f9WTN6/7mu5ruq+1n7wvc2ABBwY4sIADCzjwOgcSDrzOgQHZystWvu1Ea3VZ5L0rK8ylfF1aZS7tfRLuJNxJuPOCfOXlK8+lRL7ynErkK8+tf8lXXr52ydeIfK2Tr10cXMDBhIMLZCzPxYSLC7iYcHGAiwNcHODiABcHuDjAxYFrrkrX3vMkHE44nHA44XDC4UTO8lxOuJxwOeFywuWEy4mc5eUsL2d5OctfXsESziect9Ok9wym+HdWreCc42mfVXEeF733Ey6nl10tcLTA0QI3C9wscLLEyRInS9wrca7EtTLHJjjVWptT7qScSXVf0H1B9wXdF3Rf0H1B9wUdlnRY0mFJhyUdlnRY0l1JdyXdlXRX0l1JdyXdFHRT0k2qm5TqlOqU6lQ6ZrXuFHRihQS92PwvNTX7m6K9TdG+pmhPUrQnKdqTFO1JivYhxfiuM0ecOWJvV3P2iOfRZs+jumfRZvu3mtEaUpAZrWEv1xpxxIgjRhwx4ogRR4w4YsQRI47ETXK7XGaXU7W8ndlWXlc6HsQanMYZXJqH5eZheXseLqrz+ZvxN+NvaxfT2sFkvMp4lfEq41XGq4xXrV1JxquMVxmvMl5lvGrtQrKY59rrXHtd+5lzrWfIlO+cw/fdbYWvz7rF8aL2fDfoadDToKdBT0PiCxJfkPiCxBckviDxBYlvzWuD1gatDVobtDZobdDaoLVBa4PWBq0NWhu0Nr5WcP3Xu6UrO6EZ8So/5+qm047iZv54asWiWBw/ih/b594Vd8fS+Lln8C+sGff6LX9/POC30IPxkDX0sXg8nogn46n4XTwdfZ5Rz8bzsSJejCReij+ZlVUxYF5Wm5e1sT42xFBsDE/eyMV/Ymtsi+2xI3bGW/F27Im9fr2/E+/F/ng/PogP46PwWz0OxeE4Eh/HaIzF0SjEsTgen8cJv8hPRdlcn7FbOGuOz8V0VON8XPw/fppwigAAAHjaY2BkYGDgYtBh0GNgcnHzCWHgy0ksyWOQYGABijP8/w8kECwgAACeygdreNpjYGYRZtRhYGVgYZ3FaszAwCgPoZkvMrgxMXAwM/EzMzExsTAzMTcwMKx3YEjwYoCCksoAHyDF+5uJrfBfIQMDuwbjUgWgASA55t+sK4GUAgMTABvCDMIAAAB42mNgYGBmgGAZBkYGELgD5DGC+SwMB4C0DoMCkMUDZPEy1DH8ZwxmrGA6xnRHgUtBREFKQU5BSUFNQV/BSiFeYY2ikuqf30z//4PN4QXqW8AYBFXNoCCgIKEgA1VtCVfNCFTN/P/r/yf/D/8v/O/7j+Hv6wcnHhx+cODB/gd7Hux8sPHBigctDyzuH771ivUZ1IVEA0Y2iNfAbCYgwYSugIGBhZWNnYOTi5uHl49fQFBIWERUTFxCUkpaRlZOXkFRSVlFVU1dQ1NLW0dXT9/A0MjYxNTM3MLSytrG1s7ewdHJ2cXVzd3D08vbx9fPPyAwKDgkNCw8IjIqOiY2Lj4hMYmhvaOrZ8rM+UsWL12+bMWqNavXrtuwfuOmLdu2bt+5Y++effsZilPTsu5VLirMeVqezdA5m6GEgSGjAuy63FqGlbubUvJB7Ly6+8nNbTMOH7l2/fadGzd3MRw6yvDk4aPnLxiqbt1laO1t6eueMHFS/7TpDFPnzpvDcOx4EVBTNRADAEXYio8AAAAAAAP7BakAVwA+AEMASQBNAFEAUwBbAF8AtABhAEgATQBVAFsAYQBoAGwAtQBPAEAAZQBZADsAYwURAAB42l1Ru05bQRDdDQ8DgcTYIDnaFLOZkMZ7oQUJxNWNYmQ7heUIaTdykYtxAR9AgUQN2q8ZoKGkSJsGIRdIfEI+IRIza4iiNDs7s3POmTNLypGqd+lrz1PnJJDC3QbNNv1OSLWzAPek6+uNjLSDB1psZvTKdfv+Cwab0ZQ7agDlPW8pDxlNO4FatKf+0fwKhvv8H/M7GLQ00/TUOgnpIQTmm3FLg+8ZzbrLD/qC1eFiMDCkmKbiLj+mUv63NOdqy7C1kdG8gzMR+ck0QFNrbQSa/tQh1fNxFEuQy6axNpiYsv4kE8GFyXRVU7XM+NrBXbKz6GCDKs2BB9jDVnkMHg4PJhTStyTKLA0R9mKrxAgRkxwKOeXcyf6kQPlIEsa8SUo744a1BsaR18CgNk+z/zybTW1vHcL4WRzBd78ZSzr4yIbaGBFiO2IpgAlEQkZV+YYaz70sBuRS+89AlIDl8Y9/nQi07thEPJe1dQ4xVgh6ftvc8suKu1a5zotCd2+qaqjSKc37Xs6+xwOeHgvDQWPBm8/7/kqB+jwsrjRoDgRDejd6/6K16oirvBc+sifTv7FaAAAAAAEAAf//AA942sR9B2Ab15H2vl0sOha76ABJgCgESIIESIAECPYqik2kSFEiqS5Rnaq2bMndlnvNJU7c27nKjpNdkO7lZPtK2uXSLOfuklxyyd0f3O9c7DgXRxIJ/fPeAiRFSy73N9kktoDYeTPzZr6ZN29A0VQnRdGT7CjFUCoqIiEq2phWKdjfxSQl+7PGNEPDISUx+DKLL6dVysLZxjTC1+OCVyjxCt5OujgbQPdmd7Kjp5/rVPw9BR9JvX/2Q3ScPU4JlIdaQaWNFBWWWH0mbaapMBKLoyJ1UtJaM/hn2qql1GHJZMiIpqhYEJescOSKSV4UlqwmwSQZ2VSKksysYBJdqarqZE0zHY+5aauFo/2+oFmIC3Ck8keY9zmnz2r2u4xGl99cmohtpBkl0wE/9GD+qsXn4hJMHd0792JkeHRDKrVhdBjT+zLzOp0AerWUlaqiYIBUWNTHZ1R6SqMIi6YYEm2EZobPiAwv6YA2js9IdhSmqqoxCSoOATGhkoXDl0c1NGfieBp5ckeM4ioUzr77kGCxCA/NHxF+jVGUYjU8P0HVoyEqHQN+iSXxtBHokHhzPD5To4gZDeFp1pOsC9jjUo0yMx2oqIwH7LEZrYrcUrpT9fiWFm7pBJMTbiGxISqWnZRKjJl0SZk2PN1a4tPAB/OSGQZgM2akRhQWE65Xmx/7ww8pa1grxiKcqD8hRdSnWJE/8WrzbX+YItdNcB3+LIyvm3jJqT4lxvhpNqY3w4PJbx3+LUb4aSHCm/Ezpt0lTrjuIb8D+LcY5qcrwib5bZXkbfAh8fwfJskVeE8dfs90Kv/OenydodL6cAT+oVYrq9TpeRih2xMIV1RGYvFkXao+cr5/YqsLy6cRtaC42ZtM2OPmZtSAGK85HrNaVExcpQz5GThWeRmQWW1N0uxlOBRGZjgr8Zq9YzTzL6uyc0pF+T+NK5ym8GZUvTlcjMb/XcmWvbHqf3jY7H9tKufMaCz7D2OsUwhveo0TUAJVr8r+A/oNq9Xy6K6QD6GHzZZsA/obj1qR3Q7n2YOuymy9IKgU6L7sVrsJ/a2hHt1FwSx8MHtK4VceoxqoZdRK6m+ptBVrIkyKdk1GDIJAh6Mif1JqFDJiIy/VgRRrOBB3TZ06PLOSo4pBWUMxsYaX+uFWRMhII7KAW/5j9hksSIUYAkm6Tkht7CnRdoKdtrbZgMshfrog5AKmB/FvsY2fbsfXGWra5gq1Eba/aLW5CoJt7QuclRpBCKIyJenq4FWbklbWwGt3SuwXRH9KjJgkrxtmblV1C0rAhFXYzRGmFiZvC8IyULmRXaX0+yJ0iHGzeDIbEeZ8MoLMFjdtN3MMaob3w/0HC/SCpjBU2z2R8i67fkdr7c57tmiQ0Vii3/Fgm13L68taN3a4q7aM99cVN+5/fKceGQ0l+mPvjFau2J4qWnHxihBKDl+zprJm9f7m50uNNl9pwMXQt9lqR46u7z62s4X5Omf+vmqg1S94y4Ls3EtGX1nt8g1NYw9e0s3+1GD+s3KS+X3L2taIha5VVA9sOfPXbN3aI12d69srzBTFUuNnf89+m32FMlMhsB2dMJe/TKVLYQanW7HZ62Uz6QqQYprFk9nPZmZWJVpZQ1haBYdOIzl0shkkjhMLYzFmRAsvuUF+WjjU8lI1HHbBYRcvDcJhA0zbCXh1WwRT2siWplIpabALjhOtlSlsKVf1gtFsqIbLficcaakUWE3zOVYzQieBx/FYM40Z7PdxtJkIBSn96DPeOB4dPtDSsn+kqnrVvuaWA8PRwUDTcCQy0hIItIxEIsNNgTKFUWnius783mCjV1atPNAK745Wj+xvajm4smpFoHk4GhlpCgSa4N0jzQHFwMQtayORtbdMjN+MX28eHzzQ7fN1HxgcPNDj8/UcODPJ3qPWnt5lQmMTt6yLRNbhd05EIhPwzv3Lvd7l+wcHDy33+ZYfAju69+wH7GGQRSs1TF1HpeNYCo1YCstUmbQBC8ANB24D2ELKbdOALxohXG8Dn9PGS2rgqx/mlh9MHByawNqDtSvHcwms/Sp4dfoF04yBbVy2ImBPiSZB7EuJ5aZ0qDpJeO9eBrcpdXUS35a5Dgpdm+OpXYk1PhiKMJiTVovNDlxPYsZzSIWdRhRxzGKmJ1EwxDF7a9dd3dvTU7P5xpGuy9YmaU7vMKg5RuVvHG9s2ra8dPVa9K1IUk3r9Sm6qwVVrzU5+B9F9l37lZUDX71k+dbGzYfrl199YH0oW65kO/f2l6GLem/cP1Y4fP/Y8ssm4tGhXSlGwRp0BV3N4WDXhrpV949lm3of7TMYN31vffZdtfHvayfaAvGtf7Fl8PBgyNswWI3+nlUVDW0+CK6LQth3IgPxnX7Zc+bcJhJ1eZ9JfvRLneW8h1zkF+HzvpH9kEbKAsoJMwqJLvIZBvj7AvnvMUvtNrDeSuCgCR8ZUYT5hrttajBsUF12xRWXq7jw4FSbm77hyL/+8tdHC1RGre5vsmv//d+ya/9apzWqXUf/9Ze/gudMZj9EL5HnJOTnaE+KVGzGIJtRAy+xsgrgB0sGLcwwWm0HKYusIDLYrtlrkglTbQ0dCoZqWpCbwVNGFQpOqi+//IqjKsSFV0y1FxW1T60Ic7/Q6v4aPflv/46e/BudllMXHP31L//1yJFf/fLXR1wqzMOrmHvoNHuKqqWSlFgSndHoKRXmYCIqlpyU1LFYbCZA6JK09lhMSgJFgRLBNM1yxWWgaZgvSTtY1AhqQnGrRalqBpdnBz6DmfUgVSiCQm5UhPy1NYkkh4woBFoHihm6quAt3sKpVbWsWm/l33KdMBaYTC7+Lec7RqtBiS/rbMYTrrc4l9ns4tiByEGt2WR2m/75n0xus2DRHIgc0GhpRqM+ED2oEQRTgfDP/yQUCEZBs7/ygFrDMFo10ZED1CuKasVfUjqYlyIVFVVxCSkzIhtLUwjjEkqrCacRhQ8Rg6elnoiDjkkasHyKWFqjxfc0KnibVoMPtZQGpCKrRK0XlMpr9Qp+4QB6eQi9ku0eom/pQ9/PxvqyVegHsp4ezM6hIPUNqoCKU2knNgqMHsxuIVYwkQPIC3gU/xQBc5UUuDIbTGjGSXwchp3gxGw5EWM2NjNJosYHq0srqmxlKb9RrVRoi4udCqVRE6xaE4g3VpePjazwGtVaVqvQlibbSmg6LtOynU7QHfQt4PF9mB8S0mTwDxIVUYlC4RnGimcQ1kB5fNbt6Od0YmQE/+0UYOsyGIdAlS1C1vkDhFH0ArrGSI/6BGieOhcpnwuP4Rlnz5x9lv5H9keUmjJSIhNFoiYqacknqVAC/ASMnKWvNJaWz12v9gqrlXTwNGWxUATL9p39UDGe84edOQqdmkzO/6mBwlLZ0xkWPJ05I5XlfFoO75/ju0zNCKhHJquFxjyPoE+4pb6Vd7w+NfXGHcPDd7y5Z+r1O1ZOdh66d9Wqew915l/pd99E9hfHx1/MZt58M5vBR8j+pnTqkeXLHzkliacf6el55DTm7yxg8RD7TYqnAIkrMfUqFaD+GLFt05wSqUE/haioBtNmyKQZNVZHhgXNVDP4UK0EzTTBaBg16A6CsSAODnR4JIjoKehrTRJ8rS80ix7vQ01zVjTAZN/SwrRRNKFDpx/q71fc4w9lfwNmAFHXAz1h4GeMWk+lKUxPpTaT9mBuGrHKxKOiS+ZmeSztsmASXDA5MG+12E4YMlIN5jHmLevBvK0E7ZYU5WDKjMI0a3MFiLOKY63OYS7MUuKr/KFmJq84KvBWcW/MVoSu12nQfzbtGqioHb+4teui8Xq91kMr6Wr9wOH7xkfuuagjtvpQc7be2x2gD/IWv86hRv/VfPjSK7qHLukPlPfubAog9fovT9ZUbf7y1uHbr72sJVutVpv5FJkb15/9QBGF8S6nbqfSnXi8HGgP14kHxoFxSMeIImkAPTk6Y3n01BMVK09KpcCFUlmnkiAbdxL/kdsB3HDzorn4pCC1ADt64XZpJfCAUQMP3MI0F2vsxGZUcoCkJKoFrjoFsTEl+k3p8krs2rGBxQbAg9zsvN7VnsusKFrEKzfKI6jrQ3q9zsKqlbZA7cDOjnW3rY+Ub3nskg1f2lQdX31Rc9dFYw2c2q1iY4b+w/ePj3zlQGvFwM6mRx9ffuXxySue3N2Atgis1mgxJesbIoVNGy9Jdlw0XL2Mjgztbx842Osr69nZkmMnxkbdh1bXG92v3TF+7/7m9j3Xw3xsA/05yj4H+myjeqm0DmMi4qYNgg4ZwiITlwyg4GqILuxRUXcSwl1JC8gHjK8D640up8WCAQ6olIgEsIx5XbYowwjMrhfceRK0OpFso3+6BmkMxt+NzY0aBWYzvZdm0G+Zd2Y7EjpDdhN61KBL0H8SSi1E1veCrBWAHaLUP1HpMJa1msmk7VjARdrMjNcUtgOF5rjkVWfEYqCwKioaTkpBEGJ1LnSd+yOJbEQ7BDYQ0UhFmlOc6D7xquFXb92Ib7BicURyF6nhGiuZbXDTekK08tMWq9kcflX7lRO/gnfpQD+mPe5iczgNv4tvLb7VrwRVSKXhXfBCzVhtbosnIgegGqvNXuQ2WzzFiwNNBFSB8jiceIaZYOqnKSZINEeOfxaZK6UqZMas83sZYtjmwfa9hVqLITY41b3qy3uaIuvv2lR/fU/rIfq2AvfcH9d0XVZ38OsXNwzd/OKOxr2bhg6WGj0l7sT2ezauOLa+BpvG68othdkiwdh68aMbLnrh6g5rIIrt8W3A4yrgcSFEJ2DRHJjLPnUmrcQ6wFU4lDCFOCVMoWpilotgChXxUghEbwY2x+A1VARQQ8c5VGSOVPjw2Mw6eVZgmyF7BNW5Y1lqoW9bvRXdJvhXZ4eKa22NT29Z//Ch1u4rpV3bnjnSvjG+7oaRsTsma2s2HRuauHNLDfr70ZM30BbH3PfKewPN3U0HHt665amjHW2XS2Mrb9maTG6+cXDkxvXxlq1Xy/70BtDxHpJvci3ScMmoJf4w5wSxHwVoRMJMlEiCzt7A/LVKObdTXWhvpx8ymGbf0PHs7pYKwaU5/TPeynoKrDz+fIa6HHhYBjYpBJH5IPUmlfYTOwyxBEnR9CkzM21JvxF0tS4utangqUOEmbI9Ehux5dHCsTYqNcomCvPVbchMW9wxNYQncHFZFBtxaaWs18Lzb1+J1ZcTWV7sOCGl7KdEJwTsdSknCcxZZ6qDqOMM66yTD0lQvqwRZGX0VyaJrJLYyrnBi0p9bXBk0abmoxKmdhEmUMno9byR4ZLzyyOrLu5q2drur9/7wOZND+xt8HduaVl20arosiue37nzG5cvm6zdcsvIyM1bEsv2Hmtqun5qWTQ4dNmqkcuGSsLDRwYGjo6E0dVDV65r4k2tY3uaB26aTKUmb+5vmhprNRmb1105tO7uncnkzrvX91wyGo2OXtKz8er+4uL+q+md9XtHY7HRqYbmqaHKyqEprNsiyD0GcnGDdwTdNlP5ODuizsy4AmYcXLtUspMEcXiAzR6eQA1tzi2WeTCMtrvMhF+RAOi2lrKnlsbMKgSGDkdrBH98gkli1+XHJzc9dnGrPdJenr3e6B9DX/fUWBuObxq/Z2/z5tj4Vf1rbtlQFV93Vd/QjRsTCuX6Rw63tx15envdju1TTXM/dtCrwwOB9uUNU/dNDl0zHm3cdKRpEKZ1fN01BFPdDZhvmPkF6LefqlxAfaI3Ktkx5gsQEIsNtzUjFpIXqeR8yE849/Ru42IgmDz3bEnWdGwJSiR0AaaW6aqkOnIW3Ap0GaMyFo1ERdNJiSqGmMUBlGnJixQFvjtM8+kLSrKGwbU4PpGmCJovBLqX0K08PwZnrj6H5DnqUzH5E8jIPKEYBD9JmWsRsRRKFYToOHB6gqH0/Nx3fKVhD50wGugHytGtHTpek/1XQavhs79UC7oOzI9n0X8yp5jLSD7dJSN7CHMA1LNYCdVRSTNviRD8PMsMzkrMIPrPvj7U2t9P6IB/RgWS6UAEkiVwpIaCTQhZEdIb6WRxmSUgzH27gKGQsUNnUqFiXsNyauTmbB3ZS8qBDt/ZD+kfwLwopeqpKSpdh+US0ecwuBdj8IaoaD4pmTic4Zi2m+IcTAWQUFlUiltJ1qMQTxKBpIglkxlPEm+kDic94oLIp8RCAOrE1XkjcI/SmoJyxmMeAimMyB8CG6PIzxGAu0vE6yvsGtlSv/yqTXVVvav7amh9B1vdM9pTHe7dVNu5pTOkMqpf5FzeRZEKGy6Ml9rDQxctX3FgtK2u3vfMN9nylsamgcmu5Jomj78ioD8zcB493X9WryxlR6gV1Gbq25TYG5Va2Ey6pRfDw5ZOgIfGqGiNS2FFRlwVE9dHJQ+bEWtBbBhabiG2ox5YVc9LLmDHIMSkgzzG+DNBOVsQ5KUqzC8uI22V7XdT5vffku33OC9OnJD8ylOi7wQ17fOPTxC7PX9EsINpUDC9yFo9tS2964GRUlUQT4/2bjI9jC0ksSqth2nygpZymarqc+klUyKwiJ8h2TjJht1mZzjQ4nPsFMIpE5siHktgMOtBSoXfFwjSJfl0kzmCsKT2H/khsj9yy+xbFzfsvG1wYi2d+otVqVV1Be3XvHZJYlNwvV5vD1a76vcMV2197tfX3D77xoGL/w5pvnrvme0qHafkL8q+/8zx7M/+8Ur0nqWssaxksKfFNuys8a+7Z1c9HXsOlbx32ejx008eePn6no3jG0dLuzYk13zz9jGTKftQtM9dWefVNR36y8l7//VrPVPvZD967IXs+69sXNbOcsH+4anvo4o1Zd1xt7N13yhqUqn7jn4NyxcMIusC/28AjFshR0mAa2WYq+EogLmSBs9AexRj2lxEZsZBD4qTXBSD8/5+sxfBVAMoY6RX7qJXruTM7HNzdc8qLMYP6VuyP1VxahWnYo+fXmM0oCeza3UCzdE/EyqdTpwJxjjhPfBHXwM6LJSHKqf25OI1K8QvBI+UQ9BS7CHkFGNywkSzrGaMbQGTkqSj0ZyZVhmdAAqCcD0YlVQQHFfAjaAVaNaDOnjwgTElFgtwKpabRBUeiOBdEnqUeGMJIneIN4kKBP3e99BjV7xwaX1p/97u515pv/LFi7NfRlN/9U7Nli+tzX4FNUzetTb86lvZv2OPV2+8dU1qz0S7yfXNv1j3lR2JVU9+tWtff9lAfNWeui/fQ+zl1Wc/YCMkLo1T6Qgep1ubszAW7bzLdVqIn6Uki1swzWgpQ7DsXN2VVwEUckY0p4cYSXrkXCiir97xOmIfHjx2cFtVsdqkKapoXn2w+/pfPDIx/sBPrlhx2faxMKtValVllbuvumfintMzk/S7TyL+r/fYK9rDEb21OFhsXXv8w6/e/+HT46COIYVSVVE1kCza9TYyEdsAMmMfAJnpKSdVl5OYgclJzMlk5nOQIA6DvHSmssjpSMmJY6J59ucTFCXe/JTzvkfzD2Rf3LbtxewD2Qn01LGf4mTET49lJ9jjk29k//j0M9k/vjE5uvqJ39137++eWE34inWoAejRUd05ajR5ahRMZoZVE/1hMWF6QpjGLKfISPpMowNrRsfkXFkuQSYnx+Sf95jJOSV92dyN9Gn2+Jq5F0fnnlhDnfNcDdUqP3fhmWqWPFONn6k9zzMhKs89ULfkgfLj7p6bwg97ZM3cdmped7aC7tRQ+6l0FdEdZkF3ZkrKqjByK8GOqjavRqKTl/zA/DAE9v4wfq6/FJ6YwDl7J1hLga3C2dmwIBm02GqWgMKJ4ZRkKSMOyuA8j97Np+JziocD2SbkFbDqgWG8evsbyPD0yO1Hd1UVagSN2tiw9Wu77/jNo2PjD//LjX2X7d5Ylf0PHY++lDh8w33rHspmX91Ov/sMEt7eZatoK680KpSV1aGJZz685/6Pjk8YPRUF6CZOk5qbCzaUWnPqJ/OdrSXybslZLpVsuUQ2PsNoCecZ1by0dWYcmos6sloBMiD2IS9nvCgfx/G48N5u5rZdu2YPs8fn1tFPnF5DvzjXKz9vDn5th+cxlHeRnHHqkWTr4dPwDzv/iXO7sMWT/3bt2Q/o78LfuiAOkiNJHZMBWkQljnAoiCoF8lkFZJnSDJ9TiKeJDqdTmZSoFEQFzqWSVY/5mFhewQcrvJZmEK3nNK5AxL3iyrHI7qb9j01GNhq4IqOGU6lV1dse2Ml8a7b+slevbuUIPX8C3vnY5ygflcrxzpbjnQF455V5h7XITwbnI7yTApgmxgs0mVLyGOXFFrIERnLmduIUUIQJI+FPO1ebixwWPb2cL7SOzt1kdpttPoF+cLTAZph7QGe2e53rwU1sZrScjh7nublLLKBbLuvccgCKh3SCjp1blpMz83vgHZv3UBKTm9dIVOZ5n2aofDpRUi0I1freTloEMYjj8zqj3A+f5cnPVVHIjdsYz9dXeAQS7OBMpAA4DtdTmCDYEdU4I4kzgOrClDx8wArIZgehEA6A+uDsZBj5QshmFd5bzgkaerlRrzRo6JRa4HrWK+b+hivgXca5Fxn2uNIwyxd5eS/H/N6gPL1G8eOColl9QQHzX+6CM5WL9duUt66iLkerBmg1E1pNAsGceP1NB7RaiI/GNCqNi2gMYlXx58iKA1nMs8y6mIObHQY6VPozDk+h4sTpNRbFf3gKzjRi237V2Q/ZXy/NRee9lF+7kIu2LOSiLf+7ueirtr2UvRes/uQkWP375l7atmf0gZPXHnvvvlWr7nvv2LUnHxil330arMTuXe9kfw8e4Pdv7wJrIDxz3wfPjI0988F99374zPj4Mx9i+kG/FfuIb7JT7Yutsh2QhM5A9FuHk8AOMgw9dlExUS97KRamnxNz0o69FCt7qWIFAQdeJ5oHBX9Cl1BnEdN9w19dmv0D4jbds7vu+9/N/oE9/i//sPHRi1vnXqYfrN1wTf/TMzKWvir7ltIDPMX5pMF8PinP0wrtQiLJMp9IwjydTySxVoeRBNs+B5BlTYkVQlprpFJL2YuDbjILP4vNFcOHe9HRMYtPn/1u211Dn8nxfW89fm0ku1fHoRUFhefnfJ73Pwfe28G6rM1prkHWXMkH7Lc5CPttqnnzYgf2O2KiXVYkzP4AViQ7aI9JKy8cCjjJbCP1EqJPyAslF+Pa8mYHhZETxRfkc/DMn1NT92xymtFHa3mHLlsllJa/Obvpvl113307+zF7/O3XRm7Z2a41uubugPiwz26aO0j/PLL6aP8DX5XtxfjZD5h3QWZN1D4q3YAlpgXbo20gK2k4p16ER1UK10qL8LVSP16Ea46KjpNSpSEjVvKSEYaSMGSkFnitdJBVMdEovKC1FJXEGnBcmDCJxTC6Ui12t47iBHG3udqPnNyU+dBEpVT5ZCmC61XmwpfxIj2vKSqr79vavPqmDdUt26+75bodzcndD00enO51agRD+fKpwcFLV5Y37yB3mi/9+v67/uH5SqMjUB5w1Exc0T2wtb0ynBi+YkPPjTubu3ujAgpGQpUrttf1buqMVCaGj4yvfezSzm0yTwIg31tAviqIkck6jyxaisGLPThYF5UnsRDTrBKzhMVsUrL4UInXHhciebzuGFBsyzI72aHx8dMiO0Q+/ztnf8+a4fOdVJJKW0luWyvbe5GL50ElmHxcUAb+W+LNuaVmhkyL3Fq5ZYmTjNDf2dV08KmdO5+8qHFn313fvfrq793ZT5cx18xeu+2b1/Usv1bcBsfXHPnB/WNj9/8A04FjIyfQwWN/z+NxUrKDxKtY2D1QEsXnYKw55wsSOWfoN45ADIT+02zQmdDvWLNxeO7ZDexxo+HMimhtslKR1gkADcBSU5Tqx/CMEPVzKh3Cz/AUB+PxOHmUxLnjcWxpsV3FsfHbH79/guTsqQgnKniR4iXGcYqFQynkOPVq4+/e30VuB3HV2QlJy58SdSdefcf3fiqf0OdE7wnJrD0lmk682lTxuyr5ugfXNvHY6Tl18HEumIe6UwwFGq7Q6kxmp8tbslAbhlp5Kn/d7Sn2lgRD5ysfk6gQYEuVzS/bp3gMJ4TmfWXMds4p8qNgSAlmS1jjVqN9Sg3L6lTofoWFK8JsvF+lY1m1Cu1lbNxQtm5DdpVaqdRkR9azxwvPjFuiLlfUonhaJwB7xy2VLmeEnIFPzTgLC51n7LLeAq8Vr5B8fnDB99N5tSqKYuNDSTT2niob8Z4aRMSap1IjWxmSCfcLtD6r38FxLHqZUbPouJLTTWZ1tGYHJ7DZpEKbbVWZ9fT/oN/Wa+ZuVBvV9ISam+ucMwMmeMDIzV2nETBNLqApTeLeqlwWlsqDEaucaALltuUySQSBUPJBXuUWMxGmk2steHf0MGdVq60celhp5tbNZXazxw2GuR2OCps97KDv0xlnn597ll6Nn38JPP9pEv+7c9gKcClZ4ZADJS6K7RdFFjmTyIsXAlTIa71Ez9w/e7HCzs3uZB4Omk2sak3AZjk9uwZ/5jQ4w1NKAT4zSjJ5ajYjqqISYsnn4cmr5jNpNcFragOJunIPMecXxuJ4sXQaLTNxP/4xZ8r+QeUJGIRT23hDCYXO/vnss/TJ/Bo7tXiNncFahmWkLi810leWCl41+6PgqazZiunaB3Sl83QZohIDdCnhT3N0KQAGAF0KPaZLgenS5Omy1yQwvJNDHO8+HlPFo87s6xkDr3yA5wJ/xnUxP2DizLcIXsvX81CkGoVYRXN0AZzll7TlBIqcOMFZlB+g9U1owzKdif1Yw7Esp/kTyxuYOH3J3K2cFr0peAS+WMi2q3lZn6nsb5nQ2QjEI3ZcayBRbAb/kFoIOQqxgo1lQrP/+COCo8cUT6KvgC/TgF8majaj1FNGXC1DQtMZ1koZFPlI1EzWbDGBYxucDv2jSb1Jzb7Cmf6o0mIfvw/84hqFHuxWkrqBShfg2eSN51Z32EzagiiSOUpryLq6htOEZ9i434IDcExi3aJVHoxwRDYmuXD9Mi8VGTN4MqbwWjNmlpASY0Kas2BDIhaZRDdMgjhenqHcqZSkYclb5Hx9Ert9kjGNotyimoCPlxSHQZS6r+ehj5+/7EjvjuWVRotOGBL3D1++sizkUXHlIxO7mmu29kU2+JK9pQ1bR3sDf/Hjm1s/bts3XK3Yc8e9ZdVl5qKh4ZrNt47O7Sy6rqy90u5u3dob76uyuyItJUirCDSPEhwknv1IwYKeWkAfVlJpDvOIiksO4IoSs6dYlRFRNLcGgau3JVqIkXQWrqTRGMhKhFRkxWiew3C6GNBDWiMwqRy0F/AYTbkYMARhedI9D358SpW4pTN94LUf1R96cs/u++uUjCNYf+e6iZvXRp55aNsTbeyP5i6d2Jmdy84eeOvO4ZGVV7p+MdbdfuTpyV+f3Lme6NfE2Y+YvQodRF1Ncl2mVACks5h0AQ4E4tIFPQY8lWQINiA5gpVcKAAoo6aK/fPFfAS7yFnWxXmD+WwVPdF8+Ln9Wx9IOVmtWhtoGG8du3l9LL7u2FDv1tagzqAucCyf2FW/+bGL2lD28InbBloSflZd6C1oPvzUjqknDzX6y/xar6c2ZF124zvA+3Gg/Rs53q+h0iY5eiK8JwPwAO81i3mP2Y5BhJqLxSRdjvcFmPesCfROJ4hGnEHEEqDUxkXLXDY7ia2iBG3TZosNJ4kFOR88Dryf2nFP3ZaES6HtfOHgaz+aJLxvuGti4qa1UXQGs36gh153OlLw6LoppEAKzH3ataa77cjTWIewDF4EGZSAf5ik0l4sBUt+EBXKzEyQ8+KMT1AxHz4YDbjiWTTmIgg+F0EYgXLW4sWTSCtIzkKsUBwuhaXwcUoMCgCtFy8kKf3eT4op6c0FERMth5/bu/rLU40Gbs6T2HLb6oGD/ZU6g6rAuXLrodTOr1/eMUk/Wjl8aNnglWvraNO+V27sbzj01B47b7no+UsavOU+LK2gbfnt3/7J8HUT1bF11xKd88Cgr2Rfg9c2Kl2IpQZwrygu2ZUwV2IYd6lVGUmHRwvBeiGpdCuAAdti6YJCrI8FToCY3hzEjC+GzcQyFCEZdoaCnucrhy9aVtzqZJBZX+6JjTb5UF/2pc1fcjPTpdeuuX6sQqeN4pxG+66Bq3pm9zFf0tJyrnogez3zM7B99dQQNYni4LexMDYpM9N28yZ1WHIpMmIiKrUCyX1RqQI0LRyDQEdajQ3fNiKjBj4jNvCSUgc2jicr3StxHoiDaB487kqBmMW1OAaCQzcvdcFhtZBJV3fhMVY7YIzbZUj4pw9OPCkvl/Tz4vITUrn6lBg5wU6HyyPm8KunzCc24SqN6Up8Cm+Z7ulfbg6n4XRRrQZcw7UaL/SXV0aW9+RQ3ov95eGFU3mxZW2pYGrVMGabX5doXb0JBy9uQSwATeprBU2qbsDBKISlOGXlB6tVCmerBUlXAq8u0zTnXrmWWATwp7nq3vkiX5vdiwtS89U/IbIEozzP2roixDFLl9YHdq+PN/LeiKdnZc2mm4Y7DlYituj+InftxhtWji0PVzdtv+7G67Y1tx55dtfUY/uSayLj165acePWVHzV3iNHa0LtVa6Wku7tbe3buwIly7a3tm3vLplaebhYaK+3RSNlfPltG3ovXR0tdvtctC60Odl7ZDRa4Oz0VERtSpU5MtLZcslEoqJvS0flQJ3X3zJWU9XgNQBANZbGGhkqtbGzpKRzQ738ulH23U+BIv0d2Ccr1ZXDovq47BWEnFewzVsmmvgEHOnoDWTrjGSwkjASDK2cH1zwBsTjCbL9F57a3P3CwVXXrApvOXbT5Nc7weJfvmZH7eSd43OH6dvuenzHxJwC25j7gaBB9gXKDDiimUpb5msBjPpM2opwms1xzsYjC9l4ZDeQLIlkn8/3fLJaHgdi93POYrPJ6+B5h9dk8jq5ss3shMnn5Dinz2Qqxq/Fp19mzsyyFH3277M35mgJ4ayuk6SbgAwtwnAdMJsGMFuMZJ80JzE/pu0aCwfzxConn/QaIMbpJ8QwpPAMzPFConQpfXEWGdRu18jQZk/j2mZ39KWltGYfrNarJ0YUV545VjvREdQqv7OEcpClCLJ8E2Tpns+lWuJpHRA8wxRROpxIZWWReggX3USkUjHJpRaB/Pj5XGrifKlUBHhY3FLFOXl0r85hXp1t1pp1vF2PfjrK2fTZVUKRO8r+aPZitRFdrzNmR7UmpdpumMvqDOg7Jm4uS/TtHfgVABoZsKwyjZigXOYaBIl/FjLX72xmf3Q6ktNT9ocEA+zLxQcOP0SnCEYny8QUl0pBY4tieRBQYcALHGIFT3I4fsP8pgCHjA6kCook1cQAdjhgJkQDKRo04RQIjr1YQz5z6SF1gTZ7bmk8p9jcOSpeW6DQuDsG1lQduMFh6li9rbb/6GjllmuP1G7pq9h86cGRO5PMGddXyrviBddd1LKuqSi25UvrsPp/7cHgwEX9+Ojuh7eOzWbzcxLGaqcGcjziciNV44lpVs2nC+3yGO1ycofLT4TcwIwCCdTM1HzykAzlE7MTk77slUMLExQovW9sz5IJKmOZ00DXObnYPAbwq85bF2z49FzsZ2xVabn0+X37nr+kpeUS/Hppy2R07c1r18rbTPBrFGWPvHVrb++tbx05cuLWnp5bTxzZ/uThlpbDT27f9hT+s6ewXXkqey/QrQcbF6DGqbSQp5uwVIOJ94Lm4ACuZB4BszYZAbtz1i6INzNSctLMLUgagVRO4FUrvUUpozCBRCrnQGEnOgcIP1VrEJAG8NfrP2w48OTUznuT9XetxQDs6Ye3PdmavZfdqjM+tG4qOytj4b6+rJHuHlsug+FdG/BYxmEs34CxYDw5LuNJAibxNF9AlNxSRMlhIF8AiNKQQ5TcPKI0yFpyXkSZJOGmcCFEueuBpAYVJbZ0Tu/PI8rkl9cuIMqhgUOu0w/RRRM75xFlwaoegihzc5r+PYzFga29nBmfl4hFlwEbyhefiMo10k4yGpi6JEDDJstIVhfs86sLMusXMpNYs+MCj9TVTxyJrPBzjKC0+6qLL747wpzhTO9dcbvZ3MEjjVZ9101zu/JrYwwL+t1I/ZBK15N1WyUEjvUkcFRowulCTFkIroUIxAv5cMjRFBXtYG0AH1XIfK4VMlKzDIren3zHIoMiMy8KJ6So85RYfQJOpk1mAXBQlJ+uilYDDoLfi3AQ3CQ4SDCZo1XVORx0zhlBQRU4L61UgAw5YVpTGMA1JWKtSfL4sHKGNDiNa/fU5tK4i9brzsnj+j+Zx13rYPU6Q2nz+q62LW2+6qFtU9uGqqNrrlyx/ktNNpVRV1I/2pRc1xqAO3vgTtXaG0anHpjyqTXeoDfQPBKJd0S93lDDaGtisr+yNukD9+Qqru0OVbVWFntLG1c3dRxaVd1JeF579gP6QXYT5aMOydG7HNIVkJDOpgnjLUieuKQmsDut1uXr80nG3k08r6iKpfVufEOPN6G4Sd7EjQvo9bzEcBmcksAugMHLyTRwRifki9Vqk2Q7KVnoztkeHGFgh1eL0yy133Aigz6CWrMnrMG4u6Q25ODVBaEjbTsu/rLOyDwb1KO9Gi57ec/cQHljyGxzWbXhcM2hI/TLBhjb7aBP32DOyHbcgPUbJ9YkZc70iNp43o6D18NJZA1ojTFG7A224xqG1LiIelyvRUlImfPRJKssT8aFiC9C37712I1bv961JVGENN2vHBq9elUYHaBvmzt81xPbJ+jsLFtwz9huMOpULt/HfA9oM+Gcsonk+1Au35fPEFGmCyb4/K5+zqRAQ1ody+o0aJg16Xuzw6uZM0bt7M8c5TZbhY0J6DhAUvhZdvDd/wAIr5z6M5Uux/6sME4eJ3EFOK8cjuLyGDxf3tG+f2w+r8ySvLLCcIqFQ6nccOrVt3/4u5Q8nXy86DkhCcpTouXEq43Z9x+S88eF8GcOXizkJTve6OyAUFp96tV3yt8vJiXiAsw7wQLzzsdPF/s85vC0F/9Ow8VFsw/uwIvoTVGtOgUrmCx2h6fY64sszjwbqdydgkJPcfk5N/PTExhYjtdo/amlLASjGsuv1+LKa7wgKiff8KKtvZczMwipNApWr0YmlbXUrkIGo1ahUSNaXbA8+9xyXpX9LatmGDWb/XeluXOB7WE7E7bbZ9+NhG0VdibgnGVtTIPRY4T/Z//GllszYW4DuRfM5575eJpGueWEwihO+eRzz9bFuefEeVLPAXQg+/B6nHoOKzhkZ3ntRPZBdGg9zjx/l9Vm31PxOlqD/qDXZIcEC7pVY8ia5/4gaNDbFmN2o8aIdQP82feBHhvBg7IKitboQqEXZb2gFpJ93vYhI2jiGqVWweqUaIQ16/rmXlRaTMtmCFt+aywW+GKecei4029wJnQnPKMfeLACnrko15xPhZEqzwvkmvuN9DVzX6F/aZw7Rh8KCVZm80CZTZj9ywHM17bsH9AZpUAtR4cosT4q1bAZUjwKIbgtKvG5DS4tELu0gheO8hmpMBKLpVuipIARacLTndEWCGZUHfG4VA63PWG4XU72zJSnwJYJMbzrhWyYeOOjdfJW8NaIGAZd46WI5pQY5qUOzalX31r1kYZMIW1E9ETw9uNCuOnhJRW+WfxHA5kJWn5arVXBBNDg3zBhposK8Xxw49+vNs/+8XHytgg/XREJw/VK/BueNN3W2gGn7fh3Go4Xpo3YnkrDu/BRRSoNn7boljuVhufgI0AarbxKrdEWFrk9eO9/a1t7x9JVG/SSWlPkrqic36uen081oJXleG8PBCIlKdFmknTFZHbV5kAj9moNiKTuc8m9RbXx+BQv+BTN11jiP2kLNJTbzHZzqGeqs86k9lUsr3Gb7CZnebLInSh3wqG7ZnmFT22q65zqCcEbbeWN9JYWW3nKW7dnz5765j0rKsI6vSc1HKvfP7UnGWyJFquUxVXNwcTU3n31seGUR68LVwzubknB2+t8deV4HiJ99l40DvrCyFXG8yGQMUN+5BAIgX1H+oHsvaqjf75JxkxT2T/QJUTPrqPE5fLaQV1USoKe+aNSKKdnEJJqC0HP2kGRIm2gSO1ky2V7HehZU7tGTZpfYD03OEHdmuBd1c3wLq6JbNFaDuoWXFC3b390j6xuzogIonDyUjVoVIQo1qtvRT/6K6JuhojYFsHldc1ws42XtPim4Y8XET0y8NM6gxYUR49/v9r84R93k+tOftrlLITrBfi3WM1PR6sjcFqFf7/6VtlHPydva+anW5rb4Hor/p2GP1mkXAWpNLwdH0VTaXjbolutqbQe7/tNiTqsd1qd3uB0FRRGAEY1t7S2fVLvdHpXQbSqpfVcvasDPyxx7aB3SQH7Y79JclSmUrnlmEWql9uTgU9BAYNN89tpSP7Sukglw2iK1/gqemrcZpvZWZ5wY12DQ3dNT4VPw9d17ukNWWwWe3l9IFBfbofDUO9UR92vZUVL7d8LitZcVaxUFUdbSxJTU/sa8oq2Yk9zamrP7hRWNNBSUDhQu1TznsEKoj93odcVFnoOrO1qCuyspFVn0layNdeKEZMrKrFwhXWRBXNeM9/rxWMktUg4zOSNci2S0YNDCCvGmi4t9nSOxTEdAZrxXGBHNtjd5W0eT9Xu272tItgcdgwWN0+kavbt2VYRagw7EHq9bvPystLq0oLqztK6zd34sBAOSS8amCvHAZdzVCHY7jSDDbVenwFvhVdLyTqeNYN/pgvUOCFUaMD3REucZGStMRLEFRQCiXoGU6uHQ9Ei733CpC6kZJJxMBWC//1E6aIuNPNNaDYyz5cmOJevFO7VzS2b7z8TmZN75jyenWPOKLJUlKqnbpL3UoglcakWAjJ7LF1LKh5rCzVynIZXARIqnDAmpfwwiCogtkpuVhAE1FpbfFIQw3HJDsdBXlLK1eliAudnbXCgi5HK/mCCRPeSHaPDEhhdohZwP0cJxfNrHov6dXCI9Osg6QycSs+37GCSuZYdj7dd9fJhHTJyJfrxWxMOVmPy1Q2nKgZ2dpXq1GqF07FsYk+DfH/LXx5u2VS19pqhyg1fnqxB2Yv+6tZB+kcGy5/UDVEfq3a4C9jZa2l/qVfBFrtjQTv9Hm7F0X/Da5dOPnKoTcVcybRe/ATWyS6KUkyxLwPXLpI7PkiVTEY+ADea1uHcm0uTmaEUcZ0hLBbH8eqiWCIzLnUSR4QhvC8olg6l8nFZOhXChykKF7am4powZhYlVeIOJ+UpyaUAbeDNsvMgi6r5Dg+Li0oFeY+fQLbjx+UTvGVU6DILxxO7Htm54tLxVltIYxA4S7RlrHno0uEy9B+CIVvT22oPO5ig0zrr8bfHi+ibvEYrqtz4xJHOYNtYtZ0VipuiBbUbb1yZ/XGpzpT99torKhSKMmNRh6GsYagWrZD1CVEQNm+ASD9JraAwIiqDMCgOU1Qpr1wWn5QCoAkBnuSzOC5DFivxFqiXaLVgcRX5daROK14GV9Q6coWW1SJpl6PlpJ1UmytVdlVIbuqgCpFceCKpWpKNeTz2cORAW8uByMOxh0rC5SUPxx+OHGyB80diD5eUl5WwFX3bU6ntfRX5V0V5/GF4Y+Ch+EO5P4yTNz6cP/95altvRUXvNnh3f0VF/3bQhTWgC+3scaqYuliuTMvXusy4ChyUvJUUr2tYYzNuD7lgjEtuuCCAOnhxuRPePYXzYqZY2u7AOmC3gmHjY2mHHZ85XHgvcUzy4USZg1TNALLwLJTPEIyZT4B6reQ/XJBbS/5bs7LAgLaoOVYjoC24nCa7Ak1mb0GXZm/ZLL/A5eOuuTWWgOAL0cd1xtnvNx5pzB5FN8ELqUtb5PtVME7i/dVk+5cihp2/qIxJKrCxmnkMwMg4YACQAFMw+2+K9Uzh7G/kGrc7z17GXEP2Wq+jHqHkuWJTZtI2EinbBBhsNCo1wJUGAjUbEtimrycGp4fPTCt7sMUsADTQw+NeQ1IALpYHRuBiK1xsjWIwipsrbMg3VYilxB5BTIDjNYl14GOFVr3OzHhC0YauwaHxCZyDGDGRMjlbg2B6QcmVx4YmcrYosWiZZWnmQTm/4zoYSp6brADjpAB9lRdd0J0bdtV1L8pGBBpGm1Ib2gLxVXv271kVX70q2UUyEg822VmDzhBq3bCsZWuHv3bswMX7xxJrSrsmtmyP9LSUNI+s21Sxtp/+58GrgsFt/cmtA5WJhN/g9LiKE8tLo8vqotWp7k0to1cFQpPdJGNR51ervcFiX/NIVc2KxupYbffavvL2RCRc4fJuaY4sT1WWl9pDm7FcShU/pKPsEYivS6gaCu9O8sXJhj9HDL9IjC0GChuMiogsZ2CcbiGL7Bm8WgpyN52bG0WBJeelBkcRRDZ2jrMX87zbgVYaHO75C4LbwZp8HnziEXi33WCwF517Ctq35uwflEVgdwvAY63DPY9IjZtXkUmrcFFGWEEFFOGZsX6ryhCWxkCF+sewCvWvxCjSqlKHZ2rbyb1abI+ITs0UytupCuXtVN1CRuzmcfJ0hpO7n2A1CnaDObJ6VeHa+tExYqCa+gXTi1xhsIrqHsUK1C6I9bLzUuDiQ7wZDW8xWZofti822osX9BO5rf5yYmRN7aabnnh9+/Y3nrxpYyKx8aYnX9+x7Y0nbtpU27j75Y/vuOPUK7t3v/LnO+/4+OXdH3Rd/uy22vH+do9DxWl9DeuXjd42mUhsvn5wzVVJvY7V0MWNT16y5anD7fS7297EH4E/+s1t29/IH7+x/c5Tr+7e/eqpO+889dqePa+dumP7s5d18kXlhT5dgacgse2u8XVf2lpTDngaPmt5x9Fn5Xm8lxmmO0AWQdCWq6m0Bc9jjWJx2Yroi85UEJGIsegMS47ymytC4AVCcqMpFuN+B7gCvK0ihON4TgDkWi3AR/nwqqjDJBblNoFLToBsYkyQqKLFFSzm81Sw2HAByyfbG9VyaG944z1Ty/oqGssKdUaVoXpv1449Xp2O1bpiiZaArzlauMziDTt8qViF7esPML8raY8V0zUrVtqdds5eHbl0W/Zqtb7LEXAaTMGGisJSl87o9FvuZJcRvjxC3UJ/h3mYzKMglZsxMy4rpQY+FMdIaYEL4aJks6Mo10in1my32S0qBm/+NMORES25hBd4H/nYzSP1awaNVv+aCgluDp+rXsfnr6sEN23g0DFea9Trsz+xaNWW7I91BqOWR9ef97Icmz2D1jKn6J9QLFWV3zma746j0Mh7BBSkm1JaQfqMKKj5PQK4A45feIZZuYq+pS97E4qAGzxnfi6jBqknLzBDu7rJLOwCrNTVjT+4qwrUpTE2Uz1IblSz+e3sS6bnMjDt3TFxGS/14bw1nNWeM1lXwtW+ZWDErd6wqo3sHa0VIKoSgyaxEXSou0swzcC0pcitQUGs/RyTlhTVyeZ+SbV0AnQujD7/bEVfnXvo0euP6C0aFBjWGpXZ/6l2FRy894qj+44+9bnn59zzzG2XHN1+TFCZjdmbVFq0Q8dl96MfTa7fsBpkamFpmJddC31+2IxcQLjQ50d9Tp8fC5h9uoPsJV7PjNF/y75K1svaqfn2cXhvNel4klst4xZWy7j/ndWy9VUjB1vbDo5UwWtb24GRqp6SltXV1WuaS0qaV8eqV7eUKG5pOTASjY7sxx3d4G37W/BV8q7VbSUlbatlW3SAGlZUKx6CMRupjYv2QOOQBaCnqImlFaTmSsHhYEZBYkUV1nA+KnInMX4xGHE/krSBw/cMDKijNpbmDCS9gONMQDqCvLtd3ki90P6JeWu2Jd8Carivj97Uhx7NburLbkMP4Dm2lbmf7lFeRVVSvYSyMuCnJSpq45irBQp5x7r2pFTMZdLa4vk+U1EM/stI15wgmDyLIClZ3D0HV7zLIUDLfOMcucfbfOEeaWxI+uYUoa1KzQdFsaDNUVpb1NJrVVloA+Pmrt5YOdTgdYbr3T8xl1qR08nc71ALqo+KUvVN3kCt39STMiPEbtlVEOurLlvW1uh5j2UdYWIzJpm/oPtgPC3USgrCGckAUNYenXHIhr4EMH4Ub2pGgMRE00mxICYlABpWgaK05TeGpClFghh2QYynpOISGGRBldzwhlhuD3IzizreoPlRqhaqExehrwg96VGoWLWRYRSWksZIeWuZzRbtS65fZy+tcbf1mpRmFe/krlpfuSJV3NPcNxhsH6tuGkl5FSsMNK1Wq/XlJUUFFbVOX23QGqMHWv1xH9/eaEGMYssuV1VnRee4RVjdWT1Y5/HUdGEe/ETxJC3k60EVuXrVC9aDknZ7uEr1J4/pnI5NP1cLBsWTfzRx2TmtSrbDt+M1UuYMVYRXSM1yTQvIe37VRSwAxO0mk88lkLIW1zlrLx7sU+T+YaKGZHz0pvkVGIm3pS60BhMMAROxn1y8FLP8Gzsnbw6yTLXFkX2HrVu8HDOxYbCnYqIkK9kI3cmzTYpfQexjxrU4xFroNfLqFplteo6UAiOs7xzpqCca+BlKdoVUFOfecLsoDZ+RrPOd9iBq9ZPthH4Bm4yWi5/ZTf/bv6/JimO7jl/comgbvmFDfNWp3yodp37L3JWavAXTcRz9GR2hvwV0RDBynWH1lAXcjPxCHg9C0VrJRfll8QMXWajjfGGJxRYqFITCkM1SUsjTG+bPgoU8D54DP++m7N3op+A1i6ijFMhmRk2UP60mi4Bq0k0OpCWcnDHJ3ssk9+/F7W89ub36sd91yjlKIcKJ/AmFZHKd4kTzCWqaF0xmktyDcD+/VV/A2aoCbF7VBaQlUq45FIGOpGNpMr4QjdykVWlZobDMXVPvirWXhpvdazcWxrrKyoeyf1Wk1xl0lSGX12Zgb9nCNzd6qn1mB4zpPrBTHcqjYEF7KHD8Myp5QjO4AzMelgrl7KWaJH0v0IRMWNSEDNMYF+JWb21cSOLJG7rvpw33ZK/4S8VX1Gqdmn39jbmRWIwuC16rRFpix8eZQfoJ9iWQo2fe/xQpiP+x5woXF/qVuuR+pSSz51rwP0X2T/E/NtlngzEZLx2YWtY51V9a2j/VuWxqoHTFnn27p6Z279ujONZ9cGU4vPJgd/718PXXH774hhtkXzMD+O6XgO8sVBkgPCSWk0BYG5sJyo41jOMFmItpJW9NkWqqZA1etMUdNZhgbU0LMluZULBk0cVQ/uKM6nUlXqBUvq4yuT/+2C0ghfo1+QpAPvnStE6PKnUGBcvpUIXOwGv47JVc9gpeI1zoBqZbQcFEYb/MPg/ydVKl4I0el3fmiP7czkhLXAryuHxB9MZnymThF8XSZUEs27JCTXhGpeSRIbygGMRzfZo24BXiAOh7eWzGn4NxMdKJJachYkBIuwrKsCvwk/1HUlmQtNzGu3YrU0v0BzfzyC+j+UsQvmMJI6u/1usjjcCSt/y08WvZK7F2aXSqx5i41mUJz35XV2hCZ9CuzmuFA63ZaQfdjkoYxYevz6ue5kyUvUEwn77UxJ1Cv856S/hvfYsvQWscRXLNKubbVI5v3dRjVNolr0FKHWwmz7mZsloX3phXBji3rJYwLEIY5lrCsOWfi2FSPbwhQKo4Ai6YVD3nsGzaGqttJUFohwu3WmoF9pUJaU+sPtc07kI88y4FDaoLgIZzGHmAqdE6rTIj6QGl+kOAE1Y7hhN9FqWVttIO7hqAE/U+gBOen5jLLMjlvAB/nWqeYIxmjDGE9hYzomnFlp0uDDK6W5sAZCidYayro0RX01Qb1UdNAKJ7jUq3Y66PxtOVmOPL4lKxIiONtRN9HYnPrJVZPBhLryUR/9oVwH5DU3slCAUAyozDjg9zIAWJm6JiwUmRj0kx3IwG56fr4CDGS6tBW9fFZkZlbV0RkzYD61fXwWzuH1iL9XRUELuB82vHQBr9KbFJEDem8pimLodpalNisSldUh5LfS5MU46X0s+Haj5d20fnMY+5pClS3lIOmKc/sX6tDTBPS79ZBbZDazIS1FPn7W3qW1GCUc+qOl9mYWYI6A9LZgZzXQ4SlQWLCsO1LoBEFoBEbf64V+hJWEBgzJZdzmqMiczCmo7qwZTbXds5+/iFphBIK3s7/Y8KHVjLBmoTlY7itZCUPgNIUbLjbfKNS3dja7jMtF1dzoWlGmtGaoIr5bgnP2sE7qoFXM6mMU3bS6IpMgdSdlw0pC4szpVHNytaUNyOQ7mFEnxbvgb/3E7TwXB1z+r+GlrXoYQD0gOopntze4lWo1G4SJ+g7qs31SEf5/JZFlZX2lbsG6yPJ/xPf4MNNyUS3Rs7kmONxYGKgEpZWhgvdZQPHlLUfqIfECP3i1FZSL+Y4k/tGOON4lzvZ3eMQfMbjT6td0z2Py922rn/6NEL2vO3kaHDGsOPFer/OzQyBPyycOnTaBzLcE7HRdl3tSb9+WlE7T82aH6uYvM0Kj8mNIY+lUZ59+fn4GMybifxE5zi5aVPJTU7++G6D/vUFtVxWkGrnlWZ1Rei+HvfY9kbYMKwN7ALdP+C0B2jDl6Qbgwo7HHJC2FiNCoVwksgRjrb2E/OxGS7FCNeYqZEznnglnKBmGB6AZnoQnM5mRW5IUtRL8wcD1n6vZCA5lc/E8mFxU/lp7Yj+jdzScLnb07VFoYrUdLkT/h9TfWJwnAFfQFeDPibI05vibeuItAYcXmD3vowwSQyT+YIT8qpRmrswlwJRnGfw0IwHJFYvoTRa82IXp4grriVlDBKYRjwNG1C5sVsuLDklwDEEnl5NX/6qXrwkcHu5nk5Q83jDDV6ttrHux0Gg8PNC3B+AV6c4D34PfhvbAaDzc37YovOqAW+qEpzfEl8mrYEozMR2fnVRGcKc/4tSbQlLGtLmKRZZ7yytuAvcKjGTb2ASYXBc9gk1URAW7z2z6Et50PUn8atLxVGmv3+lkhhYaTFD8pQmGivibe3x2vaL8ClB/2NYacz3OgPNIQdjnBDAL8bfggGP/s7ilL+hvTetFNfodL63P7AxU2LREtshjPpkbwAx6lwl4oZVq2fb2TkiOKSRRyLnbj24zOkIsQSETURHFooCk6JGl7Sw4uCn2YVGnN4Wo1/w81pgwV/+YgZ/2ZeUrBqjd5gtpz79R9+vAxnzv0AC5VwAfioMjPFzHuzb/bSR+a+MkA/Oqepn3s4Y3CjFrpySm3RzXdHQm9lx100x/QVRO2kd1H2btL3apC6lEr34dFG4ue0LwKJz7TLQWg7aUDc3oSjtaHFjYzwTqiYkXT7lLqceDuShXVHosn63j6iBe1J0IL6lNgniLHUf6t31sImpGBoSXQaoT9/U60dV9y9xp6PWAvOjWVLbs88te6zu21F+5NuNJCPbs2Lg95L1AfeQmoq34dL0QD+TkdZP7vzle2zOl/ZP9H5asFDL+qBNVe+yCHnBK6y5Hzw/wOa5j3yYpp+s9gD54hShnNOd4FX4Hd1VOFn01X0WXS5z0PXEi+8mLy6TzrdeSKX+FmZzjmg00NVUzs+nVLcNaoyLgngVvzgVmIXJJuYA5zCAZdj4/EWJKnUSha+458cyad7lcXjin62E8mP8/hn+g2awl/s8DjojgY8RxGV1uJqBB3p9sSRHLPBnMn3C5jXTLxUr5rXyMSunCqe+jZpwUVTb8EHr/t8nzmvWfgz31rQKP2uvCqdejfX2IsG7aboEdAnnmRSyB6XtIl8rhWnziRLrn2DRcBfg4F0ci7FvFRLcFrTulQ7Htx1rlrMPxb0Q4/HA/qB9+yV4V5WZNce+dIjYxRXP+E174JYLrGzeKkb99qx86RDeTHAjfB5M4iYHvO5AtcvFfKHu4bOlfInhHtqByZYefw8Mo4BNvhxrrfKjtyeJgG0myHJMtBuRBkZuegIAXh0w0h8UdFI9vsKZrzfLC0YyWaFYk04bRTwoRGvcAg82SGpsWRwz7tcMyyNXa44OqfZoFcwL7QbxEof+zktPDD30uTkS9n7536/Gz197D3cdPC9Y9lx9HB2C/1GO/3sQu9B+o25e/PtB+eea8/1Q6wFbGyiItQVn+jYhbEf+PAiGE04KjlYuS17dHHcaAaAE5HhToTMzhzcwfAw3+ELrx8WY4TjCKZSi3p9SeEivABRdoGuX+YLAOQl3cBOfQom/kSfMGXifICYkXuHwVzD62/V2Mqep3tY7Hzdw+K5NbhpI1taSbz5F2wgtuCpPruVGCqcNxefq6sY87Ts3P6/jm/eNn2O8Z1cMF2fa4D0m/OOMjdGsGt4jHUXGGPqfGOsXzTG8H9vjEts4+cYavlS0/k5B3yO01007l+QcXdQx84zblz8WBqXYiyp0qrE7Y5hHncu5kUpzNwOeeZ28FItnCXks8QCnzCOre2ACMbo9FeyDedySmqFSFiqav7cPLvA7P4crOu54Iz/fDz89vlsgCLHxznCxwZqgNp9Pk5CgNcTlyrBU7UAC1csYaEUs5JsJq627YTDzgXm4a9za4xhJXP62f+Wkn06uPkcfPN+Fub5fEal8TPxEKIeok4rGMUGwIKUWYOSGmTXIJUGPYSuyt6UQEfRpYnszejKmux12WtRFF2NjiazN6Ijyewt2WO16MrstbJe383+mn0fvG0llaI2UGkblkZ1XhpleD7Xy60+QQA+npQxCcDqBnj14UVZd0pMCC+pWZuT8wQjuPBEwFu3KamsWjC9RHGC06MuSeXDrFyVKymAtuUFEQypyN6hII647Uje0Wqe36orG+0r3h09pDdZ647vOIS5f8l3R240+ITKN/Yf3bN5DT3b89JezP//2f3N7VgeY0M5Pne23ccbf7Ml++sZwuzm+hmBp85uQSWvPXFmlYKtbwZuz/XUJDDzH/xoFcYgpM8c2HEn5cddWT/ZaS5wvk5zJblOc2mry5NDc+ftNreATc/Td+7jBd9zoQ507FbZ3/zfpnPBp5yHTiQtciIXolRxWd5x5GgFv+Gkys9Pa/h8tFYs0Fr06bQu8Q3nI1n5CWdwYcKXOAAmR/8c0F9JtVDrPjkCsSwqNsQlDxit6hgpD1kYDl7LDVjnC8MTcJhYGGRbrkZcsqo/TW0+3TKdZ8Bzn2mJLjj+P3+G9aHl/nSgexbK/ckOdZ75DnXFn79D3UIu/fy96poXx/Dna1vHvDuPUxb6vHIgsb5FfV5nDEYSHRs0mRnGKbcz1sx3JOeAZNoYi4kcj0soSCdouS25cb4t+QVavu5E3Pl7vmZ/Lnd9zf4zOkq6vk5j2/29sx8o2tjXqF7q8hx1xZTcuQkgg6TEBbx9hKReQ0bslb+Zlnyjs1xVWiBkpnUF1eqw1AIhQkuUhAD4K2rr8HeVlvlT+Ks0JWUnvLYAlLAVV9Q2En/YWYG/eajAH5K/oWzRt5coFm04X1LwrVj8rRNW4XsdR57esubmddGqnlU9Vb667r5lKV/NumsHd3y1ycZyOkOweW1r48Y2b+PEronG6r7VfdVFrbv6eq7enFSgHU8eaqwZ2R5v2diTqmsMlsRK3L7y5tHGZRevinTW5fast6yq6hquDcX722K9LY1do/XFvW3hiok7Ns0imIukxxz57qAk1UbdfZ4uc3X462E/q9Vc+2e2mus4p9XcDGfx1zVhB3ehZnNSHQBcsekLN51bcAlfuP3cjvkmfF+sEZ3i5lzLvs/Fz8b/T/xsxPys++L8nK9J+8L8/PV8EdsX4ydzcb7kLc/P44Sfy6kHzsPP1OfhZ89n8rP3HH6+gPlZ3zbPUNEliA3nZWvqv8tW7GWj+Ct0EfGyX5i7Vf+y5hftvP5RJUsr6cdYTvMFmXzF7Kz+aYVaoaSfZlWLdPdWwusR6t0v3HESW9m6uNQOdncoKjXBhS7w3qsWsx5M78yIHKeNLBbE9DJXTB2e6ZJvdUVnlslHC/IZXSSfOkHkUlLXCER2Fn9lkwavSkhFMeFCqj/UDldaV6S+uJQuEPN9YWElLKE6n78pUVNQUYkazcGk39dYV1MQrqS/oNSeLWmLunwhX11VSWu0wFfqa4iQdUBZdkeI7Hqp9dTbX1x63VFxIi41AegaArFtWCw2vPWuHZBW+zkyG8Uyk/rhej/Ix7p4Nm1cJK0UlpbYbpIqsSvtFySLBu/MMElDE3KZzP+RZqOftafoC4ss+VmbkL6g5H716VuW5mX4cyLDPmrNeWfgKMZdTfL63afLc2awm2syhGcGcyu9Y0vnYb88xfp5aRjO2uWz9guYx/Gl00/sN4n+lDgszFgqm7o1nzEDRwfhSnvdf38Gnm8Z+QuL9NbCqtZAoLWqqEh+LWzIry1/QYevKGmucDormktKGiudzsrGknhbW37NmdhRpVGhp9qpYZiJIpVuxlJMxKXlMMvKYqTdn1gQJ4vy47G0xjovvZFAs9UQFlfEpREF7gaVn4YdIIsOXhqQJRMAmDoSwxEQ/tL3Yj5DplsHRb4yRBwQ0py1GReYBUySA7+uEtIFZaSMvtgkRapxSjuwHNdCwTHZ0iiIxbhUSjLN73JfEFCu7s9mn68783uXdCzFXwO/WG5NcBXle5guFpLOyAqDz+299m571Ss3DtywpU7Lza2rnrh6Rc/2ZSEtp3Y6+tbtrL3x7SrLmv3/q7dzD46quuP4fe4z+7jZZ7J5bTbJ5r3Ze5MseUMChIQkBBLAPARDERGCgBgEX4hCK0lFKyhi29FSFehUu3fJjNba6YBV207/cqa0U1un49ROM+NMy1inLUjo+Z1z95l9JNX2D2DvJsy9v98595zfOef3+3wfWoaaxLeluG1YXHn/iATNx5xgtlf07GzvPTgs0prOAyMBrvvJFyrESr0GNdmxe+99vO3g6/c6zAdem2pxlxfrCgF++uQ3102uzC9cuWtd03opp2bzkfXH+YquMdqweXqr1HjHCWDwzp/GDN5u6igV6oK2KpNklyophjfo8802k9evGRedNjfA8fmaMJsXjvxwIpppDidjttnh+FzgXWVen9jZhdcNzT5SatolQLn20ji+dLqTczYj4Lf2h5M5Y3fkiasrKgdzdSodn51XkV/f4vJ3lpeOnNrVlIb72zLIrU96TH5Y1X/8J9DvMUcXxb7A0cX17hGSrp8JE9wScbotKXC6rQpOd5a3uv2g1pAGqCv7YZRpXAJYN7pIWBJidyayQFgUbJflo+uC1L5p+N/6pgF841+Cb+hIwL8k39DqSLS/KOfQ12LqWsL+uYj9syLOP2JK/3Sm8E9XrH/qM/hHXKp/FkTuS3LTcGLUvjhn/Ts+WOcUfx3C/uqiNlHT6bnVsIc2JMmNKLjrQbPK5gTPAby6xYZxyXBmMoA+DkT9eRukAbWgUcrqroaTAFnnhfraL0u3zhSxLcmvY5mitUX5mdmSPkhjKBSI0VtwPZeBqlRyHGCvDkMqI4kOBpLoIFN6BU8an0ThiYwj7RMK7/9GL4bzKnXBFP2HhHtwKe/B6SNlPuEXF+7xYuR1tE9EashujJG7MLc+hRvh3AAr1ajkVMCeXiibjkmsMMQlVmix3iedrdyPTXwR8GZrYv8+NcG9Ftt5bwwphrK3PkN2XsccATvJr8A7n1aa5FeUkfyKPJJfEUUJgHiUMtFCfoU7kl/BJPQfeJzEPmZI6CbvTNRkQAvc0MPzJn6L22ns1j/Yv/MvIv/1ArtHhPevVY21sjFrjWw6BtCzBsywMw0KwzXK3uKKAFq86vnc0nIRxwSgjB2ianRx2s6OWtqLtYU7YDMek0s6YKs34MBl3gtlsQME7jLWuv/VXY17dtzmNj29/4KgzjradmKtTkBNMj47+B0Lb7xvxe51VS33yVO3f/+B1RNNE492j57YIrGm1tHDA6NPjNfSH2x7/bG1ec2jbT/+V9/pfI1Ol7W3uM7MmIysnbMa28SZAo1Gb9hR9/C59w89+ZdXRjofkvdufW5H4+pjP7u/fucGqW3PM6QvEwb3NOWgJOpkCuIvnFc4JblYNRes8+HkDeDf1CdQgFFjz0pkkSKZ4eQlRt42TAhuiBKC5VIJ4qp8CzkgV0DBch2gAYpqm1Ijg1Ot+ReihL0pF/XJIMPch0mX7mjuw+xhRQfOTw3H0IfLI3MfRhCLyRDEaRIe5HKY3GoWUV8dHZ8yc4m/HRm9MhKK2U0kAkpnY/WXtLEabCxfhI3RwGYR7GVHZPjMaCTTGYlkwnZeVHI6Yu2siLezKZmdaRI75IrF2rkgQMls7vbEUTuz0b0J24cR26cT8zpiKNrhvA5VsrwOw+LyOgxLyuvI4KoU73pmj+1K+e5ndt2hFHt4xH+HsP+aY/M5Yj0Y8AV7ST7H8mg+B3FdRXw+xyr0cVXUaRnyOdI7KlOsltlhuzMFaJn99qMMO2jQB/dRH3N+DjTuLShWq6VAz0CdNRcGPbh9siNrDp/mc1eDVlHOskGIAdOJwrigY8+Cy4S4q33s5ZuXY/l5sZ+ZE2vXzr9ZvsycU2KxenJMAZaOuSDvxyXOwHXgeqlGaqOSH+ILbzSUw0FlANcI54uy24ArVqBkR0CtB2eW9W5AnfF2p7GglIyC5T6SFuIs0JQ0xu0fBBQsnqL0oSYoPDo2J8ROGpiM+KOnlo3orRbp6bbl0ISv3DNk8Aje6dXdW+tEhqs93D82vcX31Mj02PTtvg2kqcTa+03Gy6uuHIb2Wr9PML+16leP7brQwrxRVbvi4Pl5d/fyqVd3/HwKxwGYF43GfwflhhP/eGK0k1H46BgbXZwCG+1RsNEhixMSGBLQ0VBOmZ8aIB2d4JKgpN+NzmjJoNLcufA6PoMdeV+FHXkC4XcntyM6iSVDYq+IzlrJDGFPxqy5w7aAhmj5Qlty4mypSGFLZdQWVxJbctLasmCiSmLSyQUzU1LDnoufjVjFtkPItkqqDXh7SRnlQa8v2CzJ+WiAqBOxpGjUSqCUF9twnhakzjTYMEEoxnbQGsWkKYsKzTogirIolHmmoTSJE57NOHYmdcqNjOMlQxjVqD9DFSdaa7qYKC0do6rD1ZsKqjroEoKO1MBqNtI7U6OrhUgfTQ6x5o5EO6mib8F/gFnuir4biNoSonUBlrbAKivkZcsGfTeLKEJqh0vRd4PXzZUd0XcrsMfou1kS9d0SRS0mVob2pRC0UDffPDh6d1jbbbB/XhOvZ8Eqvj2EV7et1EAsAxwS1ZtIkaKPFCk644oU65UiRbeiQlwlyBo7PH4mZDiToXelbpefZupkKZrr0wy9DHSuP9PcjfpYEVVPPaEojtkkuYydC1pEgnU0hivU6ti5WVN2HmxbmaA8iDDg3FbsGUDA2KtEEdZ6wMA0YrivERiYWSL6IGircE6lDmpZebw/lQ2YCAfoxYQodxUMUcZsZZeKZLAyjph6HLeA96iSyDmPvfznma3nZ/aUsSPhkpwvzpftmTm/dfqTl8d2989cmTp4ebqvb/rywakrM/1KwqR//NgwvTFcqrdp+NhY3c4rtPnC2WvnR0bOXzv7/LWLo6MXr5HYWfUIp6dEajXq56epUC14CcXKy9RQY0KwugZJ7kSX/eJst70WXNQN26AbsIsk5BKJnD3A7ki3CBskayDTyTyH4ZdtaD0s1wIZyo46E3JFcE12yOAqbyL5TUWg5yTbl6GomiryVEk4maQbJIOCnUqPU0ILRSko+UEQnSx65MNbfiMt+87deer9KuuaOx7o7f/615bpTTdv948dGVh15+pKfZbG5ewbv6tx+r3aql88v/2lfS3bKzce2Tj8yHBlJfoLfaxkVcydFWt3tvdODYskCvnuzMrJgcqYg5/wtt7zz518KUkUaQmf+7Ak7051k7Ki+a+ZGorPvIMQsVGSc9EbWk1ovLarcqENk6ItOBMPJ5BBzO23kT35xSbnpc8+TJ6xt4ga4mR5fNzQInKf3dxrTAPeC6yJaqoKCodEwEQkBQWXHVFX1TaFK6xi5m934mQdv/UH9/Jyv2MCaI3oovqooMUHtbg6FJc7fTgFwSCCTgPc0EUWfS6c2hlm9oFkp8EF77YFOqsTk7nt8WTu+IVc6i2apNsxNLWDaWS6GOgdFKwGdtB/ZBqHhoif/tufnWGq2beZKaIhSxYi8CdGQxb+yxm2lKnu6SG/z7+f+ff5OuX3j3PNdAP/OerHzVQw2zfLZlE6jmziooFBb5oL6XGBoh64MZR51mSlJORN2NnVk0NjigBsYVtRDaKAZH+xlj4+0J6nUXmlEt603G7lfjN4qs2i0qhV9XcFWjs0WqPK5e0nNu7namk3/1f0DG34GbKiz8BflU2muaDJPKvFNw5qfSEtrivTAr4OHsMEextZ5DECQDwhm56E3uwt208eocNhHejIU3PrNCppZ6ClQ6MxqnO9fd7B060WFTzD/HXaTc1+6WdwZH6GTxY+QrYK5jrUFkwPbosKtBZFTxH0SkqDBJ2RUsFUbRLUk1zZIvTzIpwWUORCP7eZZ0usVL2CjFLaTLaZUPdnIZemSAh6U7ZhaeaGpa39HXBZDwamamdvisZnoO2Zetz2FdTusM3E+UE3sTm9/+EICud1I7NzS+DbXBuwzXMLtMRkpW0gC88LeQ0gYJOir5SGv/SmbDzagi49PG1uR9ft+Sk6lCZpL8P2zl9n6nE/+//a6/iK7E3aebXJezToeZTSy9hH2G/hmsugETPz1ISZp4bXy4IHbK0Nf0n+wSJLdX6oAIqZ2ehS34bJh/Zu8Pk27G1v27PBx2xr3wvMzns62ibh20myhzN56xpvp16nBMpDNQAvEO+CuSUJnwjJjgpRJF/xsJXTGFt8iyYoOQ+2dAgdqxbNzAHC4ozn+ZSmvZw05hTbojs79OemnGKrpSTHbM7xWNH1PzHnJ3K9Lo7hU57mioyVL1In6Hcx99dNhd1nslFGDmf3QP0w6L+hKDU58DeR7psC50vuNYvu9SFm0MG9bGECnYBvh8c9gSj/paLPLQDNXUoDj6OpolvXuGn+DbTaOUaFeqCRmrVzIROE9oUotKfoHpOhKuiTZIqbC9aLs1oN/qJCAiI05tesw2+PbgCF+dWWObmkAbV2Nc6/qfbDS1JdBmDWagxmhXdJI8qDeIXajIbDFSvRUrwQ9EmtTqUcGY7NAp4GiYStSmINplKoieqBymbFwrjoIwZvcdGzam/R92iGO3fBPH7yrf2de7cOlRVxOq3G7hFXjbWMv3Bfn4nZaRJuhliaZgSzad5i6D1wdrxjW29Daa5Wpy0r3bTzwTX3vT29ych0t1rL7aK/9Ru/fXbQUdNVXcKrbYVlhbblD795uFCfXSfZvbbCLOHI5aMrnGXVZTk6j68/kD949qOn8JjTy47zpShGU6N34gCJ0mStTSJ+ZMUwixnAihqHiBZDVAHkJaEgVnVV5o1odYXRjDyLnKfC3lSB83hS9OwxYgVROGJzkFALKpucHkAl5pNCmgYC28SEY4fF0aioy3mEAOqanmIv6xB66Y9/vYY+3azTqT/S89rf81pdy3L+TxohS9B8ouL3tLbe/BsjoD/9nGZ+psBspKc03M1L9Hs18w+aaYF+vGq+GfoQDAI32BtoJPDGaCcqMkIQisJAQ/5R4iG/4Bbgv8DBMta3Zh/lf4n+3aqsNh2SInFti0pcqxLlra0ihJtwpuwwzIUVFSiidC07UdgZ0giYLSBrQGRP35Sgfu0B9WtVPu1WmKQgfx3YdWaiuMfJ0QZ9dfG5ILNx27yJqF9v3nLm7qYsnV+nfvUHw1+Uss+E1a/J81/i36GKQY28kMLLkZABWlxAMbJghmefzc0v1JDa/VxsExYNLMTGgPhtjhgqKMRigXmgCWGWzTCsGObwsGguQMboNValDCxsBEhIoecm28OxIt4NO85u86ztbrP1TgQe8PcfHqqmvfMfEju6Rl/Yv5xXcdf7+H2Mpm7s6GBXRMj7P61y/VcAAHjaY2BkYGBgZOo//7DZK57f5iuDPAcDCFz2z/KA0f/P/mvhyGTXAHI5GJhAogBrnAx3AAB42mNgZGBg1/gXzcDA8eL/2f/PODIZgCIo4CUAogoHhnjabZNfSJNRGMaf7/z5VjD6A6bQjctWClFgEV1LiVR2FTHnMCjXruY/hCCCRdCwUApyYEWyZDUsKKUspJuI6MYKuggGIl5Eky4WXgQjarGe92uLJX7w4znnPd855z3vc44q4AhqPmcUUCkU1CrmTQZd5K7bhLC9ij7nLeZVDE9IVB9AgmODTgpDahoxalwtln8xdpyUyJUKbeQWGSVJcpHMOitICWzfJ49MxnFUEU3uTQzYZmy2AeTsPVxy65AzL8k4+yX2/cipKH7rKURsB4qmATlfO3ISd88wp1coilo/x/YhbB4jaJexIGv68thq3nlst1twnud4ppbKP6j9zOGj3s2zh9Clv7B/GrM6g25q2NSjW42j0WzECXMSWeZ9x/lc/qBXvXO8cXuQlTgJmw4q5+i9yOpBRNQiDjI+pvPcM48GPYOgFp1EJ/dtUzHHT41z/xtSf6k92xnSXtGQ/GMUrjO3FneY/Rn06QTSHJuWOV4shDodRI94oh6gl0QZ+yR72004pAJ4yP4I47dVifklMGef4prHC5xi7fd4dV8HX2/5m3jh+VADffCR12Qb8bud2F/1YS3Ma9LzRbyoQbwQz8wU3kvd18MdoIoX9f/D2u8kaWelXCDfzVFE/vmwFtal0h6rRbwQz0Q3fGWuy/yHObFWO0izTgG+FqCq6izfyAJp/Qvy1H7qOY7xHVTh2hO8FxN8F0l5I5V3kiSiQ7zvu+xlxGWuuoA0mZN1mWfAPscx/ZPtw7xzI2j8AyV25OAAAAB42mNgYNCBwxaGI4wnmBYxZ7AosXix1LEcYTVhLWPdw3qLjYdNi62L7RK7F/snDgeOT5wpnFO4EriucCtwt3Gv4D7F/YanhDeFdwWfHF8T3yl+Nn4b/kP8vwQkBBIEtgncETQSLBC8ICQl1Cf0RbhOeJ3wJxEVkVuiKqIpon2i+0RviXGJOYlFiTWIC4kXiV+QMJFYI/FPSkEqTWqNNJt0hHSJ9CsZM5lJMj9k42SXySXInZOXkQ9SkFBIUJilcETxjuIPZQnlIiA8ppKk8k41Q/WWGoPaGXU59ScaBRrHNN5pvNPcoHlOS0urQuuBdpJ2l/YzHS2dJJ0zuny6Cbp79CL0hfR/GNQYnDNUMKwxYjOaZKxkPMvEzWSCyR1TA9N1pjfMWMwczBaYc5n3mf+zKLB4YznByswqwuqRtZl1j/UbmxKbI7YitpvsouyZ7Hc4THOscIpxNnG+4ZLm8s21z83LrcZtndsH9wD3Rx4lHs88ozxveFV4S3lneD/z8fLZ4Cvnu8mPyS/B74l/WYBBwJaAV4FWOKBHYFhgSmBN4JTAa0ESQVFBV4J9go8E/wnJAcJFIbdCboW2hf4JkwmrCXsEAOI0m6EAAQAAAOkAZQAFAAAAAAACAAEAAgAWAAABAAGCAAAAAHja1VbNbuNkFL1OO5BJSwUIzYLFyKpYtFJJU9RBqKwQaMRI/GkG0SWT2E5iNYkzsd1MEQsegSUPwBKxYsWCNT9bNrwDj8CCc8+9jpOmw0yRWKAo9vX33d/znXttEbkV7MiGBJs3RYJtEZcDeQVPJjdkJwhd3pD7QdvlTXkt+MrlG/J+8K3Lz8H2T5efl4eNymdTOo2HLt+U242vXW7d+LHxvctb0mkOXd6WuPmNyy8EXzb/cnlHjluPXX5Rmq3vXH5JWq0fXP5ZbrV+cvkX6bR+d/lX2dnadPk32d562eQ/NuTVrdvyrmQylQuZSSoDGUohoexJJPu4vyEdOcI/lB40QuxdyCfQH0lXJhJj5QMp5QxPuXyBp/dwTSXBjt4jrMxxL+A1lPtYz/GfyTk1QrkLTxPG+wgexlgNZRceu1jLILXpX/0k0MvdqmRk9RPSs1o9kHvQDOVjVKK6y75XPRxg5TNa51jPqHuESEcezWKblaGheQ8QVWuePQWBy/WfPMHnyRK2V+2Hl6JelbFZv42nUyJbUEd3I/hQqy6kwpHS2otFrNeXYtXxU2iFeFJc1VpRHtPTGdYy6f8LBrSvbfG03fVsc3o2bqWLLJUJfWKgDOmTYSmyUB7HREwRmDirUiJX86mE9tixu9wFp8REo86BZI+5mpdVv7Nn6I+9FcaHjGnVaC8s57G7yNLQ1PqH6FLl7T1ypmD9CW0No4iZKg7KJKtd87WzMGRyaFrvTSEV7JQCfroLi4is6zNmxL0JKlT9GRk5Y49b5BNmWdDvEHsaN3b+KZtCeYS1lHG0QmOa1jv1XDX6LifH0Hu5XOBr9ffgN/Z5lMhjRutBq6BVHTMmRlNWe7FSaebTTv1pnRXjNa/8H2NbPw4WXZXiJLVuPYVPnT0RtXLuRu5fscqI8IxYZaz5gDtdX4sW/W64nzP/FLWN6HeVoyUsp8wjcgaqN63pnPuV3oidb3Ogz/hj1lh3RMqYoU+NMXO7YG9Zvyb0MVhwRmt9xxk3dA5V81vrGHsuFZo57RNOkfVeHSFexj2dNWfO34TVx86HOlLfp5qtdH3CVzNhTiSe3N9VJx94hGSBqLJmwPeUsTfGimUyYVeExG7EbOeOjfVGiUpmS3maHK8wIif3U0yLGSPZG6yaGAWZN2K0asqun12+crp1zV3mlvCUqs40L3M/T/V24KxOnUv1yRXMyezsqSTCJSupmFudRu5aXbDSuFOscKU62YydM6GFdceQlUwxIQ7xm/PX9kldvx3anDZjaFxX//LszbG2PH0/X5u+h//xt8/etWvY/199Ma1XmMNOsZyy89u0GOGecWYeItpdeN+/gg/PZllVWn+96LdPj71puduX0alX/qFP/lCO8e/geiJ35C1cj3GtzvhNoqOTRedvQXaX7IN8CZUH/uaybh/9DeeiFNJ42m3QV0xTcRTH8e+B0kLZe+Peq/eWMtwt5br3wK0o0FYRsFgVFxrBrdGY+KZxvahxz2jUBzXuFUfUB5/d8UF91cL9++Z5+eT3/+ecnBwiaK8/FZTzv/oEEiGRYiESC1FYsRFNDHZiiSOeBBJJIpkUUkkjnQwyySKbHHLJI58COtCRTnSmC13pRnd60JNe9KYPfelHfwbgQEPHSSEuiiimhFIGMojBDGEowxiOGw9leMM7GoxgJKMYzRjGMo7xTGAik5jMFKYyjelUMIOZzGI2c5jLPOazgEqJ4igttHKD/XxkM7vZwQGOc0ysbOc9m9gnNolml8Swldt8EDsHOcEvfvKbI5ziAfc4zUIWsYcqHlHNfR7yjMc84Wn4TjW85DkvOIOPH+zlDa94jZ8vfGMbiwmwhKXUUsch6llGA0EaCbGcFazkM6tYTRNrWMdarnKYZtazgY185TvXOMs5rvOWdxIrcRIvCZIoSZIsKZIqaZIuGZIpWZznApe5wh0ucom7bOGkZHOTW5IjueyUPMmXAquvtqnBr9lCdQGHw+E1o9OMbofSa+rRlerf41KWtqmH+5WaUlc6lYVKl7JIWawsUf6b5zbV1FxNs9cEfKFgdVVlo9980g1Tl2EpDwXr24PLKGvT8Jh7hNX/AtbOnHEAeNpFzqsOwkAQBdDdlr7pu6SKpOjVCIKlNTUETJuQ4JEILBgkWBzfMEsQhA/iN8qUbhc3507mZl60OQO9kBLMZcUpvda80Fk1gaAuIVnhcKrHoLNNRUDNclDZAqwsfxOV+kRhP5tZ/rC4gIEwdwI6wlgLaAh9LjBAaB8Buyv0+kIHl/ZNYIhw0g4UXPFDiKn7VBhXiwMyQIZbSR8ZTCW9tt+nMyKTqE3cY/NPYjyJ7pIJMt5LjpBJ2rOGhH0Bs3VX7QAAAAABVym5yAAA) format(\'woff\');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: "Varela Round",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: "Varela Round",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*"Varela Round",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: "Varela Round",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: "Varela Round",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: "Varela Round",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don\'t display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It\'ll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n '],encapsulation:core.ViewEncapsulation.None}),__metadata("design:paramtypes",[core.ElementRef])],EditorComponent)}(),$$5=_$,ResizerDirective=function(){function ResizerDirective(element,document){var _this=this;this.element=element,this.document=document,this.dragInProgress=!1,this.vertical=!0,this._subscriptions=new tsDisposables.CompositeDisposable,this.sizeChange=new core.EventEmitter,this.mouseMoveHandler=function(e){_this.dragInProgress&&_this.mousemove(e)}}return Object.defineProperty(ResizerDirective.prototype,"splitSize",{set:function(splitSize){this.maxSplitSize&&splitSize>this.maxSplitSize&&(splitSize=this.maxSplitSize),this.vertical?($$5(this.element.nativeElement).css({left:splitSize+"px"}),$$5(this.first).css({width:splitSize+"px"}),$$5(this.second).css({left:splitSize+this._size+"px"})):($$5(this.element.nativeElement).css({bottom:splitSize+"px"}),$$5(this.first).css({bottom:splitSize+this._size+"px"}),$$5(this.second).css({height:splitSize+"px"})),this._splitSize=splitSize,this.sizeChange.emit(splitSize)},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerWidth",{set:function(width){this._size=width,this.vertical=!0},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerHeight",{set:function(height){this._size=height,this.vertical=!1},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerLeft",{set:function(first){this.first=first},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerTop",{set:function(first){this.first=first},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerRight",{set:function(second){this.second=second},enumerable:!0,configurable:!0}),Object.defineProperty(ResizerDirective.prototype,"resizerBottom",{set:function(second){this.second=second},enumerable:!0,configurable:!0}),ResizerDirective.prototype.startDrag=function(){this.dragInProgress=!0},ResizerDirective.prototype.mousemove=function(event){var size;size=this.vertical?event.pageX-$$5(this.first).offset().left:window.innerHeight-event.pageY-$$5(this.second).offset().top,this.splitSize=size},ResizerDirective.prototype.ngOnInit=function(){var _this=this;this.splitSize=this._splitSize;var subscription1=rxjs.fromEvent($$5(this.document).get(0),"mousemove").pipe(operators.sampleTime(300)).subscribe(this.mouseMoveHandler);this._subscriptions.add(tsDisposables.Disposable.create(function(){return subscription1.unsubscribe()}));var subscription2=rxjs.fromEvent($$5(this.document).get(0),"mouseup").subscribe(function(e){_this.dragInProgress&&(_this.mousemove(e),_this.dragInProgress=!1)});this._subscriptions.add(tsDisposables.Disposable.create(function(){return subscription2.unsubscribe()}))},ResizerDirective.prototype.ngOnDestroy=function(){this._subscriptions.dispose()},__decorate([core.Input(),__metadata("design:type",Number)],ResizerDirective.prototype,"maxSplitSize",void 0),__decorate([core.Output(),__metadata("design:type",Object)],ResizerDirective.prototype,"sizeChange",void 0),__decorate([core.Input(),__metadata("design:type",Number),__metadata("design:paramtypes",[Number])],ResizerDirective.prototype,"splitSize",null),__decorate([core.Input(),__metadata("design:type",Number),__metadata("design:paramtypes",[Number])],ResizerDirective.prototype,"resizerWidth",null),__decorate([core.Input(),__metadata("design:type",Number),__metadata("design:paramtypes",[Number])],ResizerDirective.prototype,"resizerHeight",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],ResizerDirective.prototype,"resizerLeft",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],ResizerDirective.prototype,"resizerTop",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],ResizerDirective.prototype,"resizerRight",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],ResizerDirective.prototype,"resizerBottom",null),ResizerDirective=__decorate([core.Directive({selector:"[resizer]",host:{"(mousedown)":"startDrag()"}}),__param(1,core.Inject(platformBrowser.DOCUMENT)),__metadata("design:paramtypes",[core.ElementRef,Object])],ResizerDirective)}(),$$6=_$,DslEditorComponent=function(){function DslEditorComponent(element){var _this=this;this.element=element,this._dsl="",this._lint=!1,this.lineNumbers=!1,this.lineWrapping=!1,this.debounce=0,this.dslChange=new core.EventEmitter,this.focus=new core.EventEmitter,this.blur=new core.EventEmitter,this.editor=new core.EventEmitter,this._dslChangedHandler=function(){_this._dsl=_this.doc.getValue(),_this.dslChange.emit(_this._dsl)}}return Object.defineProperty(DslEditorComponent.prototype,"dsl",{set:function(dsl){if(this._dsl=dsl,this.doc&&this._dsl!==this.doc.getValue()){var cursorPosition=this.doc.getCursor();this.doc.setValue(this._dsl||""),this.doc.setCursor(cursorPosition)}},enumerable:!0,configurable:!0}),Object.defineProperty(DslEditorComponent.prototype,"lintOptions",{set:function(lintOptions){this._lint=lintOptions,this.doc&&this.doc.setOption("lint",this._lint)},enumerable:!0,configurable:!0}),Object.defineProperty(DslEditorComponent.prototype,"hintOptions",{set:function(hintOptions){this._hint=hintOptions,this.doc&&this.doc.setOption("hintOptions",this._hint)},enumerable:!0,configurable:!0}),DslEditorComponent.prototype.ngOnInit=function(){var _this=this,options={value:this._dsl||"",gutters:["CodeMirror-lint-markers"],extraKeys:{"Ctrl-Space":"autocomplete"},lineNumbers:this.lineNumbers,lineWrapping:this.lineWrapping,electricChars:!1,smartIndent:!1};this.scrollbarStyle&&(options.scrollbarStyle=this.scrollbarStyle),this._lint&&(options.lint=this._lint),this._hint&&(options.hintOptions=this._hint),this.doc=codemirrorMinified.fromTextArea($$6("#dsl-editor-host",this.element.nativeElement)[0],options),this.placeholder&&this.doc.setOption("placeholder",this.placeholder),this.doc.setValue(this._dsl||""),this.doc.on("change",this.debounce?lodash.debounce(this._dslChangedHandler,this.debounce):this._dslChangedHandler),this.doc.on("focus",function(){return _this.focus.emit()}),this.doc.on("blur",function(){return _this.blur.emit()}),this.editor.emit(this.doc)},DslEditorComponent.prototype.ngOnDestroy=function(){},__decorate([core.Input("line-numbers"),__metadata("design:type",Object)],DslEditorComponent.prototype,"lineNumbers",void 0),__decorate([core.Input("line-wrapping"),__metadata("design:type",Object)],DslEditorComponent.prototype,"lineWrapping",void 0),__decorate([core.Input("scrollbar-style"),__metadata("design:type",String)],DslEditorComponent.prototype,"scrollbarStyle",void 0),__decorate([core.Input(),__metadata("design:type",String)],DslEditorComponent.prototype,"placeholder",void 0),__decorate([core.Input(),__metadata("design:type",Object)],DslEditorComponent.prototype,"debounce",void 0),__decorate([core.Output(),__metadata("design:type",Object)],DslEditorComponent.prototype,"dslChange",void 0),__decorate([core.Output(),__metadata("design:type",Object)],DslEditorComponent.prototype,"focus",void 0),__decorate([core.Output(),__metadata("design:type",Object)],DslEditorComponent.prototype,"blur",void 0),__decorate([core.Output(),__metadata("design:type",Object)],DslEditorComponent.prototype,"editor",void 0),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],DslEditorComponent.prototype,"dsl",null),__decorate([core.Input(),__metadata("design:type",Object),__metadata("design:paramtypes",[Object])],DslEditorComponent.prototype,"lintOptions",null),__decorate([core.Input(),__metadata("design:type",Object),__metadata("design:paramtypes",[Object])],DslEditorComponent.prototype,"hintOptions",null),DslEditorComponent=__decorate([core.Component({selector:"dsl-editor",template:'\n \n ',styles:["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "],encapsulation:core.ViewEncapsulation.None}),__metadata("design:paramtypes",[core.ElementRef])],DslEditorComponent)}(),$$7=_$,CodeEditorComponent=function(){function CodeEditorComponent(element){var _this=this;this.element=element,this._dsl="",this._lint=!1,this.lineNumbers=!1,this.lineWrapping=!1,this.dslChange=new core.EventEmitter,this.focus=new core.EventEmitter,this.blur=new core.EventEmitter,this.editor=new core.EventEmitter,this._dslChangedHandler=function(){_this._dsl=_this.doc.getValue(),_this.dslChange.emit(_this._dsl),_this._onChangeHandler&&_this._onChangeHandler(_this._dsl)}}var CodeEditorComponent_1;return CodeEditorComponent_1=CodeEditorComponent,Object.defineProperty(CodeEditorComponent.prototype,"dsl",{set:function(dsl){if(this._dsl=dsl,this.doc&&this._dsl!==this.doc.getValue()){var cursorPosition=this.doc.getCursor();this.doc.setValue(this._dsl||""),this.doc.setCursor(cursorPosition)}},enumerable:!0,configurable:!0}),Object.defineProperty(CodeEditorComponent.prototype,"language",{set:function(_language){this._language!==_language&&(this._language=_language,this.loadEditorMode())},enumerable:!0,configurable:!0}),CodeEditorComponent.prototype.ngOnInit=function(){var _this=this,options={value:this._dsl||"",gutters:["CodeMirror-lint-markers"],extraKeys:{"Ctrl-Space":"autocomplete"},lineNumbers:this.lineNumbers,lineWrapping:this.lineWrapping,matchBrackets:!0,autoCloseBrackets:!0};this.scrollbarStyle&&(options.scrollbarStyle=this.scrollbarStyle),this._lint&&(options.lint=this._lint),this.doc=codemirrorMinified.fromTextArea($$7("#code-editor-host",this.element.nativeElement)[0],options),this.placeholder&&this.doc.setOption("placeholder",this.placeholder),this.doc.setValue(this._dsl||""),this.doc.on("change",this._dslChangedHandler),this.doc.on("focus",function(){_this.focus.emit(),_this._onTouchHandler&&_this._onTouchHandler()}),this.doc.on("blur",function(){return _this.blur.emit()}),this.warningRuler=this.doc.annotateScrollbar("CodeMirror-vertical-ruler-warning"),this.errorRuler=this.doc.annotateScrollbar("CodeMirror-vertical-ruler-error"),this.loadEditorMode(),this.editor.emit(this.doc)},CodeEditorComponent.prototype.loadEditorMode=function(){if(this.doc){var info=this._language?codemirrorMinified.findModeByName(this._language):void 0;info?this.doc.setOption("mode",info.mime):this.doc.setOption("mode","text/plain"),this.doc.setOption("lint",this.getLintOptions())}},CodeEditorComponent.prototype.ngOnDestroy=function(){},CodeEditorComponent.prototype.writeValue=function(obj){this.dsl=obj},CodeEditorComponent.prototype.registerOnChange=function(fn){this._onChangeHandler=fn},CodeEditorComponent.prototype.registerOnTouched=function(fn){this._onTouchHandler=fn},CodeEditorComponent.prototype.getLintOptions=function(){var _this=this;switch(this._language){case"javascript":case"json":case"coffeescript":case"yaml":return{onUpdateLinting:function(annotations){var warnings=[],errors=[];_this.overviewRuler&&Array.isArray(annotations)&&annotations.forEach(function(a){a.to&&a.from&&0<=a.from.line&&0<=a.from.ch&&a.to.line>=a.from.line&&0<=a.from.ch&&("error"===a.severity?errors.push(a):"warning"===a.severity&&warnings.push(a))}),_this.warningRuler.update(warnings),_this.errorRuler.update(errors)}}}return!1},__decorate([core.Input("line-numbers"),__metadata("design:type",Object)],CodeEditorComponent.prototype,"lineNumbers",void 0),__decorate([core.Input("line-wrapping"),__metadata("design:type",Object)],CodeEditorComponent.prototype,"lineWrapping",void 0),__decorate([core.Input("scrollbar-style"),__metadata("design:type",String)],CodeEditorComponent.prototype,"scrollbarStyle",void 0),__decorate([core.Input(),__metadata("design:type",String)],CodeEditorComponent.prototype,"placeholder",void 0),__decorate([core.Input("overview-ruler"),__metadata("design:type",Boolean)],CodeEditorComponent.prototype,"overviewRuler",void 0),__decorate([core.Output(),__metadata("design:type",Object)],CodeEditorComponent.prototype,"dslChange",void 0),__decorate([core.Output(),__metadata("design:type",Object)],CodeEditorComponent.prototype,"focus",void 0),__decorate([core.Output(),__metadata("design:type",Object)],CodeEditorComponent.prototype,"blur",void 0),__decorate([core.Output(),__metadata("design:type",Object)],CodeEditorComponent.prototype,"editor",void 0),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],CodeEditorComponent.prototype,"dsl",null),__decorate([core.Input(),__metadata("design:type",String),__metadata("design:paramtypes",[String])],CodeEditorComponent.prototype,"language",null),CodeEditorComponent=CodeEditorComponent_1=__decorate([core.Component({selector:"code-editor",template:'\n
\n \n
\n ',styles:["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "],encapsulation:core.ViewEncapsulation.None,providers:[{provide:forms.NG_VALUE_ACCESSOR,useExisting:core.forwardRef(function(){return CodeEditorComponent_1}),multi:!0}]}),__metadata("design:paramtypes",[core.ElementRef])],CodeEditorComponent)}();!function(Properties){var InputType;!function(InputType){InputType[InputType.TEXT=0]="TEXT",InputType[InputType.NUMBER=1]="NUMBER",InputType[InputType.SELECT=2]="SELECT",InputType[InputType.CHECKBOX=3]="CHECKBOX",InputType[InputType.PASSWORD=4]="PASSWORD",InputType[InputType.EMAIL=5]="EMAIL",InputType[InputType.URL=6]="URL",InputType[InputType.CODE=7]="CODE"}(InputType=Properties.InputType||(Properties.InputType={}));var GenericControlModel=function(){function GenericControlModel(_property,type,validation){this._property=_property,this.type=type,this.validation=validation}return Object.defineProperty(GenericControlModel.prototype,"id",{get:function(){return this.property.id},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"name",{get:function(){return this.property.name},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"description",{get:function(){return this.property.description},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"defaultValue",{get:function(){return this.property.defaultValue},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"value",{get:function(){return this.getValue()},set:function(value){this.setValue(value)},enumerable:!0,configurable:!0}),Object.defineProperty(GenericControlModel.prototype,"property",{get:function(){return this._property},enumerable:!0,configurable:!0}),GenericControlModel.prototype.setValue=function(value){this.property.value=value},GenericControlModel.prototype.getValue=function(){return this.property.value},GenericControlModel}(),CheckBoxControlModel=function(_super){function CheckBoxControlModel(_property,validation){return _super.call(this,_property,InputType.CHECKBOX,validation)||this}return __extends(CheckBoxControlModel,_super),CheckBoxControlModel.prototype.getValue=function(){var res=_super.prototype.getValue.call(this);switch(typeof res){case"boolean":return res;case"string":switch(res.trim().toLowerCase()){case"true":case"1":return!0;case"false":case"0":return!1;default:return this.property.defaultValue}case"number":return 0!==res&&(1===res||this.property.defaultValue)}return this.property.defaultValue},CheckBoxControlModel}(Properties.GenericControlModel=GenericControlModel);Properties.CheckBoxControlModel=CheckBoxControlModel;var AbstractCodeControlModel=function(_super){function AbstractCodeControlModel(_property,encode,decode,validation){var _this=_super.call(this,_property,InputType.CODE,validation)||this;return _this.encode=encode,_this.decode=decode,_this}return __extends(AbstractCodeControlModel,_super),Object.defineProperty(AbstractCodeControlModel.prototype,"value",{get:function(){var dsl=_super.prototype.getValue.call(this);return dsl&&this.decode?this.decode(dsl):dsl},set:function(value){value&&this.encode?_super.prototype.setValue.call(this,this.encode(value)):_super.prototype.setValue.call(this,value)},enumerable:!0,configurable:!0}),AbstractCodeControlModel}(GenericControlModel),GenericCodeControlModel=function(_super){function GenericCodeControlModel(_property,language,encode,decode,validation){var _this=_super.call(this,_property,encode,decode,validation)||this;return _this.language=language,_this}return __extends(GenericCodeControlModel,_super),GenericCodeControlModel}(Properties.AbstractCodeControlModel=AbstractCodeControlModel);Properties.GenericCodeControlModel=GenericCodeControlModel;var CodeControlModelWithDynamicLanguageProperty=function(_super){function CodeControlModelWithDynamicLanguageProperty(_property,_languagePropertyName,_groupModel,encode,decode,validation){var _this=_super.call(this,_property,encode,decode,validation)||this;return _this._languagePropertyName=_languagePropertyName,_this._groupModel=_groupModel,_this}return __extends(CodeControlModelWithDynamicLanguageProperty,_super),Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype,"language",{get:function(){var value=this.languageControlModel.value;return value||this.languageControlModel.defaultValue},enumerable:!0,configurable:!0}),Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype,"languageControlModel",{get:function(){var _this=this;return this._langControlModel||(this._langControlModel=this._groupModel.getControlsModels().find(function(c){return c.id===_this._languagePropertyName})),this._langControlModel},enumerable:!0,configurable:!0}),CodeControlModelWithDynamicLanguageProperty}(AbstractCodeControlModel);Properties.CodeControlModelWithDynamicLanguageProperty=CodeControlModelWithDynamicLanguageProperty;var GenericListControlModel=function(_super){function GenericListControlModel(property,validation){return _super.call(this,property,InputType.TEXT,validation)||this}return __extends(GenericListControlModel,_super),Object.defineProperty(GenericListControlModel.prototype,"value",{get:function(){return this.property.value?this.property.value.join(", "):""},set:function(value){this.property.value=value&&value.trim()?value.split(/\s*,\s*/):void 0},enumerable:!0,configurable:!0}),GenericListControlModel}(GenericControlModel);Properties.GenericListControlModel=GenericListControlModel;var SelectControlModel=function(_super){function SelectControlModel(_property,type,options){var _this=_super.call(this,_property,type)||this;return _this.options=options,void 0===_property.defaultValue&&options.unshift({name:"SELECT",value:_property.defaultValue}),_this}return __extends(SelectControlModel,_super),SelectControlModel}(GenericControlModel);Properties.SelectControlModel=SelectControlModel;var DefaultCellPropertiesSource=function(){function DefaultCellPropertiesSource(cell){this.cell=cell}return DefaultCellPropertiesSource.prototype.getProperties=function(){var _this=this,metadata=this.cell.attr("metadata");return Promise.resolve(metadata.properties().then(function(propsMetadata){return Array.from(propsMetadata.values()).map(function(m){return _this.createProperty(m)})}))},DefaultCellPropertiesSource.prototype.createProperty=function(metadata){return{id:metadata.id,name:metadata.name,type:metadata.type,defaultValue:metadata.defaultValue,attr:"props/"+metadata.name,value:this.cell.attr("props/"+metadata.name),description:metadata.description,valueOptions:metadata.options}},DefaultCellPropertiesSource.prototype.applyChanges=function(properties){var _this=this;this.cell.trigger("batch:start",{batchName:"update properties"}),properties.forEach(function(property){if("boolean"==typeof property.value&&!property.defaultValue&&!property.value||property.value===property.defaultValue||""===property.value||void 0===property.value||null===property.value){var currentValue=_this.cell.attr(property.attr);null!=currentValue&&(_this.cell.attr(property.attr,void 0===property.defaultValue?null:property.defaultValue),_this.cell.removeAttr(property.attr))}else _this.cell.attr(property.attr,property.value)}),this.cell.trigger("batch:stop",{batchName:"update properties"})},DefaultCellPropertiesSource}();Properties.DefaultCellPropertiesSource=DefaultCellPropertiesSource;var PropertiesGroupModel=function(){function PropertiesGroupModel(propertiesSource){this.loading=!0,this.propertiesSource=propertiesSource}return PropertiesGroupModel.prototype.load=function(){var _this=this;this.loading=!0,this._loadedSubject=new rxjs.Subject,this.propertiesSource.getProperties().then(function(properties){_this.controlModels=properties.map(function(p){return _this.createControlModel(p)}),_this.loading=!1,_this._loadedSubject.next(!0),_this._loadedSubject.complete()})},Object.defineProperty(PropertiesGroupModel.prototype,"isLoading",{get:function(){return this.loading},enumerable:!0,configurable:!0}),Object.defineProperty(PropertiesGroupModel.prototype,"loadedSubject",{get:function(){return this._loadedSubject},enumerable:!0,configurable:!0}),PropertiesGroupModel.prototype.getControlsModels=function(){return this.controlModels},PropertiesGroupModel.prototype.createControlModel=function(property){return new GenericControlModel(property,InputType.TEXT)},PropertiesGroupModel.prototype.applyChanges=function(){if(!this.loading){var properties=this.controlModels.map(function(cm){return cm.property});this.propertiesSource.applyChanges(properties)}},PropertiesGroupModel}();Properties.PropertiesGroupModel=PropertiesGroupModel,function(Validators){Validators.uniqueResource=function(service,debounce$$1){return function(control){return new rxjs.Observable(function(obs){control.valueChanges&&control.value?control.valueChanges.pipe(operators.debounceTime(debounce$$1),operators.mergeMap(function(value){return service(value)})).subscribe(function(){obs.next({uniqueResource:!0}),obs.complete()},function(){obs.next(void 0),obs.complete()}):(obs.next(void 0),obs.complete())})}},Validators.noneOf=function(excluded){return function(control){return excluded.find(function(e){return e===control.value})?{noneOf:{value:control.value}}:{}}}}(Properties.Validators||(Properties.Validators={}))}(exports.Properties||(exports.Properties={}));var PropertiesGroupComponent=function(){function PropertiesGroupComponent(){}return PropertiesGroupComponent.prototype.ngOnInit=function(){var _this=this;if(this.propertiesGroupModel.isLoading)var subscription_1=this.propertiesGroupModel.loadedSubject.subscribe(function(loaded){loaded&&(subscription_1.unsubscribe(),_this.createGroupControls())});else this.createGroupControls()},PropertiesGroupComponent.prototype.createGroupControls=function(){var _this=this;this.propertiesGroupModel.getControlsModels().forEach(function(c){c.validation?_this.form.addControl(c.id,new forms.FormControl(c.value||"",c.validation.validator,c.validation.asyncValidator)):_this.form.addControl(c.id,new forms.FormControl(c.value||""))})},__decorate([core.Input(),__metadata("design:type",exports.Properties.PropertiesGroupModel)],PropertiesGroupComponent.prototype,"propertiesGroupModel",void 0),__decorate([core.Input(),__metadata("design:type",forms.FormGroup)],PropertiesGroupComponent.prototype,"form",void 0),PropertiesGroupComponent=__decorate([core.Component({selector:"properties-group",template:'\n
\n \n
\n ',encapsulation:core.ViewEncapsulation.None})],PropertiesGroupComponent)}(),DynamicFormPropertyComponent=function(){function DynamicFormPropertyComponent(){}return Object.defineProperty(DynamicFormPropertyComponent.prototype,"types",{get:function(){return exports.Properties.InputType},enumerable:!0,configurable:!0}),Object.defineProperty(DynamicFormPropertyComponent.prototype,"control",{get:function(){return this.form.controls[this.model.id]},enumerable:!0,configurable:!0}),Object.defineProperty(DynamicFormPropertyComponent.prototype,"errorData",{get:function(){var _this=this;return(this.model.validation&&this.model.validation.errorData?this.model.validation.errorData:[]).filter(function(e){return _this.control.errors&&_this.control.errors[e.id]})},enumerable:!0,configurable:!0}),__decorate([core.Input(),__metadata("design:type",Object)],DynamicFormPropertyComponent.prototype,"model",void 0),__decorate([core.Input(),__metadata("design:type",forms.FormGroup)],DynamicFormPropertyComponent.prototype,"form",void 0),DynamicFormPropertyComponent=__decorate([core.Component({selector:"df-property",template:'\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ',encapsulation:core.ViewEncapsulation.None}),__metadata("design:paramtypes",[])],DynamicFormPropertyComponent)}(),FloModule=function(){function FloModule(){}return FloModule=__decorate([core.NgModule({imports:[forms.FormsModule,common.CommonModule,forms.ReactiveFormsModule],declarations:[Palette,EditorComponent,ResizerDirective,DslEditorComponent,CodeEditorComponent,PropertiesGroupComponent,DynamicFormPropertyComponent],exports:[EditorComponent,DslEditorComponent,DynamicFormPropertyComponent,PropertiesGroupComponent]})],FloModule)}();exports.FloModule=FloModule,exports.Palette=Palette,exports.EditorComponent=EditorComponent,exports.DslEditorComponent=DslEditorComponent,exports.CodeEditorComponent=CodeEditorComponent,exports.PropertiesGroupComponent=PropertiesGroupComponent,exports.DynamicFormPropertyComponent=DynamicFormPropertyComponent,exports.ResizerDirective=ResizerDirective,Object.defineProperty(exports,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/dist/esm2015/code-editor/code-editor.component.js b/dist/esm2015/code-editor/code-editor.component.js deleted file mode 100644 index 01f12b5..0000000 --- a/dist/esm2015/code-editor/code-editor.component.js +++ /dev/null @@ -1,249 +0,0 @@ -import * as tslib_1 from "tslib"; -var CodeEditorComponent_1; -import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation, forwardRef } from '@angular/core'; -import { NG_VALUE_ACCESSOR } from '@angular/forms'; -import * as CodeMirror from 'codemirror-minified'; -import * as _$ from 'jquery'; -const $ = _$; -// CodeMirror extensions -import 'codemirror-minified/mode/meta'; -import 'codemirror-minified/addon/lint/lint'; -import 'codemirror-minified/addon/hint/show-hint'; -// import 'codemirror-minified/addon/mode/loadmode'; -import 'codemirror-minified/addon/edit/matchbrackets'; -import 'codemirror-minified/addon/edit/closebrackets'; -import 'codemirror-minified/addon/display/placeholder'; -import 'codemirror-minified/addon/scroll/annotatescrollbar'; -import 'codemirror-minified/addon/scroll/simplescrollbars'; -// Lint support -// Unclear how to import this dynamically... -import 'codemirror-minified/addon/lint/javascript-lint'; -import 'codemirror-minified/addon/lint/coffeescript-lint'; -import 'codemirror-minified/addon/lint/json-lint'; -import 'codemirror-minified/addon/lint/yaml-lint'; -// TODO: use dynamic import with JS7 in the future. CM autoLoad cannot load it properly - thinks its AMD -// Supported languages until dynamic loading -import 'codemirror-minified/mode/groovy/groovy'; -import 'codemirror-minified/mode/javascript/javascript'; -import 'codemirror-minified/mode/python/python'; -import 'codemirror-minified/mode/ruby/ruby'; -import 'codemirror-minified/mode/clike/clike'; -import 'codemirror-minified/mode/yaml/yaml'; -import 'codemirror-minified/mode/coffeescript/coffeescript'; -let CodeEditorComponent = CodeEditorComponent_1 = class CodeEditorComponent { - constructor(element) { - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.dslChange = new EventEmitter(); - this.focus = new EventEmitter(); - this.blur = new EventEmitter(); - this.editor = new EventEmitter(); - this._dslChangedHandler = () => { - this._dsl = this.doc.getValue(); - this.dslChange.emit(this._dsl); - if (this._onChangeHandler) { - this._onChangeHandler(this._dsl); - } - }; - } - set dsl(dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - let cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - } - set language(_language) { - if (this._language !== _language) { - this._language = _language; - this.loadEditorMode(); - } - } - ngOnInit() { - let options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - matchBrackets: true, - autoCloseBrackets: true, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - this.doc = CodeMirror.fromTextArea($('#code-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this._dslChangedHandler); - this.doc.on('focus', () => { - this.focus.emit(); - if (this._onTouchHandler) { - this._onTouchHandler(); - } - }); - this.doc.on('blur', () => this.blur.emit()); - this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); - this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); - this.loadEditorMode(); - this.editor.emit(this.doc); - } - loadEditorMode() { - // CodeMirror doc object must be initialized - if (!this.doc) { - return; - } - const info = this._language ? CodeMirror.findModeByName(this._language) : undefined; - // Set proper editor mode - if (info) { - this.doc.setOption('mode', info.mime); - // (CodeMirror).autoLoadMode(this.doc, info.mode); - } - else { - this.doc.setOption('mode', 'text/plain'); - } - // Set proper Lint mode - this.doc.setOption('lint', this.getLintOptions()); - } - ngOnDestroy() { - } - writeValue(obj) { - this.dsl = obj; - } - registerOnChange(fn) { - this._onChangeHandler = fn; - } - registerOnTouched(fn) { - this._onTouchHandler = fn; - } - getLintOptions() { - switch (this._language) { - case 'javascript': - case 'json': - case 'coffeescript': - case 'yaml': - return { - onUpdateLinting: (annotations) => { - const warnings = []; - const errors = []; - if (this.overviewRuler) { - if (Array.isArray(annotations)) { - annotations.forEach((a) => { - if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { - if (a.severity === 'error') { - errors.push(a); - } - else if (a.severity === 'warning') { - warnings.push(a); - } - } - }); - } - } - this.warningRuler.update(warnings); - this.errorRuler.update(errors); - } - }; - } - return false; - } -}; -tslib_1.__decorate([ - Input('line-numbers'), - tslib_1.__metadata("design:type", Object) -], CodeEditorComponent.prototype, "lineNumbers", void 0); -tslib_1.__decorate([ - Input('line-wrapping'), - tslib_1.__metadata("design:type", Object) -], CodeEditorComponent.prototype, "lineWrapping", void 0); -tslib_1.__decorate([ - Input('scrollbar-style'), - tslib_1.__metadata("design:type", String) -], CodeEditorComponent.prototype, "scrollbarStyle", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String) -], CodeEditorComponent.prototype, "placeholder", void 0); -tslib_1.__decorate([ - Input('overview-ruler'), - tslib_1.__metadata("design:type", Boolean) -], CodeEditorComponent.prototype, "overviewRuler", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], CodeEditorComponent.prototype, "dslChange", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], CodeEditorComponent.prototype, "focus", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], CodeEditorComponent.prototype, "blur", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], CodeEditorComponent.prototype, "editor", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) -], CodeEditorComponent.prototype, "dsl", null); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) -], CodeEditorComponent.prototype, "language", null); -CodeEditorComponent = CodeEditorComponent_1 = tslib_1.__decorate([ - Component({ - selector: 'code-editor', - template: ` -
- -
- `, - styles: [` - .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror { - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - height: 100%; - } - .CodeMirror-hint { - max-width: 38em; - } - .CodeMirror-vertical-ruler-error { - background-color: rgba(188, 0, 0, 0.5); - } - .CodeMirror-vertical-ruler-warning { - background-color: rgba(255, 188, 0, 0.5); - } - .CodeMirror-lint-tooltip { - z-index: 2000; - } - `], - encapsulation: ViewEncapsulation.None, - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CodeEditorComponent_1), - multi: true - } - ] - }), - tslib_1.__metadata("design:paramtypes", [ElementRef]) -], CodeEditorComponent); -export { CodeEditorComponent }; -//# sourceMappingURL=code-editor.component.js.map \ No newline at end of file diff --git a/dist/esm2015/directives/resizer.js b/dist/esm2015/directives/resizer.js deleted file mode 100644 index 1977e8e..0000000 --- a/dist/esm2015/directives/resizer.js +++ /dev/null @@ -1,161 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Directive, Input, Output, EventEmitter, Inject, ElementRef } from '@angular/core'; -import { DOCUMENT } from '@angular/platform-browser'; -import { fromEvent } from 'rxjs'; -import { sampleTime } from 'rxjs/operators'; -import { CompositeDisposable, Disposable } from 'ts-disposables'; -import * as _$ from 'jquery'; -const $ = _$; -let ResizerDirective = class ResizerDirective { - constructor(element, document) { - this.element = element; - this.document = document; - this.dragInProgress = false; - this.vertical = true; - this._subscriptions = new CompositeDisposable(); - this.sizeChange = new EventEmitter(); - this.mouseMoveHandler = (e) => { - if (this.dragInProgress) { - this.mousemove(e); - } - }; - } - set splitSize(splitSize) { - if (this.maxSplitSize && splitSize > this.maxSplitSize) { - splitSize = this.maxSplitSize; - } - if (this.vertical) { - // Handle vertical resizer - $(this.element.nativeElement).css({ - left: splitSize + 'px' - }); - $(this.first).css({ - width: splitSize + 'px' - }); - $(this.second).css({ - left: (splitSize + this._size) + 'px' - }); - } - else { - // Handle horizontal resizer - $(this.element.nativeElement).css({ - bottom: splitSize + 'px' - }); - $(this.first).css({ - bottom: (splitSize + this._size) + 'px' - }); - $(this.second).css({ - height: splitSize + 'px' - }); - } - this._splitSize = splitSize; - // Update the local field - this.sizeChange.emit(splitSize); - } - set resizerWidth(width) { - this._size = width; - this.vertical = true; - } - set resizerHeight(height) { - this._size = height; - this.vertical = false; - } - set resizerLeft(first) { - this.first = first; - } - set resizerTop(first) { - this.first = first; - } - set resizerRight(second) { - this.second = second; - } - set resizerBottom(second) { - this.second = second; - } - startDrag() { - this.dragInProgress = true; - } - mousemove(event) { - let size; - if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node - size = event.pageX - $(this.first).offset().left; - } - else { - // Handle horizontal resizer Calculate new size relative to palette container DOM node - size = window.innerHeight - event.pageY - $(this.second).offset().top; - } - this.splitSize = size; - } - ngOnInit() { - // Need to set left and right elements width and fire events on init when DOM is built - this.splitSize = this._splitSize; - let subscription1 = fromEvent($(this.document).get(0), 'mousemove') - .pipe(sampleTime(300)) - .subscribe(this.mouseMoveHandler); - this._subscriptions.add(Disposable.create(() => subscription1.unsubscribe())); - let subscription2 = fromEvent($(this.document).get(0), 'mouseup') - .subscribe(e => { - if (this.dragInProgress) { - this.mousemove(e); - this.dragInProgress = false; - } - }); - this._subscriptions.add(Disposable.create(() => subscription2.unsubscribe())); - } - ngOnDestroy() { - this._subscriptions.dispose(); - } -}; -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number) -], ResizerDirective.prototype, "maxSplitSize", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], ResizerDirective.prototype, "sizeChange", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number), - tslib_1.__metadata("design:paramtypes", [Number]) -], ResizerDirective.prototype, "splitSize", null); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number), - tslib_1.__metadata("design:paramtypes", [Number]) -], ResizerDirective.prototype, "resizerWidth", null); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number), - tslib_1.__metadata("design:paramtypes", [Number]) -], ResizerDirective.prototype, "resizerHeight", null); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) -], ResizerDirective.prototype, "resizerLeft", null); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) -], ResizerDirective.prototype, "resizerTop", null); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) -], ResizerDirective.prototype, "resizerRight", null); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) -], ResizerDirective.prototype, "resizerBottom", null); -ResizerDirective = tslib_1.__decorate([ - Directive({ - selector: '[resizer]', - host: { '(mousedown)': 'startDrag()' } - }), - tslib_1.__param(1, Inject(DOCUMENT)), - tslib_1.__metadata("design:paramtypes", [ElementRef, Object]) -], ResizerDirective); -export { ResizerDirective }; -//# sourceMappingURL=resizer.js.map \ No newline at end of file diff --git a/dist/esm2015/dsl-editor/dsl-editor.component.js b/dist/esm2015/dsl-editor/dsl-editor.component.js deleted file mode 100644 index 860a577..0000000 --- a/dist/esm2015/dsl-editor/dsl-editor.component.js +++ /dev/null @@ -1,168 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation } from '@angular/core'; -import * as _ from 'lodash'; -import * as CodeMirror from 'codemirror-minified'; -import * as _$ from 'jquery'; -const $ = _$; -import 'codemirror-minified/addon/lint/lint'; -import 'codemirror-minified/addon/hint/show-hint'; -import 'codemirror-minified/addon/display/placeholder'; -import 'codemirror-minified/addon/scroll/annotatescrollbar'; -import 'codemirror-minified/addon/scroll/simplescrollbars'; -let DslEditorComponent = class DslEditorComponent { - constructor(element) { - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.debounce = 0; - this.dslChange = new EventEmitter(); - this.focus = new EventEmitter(); - this.blur = new EventEmitter(); - this.editor = new EventEmitter(); - this._dslChangedHandler = () => { - this._dsl = this.doc.getValue(); - this.dslChange.emit(this._dsl); - }; - } - set dsl(dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - let cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - } - set lintOptions(lintOptions) { - this._lint = lintOptions; - if (this.doc) { - this.doc.setOption('lint', this._lint); - } - } - set hintOptions(hintOptions) { - this._hint = hintOptions; - if (this.doc) { - this.doc.setOption('hintOptions', this._hint); - } - } - ngOnInit() { - let options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - electricChars: false, - smartIndent: false, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - if (this._hint) { - options.hintOptions = this._hint; - } - this.doc = CodeMirror.fromTextArea($('#dsl-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this.debounce ? _.debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); - this.doc.on('focus', () => this.focus.emit()); - this.doc.on('blur', () => this.blur.emit()); - this.editor.emit(this.doc); - } - ngOnDestroy() { - } -}; -tslib_1.__decorate([ - Input('line-numbers'), - tslib_1.__metadata("design:type", Object) -], DslEditorComponent.prototype, "lineNumbers", void 0); -tslib_1.__decorate([ - Input('line-wrapping'), - tslib_1.__metadata("design:type", Object) -], DslEditorComponent.prototype, "lineWrapping", void 0); -tslib_1.__decorate([ - Input('scrollbar-style'), - tslib_1.__metadata("design:type", String) -], DslEditorComponent.prototype, "scrollbarStyle", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String) -], DslEditorComponent.prototype, "placeholder", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], DslEditorComponent.prototype, "debounce", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], DslEditorComponent.prototype, "dslChange", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], DslEditorComponent.prototype, "focus", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], DslEditorComponent.prototype, "blur", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], DslEditorComponent.prototype, "editor", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) -], DslEditorComponent.prototype, "dsl", null); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object), - tslib_1.__metadata("design:paramtypes", [Object]) -], DslEditorComponent.prototype, "lintOptions", null); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object), - tslib_1.__metadata("design:paramtypes", [Object]) -], DslEditorComponent.prototype, "hintOptions", null); -DslEditorComponent = tslib_1.__decorate([ - Component({ - selector: 'dsl-editor', - template: ` - - `, - styles: [` - .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */ - - .CodeMirror { - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - height: 100%; - } - .CodeMirror-hint { - max-width: 38em; - } - .CodeMirror-vertical-ruler-error { - background-color: rgba(188, 0, 0, 0.5); - } - .CodeMirror-vertical-ruler-warning { - background-color: rgba(255, 188, 0, 0.5); - } - - - /* Code Mirror related styles END */ - `], - encapsulation: ViewEncapsulation.None - }), - tslib_1.__metadata("design:paramtypes", [ElementRef]) -], DslEditorComponent); -export { DslEditorComponent }; -//# sourceMappingURL=dsl-editor.component.js.map \ No newline at end of file diff --git a/dist/esm2015/editor/editor-utils.js b/dist/esm2015/editor/editor-utils.js deleted file mode 100644 index 2f16930..0000000 --- a/dist/esm2015/editor/editor-utils.js +++ /dev/null @@ -1,108 +0,0 @@ -import { Flo } from '../shared/flo-common'; -import * as _ from 'lodash'; -const joint = Flo.joint; -import * as _$ from 'jquery'; -const $ = _$; -export class Utils { - static fanRoute(graph, cell) { - if (cell instanceof joint.dia.Element) { - const links = graph.getConnectedLinks(cell); - const groupsOfOverlappingLinks = _.groupBy(links, (link) => { - // the key of the group is the model id of the link's source or target, but not our cell id. - const sourceId = link.get('source').id; - const targetId = link.get('target').id; - return cell.id !== sourceId ? sourceId : targetId; - }); - _.each(groupsOfOverlappingLinks, (group, key) => { - // If the member of the group has both source and target model adjust vertices. - let toRoute = {}; - if (key !== undefined) { - group.forEach((link) => { - if (link.get('source').id === cell.get('id') && link.get('target').id) { - toRoute[link.get('target').id] = link; - } - else if (link.get('target').id === cell.get('id') && link.get('source').id) { - toRoute[link.get('source').id] = link; - } - }); - Object.keys(toRoute).forEach(k => { - Utils.fanRoute(graph, toRoute[k]); - }); - } - }); - } - else if (cell instanceof joint.dia.Link) { - // The cell is a link. Let's find its source and target models. - let srcId = cell.get('source').id || cell.previous('source').id; - let trgId = cell.get('target').id || cell.previous('target').id; - // If one of the ends is not a model, the link has no siblings. - if (!srcId || !trgId) { - return; - } - const siblings = graph.getLinks().filter((sibling) => { - const _srcId = sibling.get('source').id; - const _trgId = sibling.get('target').id; - const vertices = sibling.get('vertices'); - const fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); - return ((_srcId === srcId && _trgId === trgId) || (_srcId === trgId && _trgId === srcId)) && fanRouted; - }); - switch (siblings.length) { - case 0: - // The link was removed and had no siblings. - break; - case 1: - // There is only one link between the source and target. No vertices needed. - let vertices = cell.get('vertices'); - if (vertices && vertices.length && cell.get('fanRouted')) { - cell.unset('vertices'); - } - break; - default: - // There is more than one siblings. We need to create vertices. - // First of all we'll find the middle point of the link. - let source = graph.getCell(srcId); - let target = graph.getCell(trgId); - if (!source || !target) { - // When clearing the graph it may happen that some nodes are gone and some are left - return; - } - let srcCenter = source.getBBox().center(); - let trgCenter = target.getBBox().center(); - let midPoint = joint.g.line(srcCenter, trgCenter).midpoint(); - // Then find the angle it forms. - let theta = srcCenter.theta(trgCenter); - // This is the maximum distance between links - let gap = 20; - siblings.forEach((sibling, index) => { - // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. - let offset = gap * Math.ceil(index / 2); - // Now we need the vertices to be placed at points which are 'offset' pixels distant - // from the first link and forms a perpendicular angle to it. And as index goes up - // alternate left and right. - // - // ^ odd indexes - // | - // |----> index 0 line (straight line between a source center and a target center. - // | - // v even indexes - let sign = index % 2 ? 1 : -1; - let angle = joint.g.toRad(theta + sign * 90); - // We found the vertex. - let vertex = joint.g.point.fromPolar(offset, angle, midPoint); - sibling.set('fanRouted', true); - sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); - }); - } - } - } - static isCustomPaperEvent(args) { - return args.length === 5 && - _.isString(args[0]) && - (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && - args[1] instanceof $.Event && - args[2] instanceof joint.dia.CellView && - _.isNumber(args[3]) && - _.isNumber(args[4]); - } -} -//# sourceMappingURL=editor-utils.js.map \ No newline at end of file diff --git a/dist/esm2015/editor/editor.component.js b/dist/esm2015/editor/editor.component.js deleted file mode 100644 index 38582c6..0000000 --- a/dist/esm2015/editor/editor.component.js +++ /dev/null @@ -1,1778 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation } from '@angular/core'; -import { debounceTime } from 'rxjs/operators'; -import { Flo } from '../shared/flo-common'; -import { Shapes, Constants } from '../shared/shapes'; -import { Utils } from './editor-utils'; -import { CompositeDisposable, Disposable } from 'ts-disposables'; -import * as _$ from 'jquery'; -import * as _ from 'lodash'; -import { Subject, BehaviorSubject } from 'rxjs'; -const joint = Flo.joint; -const $ = _$; -const SCROLLBAR_SIZE = 17; -let EditorComponent = class EditorComponent { - constructor(element) { - this.element = element; - /** - * Flag specifying whether the Flo-Editor is in read-only mode. - */ - this._readOnlyCanvas = false; - /** - * Grid size - */ - this._gridSize = 1; - this._hiddenPalette = false; - this.textToGraphEventEmitter = new EventEmitter(); - this.graphToTextEventEmitter = new EventEmitter(); - this._graphToTextSyncEnabled = true; - this.validationEventEmitter = new EventEmitter(); - this._disposables = new CompositeDisposable(); - this._dslText = ''; - this.textToGraphConversionCompleted = new Subject(); - this.graphToTextConversionCompleted = new Subject(); - this.paletteReady = new BehaviorSubject(false); - /** - * Min zoom percent value - */ - this.minZoom = 5; - /** - * Max zoom percent value - */ - this.maxZoom = 400; - /** - * Zoom percent increment/decrement step - */ - this.zoomStep = 5; - this.paperPadding = 0; - this.floApi = new EventEmitter(); - this.validationMarkers = new EventEmitter(); - this.contentValidated = new EventEmitter(); - this.dslChange = new EventEmitter(); - this._resizeHandler = () => this.autosizePaper(); - let self = this; - this.editorContext = new (class DefaultRunnableContext { - set zoomPercent(percent) { - self.zoomPercent = percent; - } - get zoomPercent() { - return self.zoomPercent; - } - set noPalette(noPalette) { - self.noPalette = noPalette; - } - get noPalette() { - return self.noPalette; - } - set gridSize(gridSize) { - self.gridSize = gridSize; - } - get gridSize() { - return self.gridSize; - } - set readOnlyCanvas(readOnly) { - self.readOnlyCanvas = readOnly; - } - get readOnlyCanvas() { - return self.readOnlyCanvas; - } - setDsl(dsl) { - self.dsl = dsl; - } - updateGraph() { - return self.updateGraphRepresentation(); - } - updateText() { - return self.updateTextRepresentation(); - } - performLayout() { - return self.doLayout(); - } - clearGraph() { - self.selection = undefined; - self.graph.clear(); - if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { - return self.metamodel.load().then(data => { - self.editor.setDefaultContent(this, data); - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - }); - } - else { - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - } - } - getGraph() { - return self.graph; - } - getPaper() { - return self.paper; - } - get graphToTextSync() { - return self.graphToTextSync; - } - set graphToTextSync(sync) { - self.graphToTextSync = sync; - } - getMinZoom() { - return self.minZoom; - } - getMaxZoom() { - return self.maxZoom; - } - getZoomStep() { - return self.zoomStep; - } - fitToPage() { - self.fitToPage(); - } - createNode(metadata, props, position) { - return self.createNode(metadata, props, position); - } - createLink(source, target, metadata, props) { - return self.createLink(source, target, metadata, props); - } - get selection() { - return self.selection; - } - set selection(newSelection) { - self.selection = newSelection; - } - deleteSelectedNode() { - if (self.selection) { - if (self.editor && self.editor.preDelete) { - self.editor.preDelete(self.editorContext, self.selection.model); - } - else { - if (self.selection.model instanceof joint.dia.Element) { - self.graph.getConnectedLinks(self.selection.model).forEach((l) => l.remove()); - } - } - self.selection.model.remove(); - self.selection = undefined; - } - } - get textToGraphConversionObservable() { - return self.textToGraphConversionCompleted; - } - get graphToTextConversionObservable() { - return self.graphToTextConversionCompleted; - } - get paletteReady() { - return self.paletteReady; - } - })(); - } - ngOnInit() { - this.initGraph(); - this.initPaper(); - this.initGraphListeners(); - this.initPaperListeners(); - this.initMetamodel(); - $(window).on('resize', this._resizeHandler); - this._disposables.add(Disposable.create(() => $(window).off('resize', this._resizeHandler))); - /* - * Execute resize to get the right size for the SVG element on the editor canvas. - * Executed via timeout to let angular render the DOM first and elements to have the right width and height - */ - window.setTimeout(this._resizeHandler); - this.floApi.emit(this.editorContext); - } - ngOnDestroy() { - this._disposables.dispose(); - } - get noPalette() { - return this._hiddenPalette; - } - set noPalette(hidden) { - this._hiddenPalette = hidden; - // If palette is not shown ensure that canvas starts from the left==0! - if (hidden) { - $('#paper-container', this.element.nativeElement).css('left', 0); - } - } - get graphToTextSync() { - return this._graphToTextSyncEnabled; - } - set graphToTextSync(sync) { - this._graphToTextSyncEnabled = sync; - // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion - // this.performGraphToTextSyncing(); - } - performGraphToTextSyncing() { - if (this._graphToTextSyncEnabled) { - this.graphToTextEventEmitter.emit(); - } - } - createHandle(element, kind, action, location) { - if (!location) { - let bbox = element.model.getBBox(); - location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); - } - let handle = Shapes.Factory.createHandle({ - renderer: this.renderer, - paper: this.paper, - parent: element.model, - kind: kind, - position: location - }); - const view = this.paper.findViewByModel(handle); - view.on('cell:pointerdown', () => { - if (action) { - action(); - } - }); - view.on('cell:mouseover', () => { - handle.attr('image/filter', { - name: 'dropShadow', - args: { dx: 1, dy: 1, blur: 1, color: 'black' } - }); - }); - view.on('cell:mouseout', () => { - handle.removeAttr('image/filter'); - }); - view.setInteractivity(false); - return handle; - } - removeEmbeddedChildrenOfType(element, types) { - let embeds = element.getEmbeddedCells(); - for (let i = 0; i < embeds.length; i++) { - if (types.indexOf(embeds[i].get('type')) >= 0) { - embeds[i].remove(); - } - } - } - get selection() { - return this._selection; - } - set selection(newSelection) { - if (newSelection && (newSelection.model.get('type') === joint.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint.shapes.flo.HANDLE_TYPE)) { - newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); - } - if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { - newSelection = undefined; - } - if (newSelection !== this._selection) { - if (this._selection) { - const elementview = this.paper.findViewByModel(this._selection.model); - if (elementview) { // May have been removed from the graph - this.removeEmbeddedChildrenOfType(elementview.model, joint.shapes.flo.HANDLE_TYPE); - elementview.unhighlight(); - } - } - if (newSelection) { - newSelection.highlight(); - if (this.editor && this.editor.createHandles) { - this.editor.createHandles(this.editorContext, (owner, kind, action, location) => this.createHandle(owner, kind, action, location), newSelection); - } - } - this._selection = newSelection; - } - } - get readOnlyCanvas() { - return this._readOnlyCanvas; - } - set readOnlyCanvas(value) { - if (this._readOnlyCanvas === value) { - // Nothing to do - return; - } - if (value) { - this.selection = undefined; - } - if (this.graph) { - this.graph.getLinks().forEach((link) => { - if (value) { - link.attr('.link-tools/display', 'none'); - link.attr('.marker-vertices/display', 'none'); - link.attr('.connection-wrap/display', 'none'); - } - else { - link.removeAttr('.link-tools/display'); - if (this.editor && this.editor.allowLinkVertexEdit) { - link.removeAttr('.marker-vertices/display'); - } - link.removeAttr('.connection-wrap/display'); - } - }); - } - this._readOnlyCanvas = value; - } - /** - * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - showDragFeedback(dragDescriptor) { - if (this.editor && this.editor.showDragFeedback) { - this.editor.showDragFeedback(this.editorContext, dragDescriptor); - } - else { - let magnet; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint.V(magnet).addClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint.V(magnet).addClass('dnd-target-feedback'); - } - } - } - } - } - /** - * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - hideDragFeedback(dragDescriptor) { - if (this.editor && this.editor.hideDragFeedback) { - this.editor.hideDragFeedback(this.editorContext, dragDescriptor); - } - else { - let magnet; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint.V(magnet).removeClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint.V(magnet).removeClass('dnd-target-feedback'); - } - } - } - } - } - /** - * Sets the new DnD info object - the descriptor for DnD - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - setDragDescriptor(dragDescriptor) { - if (this.highlighted === dragDescriptor) { - return; - } - if (this.highlighted && dragDescriptor && _.isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { - if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { - return; - } - if (this.highlighted.source && - dragDescriptor.source && - this.highlighted.target && - dragDescriptor.target && - this.highlighted.source.view.model === dragDescriptor.source.view.model && - this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && - this.highlighted.target.view.model === dragDescriptor.target.view.model && - this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { - return; - } - } - if (this.highlighted) { - this.hideDragFeedback(this.highlighted); - } - this.highlighted = dragDescriptor; - if (this.highlighted) { - this.showDragFeedback(this.highlighted); - } - } - /** - * Handles DnD events when a node is being dragged over canvas - * - * @param draggedView The Joint JS view object being dragged - * @param targetUnderMouse The Joint JS view under mouse cursor - * @param x X coordinate of the mouse on the canvas - * @param y Y coordinate of the mosue on the canvas - * @param context DnD context (palette or canvas) - */ - handleNodeDragging(draggedView, targetUnderMouse, x, y, sourceComponent) { - if (this.editor && this.editor.calculateDragDescriptor) { - this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint.g.point(x, y), sourceComponent)); - } - } - /** - * Handles DnD drop event when a node is being dragged and dropped on the main canvas - */ - handleNodeDropping() { - if (this.highlighted && this.editor && this.editor.handleNodeDropping) { - this.editor.handleNodeDropping(this.editorContext, this.highlighted); - } - this.setDragDescriptor(undefined); - } - /** - * Hides DOM Node (used to determine drop target DOM element) - * @param domNode DOM node to hide - * @returns - */ - _hideNode(domNode) { - let oldVisibility = { - visibility: domNode.style ? domNode.style.display : undefined, - children: [] - }; - for (let i = 0; i < domNode.children.length; i++) { - let node = domNode.children.item(i); - if (node instanceof HTMLElement) { - oldVisibility.children.push(this._hideNode(node)); - } - } - domNode.style.display = 'none'; - return oldVisibility; - } - /** - * Restored DOM node original visibility (used to determine drop target DOM element) - * @param domNode DOM node to restore visibility of - * @param oldVisibility original visibility parameter - */ - _restoreNodeVisibility(domNode, oldVisibility) { - if (domNode.style) { - domNode.style.display = oldVisibility.visibility; - } - let j = 0; - for (let i = 0; i < domNode.childNodes.length; i++) { - if (j < oldVisibility.children.length) { - let node = domNode.children.item(i); - if (node instanceof HTMLElement) { - this._restoreNodeVisibility(node, oldVisibility.children[j++]); - } - } - } - } - /** - * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. - * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location - * (bounding box of a link for testing is bad). - * The result of that is that links can only be the drop target when dragging from the palette currently. - * When DnDing shapes on the canvas drop target cannot be a link. - * - * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked - * - e.g. Drag-n-Drop) - */ - getTargetViewFromEvent(event, x, y, excludeViews = []) { - if (!x && !y) { - let l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); - x = l.x; - y = l.y; - } - // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing - // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); - // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); - // if (underMouse) { - // return underMouse; - // } - let oldVisibility = excludeViews.map(_x => this._hideNode(_x.el)); - let targetElement = document.elementFromPoint(event.clientX, event.clientY); - excludeViews.forEach((excluded, i) => { - this._restoreNodeVisibility(excluded.el, oldVisibility[i]); - }); - return this.paper.findView($(targetElement)); - } - handleDnDFromPalette(dndEvent) { - switch (dndEvent.type) { - case Flo.DnDEventType.DRAG: - this.handleDragFromPalette(dndEvent); - break; - case Flo.DnDEventType.DROP: - this.handleDropFromPalette(dndEvent); - break; - default: - break; - } - } - handleDragFromPalette(dnDEvent) { - console.debug('Dragging from palette'); - if (dnDEvent.view && !this.readOnlyCanvas) { - let location = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); - this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location.x, location.y, [dnDEvent.view]), location.x, location.y, Constants.PALETTE_CONTEXT); - } - } - createNode(metadata, props, position) { - return Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.paper, - metadata: metadata, - props: props, - position: position - }); - } - createLink(source, target, metadata, props) { - return Shapes.Factory.createLink({ - renderer: this.renderer, - paper: this.paper, - source: source, - target: target, - metadata: metadata, - props: props - }); - } - handleDropFromPalette(event) { - let cellview = event.view; - let evt = event.event; - if (this.paper.el === evt.target || $.contains(this.paper.el, evt.target)) { - if (this.readOnlyCanvas) { - this.setDragDescriptor(undefined); - } - else { - let metadata = cellview.model.attr('metadata'); - let props = cellview.model.attr('props'); - let position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); - /* Calculate target element before creating the new - * element under mouse location. Otherwise target - * element would be the newly created element because - * it's under the mouse pointer - */ - let targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); - let newNode = this.createNode(metadata, props, position); - let newView = this.paper.findViewByModel(newNode); - this.handleNodeDragging(newView, targetElement, position.x, position.y, Constants.PALETTE_CONTEXT); - this.handleNodeDropping(); - } - } - } - fitToContent(gridWidth, gridHeight, padding, opt) { - const paper = this.paper; - if (joint.util.isObject(gridWidth)) { - // first parameter is an option object - opt = gridWidth; - gridWidth = opt.gridWidth || 1; - gridHeight = opt.gridHeight || 1; - padding = opt.padding || 0; - } - else { - opt = opt || {}; - gridWidth = gridWidth || 1; - gridHeight = gridHeight || 1; - padding = padding || 0; - } - const paddingJson = joint.util.normalizeSides(padding); - // Calculate the paper size to accomodate all the graph's elements. - const bbox = joint.V(paper.viewport).getBBox(); - const currentScale = paper.scale(); - const currentTranslate = paper.translate(); - bbox.x *= currentScale.sx; - bbox.y *= currentScale.sy; - bbox.width *= currentScale.sx; - bbox.height *= currentScale.sy; - let calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; - let calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; - let tx = 0; - let ty = 0; - if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { - tx = (-bbox.x / gridWidth) * gridWidth; - tx += paddingJson.left; - } - else if (opt.allowNewOrigin === 'same') { - tx = currentTranslate.tx; - } - calcWidth += tx; - if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { - ty = (-bbox.y / gridHeight) * gridHeight; - ty += paddingJson.top; - } - else if (opt.allowNewOrigin === 'same') { - ty = currentTranslate.ty; - } - calcHeight += ty; - calcWidth += paddingJson.right; - calcHeight += paddingJson.bottom; - // Make sure the resulting width and height are greater than minimum. - calcWidth = Math.max(calcWidth, opt.minWidth || 0); - calcHeight = Math.max(calcHeight, opt.minHeight || 0); - // Make sure the resulting width and height are lesser than maximum. - calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); - calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); - const dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; - const originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; - // Change the dimensions only if there is a size discrepency or an origin change - if (originChange) { - paper.translate(tx, ty); - } - if (dimensionChange) { - paper.setDimensions(calcWidth, calcHeight); - } - } - autosizePaper() { - let parent = $('#paper-container', this.element.nativeElement); - const parentWidth = parent.innerWidth(); - const parentHeight = parent.innerHeight(); - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth - SCROLLBAR_SIZE, - minHeight: parentHeight - SCROLLBAR_SIZE, - allowNewOrigin: 'same' - }); - } - fitToPage() { - let parent = $('#paper-container', this.element.nativeElement); - let minScale = this.minZoom / 100; - let maxScale = 2; - const parentWidth = parent.innerWidth(); - const parentHeight = parent.innerHeight(); - this.paper.scaleContentToFit({ - padding: this.paperPadding, - minScaleX: minScale, - minScaleY: minScale, - maxScaleX: maxScale, - maxScaleY: maxScale, - fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } - }); - /** - * Size the canvas appropriately and allow origin movement - */ - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth, - minHeight: parentHeight, - maxWidth: parentWidth, - maxHeight: parentHeight, - allowNewOrigin: 'any' - }); - } - get zoomPercent() { - return Math.round(joint.V(this.paper.viewport).scale().sx * 100); - } - set zoomPercent(percent) { - if (!isNaN(percent)) { - if (percent < this.minZoom) { - percent = this.minZoom; - } - else if (percent >= this.maxZoom) { - percent = this.maxZoom; - } - else { - if (percent <= 0) { - percent = 0.00001; - } - } - this.paper.scale(percent / 100, percent / 100); - } - } - get gridSize() { - return this._gridSize; - } - set gridSize(size) { - if (!isNaN(size) && size >= 1) { - this._gridSize = size; - if (this.paper) { - this.paper.setGridSize(size); - } - } - } - validateContent() { - return new Promise(resolve => { - if (this.editor && this.editor.validate) { - return this.editor - .validate(this.graph, this.dsl, this.editorContext) - .then(allMarkers => { - this.graph.getCells() - .forEach((cell) => this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : [])); - this.validationMarkers.emit(allMarkers); - this.contentValidated.emit(true); - resolve(); - }); - } - else { - resolve(); - } - }); - } - markElement(cell, markers) { - let errorMessages = markers.map(m => m.message); - let errorCell = cell.getEmbeddedCells().find((e) => e.attr('./kind') === Constants.ERROR_DECORATION_KIND); - if (errorCell) { - if (errorMessages.length === 0) { - errorCell.remove(); - } - else { - // Without rewrite we merge this list with existing errors - errorCell.attr('messages', errorMessages, { rewrite: true }); - } - } - else if (errorMessages.length > 0) { - let error = Shapes.Factory.createDecoration({ - renderer: this.renderer, - paper: this.paper, - parent: cell, - kind: Constants.ERROR_DECORATION_KIND, - messages: errorMessages - }); - let pt; - const view = this.paper.findViewByModel(error); - if (cell instanceof joint.dia.Element) { - pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); - error.set('position', pt); - view.setInteractivity(false); - } - else { - // TODO: do something for the link perhaps? - } - } - } - doLayout() { - if (this.renderer && this.renderer.layout) { - return this.renderer.layout(this.paper); - } - } - set dsl(dslText) { - if (this._dslText !== dslText) { - this._dslText = dslText; - this.textToGraphEventEmitter.emit(); - } - } - get dsl() { - return this._dslText; - } - /** - * Ask the server to parse the supplied text into a JSON graph of nodes and links, - * then update the view based on that new information. - */ - updateGraphRepresentation() { - console.debug(`Updating graph to represent '${this._dslText}'`); - if (this.metamodel && this.metamodel.textToGraph) { - return this.metamodel.textToGraph(this.editorContext, this._dslText).then(() => { - this.textToGraphConversionCompleted.next(); - return this.validateContent(); - }); - } - else { - this.textToGraphConversionCompleted.next(); - return this.validateContent(); - } - } - updateTextRepresentation() { - if (this.metamodel && this.metamodel.graphToText) { - return this.metamodel.graphToText(this.editorContext).then(text => { - if (this._dslText !== text) { - this._dslText = text; - this.dslChange.emit(text); - } - this.graphToTextConversionCompleted.next(); - return this.validateContent(); - }) - .catch(error => { - // Validation may reveal why the graph couldn't be - // converted so let it run - this.graphToTextConversionCompleted.next(); - return this.validateContent(); - }); - } - else { - this.graphToTextConversionCompleted.next(); - return this.validateContent(); - } - } - initMetamodel() { - this.metamodel.load().then(data => { - this.updateGraphRepresentation(); - let textSyncSubscription = this.graphToTextEventEmitter.pipe(debounceTime(100)).subscribe(() => { - if (this._graphToTextSyncEnabled) { - this.updateTextRepresentation(); - } - }); - this._disposables.add(Disposable.create(() => textSyncSubscription.unsubscribe())); - // Setup content validated event emitter. Emit not validated when graph to text conversion required - let graphValidatedSubscription1 = this.graphToTextEventEmitter.subscribe(() => this.contentValidated.emit(false)); - this._disposables.add(Disposable.create(() => graphValidatedSubscription1.unsubscribe)); - // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); - // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); - let graphSyncSubscription = this.textToGraphEventEmitter.pipe(debounceTime(300)).subscribe(() => this.updateGraphRepresentation()); - this._disposables.add(Disposable.create(() => graphSyncSubscription.unsubscribe())); - // Setup content validated event emitter. Emit not validated when text to graph conversion required - let graphValidatedSubscription2 = this.textToGraphEventEmitter.subscribe(() => this.contentValidated.emit(false)); - this._disposables.add(Disposable.create(() => graphValidatedSubscription2.unsubscribe)); - if (this.editor && this.editor.setDefaultContent) { - this.editor.setDefaultContent(this.editorContext, data); - } - }); - } - initGraph() { - this.graph = new joint.dia.Graph(); - this.graph.set('type', Constants.CANVAS_CONTEXT); - this.graph.set('paperPadding', this.paperPadding); - } - handleNodeCreation(node) { - node.on('change:size', this._resizeHandler); - node.on('change:position', this._resizeHandler); - if (node.attr('metadata')) { - node.on('change:attrs', (cell, attrs, changeData) => { - let propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - let propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (this.renderer && this.renderer.isSemanticProperty && this.renderer.isSemanticProperty(propAttr, node))) { - this.performGraphToTextSyncing(); - } - if (this.renderer && this.renderer.refreshVisuals) { - this.renderer.refreshVisuals(node, propAttr, this.paper); - } - } - }); - } - } - /** - * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples - * are 'change:source', 'change:target'. - */ - handleLinkEvent(event, link) { - if (this.renderer && this.renderer.handleLinkEvent) { - this.renderer.handleLinkEvent(this.editorContext, event, link); - } - } - handleLinkCreation(link) { - this.handleLinkEvent('add', link); - link.on('change:source', (l) => { - this.autosizePaper(); - let newSourceId = l.get('source').id; - let oldSourceId = l.previous('source').id; - if (newSourceId !== oldSourceId) { - this.performGraphToTextSyncing(); - } - this.handleLinkEvent('change:source', l); - }); - link.on('change:target', (l) => { - this.autosizePaper(); - let newTargetId = l.get('target').id; - let oldTargetId = l.previous('target').id; - if (newTargetId !== oldTargetId) { - this.performGraphToTextSyncing(); - } - this.handleLinkEvent('change:target', l); - }); - link.on('change:vertices', this._resizeHandler); - link.on('change:attrs', (cell, attrs, changeData) => { - let propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - let propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (this.renderer && this.renderer.isSemanticProperty && this.renderer.isSemanticProperty(propAttr, link))) { - let sourceId = link.get('source').id; - let targetId = link.get('target').id; - this.performGraphToTextSyncing(); - } - if (this.renderer && this.renderer.refreshVisuals) { - this.renderer.refreshVisuals(link, propAttr, this.paper); - } - } - }); - this.paper.findViewByModel(link).on('link:options', () => this.handleLinkEvent('options', link)); - if (this.readOnlyCanvas) { - link.attr('.link-tools/display', 'none'); - } - } - initGraphListeners() { - this.graph.on('add', (element) => { - if (element instanceof joint.dia.Link) { - this.handleLinkCreation(element); - } - else if (element instanceof joint.dia.Element) { - this.handleNodeCreation(element); - } - if (element.get('type') === joint.shapes.flo.NODE_TYPE || element.get('type') === joint.shapes.flo.LINK_TYPE) { - this.performGraphToTextSyncing(); - } - this.autosizePaper(); - }); - this.graph.on('remove', (element) => { - if (element instanceof joint.dia.Link) { - this.handleLinkEvent('remove', element); - } - if (this.selection && this.selection.model === element) { - this.selection = undefined; - } - if (element.isLink()) { - window.setTimeout(() => this.performGraphToTextSyncing(), 100); - } - else if (element.get('type') === joint.shapes.flo.NODE_TYPE) { - this.performGraphToTextSyncing(); - } - this.autosizePaper(); - }); - // Set if link is fan-routed. Should be called before routing call - this.graph.on('change:vertices', (link, changed, opt) => { - if (opt.fanRouted) { - link.set('fanRouted', true); - } - else { - link.unset('fanRouted'); - } - }); - // adjust vertices when a cell is removed or its source/target was changed - this.graph.on('add remove change:source change:target change:vertices change:position', _.partial(Utils.fanRoute, this.graph)); - } - initPaperListeners() { - // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element - this.paper.on('cell:pointerclick', (cellView) => { - if (!this.readOnlyCanvas) { - this.selection = cellView; - } - }); - this.paper.on('blank:pointerclick', () => { - this.selection = undefined; - }); - this.paper.on('scale', this._resizeHandler); - this.paper.on('all', function () { - if (Utils.isCustomPaperEvent(arguments)) { - arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); - } - }); - this.paper.on('dragging-node-over-canvas', (dndEvent) => { - console.debug(`Canvas DnD type = ${dndEvent.type}`); - let location = this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); - switch (dndEvent.type) { - case Flo.DnDEventType.DRAG: - this.handleNodeDragging(dndEvent.view, this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, Constants.CANVAS_CONTEXT); - break; - case Flo.DnDEventType.DROP: - this.handleNodeDropping(); - break; - default: - break; - } - }); - // JointJS now no longer grabs focus if working in a paper element - crude... - $('#flow-view', this.element.nativeElement).on('mousedown', () => { - $('#palette-filter-textfield', this.element.nativeElement).focus(); - }); - } - initPaper() { - let options = { - el: $('#paper', this.element.nativeElement), - gridSize: this._gridSize, - drawGrid: true, - model: this.graph, - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.shapes.flo.ElementView /*joint.dia.ElementView*/, - linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint.shapes.flo.LinkView, - // Enable link snapping within 25px lookup radius - snapLinks: { radius: 25 }, - defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ (cellView, magnet) => { - if (this.renderer && this.renderer.createLink) { - let linkEnd = { - id: cellView.model.id - }; - if (magnet) { - linkEnd.selector = cellView.getSelector(magnet, undefined); - } - if (magnet.getAttribute('port')) { - linkEnd.port = magnet.getAttribute('port'); - } - if (magnet.getAttribute('port') === 'input') { - return this.renderer.createLink(undefined, linkEnd); - } - else { - return this.renderer.createLink(linkEnd, undefined); - } - } - else { - return new joint.shapes.flo.Link(); - } - }, - // decide whether to create a link if the user clicks a magnet - validateMagnet: (cellView, magnet) => { - if (this.readOnlyCanvas) { - return false; - } - else { - if (this.editor && this.editor.validatePort) { - return this.editor.validatePort(this.editorContext, cellView, magnet); - } - else { - return true; - } - } - }, - interactive: (cellView, event) => { - if (this.readOnlyCanvas) { - return false; - } - else { - if (this.editor && this.editor.interactive) { - if (typeof this.editor.interactive === 'function') { - // Type for interactive is wrong in JointJS have to cast to - return this.editor.interactive(cellView, event); - } - else { - return this.editor.interactive; - } - } - return true; - } - }, - highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { - 'default': { - name: 'addClass', - options: { - className: 'highlighted' - } - } - }, - markAvailable: true - }; - if (this.renderer && this.renderer.getLinkAnchorPoint) { - options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; - } - if (this.editor && this.editor.validateLink) { - const self = this; - options.validateConnection = (cellViewS, magnetS, cellViewT, magnetT, end, linkView) => self.editor.validateLink(this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); - } - // The paper is what will represent the graph on the screen - this.paper = new joint.dia.Paper(options); - this._disposables.add(Disposable.create(() => this.paper.remove())); - } - updatePaletteReadyState(ready) { - this.paletteReady.next(ready); - } -}; -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "metamodel", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "renderer", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "editor", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number) -], EditorComponent.prototype, "paletteSize", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "minZoom", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "maxZoom", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "zoomStep", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "paperPadding", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "floApi", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "validationMarkers", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "contentValidated", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], EditorComponent.prototype, "dslChange", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) -], EditorComponent.prototype, "dsl", null); -EditorComponent = tslib_1.__decorate([ - Component({ - selector: 'flo-editor', - template: ` - -
-
-
- -
- - - -
- -
-
-
- - - - - - - - - - -
- - - - - -
-
- -
-
-
- `, - styles: [` - /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library - - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - /* - A complete list of SVG properties that can be set through CSS is here: - http://www.w3.org/TR/SVG/styling.html - - Important note: Presentation attributes have a lower precedence over CSS style rules. - */ - - - /* .viewport is a node wrapping all diagram elements in the paper */ - .joint-viewport { - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - } - - .joint-paper > svg, - .joint-paper-background, - .joint-paper-grid { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - } - - /* - 1. IE can't handle paths without the \`d\` attribute for bounding box calculation - 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will - break the links rendering. - - path:not([d]) { - display: none; - } - - */ - - - /* magnet is an element that can be either source or a target of a link */ - [magnet=true]:not(.joint-element) { - cursor: crosshair; - } - [magnet=true]:not(.joint-element):hover { - opacity: .7; - } - - /* - - Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class "element basic Rect". - This makes it possible to easilly style elements in CSS and have generic CSS rules applying to - the whole group of elements. Each plugin can provide its own stylesheet. - - */ - - .joint-element { - /* Give the user a hint that he can drag&drop the element. */ - cursor: move; - } - - .joint-element * { - user-drag: none; - } - - .joint-element .scalable * { - /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */ - vector-effect: non-scaling-stroke; - } - /* - - connection-wrap is a element of the joint.dia.Link that follows the .connection of that link. - In other words, the \`d\` attribute of the .connection-wrap contains the same data as the \`d\` attribute of the - .connection . The advantage of using .connection-wrap is to be able to catch pointer events - in the neighborhood of the .connection . This is especially handy if the .connection is - very thin. - - */ - - .marker-source, - .marker-target { - /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */ - vector-effect: non-scaling-stroke; - } - - /* Paper */ - .joint-paper { - position: relative; - } - /* Paper */ - - /* Highlighting */ - .joint-highlight-opacity { - opacity: 0.3; - } - /* Highlighting */ - - /* - - Vertex markers are \`\` elements that appear at connection vertex positions. - - */ - - .joint-link .connection-wrap, - .joint-link .connection { - fill: none; - } - - /* element wrapping .marker-vertex-group. */ - .marker-vertices { - opacity: 0; - cursor: move; - } - .marker-arrowheads { - opacity: 0; - cursor: move; - cursor: -webkit-grab; - cursor: -moz-grab; - /* display: none; */ /* setting \`display: none\` on .marker-arrowheads effectivelly switches of links reconnecting */ - } - .link-tools { - opacity: 0; - cursor: pointer; - } - .link-tools .tool-options { - display: none; /* by default, we don't display link options tool */ - } - .joint-link:hover .marker-vertices, - .joint-link:hover .marker-arrowheads, - .joint-link:hover .link-tools { - opacity: 1; - } - - /* element used to remove a vertex */ - .marker-vertex-remove { - cursor: pointer; - opacity: .1; - } - - .marker-vertex-group:hover .marker-vertex-remove { - opacity: 1; - } - - .marker-vertex-remove-area { - opacity: .1; - cursor: pointer; - } - .marker-vertex-group:hover .marker-vertex-remove-area { - opacity: 1; - } - - /* - Example of custom changes (in pure CSS only!): - - Do not show marker vertices at all: .marker-vertices { display: none; } - Do not allow adding new vertices: .connection-wrap { pointer-events: none; } - */ - - /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */ - .joint-element .fobj { - overflow: hidden; - } - .joint-element .fobj body { - background-color: transparent; - margin: 0px; - position: static; - } - .joint-element .fobj div { - text-align: center; - vertical-align: middle; - display: table-cell; - padding: 0px 5px 0px 5px; - } - - /* Paper */ - .joint-paper.joint-theme-dark { - background-color: #18191b; - } - /* Paper */ - - /* Links */ - .joint-link.joint-theme-dark .connection-wrap { - stroke: #8F8FF3; - stroke-width: 15; - stroke-linecap: round; - stroke-linejoin: round; - opacity: 0; - cursor: move; - } - .joint-link.joint-theme-dark .connection-wrap:hover { - opacity: .4; - stroke-opacity: .4; - } - .joint-link.joint-theme-dark .connection { - stroke-linejoin: round; - } - .joint-link.joint-theme-dark .link-tools .tool-remove circle { - fill: #F33636; - } - .joint-link.joint-theme-dark .link-tools .tool-remove path { - fill: white; - } - .joint-link.joint-theme-dark .link-tools [event="link:options"] circle { - fill: green; - } - /* element inside .marker-vertex-group element */ - .joint-link.joint-theme-dark .marker-vertex { - fill: #5652DB; - } - .joint-link.joint-theme-dark .marker-vertex:hover { - fill: #8E8CE1; - stroke: none; - } - .joint-link.joint-theme-dark .marker-arrowhead { - fill: #5652DB; - } - .joint-link.joint-theme-dark .marker-arrowhead:hover { - fill: #8E8CE1; - stroke: none; - } - /* element used to remove a vertex */ - .joint-link.joint-theme-dark .marker-vertex-remove-area { - fill: green; - stroke: darkgreen; - } - .joint-link.joint-theme-dark .marker-vertex-remove { - fill: white; - stroke: white; - } - /* Links */ - /* Paper */ - .joint-paper.joint-theme-default { - background-color: #FFFFFF; - } - /* Paper */ - - /* Links */ - .joint-link.joint-theme-default .connection-wrap { - stroke: #000000; - stroke-width: 15; - stroke-linecap: round; - stroke-linejoin: round; - opacity: 0; - cursor: move; - } - .joint-link.joint-theme-default .connection-wrap:hover { - opacity: .4; - stroke-opacity: .4; - } - .joint-link.joint-theme-default .connection { - stroke-linejoin: round; - } - .joint-link.joint-theme-default .link-tools .tool-remove circle { - fill: #FF0000; - } - .joint-link.joint-theme-default .link-tools .tool-remove path { - fill: #FFFFFF; - } - - /* element inside .marker-vertex-group element */ - .joint-link.joint-theme-default .marker-vertex { - fill: #1ABC9C; - } - .joint-link.joint-theme-default .marker-vertex:hover { - fill: #34495E; - stroke: none; - } - - .joint-link.joint-theme-default .marker-arrowhead { - fill: #1ABC9C; - } - .joint-link.joint-theme-default .marker-arrowhead:hover { - fill: #F39C12; - stroke: none; - } - - /* element used to remove a vertex */ - .joint-link.joint-theme-default .marker-vertex-remove { - fill: #FFFFFF; - } - /* Links */ - - @font-face { - font-family: 'lato-light'; - src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); - font-weight: normal; - font-style: normal; - } - - /* Links */ - .joint-link.joint-theme-material .connection-wrap { - stroke: #000000; - stroke-width: 15; - stroke-linecap: round; - stroke-linejoin: round; - opacity: 0; - cursor: move; - } - .joint-link.joint-theme-material .connection-wrap:hover { - opacity: .4; - stroke-opacity: .4; - } - .joint-link.joint-theme-material .connection { - stroke-linejoin: round; - } - .joint-link.joint-theme-material .link-tools .tool-remove circle { - fill: #C64242; - } - .joint-link.joint-theme-material .link-tools .tool-remove path { - fill: #FFFFFF; - } - - /* element inside .marker-vertex-group element */ - .joint-link.joint-theme-material .marker-vertex { - fill: #d0d8e8; - } - .joint-link.joint-theme-material .marker-vertex:hover { - fill: #5fa9ee; - stroke: none; - } - - .joint-link.joint-theme-material .marker-arrowhead { - fill: #d0d8e8; - } - .joint-link.joint-theme-material .marker-arrowhead:hover { - fill: #5fa9ee; - stroke: none; - } - - /* element used to remove a vertex */ - .joint-link.joint-theme-material .marker-vertex-remove-area { - fill: #5fa9ee; - } - .joint-link.joint-theme-material .marker-vertex-remove { - fill: white; - } - /* Links */ - - /* Links */ - .joint-link.joint-theme-modern .connection-wrap { - stroke: #000000; - stroke-width: 15; - stroke-linecap: round; - stroke-linejoin: round; - opacity: 0; - cursor: move; - } - .joint-link.joint-theme-modern .connection-wrap:hover { - opacity: .4; - stroke-opacity: .4; - } - .joint-link.joint-theme-modern .connection { - stroke-linejoin: round; - } - .joint-link.joint-theme-modern .link-tools .tool-remove circle { - fill: #FF0000; - } - .joint-link.joint-theme-modern .link-tools .tool-remove path { - fill: #FFFFFF; - } - - /* element inside .marker-vertex-group element */ - .joint-link.joint-theme-modern .marker-vertex { - fill: #1ABC9C; - } - .joint-link.joint-theme-modern .marker-vertex:hover { - fill: #34495E; - stroke: none; - } - - .joint-link.joint-theme-modern .marker-arrowhead { - fill: #1ABC9C; - } - .joint-link.joint-theme-modern .marker-arrowhead:hover { - fill: #F39C12; - stroke: none; - } - - /* element used to remove a vertex */ - .joint-link.joint-theme-modern .marker-vertex-remove { - fill: white; - } - /* Links */ - flo-view { - width:100%; - height:100%; - margin: 0; - background-color: #eeeeee; - font-family: "Varela Round",sans-serif; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - } - - .canvas { - border: 1px solid; - border-color: #6db33f; - border-radius: 2px; - margin-top: 3px; - } - - /* Canvas contains the palette on the left and the paper on the right */ - - .paper { - padding: 0px; - background-color: #ffffff; - /* height: 100%; - width: 100%; - position: relative; - overflow: hidden; - *//* margin-left: 400px; */ - } - - #sidebar-resizer { - background-color: #34302d; - position: absolute; - top: 0; - bottom: 0; - width: 6px; - cursor: e-resize; - } - - #palette-container { - background-color: #EEE; - position: absolute; - top: 0; - bottom: 0; - left: 0; - overflow: auto; - } - - #paper-container { - position: absolute; - top: 0; - bottom: 0; - right: 0; - overflow: auto; - color: #FFF; - background-color: #FFF; - } - - /* Tooltip START */ - - .node-tooltip .tooltip-description { - margin-top: 5px; - margin-left: 0px; - margin-bottom: 5px; - } - - .node-tooltip { - display:none; - position:absolute; - border:1px solid #333; - background-color:#34302d;/*#161616;*/ - border-radius:5px; - padding:5px; - color:#fff; - /* font-size:12px Arial;*/ - font-family: "Varela Round",sans-serif; - font-size: 19px; - z-index: 100; - } - - .tooltip-title-type { - font-size: 24px; - font-weight: bold; - } - - .tooltip-title-group { - padding-left: 5px; - font-size: 20px; - font-style: italic; - } - - .node-tooltip-option-name { - font-family: monospace;/*"Varela Round",sans-serif;*/ - font-size: 17px; - font-weight: bold; - padding-right: 20px; - - } - - .node-tooltip-option-description { - font-family: "Varela Round",sans-serif; - font-size: 18px; - } - - /* Tooltip END */ - - - /* Validation Error Marker on Canvas START */ - - .error-tooltip p { - margin-top: 5px; - margin-left: 0px; - margin-bottom: 5px; - color:#fff; - } - .error-tooltip { - display:none; - position:absolute; - border:1px solid #333; - background-color:red;/*#161616;*/ - border-radius:5px; - padding:5px; - color:#fff; - /* font-size:12px Arial;*/ - font-family: "Varela Round",sans-serif; - font-size: 20px; - z-index: 100; - } - - /* Validation Error Marker on Canvas END */ - - /* Controls on Canvas START */ - - .canvas-controls-container { - position: absolute; - right: 15px; - top: 5px; - } - - .canvas-control { - background: transparent; - font-family: "Varela Round",sans-serif; - font-size: 11px; - vertical-align: middle; - margin: 0px; - } - - .zoom-canvas-control { - border: 0px; - padding: 0px; - margin: 0px; - outline: none; - } - - .zoom-canvas-input { - text-align: right; - font-weight:bold; - color: black; - background-color: transparent; - } - - .zoom-canvas-label { - padding-right: 4px; - color: black; - } - - /* Controls on Canvas END */ - - - - - /* START - FLO CANVAS STYLES - override joint js styles */ - - .highlighted { - outline: none; - } - - .joint-element.highlighted rect { - stroke: #34302d; - stroke-width: 3; - } - - .joint-type-handle { - cursor: pointer; - } - - .available-magnet { - stroke-width: 3; - } - - .link { - fill: none; - stroke: #ccc; - stroke-width: 1.5px; - } - - .link-tools .tool-options { - display: none; /* by default, we don't display link options tool */ - } - - /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */ - .link-tools .tool-options circle { - fill: transparent; - stroke: transparent; - } - - .link-tools .tool-options path { - fill: black; - stroke: black; - } - - .link-tools .tool-remove circle { - fill: red; - stroke: red; - } - - .link-tools .tool-remove path { - fill: white; - stroke: white; - } - - .link-tools-container { - stroke-width: 0; - fill: transparent; - } - - /* END - FLO CANVAS STYLES */ - `], - encapsulation: ViewEncapsulation.None - }), - tslib_1.__metadata("design:paramtypes", [ElementRef]) -], EditorComponent); -export { EditorComponent }; -//# sourceMappingURL=editor.component.js.map \ No newline at end of file diff --git a/dist/esm2015/index.js b/dist/esm2015/index.js deleted file mode 100644 index e50ba34..0000000 --- a/dist/esm2015/index.js +++ /dev/null @@ -1,12 +0,0 @@ -export { FloModule } from './module'; -export { Palette } from './palette/palette.component'; -export { EditorComponent } from './editor/editor.component'; -export { DslEditorComponent } from './dsl-editor/dsl-editor.component'; -export { CodeEditorComponent } from './code-editor/code-editor.component'; -export { PropertiesGroupComponent } from './properties/properties.group.component'; -export { DynamicFormPropertyComponent } from './properties/df.property.component'; -export { ResizerDirective } from './directives/resizer'; -export * from './shared/flo-common'; -export * from './shared/flo-properties'; -export * from './shared/shapes'; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/esm2015/module.js b/dist/esm2015/module.js deleted file mode 100644 index 07cf0b0..0000000 --- a/dist/esm2015/module.js +++ /dev/null @@ -1,39 +0,0 @@ -import * as tslib_1 from "tslib"; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { Palette } from './palette/palette.component'; -import { EditorComponent } from './editor/editor.component'; -import { ResizerDirective } from './directives/resizer'; -import { DslEditorComponent } from './dsl-editor/dsl-editor.component'; -import { CodeEditorComponent } from './code-editor/code-editor.component'; -import { PropertiesGroupComponent } from './properties/properties.group.component'; -import { DynamicFormPropertyComponent } from './properties/df.property.component'; -let FloModule = class FloModule { -}; -FloModule = tslib_1.__decorate([ - NgModule({ - imports: [ - FormsModule, - CommonModule, - ReactiveFormsModule - ], - declarations: [ - Palette, - EditorComponent, - ResizerDirective, - DslEditorComponent, - CodeEditorComponent, - PropertiesGroupComponent, - DynamicFormPropertyComponent - ], - exports: [ - EditorComponent, - DslEditorComponent, - DynamicFormPropertyComponent, - PropertiesGroupComponent - ] - }) -], FloModule); -export { FloModule }; -//# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/dist/esm2015/palette/palette.component.js b/dist/esm2015/palette/palette.component.js deleted file mode 100644 index d66a10d..0000000 --- a/dist/esm2015/palette/palette.component.js +++ /dev/null @@ -1,511 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, ElementRef, Input, Output, EventEmitter, Inject, ViewEncapsulation } from '@angular/core'; -import { Subject } from 'rxjs'; -import { debounceTime } from 'rxjs/operators'; -import { dia } from 'jointjs'; -import { Flo } from '../shared/flo-common'; -import { Shapes, Constants } from '../shared/shapes'; -import { DOCUMENT } from '@angular/platform-browser'; -import * as _$ from 'jquery'; -const joint = Flo.joint; -const $ = _$; -const DEBOUNCE_TIME = 300; -joint.shapes.flo.PaletteGroupHeader = joint.shapes.basic.Generic.extend({ - // The path is the open/close arrow, defaults to vertical (open) - markup: '', - defaults: joint.util.deepSupplement({ - type: 'palette.groupheader', - size: { width: 170, height: 30 }, - position: { x: 0, y: 0 }, - attrs: { - 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, - 'text': { - text: '', - fill: '#eeeeee', - 'ref-x': 0.5, - 'ref-y': 7, - 'x-alignment': 'middle', - 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ - }, - 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } - }, - // custom properties - isOpen: true - }, joint.shapes.basic.Generic.prototype.defaults) -}); -let Palette = class Palette { - constructor(element, document) { - this.element = element; - this.document = document; - this._metamodelListener = { - metadataError: (data) => { }, - metadataAboutToChange: () => { }, - metadataChanged: () => this.rebuildPalette() - }; - this.initialized = false; - this._filterText = ''; - this.filterTextModel = new Subject(); - this.paletteEntryPadding = { width: 12, height: 12 }; - this.onPaletteEntryDrop = new EventEmitter(); - this.paletteReady = new EventEmitter(); - this.paletteFocus = new EventEmitter(); - this.mouseMoveHanlder = (e) => this.handleDrag(e); - this.mouseUpHanlder = (e) => this.handleMouseUp(e); - this.paletteGraph = new joint.dia.Graph(); - this.paletteGraph.set('type', Constants.PALETTE_CONTEXT); - this._filterText = ''; - this.closedGroups = new Set(); - } - set paletteSize(size) { - console.debug('Palette Size: ' + size); - if (this._paletteSize !== size) { - this._paletteSize = size; - this.rebuildPalette(); - } - } - onFocus() { - this.paletteFocus.emit(); - } - ngOnInit() { - let element = $('#palette-paper', this.element.nativeElement); - // Create the paper for the palette using the specified element view - this.palette = new joint.dia.Paper({ - el: element, - gridSize: 1, - model: this.paletteGraph, - height: $(this.element.nativeElement.parentNode).height(), - width: $(this.element.nativeElement.parentNode).width(), - elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.dia.ElementView), - interactive: false - }); - this.palette.on('cell:pointerup', (cellview, evt) => { - if (this.viewBeingDragged) { - this.trigger({ - type: Flo.DnDEventType.DROP, - view: this.viewBeingDragged, - event: evt - }); - this.viewBeingDragged = undefined; - } - this.clickedElement = undefined; - $('#palette-floater').remove(); - if (this.floaterpaper) { - this.floaterpaper.remove(); - } - }); - // Toggle the header open/closed on a click - this.palette.on('cell:pointerclick', (cellview, event) => { - // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? - // Click position within the element would be: evt.offsetX, evt.offsetY - const cell = cellview.model; - if (cell.attributes.header) { - // Toggle the header open/closed - if (cell.get('isOpen')) { - this.rotateClosed(cell); - } - else { - this.rotateOpen(cell); - } - } - // TODO [palette] ensure other mouse handling events do nothing for headers - // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) - }); - $(this.document).on('mouseup', this.mouseUpHanlder); - if (this.metamodel) { - this.metamodel.load().then(data => { - this.buildPalette(data); - // Add listener to metamodel - if (this.metamodel && this.metamodel.subscribe) { - this.metamodel.subscribe(this._metamodelListener); - } - // Add debounced listener to filter text changes - this.filterTextModel - .pipe(debounceTime(DEBOUNCE_TIME)) - .subscribe((value) => this.rebuildPalette()); - this.initialized = true; - }); - } - else { - console.error('No Metamodel service specified for palette!'); - } - this._paletteSize = this._paletteSize || $(this.element.nativeElement.parentNode).width(); - } - ngOnDestroy() { - if (this.metamodel && this.metamodel.unsubscribe) { - this.metamodel.unsubscribe(this._metamodelListener); - } - $(this.document).off('mouseup', this.mouseUpHanlder); - this.palette.remove(); - } - ngOnChanges(changes) { - // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { - // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); - // } - } - createPaletteGroup(title, isOpen) { - let newGroupHeader = new joint.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); - newGroupHeader.set('header', title); - if (!isOpen) { - newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); - newGroupHeader.set('isOpen', false); - } - this.paletteGraph.addCell(newGroupHeader); - return newGroupHeader; - } - createPaletteEntry(title, metadata) { - return Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.palette, - metadata: metadata - }); - } - buildPalette(metamodel) { - let startTime = new Date().getTime(); - this.paletteReady.emit(false); - this.paletteGraph.clear(); - let filterText = this.filterText; - if (filterText) { - filterText = filterText.toLowerCase(); - } - let paletteNodes = []; - let groupAdded = new Set(); - let parentWidth = this._paletteSize; - console.debug(`Parent Width: ${parentWidth}`); - // The field closedGroups tells us which should not be shown - // Work out the list of active groups/nodes based on the filter text - this.metamodel.groups().forEach(group => { - if (metamodel && metamodel.has(group)) { - Array.from(metamodel.get(group).keys()).sort().forEach(name => { - let node = metamodel.get(group).get(name); - if (node) { - let nodeActive = !(node.metadata && node.metadata.noPaletteEntry); - if (nodeActive && filterText) { - nodeActive = false; - if (name.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - else if (group.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { - // nodeActive = true; - // } - // else if (node.properties) { - // Object.keys(node.properties).sort().forEach(function(propertyName) { - // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || - // (node.properties[propertyName].description && - // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { - // nodeActive=true; - // } - // }); - // } - } - if (nodeActive) { - if (!groupAdded.has(group)) { - let header = this.createPaletteGroup(group, !this.closedGroups.has(group)); - header.set('size', { width: parentWidth, height: 30 }); - paletteNodes.push(header); - groupAdded.add(group); - } - if (!this.closedGroups.has(group)) { - paletteNodes.push(this.createPaletteEntry(name, node)); - } - } - } - }); - } - }); - let cellWidth = 0, cellHeight = 0; - // Determine the size of the palette entry cell (width and height) - paletteNodes.forEach(pnode => { - if (pnode.attr('metadata/name')) { - let dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (cellWidth < dimension.width) { - cellWidth = dimension.width; - } - if (cellHeight < dimension.height) { - cellHeight = dimension.height; - } - } - }); - // Adjust the palette entry cell size with paddings. - cellWidth += 2 * this.paletteEntryPadding.width; - cellHeight += 2 * this.paletteEntryPadding.height; - // Align palette entries row to be at the center - let startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; - let xpos = startX; - let ypos = 0; - let prevNode; - // Layout palette entry nodes - paletteNodes.forEach(pnode => { - let dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (pnode.get('header')) { //attributes.attrs.header) { - // Palette entry header - xpos = startX; - pnode.set('position', { x: 0, y: ypos }); - ypos += dimension.height + 5; - } - else { - // Palette entry element - if (xpos + cellWidth > parentWidth) { - // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line - xpos = startX; - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - else { - // Enough real estate to place entry in a row - adjust y position - if (prevNode && prevNode.attr('metadata/name')) { - ypos -= cellHeight; - } - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - // increment x position and y position (can be reorganized) - xpos += cellWidth; - ypos += cellHeight; - } - prevNode = pnode; - }); - this.palette.setDimensions(parentWidth, ypos); - this.paletteReady.emit(true); - console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); - } - rebuildPalette() { - if (this.initialized && this.metamodel) { - this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); - } - } - set filterText(text) { - if (this._filterText !== text) { - this._filterText = text; - this.filterTextModel.next(text); - } - } - get filterText() { - return this._filterText; - } - getPaletteView(view) { - let self = this; - return view.extend({ - pointerdown: function ( /*evt, x, y*/) { - // Remove the tooltip - // $('.node-tooltip').remove(); - // TODO move metadata to the right place (not inside attrs I think) - self.clickedElement = this.model; - if (self.clickedElement && self.clickedElement.attr('metadata')) { - $(self.document).on('mousemove', self.mouseMoveHanlder); - } - }, - pointermove: function ( /*evt, x, y*/) { - // Nothing to prevent move within the palette canvas - }, - }); - } - handleMouseUp(event) { - $(this.document).off('mousemove', this.mouseMoveHanlder); - } - trigger(event) { - this.onPaletteEntryDrop.emit(event); - } - handleDrag(event) { - // TODO offsetX/Y not on firefox - // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); - // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); - if (this.clickedElement && this.clickedElement.attr('metadata')) { - if (!this.viewBeingDragged) { - let dataOfClickedElement = this.clickedElement.attr('metadata'); - // custom div if not already built. - $('
', { - id: 'palette-floater' - }).appendTo($('body')); - let floatergraph = new joint.dia.Graph(); - floatergraph.set('type', Constants.FEEDBACK_CONTEXT); - const parent = $('#palette-floater'); - this.floaterpaper = new joint.dia.Paper({ - el: $('#palette-floater'), - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.dia.ElementView, - gridSize: 10, - model: floatergraph, - height: parent.height(), - width: parent.width(), - validateMagnet: () => false, - validateConnection: () => false - }); - // TODO float thing needs to be bigger otherwise icon label is missing - // Initiative drag and drop - create draggable element - let floaternode = Shapes.Factory.createNode({ - 'renderer': this.renderer, - 'paper': this.floaterpaper, - 'graph': floatergraph, - 'metadata': dataOfClickedElement - }); - // Only node view expected - let box = this.floaterpaper.findViewByModel(floaternode).getBBox(); - let size = floaternode.get('size'); - // Account for node real size including ports - floaternode.translate(box.width - size.width, box.height - size.height); - this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); - $('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - } - else { - $('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - this.trigger({ - type: Flo.DnDEventType.DRAG, - view: this.viewBeingDragged, - event: event - }); - } - } - } - /* - * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) - */ - rotateOpen(element) { - setTimeout(() => this.doRotateOpen(element, 90)); - } - doRotateOpen(element, angle) { - angle -= 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle <= 0) { - element.set('isOpen', true); - this.closedGroups.delete(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(() => this.doRotateOpen(element, angle), 10); - } - } - doRotateClose(element, angle) { - angle += 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle >= 90) { - element.set('isOpen', false); - this.closedGroups.add(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(() => this.doRotateClose(element, angle), 10); - } - } - // TODO better name for this function as this does the animation *and* updates the palette - /* - * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) - */ - rotateClosed(element) { - setTimeout(() => this.doRotateClose(element, 0)); - } -}; -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], Palette.prototype, "metamodel", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], Palette.prototype, "renderer", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], Palette.prototype, "paletteEntryPadding", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], Palette.prototype, "onPaletteEntryDrop", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], Palette.prototype, "paletteReady", void 0); -tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) -], Palette.prototype, "paletteFocus", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number), - tslib_1.__metadata("design:paramtypes", [Number]) -], Palette.prototype, "paletteSize", null); -Palette = tslib_1.__decorate([ - Component({ - selector: 'flo-palette', - template: ` -
- -
-
-
-
- `, - styles: [` - /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */ - - #palette-floater { - /* TODO size relative to paper that goes on it? */ - opacity: 0.75; - width:170px; - height:60px; - background-color: transparent; - /* - background-color: #6db33f; - */ - float:left; - position: absolute; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - } - - #palette-floater.joint-paper > svg { - background-color: transparent; - } - - #palette-paper-container { - overflow-y: auto; - overflow-x: hidden; - background-color: white; - color: white; - } - - /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */ - - /* Palette START */ - - .palette-filter { - border: 3px solid #6db33f; - } - - .palette-filter-textfield { - width: 100%; - font-size:24px; - /* border: 3px solid #6db33f; - */ font-family: "Varela Round",sans-serif; - /* padding: 2px; */ - } - - .palette-paper { - background-color: #eeeeee; - /* - border-right: 7px solid; - */ - border-color: #6db33f; - /* width: 170px; - height:100%; - float: left; - */ - } - - /* Palette END */ - `], - encapsulation: ViewEncapsulation.None - }), - tslib_1.__param(1, Inject(DOCUMENT)), - tslib_1.__metadata("design:paramtypes", [ElementRef, Object]) -], Palette); -export { Palette }; -//# sourceMappingURL=palette.component.js.map \ No newline at end of file diff --git a/dist/esm2015/properties/df.property.component.js b/dist/esm2015/properties/df.property.component.js deleted file mode 100644 index ccd6811..0000000 --- a/dist/esm2015/properties/df.property.component.js +++ /dev/null @@ -1,82 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, Input, ViewEncapsulation } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { Properties } from '../shared/flo-properties'; -let DynamicFormPropertyComponent = class DynamicFormPropertyComponent { - constructor() { } - get types() { - return Properties.InputType; - } - get control() { - return this.form.controls[this.model.id]; - } - get errorData() { - return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) - .filter(e => this.control.errors && this.control.errors[e.id]); - } -}; -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) -], DynamicFormPropertyComponent.prototype, "model", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", FormGroup) -], DynamicFormPropertyComponent.prototype, "form", void 0); -DynamicFormPropertyComponent = tslib_1.__decorate([ - Component({ - selector: 'df-property', - template: ` - - - - - - - -
- - - - - - - - - - - - - - - - - -
-
-
{{model.description}}
-
{{e.message}}
-
- - - - `, - encapsulation: ViewEncapsulation.None - }), - tslib_1.__metadata("design:paramtypes", []) -], DynamicFormPropertyComponent); -export { DynamicFormPropertyComponent }; -//# sourceMappingURL=df.property.component.js.map \ No newline at end of file diff --git a/dist/esm2015/properties/properties.group.component.js b/dist/esm2015/properties/properties.group.component.js deleted file mode 100644 index 28395ea..0000000 --- a/dist/esm2015/properties/properties.group.component.js +++ /dev/null @@ -1,50 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, Input, ViewEncapsulation } from '@angular/core'; -import { FormGroup, FormControl } from '@angular/forms'; -import { Properties } from '../shared/flo-properties'; -let PropertiesGroupComponent = class PropertiesGroupComponent { - ngOnInit() { - if (this.propertiesGroupModel.isLoading) { - let subscription = this.propertiesGroupModel.loadedSubject.subscribe(loaded => { - if (loaded) { - subscription.unsubscribe(); - this.createGroupControls(); - } - }); - } - else { - this.createGroupControls(); - } - } - createGroupControls() { - this.propertiesGroupModel.getControlsModels().forEach(c => { - if (c.validation) { - this.form.addControl(c.id, new FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); - } - else { - this.form.addControl(c.id, new FormControl(c.value || '')); - } - }); - } -}; -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Properties.PropertiesGroupModel) -], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); -tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", FormGroup) -], PropertiesGroupComponent.prototype, "form", void 0); -PropertiesGroupComponent = tslib_1.__decorate([ - Component({ - selector: 'properties-group', - template: ` -
- -
- `, - encapsulation: ViewEncapsulation.None - }) -], PropertiesGroupComponent); -export { PropertiesGroupComponent }; -//# sourceMappingURL=properties.group.component.js.map \ No newline at end of file diff --git a/dist/esm2015/shared/flo-common.js b/dist/esm2015/shared/flo-common.js deleted file mode 100644 index 945ef9e..0000000 --- a/dist/esm2015/shared/flo-common.js +++ /dev/null @@ -1,57 +0,0 @@ -import * as _joint from 'jointjs'; -import * as _$ from 'jquery'; -const $ = _$; -export var Flo; -(function (Flo) { - Flo.joint = _joint; - let DnDEventType; - (function (DnDEventType) { - DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; - DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; - })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); - let Severity; - (function (Severity) { - Severity[Severity["Error"] = 0] = "Error"; - Severity[Severity["Warning"] = 1] = "Warning"; - })(Severity = Flo.Severity || (Flo.Severity = {})); - function findMagnetByClass(view, className) { - if (className && className.startsWith('.')) { - className = className.substr(1); - } - const element = view.$('[magnet]').toArray().find((magnet) => magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByClass = findMagnetByClass; - function findMagnetByPort(view, port) { - const element = view.$('[magnet]').toArray().find((magnet) => magnet.getAttribute('port') === port); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByPort = findMagnetByPort; - /** - * Return the metadata for a particular palette entry in a particular group. - * @param name - name of the palette entry - * @param group - group in which the palette entry should exist (e.g. sinks) - * @return - */ - function getMetadata(metamodel, name, group) { - const groupObj = metamodel && group ? metamodel.get(group) : undefined; - if (name && groupObj && groupObj.get(name)) { - return metamodel.get(group).get(name); - } - else { - return { - name: name, - group: group, - unresolved: true, - get: (property) => new Promise(resolve => resolve()), - properties: () => Promise.resolve(new Map()) - }; - } - } - Flo.getMetadata = getMetadata; -})(Flo || (Flo = {})); -//# sourceMappingURL=flo-common.js.map \ No newline at end of file diff --git a/dist/esm2015/shared/flo-properties.js b/dist/esm2015/shared/flo-properties.js deleted file mode 100644 index 9d77cbe..0000000 --- a/dist/esm2015/shared/flo-properties.js +++ /dev/null @@ -1,273 +0,0 @@ -import { Subject, Observable } from 'rxjs'; -import { debounceTime, mergeMap } from 'rxjs/operators'; -export var Properties; -(function (Properties) { - let InputType; - (function (InputType) { - InputType[InputType["TEXT"] = 0] = "TEXT"; - InputType[InputType["NUMBER"] = 1] = "NUMBER"; - InputType[InputType["SELECT"] = 2] = "SELECT"; - InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; - InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; - InputType[InputType["EMAIL"] = 5] = "EMAIL"; - InputType[InputType["URL"] = 6] = "URL"; - InputType[InputType["CODE"] = 7] = "CODE"; - })(InputType = Properties.InputType || (Properties.InputType = {})); - class GenericControlModel { - constructor(_property, type, validation) { - this._property = _property; - this.type = type; - this.validation = validation; - } - get id() { - return this.property.id; - } - get name() { - return this.property.name; - } - get description() { - return this.property.description; - } - get defaultValue() { - return this.property.defaultValue; - } - get value() { - return this.getValue(); - } - set value(value) { - this.setValue(value); - } - get property() { - return this._property; - } - setValue(value) { - this.property.value = value; - } - getValue() { - return this.property.value; - } - } - Properties.GenericControlModel = GenericControlModel; - class CheckBoxControlModel extends GenericControlModel { - constructor(_property, validation) { - super(_property, InputType.CHECKBOX, validation); - } - getValue() { - const res = super.getValue(); - const type = typeof res; - switch (type) { - case 'boolean': - return res; - case 'string': - switch (res.trim().toLowerCase()) { - case 'true': - case '1': - return true; - case 'false': - case '0': - return false; - default: - return this.property.defaultValue; - } - case 'number': - const num = res; - if (num === 0) { - return false; - } - else if (num === 1) { - return true; - } - else { - return this.property.defaultValue; - } - } - return this.property.defaultValue; - } - } - Properties.CheckBoxControlModel = CheckBoxControlModel; - class AbstractCodeControlModel extends GenericControlModel { - constructor(_property, encode, decode, validation) { - super(_property, InputType.CODE, validation); - this.encode = encode; - this.decode = decode; - } - set value(value) { - if (value && this.encode) { - super.setValue(this.encode(value)); - } - else { - super.setValue(value); - } - } - get value() { - let dsl = super.getValue(); - if (dsl && this.decode) { - return this.decode(dsl); - } - else { - return dsl; - } - } - } - Properties.AbstractCodeControlModel = AbstractCodeControlModel; - class GenericCodeControlModel extends AbstractCodeControlModel { - constructor(_property, language, encode, decode, validation) { - super(_property, encode, decode, validation); - this.language = language; - } - } - Properties.GenericCodeControlModel = GenericCodeControlModel; - class CodeControlModelWithDynamicLanguageProperty extends AbstractCodeControlModel { - constructor(_property, _languagePropertyName, _groupModel, encode, decode, validation) { - super(_property, encode, decode, validation); - this._languagePropertyName = _languagePropertyName; - this._groupModel = _groupModel; - } - get language() { - const value = this.languageControlModel.value; - return value ? value : this.languageControlModel.defaultValue; - } - get languageControlModel() { - if (!this._langControlModel) { - // Cast to Properties.ControlModel from Properties.ControlModel | undefined - // Should not be undefined! - this._langControlModel = this._groupModel.getControlsModels().find(c => c.id === this._languagePropertyName); - } - return this._langControlModel; - } - } - Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; - class GenericListControlModel extends GenericControlModel { - constructor(property, validation) { - super(property, InputType.TEXT, validation); - } - get value() { - return this.property.value ? this.property.value.join(', ') : ''; - } - set value(value) { - this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; - } - } - Properties.GenericListControlModel = GenericListControlModel; - class SelectControlModel extends GenericControlModel { - constructor(_property, type, options) { - super(_property, type); - this.options = options; - if (_property.defaultValue === undefined) { - options.unshift({ - name: 'SELECT', - value: _property.defaultValue - }); - } - } - } - Properties.SelectControlModel = SelectControlModel; - class DefaultCellPropertiesSource { - constructor(cell) { - this.cell = cell; - } - getProperties() { - let metadata = this.cell.attr('metadata'); - return Promise.resolve(metadata.properties().then(propsMetadata => Array.from(propsMetadata.values()).map(m => this.createProperty(m)))); - } - createProperty(metadata) { - return { - id: metadata.id, - name: metadata.name, - type: metadata.type, - defaultValue: metadata.defaultValue, - attr: `props/${metadata.name}`, - value: this.cell.attr(`props/${metadata.name}`), - description: metadata.description, - valueOptions: metadata.options - }; - } - applyChanges(properties) { - this.cell.trigger('batch:start', { batchName: 'update properties' }); - properties.forEach(property => { - if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || - (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { - let currentValue = this.cell.attr(property.attr); - if (currentValue !== undefined && currentValue !== null) { - // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync - this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); - this.cell.removeAttr(property.attr); - } - } - else { - this.cell.attr(property.attr, property.value); - } - }); - this.cell.trigger('batch:stop', { batchName: 'update properties' }); - } - } - Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; - class PropertiesGroupModel { - constructor(propertiesSource) { - this.loading = true; - this.propertiesSource = propertiesSource; - } - load() { - this.loading = true; - this._loadedSubject = new Subject(); - this.propertiesSource.getProperties().then(properties => { - this.controlModels = properties.map(p => this.createControlModel(p)); - this.loading = false; - this._loadedSubject.next(true); - this._loadedSubject.complete(); - }); - } - get isLoading() { - return this.loading; - } - get loadedSubject() { - return this._loadedSubject; - } - getControlsModels() { - return this.controlModels; - } - createControlModel(property) { - return new GenericControlModel(property, InputType.TEXT); - } - applyChanges() { - if (this.loading) { - return; - } - let properties = this.controlModels.map(cm => cm.property); - this.propertiesSource.applyChanges(properties); - } - } - Properties.PropertiesGroupModel = PropertiesGroupModel; - let Validators; - (function (Validators) { - function uniqueResource(service, debounce) { - return (control) => { - return new Observable(obs => { - if (control.valueChanges && control.value) { - control.valueChanges - .pipe(debounceTime(debounce), mergeMap(value => service(value))) - .subscribe(() => { - obs.next({ uniqueResource: true }); - obs.complete(); - }, () => { - obs.next(undefined); - obs.complete(); - }); - } - else { - obs.next(undefined); - obs.complete(); - } - }); - }; - } - Validators.uniqueResource = uniqueResource; - function noneOf(excluded) { - return (control) => { - return excluded.find(e => e === control.value) ? { 'noneOf': { value: control.value } } : {}; - }; - } - Validators.noneOf = noneOf; - })(Validators = Properties.Validators || (Properties.Validators = {})); -})(Properties || (Properties = {})); -//# sourceMappingURL=flo-properties.js.map \ No newline at end of file diff --git a/dist/esm2015/shared/shapes.js b/dist/esm2015/shared/shapes.js deleted file mode 100644 index 7ad599b..0000000 --- a/dist/esm2015/shared/shapes.js +++ /dev/null @@ -1,494 +0,0 @@ -import { Flo } from './flo-common'; -import * as _ from 'lodash'; -import * as _$ from 'jquery'; -const joint = Flo.joint; -const $ = _$; -const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); -const isFF = navigator.userAgent.indexOf('Firefox') > 0; -const IMAGE_W = 120; -const IMAGE_H = 35; -const ERROR_MARKER_SIZE = { width: 16, height: 16 }; -const HANDLE_SIZE = { width: 10, height: 10 }; -joint.shapes.flo = {}; -joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; -joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; -joint.shapes.flo.DECORATION_TYPE = 'decoration'; -joint.shapes.flo.HANDLE_TYPE = 'handle'; -const HANDLE_ICON_MAP = new Map(); -const REMOVE = 'remove'; -HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); -const DECORATION_ICON_MAP = new Map(); -const ERROR = 'error'; -DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); -joint.util.cloneDeep = (obj) => { - return _.cloneDeepWith(obj, (o) => { - if (_.isObject(o) && !_.isPlainObject(o)) { - return o; - } - }); -}; -joint.util.filter.redscale = (args) => { - let amount = Number.isFinite(args.amount) ? args.amount : 1; - return _.template('', { - a: 1 - 0.96 * amount, - b: 0.95 * amount, - c: 0.01 * amount, - d: 0.3 * amount, - e: 0.2 * amount, - f: 1 - 0.9 * amount, - g: 0.7 * amount, - h: 0.05 * amount, - i: 0.05 * amount, - k: 1 - 0.1 * amount - }); -}; -joint.util.filter.orangescale = (args) => { - let amount = Number.isFinite(args.amount) ? args.amount : 1; - return _.template('', { - a: 1.0 + 0.5 * amount, - b: 1.4 * amount, - c: 0.2 * amount, - d: 0.3 * amount, - e: 0.3 * amount, - f: 1 + 0.05 * amount, - g: 0.2 * amount, - h: 0.15 * amount, - i: 0.3 * amount, - k: 0.3 * amount, - l: 1 - 0.6 * amount - }); -}; -joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ - markup: '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.NODE_TYPE, - position: { x: 0, y: 0 }, - size: { width: IMAGE_W, height: IMAGE_H }, - attrs: { - '.': { magnet: false }, - // rounded edges around image - '.border': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - 'fill-opacity': 0, - stroke: '#eeeeee', - 'stroke-width': 0 - }, - '.box': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - //'fill-opacity': 0, // see through - stroke: '#6db33f', - fill: '#eeeeee', - 'stroke-width': 1 - }, - '.input-port': { - port: 'input', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.output-port': { - port: 'output', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.label': { - 'text-anchor': 'middle', - 'ref-x': 0.5, - // 'ref-y': -12, // jointjs specific: relative position to ref'd element - 'ref-y': 0.3, - ref: '.border', - fill: 'black', - 'font-size': 14 - }, - '.label2': { - 'text': '\u21d2', - 'text-anchor': 'middle', - 'ref-x': 0.15, - 'ref-y': 0.2, - ref: '.border', - // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', - fill: 'black', - 'font-size': 24 - }, - '.shape': {}, - '.image': { - width: IMAGE_W, - height: IMAGE_H - } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); -joint.shapes.flo.Link = joint.dia.Link.extend({ - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.LINK_TYPE, - attrs: { - '.connection': { stroke: '#34302d', 'stroke-width': 2 }, - // Lots of alternatives that have been played with: - // '.smoooth': true - // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, - // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, - // '.connection': { 'stroke':'black'}, - // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, - // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, - // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) - // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, - // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, - // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, - // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, - '.marker-arrowheads': { display: 'none' }, - '.tool-options': { display: 'none' } - }, - }, joint.dia.Link.prototype.defaults) -}); -joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ - options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), - _beforeArrowheadMove: function () { - if (this.model.get('source').id) { - this._oldSource = this.model.get('source'); - } - if (this.model.get('target').id) { - this._oldTarget = this.model.get('target'); - } - joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); - }, - _afterArrowheadMove: function () { - joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); - if (!this.model.get('source').id) { - if (this._oldSource) { - this.model.set('source', this._oldSource); - } - else { - this.model.remove(); - } - } - if (!this.model.get('target').id) { - if (this._oldTarget) { - this.model.set('target', this._oldTarget); - } - else { - this.model.remove(); - } - } - delete this._oldSource; - delete this._oldTarget; - } -}); -// TODO: must do cleanup for the `mainElementView' -joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ - // canShowTooltip: true, - beingDragged: false, - // _tempZorder: 0, - _tempOpacity: 1.0, - _hovering: false, - dragLinkStart: function (evt, magnet, x, y) { - this.model.startBatch('add-link'); - const linkView = this.addLinkFromMagnet(magnet, x, y); - // backwards compatiblity events - joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); - linkView.notify('link:pointerdown', evt, x, y); - /*** START MAIN DIFF ***/ - const sourceOrTarget = $(magnet).attr('port') === 'input' ? 'source' : 'target'; - linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); - /*** END MAIN DIFF ***/ - this.eventData(evt, { linkView: linkView }); - }, - addLinkFromMagnet: function (magnet, x, y) { - const paper = this.paper; - const graph = paper.model; - const link = paper.getDefaultLink(this, magnet); - let sourceEnd, targetEnd; - /*** START MAIN DIFF ***/ - if ($(magnet).attr('port') === 'input') { - sourceEnd = { x: x, y: y }; - targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); - } - else { - sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); - targetEnd = { x: x, y: y }; - } - /*** END MAIN DIFF ***/ - link.set({ - source: sourceEnd, - target: targetEnd - }).addTo(graph, { - async: false, - ui: true - }); - return link.findView(paper); - }, - // pointerdown: function(evt: any, x: number, y: number) { - // // this.canShowTooltip = false; - // // this.hideTooltip(); - // this.beingDragged = false; - // this._tempOpacity = this.model.attr('./opacity'); - // - // this.model.trigger('batch:start'); - // - // if ( // target is a valid magnet start linking - // evt.target.getAttribute('magnet') && - // this.paper.options.validateMagnet.call(this.paper, this, evt.target) - // ) { - // let link = this.paper.getDefaultLink(this, evt.target); - // if ($(evt.target).attr('port') === 'input') { - // link.set({ - // source: { x: x, y: y }, - // target: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // } - // }); - // } else { - // link.set({ - // source: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // }, - // target: { x: x, y: y } - // }); - // } - // this.paper.model.addCell(link); - // this._linkView = this.paper.findViewByModel(link); - // if ($(evt.target).attr('port') === 'input') { - // this._linkView.startArrowheadMove('source'); - // } else { - // this._linkView.startArrowheadMove('target'); - // } - // this.paper.__creatingLinkFromPort = true; - // } else { - // this._dx = x; - // this._dy = y; - // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); - // } - // }, - drag: function (evt, x, y) { - let interactive = _.isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : - this.options.interactive; - if (interactive !== false) { - this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DRAG, view: this, event: evt }); - } - joint.dia.ElementView.prototype.drag.apply(this, arguments); - }, - dragEnd: function (evt, x, y) { - this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DROP, view: this, event: evt }); - joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); - }, -}); -joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ - markup: '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.DECORATION_TYPE, - size: ERROR_MARKER_SIZE, - attrs: { - 'image': ERROR_MARKER_SIZE - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); -export var Constants; -(function (Constants) { - Constants.REMOVE_HANDLE_TYPE = REMOVE; - Constants.PROPERTIES_HANDLE_TYPE = 'properties'; - Constants.ERROR_DECORATION_KIND = ERROR; - Constants.PALETTE_CONTEXT = 'palette'; - Constants.CANVAS_CONTEXT = 'canvas'; - Constants.FEEDBACK_CONTEXT = 'feedback'; -})(Constants || (Constants = {})); -export var Shapes; -(function (Shapes) { - class Factory { - /** - * Create a JointJS node that embeds extra metadata (properties). - */ - static createNode(params) { - let renderer = params.renderer; - let paper = params.paper; - let metadata = params.metadata; - let position = params.position; - let props = params.props; - let graph = params.graph || (params.paper ? params.paper.model : undefined); - let node; - if (!position) { - position = { x: 0, y: 0 }; - } - if (renderer && _.isFunction(renderer.createNode)) { - node = renderer.createNode(metadata, props); - } - else { - node = new joint.shapes.flo.Node(); - if (metadata) { - node.attr('.label/text', metadata.name); - } - } - node.set('type', joint.shapes.flo.NODE_TYPE); - if (position) { - node.set('position', position); - } - if (props) { - Array.from(props.keys()).forEach(key => node.attr(`props/${key}`, props.get(key))); - } - node.attr('metadata', metadata); - if (graph) { - graph.addCell(node); - } - if (renderer && _.isFunction(renderer.initializeNewNode)) { - let descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewNode(node, descriptor); - } - return node; - } - static createLink(params) { - let renderer = params.renderer; - let paper = params.paper; - let metadata = params.metadata; - let source = params.source; - let target = params.target; - let props = params.props; - let graph = params.graph || (params.paper ? params.paper.model : undefined); - let link; - if (renderer && _.isFunction(renderer.createLink)) { - link = renderer.createLink(source, target, metadata, props); - } - else { - link = new joint.shapes.flo.Link(); - } - if (source) { - link.set('source', source); - } - if (target) { - link.set('target', target); - } - link.set('type', joint.shapes.flo.LINK_TYPE); - if (metadata) { - link.attr('metadata', metadata); - } - if (props) { - Array.from(props.keys()).forEach(key => link.attr(`props/${key}`, props.get(key))); - } - if (graph) { - graph.addCell(link); - } - if (renderer && _.isFunction(renderer.initializeNewLink)) { - let descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewLink(link, descriptor); - } - // prevent creation of link breaks - link.attr('.marker-vertices/display', 'none'); - return link; - } - static createDecoration(params) { - let renderer = params.renderer; - let paper = params.paper; - let parent = params.parent; - let kind = params.kind; - let messages = params.messages; - let location = params.position; - let graph = params.graph || (params.paper ? params.paper.model : undefined); - if (!location) { - location = { x: 0, y: 0 }; - } - let decoration; - if (renderer && _.isFunction(renderer.createDecoration)) { - decoration = renderer.createDecoration(kind, parent); - } - else { - decoration = new joint.shapes.flo.ErrorDecoration({ - attrs: { - image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, - } - }); - } - decoration.set('type', joint.shapes.flo.DECORATION_TYPE); - decoration.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - decoration.set('z', parent.get('z') + 1); - } - decoration.attr('./kind', kind); - decoration.attr('messages', messages); - if (graph) { - graph.addCell(decoration); - } - parent.embed(decoration); - if (renderer && _.isFunction(renderer.initializeNewDecoration)) { - let descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewDecoration(decoration, descriptor); - } - return decoration; - } - static createHandle(params) { - let renderer = params.renderer; - let paper = params.paper; - let parent = params.parent; - let kind = params.kind; - let location = params.position; - let graph = params.graph || (params.paper ? params.paper.model : undefined); - let handle; - if (!location) { - location = { x: 0, y: 0 }; - } - if (renderer && _.isFunction(renderer.createHandle)) { - handle = renderer.createHandle(kind, parent); - } - else { - handle = new joint.shapes.flo.ErrorDecoration({ - size: HANDLE_SIZE, - attrs: { - 'image': { - 'xlink:href': HANDLE_ICON_MAP.get(kind) - } - } - }); - } - handle.set('type', joint.shapes.flo.HANDLE_TYPE); - handle.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - handle.set('z', parent.get('z') + 1); - } - handle.attr('./kind', kind); - if (graph) { - graph.addCell(handle); - } - parent.embed(handle); - if (renderer && _.isFunction(renderer.initializeNewHandle)) { - let descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewHandle(handle, descriptor); - } - return handle; - } - } - Shapes.Factory = Factory; -})(Shapes || (Shapes = {})); -//# sourceMappingURL=shapes.js.map \ No newline at end of file diff --git a/dist/esm2015/spring-flo.js b/dist/esm2015/spring-flo.js deleted file mode 100644 index 31c32cd..0000000 --- a/dist/esm2015/spring-flo.js +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Generated bundle index. Do not edit. - */ -export * from './index'; -//# sourceMappingURL=spring-flo.js.map \ No newline at end of file diff --git a/dist/esm2015/spring-flo.metadata.json b/dist/esm2015/spring-flo.metadata.json deleted file mode 100644 index 688daff..0000000 --- a/dist/esm2015/spring-flo.metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"__symbolic":"module","version":4,"exports":[{"from":"./shared/flo-common"},{"from":"./shared/flo-properties"},{"from":"./shared/shapes"}],"metadata":{"FloModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":12,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@angular/forms","name":"FormsModule","line":14,"character":4},{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":15,"character":4},{"__symbolic":"reference","module":"@angular/forms","name":"ReactiveFormsModule","line":16,"character":4}],"declarations":[{"__symbolic":"reference","name":"Palette"},{"__symbolic":"reference","name":"EditorComponent"},{"__symbolic":"reference","name":"ResizerDirective"},{"__symbolic":"reference","name":"DslEditorComponent"},{"__symbolic":"reference","name":"CodeEditorComponent"},{"__symbolic":"reference","name":"PropertiesGroupComponent"},{"__symbolic":"reference","name":"DynamicFormPropertyComponent"}],"exports":[{"__symbolic":"reference","name":"EditorComponent"},{"__symbolic":"reference","name":"DslEditorComponent"},{"__symbolic":"reference","name":"DynamicFormPropertyComponent"},{"__symbolic":"reference","name":"PropertiesGroupComponent"}]}]}],"members":{}},"Palette":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":37,"character":1},"arguments":[{"selector":"flo-palette","template":"\n
\n \n
\n
\n
\n
\n ","styles":["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":109,"character":17},"member":"None"}}]}],"members":{"metamodel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":145,"character":3}}]}],"renderer":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":148,"character":3}}]}],"paletteEntryPadding":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":151,"character":3}}]}],"onPaletteEntryDrop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":154,"character":3}}]}],"paletteReady":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":157,"character":3}}]}],"paletteFocus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":160,"character":3}}]}],"paletteSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":166,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":175,"character":44},"arguments":[{"__symbolic":"reference","module":"@angular/platform-browser","name":"DOCUMENT","line":175,"character":51}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":175,"character":31},{"__symbolic":"reference","name":"any"}]}],"onFocus":[{"__symbolic":"method"}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"createPaletteGroup":[{"__symbolic":"method"}],"createPaletteEntry":[{"__symbolic":"method"}],"buildPalette":[{"__symbolic":"method"}],"rebuildPalette":[{"__symbolic":"method"}],"getPaletteView":[{"__symbolic":"method"}],"handleMouseUp":[{"__symbolic":"method"}],"trigger":[{"__symbolic":"method"}],"handleDrag":[{"__symbolic":"method"}],"rotateOpen":[{"__symbolic":"method"}],"doRotateOpen":[{"__symbolic":"method"}],"doRotateClose":[{"__symbolic":"method"}],"rotateClosed":[{"__symbolic":"method"}]}},"EditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":20,"character":1},"arguments":[{"selector":"flo-editor","template":"\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ","styles":["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":693,"character":17},"member":"None"}}]}],"members":{"metamodel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":752,"character":3}}]}],"renderer":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":758,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":764,"character":3}}]}],"paletteSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":770,"character":3}}]}],"minZoom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":776,"character":3}}]}],"maxZoom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":782,"character":3}}]}],"zoomStep":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":788,"character":3}}]}],"paperPadding":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":791,"character":3}}]}],"floApi":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":794,"character":3}}]}],"validationMarkers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":797,"character":3}}]}],"contentValidated":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":800,"character":3}}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":803,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":808,"character":31}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"performGraphToTextSyncing":[{"__symbolic":"method"}],"createHandle":[{"__symbolic":"method"}],"removeEmbeddedChildrenOfType":[{"__symbolic":"method"}],"showDragFeedback":[{"__symbolic":"method"}],"hideDragFeedback":[{"__symbolic":"method"}],"setDragDescriptor":[{"__symbolic":"method"}],"handleNodeDragging":[{"__symbolic":"method"}],"handleNodeDropping":[{"__symbolic":"method"}],"_hideNode":[{"__symbolic":"method"}],"_restoreNodeVisibility":[{"__symbolic":"method"}],"getTargetViewFromEvent":[{"__symbolic":"method"}],"handleDnDFromPalette":[{"__symbolic":"method"}],"handleDragFromPalette":[{"__symbolic":"method"}],"createNode":[{"__symbolic":"method"}],"createLink":[{"__symbolic":"method"}],"handleDropFromPalette":[{"__symbolic":"method"}],"fitToContent":[{"__symbolic":"method"}],"autosizePaper":[{"__symbolic":"method"}],"fitToPage":[{"__symbolic":"method"}],"validateContent":[{"__symbolic":"method"}],"markElement":[{"__symbolic":"method"}],"doLayout":[{"__symbolic":"method"}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":1577,"character":3}}]}],"updateGraphRepresentation":[{"__symbolic":"method"}],"updateTextRepresentation":[{"__symbolic":"method"}],"initMetamodel":[{"__symbolic":"method"}],"initGraph":[{"__symbolic":"method"}],"handleNodeCreation":[{"__symbolic":"method"}],"handleLinkEvent":[{"__symbolic":"method"}],"handleLinkCreation":[{"__symbolic":"method"}],"initGraphListeners":[{"__symbolic":"method"}],"initPaperListeners":[{"__symbolic":"method"}],"initPaper":[{"__symbolic":"method"}],"updatePaletteReadyState":[{"__symbolic":"method"}]}},"DslEditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":13,"character":1},"arguments":[{"selector":"dsl-editor","template":"\n \n ","styles":["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":42,"character":17},"member":"None"}}]}],"members":{"lineNumbers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":54,"character":3},"arguments":["line-numbers"]}]}],"lineWrapping":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3},"arguments":["line-wrapping"]}]}],"scrollbarStyle":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3},"arguments":["scrollbar-style"]}]}],"placeholder":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":63,"character":3}}]}],"debounce":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":66,"character":3}}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":69,"character":3}}]}],"focus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":72,"character":3}}]}],"blur":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":75,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":78,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":86,"character":31}]}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":88,"character":3}}]}],"lintOptions":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":98,"character":3}}]}],"hintOptions":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":106,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}},"CodeEditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":35,"character":1},"arguments":[{"selector":"code-editor","template":"\n
\n \n
\n ","styles":["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":64,"character":17},"member":"None"},"providers":[{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":67,"character":15},"useExisting":{"__symbolic":"reference","name":"CodeEditorComponent"},"multi":true}]}]}],"members":{"lineNumbers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":91,"character":3},"arguments":["line-numbers"]}]}],"lineWrapping":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":94,"character":3},"arguments":["line-wrapping"]}]}],"scrollbarStyle":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":97,"character":3},"arguments":["scrollbar-style"]}]}],"placeholder":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":100,"character":3}}]}],"overviewRuler":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":103,"character":3},"arguments":["overview-ruler"]}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":106,"character":3}}]}],"focus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":109,"character":3}}]}],"blur":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":112,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":115,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":126,"character":31}]}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":128,"character":3}}]}],"language":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":138,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"loadEditorMode":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"registerOnChange":[{"__symbolic":"method"}],"registerOnTouched":[{"__symbolic":"method"}],"getLintOptions":[{"__symbolic":"method"}]}},"PropertiesGroupComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"properties-group","template":"\n
\n \n
\n ","encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":11,"character":17},"member":"None"}}]}],"members":{"propertiesGroupModel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":18,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"createGroupControls":[{"__symbolic":"method"}]}},"DynamicFormPropertyComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"df-property","template":"\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ","encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":54,"character":17},"member":"None"}}]}],"members":{"model":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":58,"character":3}}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":61,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor"}]}},"ResizerDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":9,"character":1},"arguments":[{"selector":"[resizer]","host":{"(mousedown)":"startDrag()","$quoted$":["(mousedown)"]}}]}],"members":{"maxSplitSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":21,"character":3}}]}],"sizeChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":24,"character":3}}]}],"splitSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"resizerWidth":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":72,"character":3}}]}],"resizerHeight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":78,"character":3}}]}],"resizerLeft":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":84,"character":3}}]}],"resizerTop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":89,"character":3}}]}],"resizerRight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":94,"character":3}}]}],"resizerBottom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":99,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":104,"character":44},"arguments":[{"__symbolic":"reference","module":"@angular/platform-browser","name":"DOCUMENT","line":104,"character":51}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":104,"character":31},{"__symbolic":"reference","name":"any"}]}],"startDrag":[{"__symbolic":"method"}],"mousemove":[{"__symbolic":"method"}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}}},"origins":{"FloModule":"./module","Palette":"./palette/palette.component","EditorComponent":"./editor/editor.component","DslEditorComponent":"./dsl-editor/dsl-editor.component","CodeEditorComponent":"./code-editor/code-editor.component","PropertiesGroupComponent":"./properties/properties.group.component","DynamicFormPropertyComponent":"./properties/df.property.component","ResizerDirective":"./directives/resizer"},"importAs":"spring-flo"} \ No newline at end of file diff --git a/dist/esm5/code-editor/code-editor.component.js b/dist/esm5/code-editor/code-editor.component.js deleted file mode 100644 index 1679726..0000000 --- a/dist/esm5/code-editor/code-editor.component.js +++ /dev/null @@ -1,237 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation, forwardRef } from '@angular/core'; -import { NG_VALUE_ACCESSOR } from '@angular/forms'; -import * as CodeMirror from 'codemirror-minified'; -import * as _$ from 'jquery'; -var $ = _$; -// CodeMirror extensions -import 'codemirror-minified/mode/meta'; -import 'codemirror-minified/addon/lint/lint'; -import 'codemirror-minified/addon/hint/show-hint'; -// import 'codemirror-minified/addon/mode/loadmode'; -import 'codemirror-minified/addon/edit/matchbrackets'; -import 'codemirror-minified/addon/edit/closebrackets'; -import 'codemirror-minified/addon/display/placeholder'; -import 'codemirror-minified/addon/scroll/annotatescrollbar'; -import 'codemirror-minified/addon/scroll/simplescrollbars'; -// Lint support -// Unclear how to import this dynamically... -import 'codemirror-minified/addon/lint/javascript-lint'; -import 'codemirror-minified/addon/lint/coffeescript-lint'; -import 'codemirror-minified/addon/lint/json-lint'; -import 'codemirror-minified/addon/lint/yaml-lint'; -// TODO: use dynamic import with JS7 in the future. CM autoLoad cannot load it properly - thinks its AMD -// Supported languages until dynamic loading -import 'codemirror-minified/mode/groovy/groovy'; -import 'codemirror-minified/mode/javascript/javascript'; -import 'codemirror-minified/mode/python/python'; -import 'codemirror-minified/mode/ruby/ruby'; -import 'codemirror-minified/mode/clike/clike'; -import 'codemirror-minified/mode/yaml/yaml'; -import 'codemirror-minified/mode/coffeescript/coffeescript'; -var CodeEditorComponent = /** @class */ (function () { - function CodeEditorComponent(element) { - var _this = this; - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.dslChange = new EventEmitter(); - this.focus = new EventEmitter(); - this.blur = new EventEmitter(); - this.editor = new EventEmitter(); - this._dslChangedHandler = function () { - _this._dsl = _this.doc.getValue(); - _this.dslChange.emit(_this._dsl); - if (_this._onChangeHandler) { - _this._onChangeHandler(_this._dsl); - } - }; - } - CodeEditorComponent_1 = CodeEditorComponent; - Object.defineProperty(CodeEditorComponent.prototype, "dsl", { - set: function (dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - var cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CodeEditorComponent.prototype, "language", { - set: function (_language) { - if (this._language !== _language) { - this._language = _language; - this.loadEditorMode(); - } - }, - enumerable: true, - configurable: true - }); - CodeEditorComponent.prototype.ngOnInit = function () { - var _this = this; - var options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - matchBrackets: true, - autoCloseBrackets: true, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - this.doc = CodeMirror.fromTextArea($('#code-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this._dslChangedHandler); - this.doc.on('focus', function () { - _this.focus.emit(); - if (_this._onTouchHandler) { - _this._onTouchHandler(); - } - }); - this.doc.on('blur', function () { return _this.blur.emit(); }); - this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); - this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); - this.loadEditorMode(); - this.editor.emit(this.doc); - }; - CodeEditorComponent.prototype.loadEditorMode = function () { - // CodeMirror doc object must be initialized - if (!this.doc) { - return; - } - var info = this._language ? CodeMirror.findModeByName(this._language) : undefined; - // Set proper editor mode - if (info) { - this.doc.setOption('mode', info.mime); - // (CodeMirror).autoLoadMode(this.doc, info.mode); - } - else { - this.doc.setOption('mode', 'text/plain'); - } - // Set proper Lint mode - this.doc.setOption('lint', this.getLintOptions()); - }; - CodeEditorComponent.prototype.ngOnDestroy = function () { - }; - CodeEditorComponent.prototype.writeValue = function (obj) { - this.dsl = obj; - }; - CodeEditorComponent.prototype.registerOnChange = function (fn) { - this._onChangeHandler = fn; - }; - CodeEditorComponent.prototype.registerOnTouched = function (fn) { - this._onTouchHandler = fn; - }; - CodeEditorComponent.prototype.getLintOptions = function () { - var _this = this; - switch (this._language) { - case 'javascript': - case 'json': - case 'coffeescript': - case 'yaml': - return { - onUpdateLinting: function (annotations) { - var warnings = []; - var errors = []; - if (_this.overviewRuler) { - if (Array.isArray(annotations)) { - annotations.forEach(function (a) { - if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { - if (a.severity === 'error') { - errors.push(a); - } - else if (a.severity === 'warning') { - warnings.push(a); - } - } - }); - } - } - _this.warningRuler.update(warnings); - _this.errorRuler.update(errors); - } - }; - } - return false; - }; - var CodeEditorComponent_1; - tslib_1.__decorate([ - Input('line-numbers'), - tslib_1.__metadata("design:type", Object) - ], CodeEditorComponent.prototype, "lineNumbers", void 0); - tslib_1.__decorate([ - Input('line-wrapping'), - tslib_1.__metadata("design:type", Object) - ], CodeEditorComponent.prototype, "lineWrapping", void 0); - tslib_1.__decorate([ - Input('scrollbar-style'), - tslib_1.__metadata("design:type", String) - ], CodeEditorComponent.prototype, "scrollbarStyle", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String) - ], CodeEditorComponent.prototype, "placeholder", void 0); - tslib_1.__decorate([ - Input('overview-ruler'), - tslib_1.__metadata("design:type", Boolean) - ], CodeEditorComponent.prototype, "overviewRuler", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], CodeEditorComponent.prototype, "dslChange", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], CodeEditorComponent.prototype, "focus", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], CodeEditorComponent.prototype, "blur", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], CodeEditorComponent.prototype, "editor", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) - ], CodeEditorComponent.prototype, "dsl", null); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) - ], CodeEditorComponent.prototype, "language", null); - CodeEditorComponent = CodeEditorComponent_1 = tslib_1.__decorate([ - Component({ - selector: 'code-editor', - template: "\n
\n \n
\n ", - styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "], - encapsulation: ViewEncapsulation.None, - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(function () { return CodeEditorComponent_1; }), - multi: true - } - ] - }), - tslib_1.__metadata("design:paramtypes", [ElementRef]) - ], CodeEditorComponent); - return CodeEditorComponent; -}()); -export { CodeEditorComponent }; -//# sourceMappingURL=code-editor.component.js.map \ No newline at end of file diff --git a/dist/esm5/directives/resizer.js b/dist/esm5/directives/resizer.js deleted file mode 100644 index 7f5415a..0000000 --- a/dist/esm5/directives/resizer.js +++ /dev/null @@ -1,192 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Directive, Input, Output, EventEmitter, Inject, ElementRef } from '@angular/core'; -import { DOCUMENT } from '@angular/platform-browser'; -import { fromEvent } from 'rxjs'; -import { sampleTime } from 'rxjs/operators'; -import { CompositeDisposable, Disposable } from 'ts-disposables'; -import * as _$ from 'jquery'; -var $ = _$; -var ResizerDirective = /** @class */ (function () { - function ResizerDirective(element, document) { - var _this = this; - this.element = element; - this.document = document; - this.dragInProgress = false; - this.vertical = true; - this._subscriptions = new CompositeDisposable(); - this.sizeChange = new EventEmitter(); - this.mouseMoveHandler = function (e) { - if (_this.dragInProgress) { - _this.mousemove(e); - } - }; - } - Object.defineProperty(ResizerDirective.prototype, "splitSize", { - set: function (splitSize) { - if (this.maxSplitSize && splitSize > this.maxSplitSize) { - splitSize = this.maxSplitSize; - } - if (this.vertical) { - // Handle vertical resizer - $(this.element.nativeElement).css({ - left: splitSize + 'px' - }); - $(this.first).css({ - width: splitSize + 'px' - }); - $(this.second).css({ - left: (splitSize + this._size) + 'px' - }); - } - else { - // Handle horizontal resizer - $(this.element.nativeElement).css({ - bottom: splitSize + 'px' - }); - $(this.first).css({ - bottom: (splitSize + this._size) + 'px' - }); - $(this.second).css({ - height: splitSize + 'px' - }); - } - this._splitSize = splitSize; - // Update the local field - this.sizeChange.emit(splitSize); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerWidth", { - set: function (width) { - this._size = width; - this.vertical = true; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerHeight", { - set: function (height) { - this._size = height; - this.vertical = false; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerLeft", { - set: function (first) { - this.first = first; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerTop", { - set: function (first) { - this.first = first; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerRight", { - set: function (second) { - this.second = second; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerBottom", { - set: function (second) { - this.second = second; - }, - enumerable: true, - configurable: true - }); - ResizerDirective.prototype.startDrag = function () { - this.dragInProgress = true; - }; - ResizerDirective.prototype.mousemove = function (event) { - var size; - if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node - size = event.pageX - $(this.first).offset().left; - } - else { - // Handle horizontal resizer Calculate new size relative to palette container DOM node - size = window.innerHeight - event.pageY - $(this.second).offset().top; - } - this.splitSize = size; - }; - ResizerDirective.prototype.ngOnInit = function () { - // Need to set left and right elements width and fire events on init when DOM is built - var _this = this; - this.splitSize = this._splitSize; - var subscription1 = fromEvent($(this.document).get(0), 'mousemove') - .pipe(sampleTime(300)) - .subscribe(this.mouseMoveHandler); - this._subscriptions.add(Disposable.create(function () { return subscription1.unsubscribe(); })); - var subscription2 = fromEvent($(this.document).get(0), 'mouseup') - .subscribe(function (e) { - if (_this.dragInProgress) { - _this.mousemove(e); - _this.dragInProgress = false; - } - }); - this._subscriptions.add(Disposable.create(function () { return subscription2.unsubscribe(); })); - }; - ResizerDirective.prototype.ngOnDestroy = function () { - this._subscriptions.dispose(); - }; - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number) - ], ResizerDirective.prototype, "maxSplitSize", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], ResizerDirective.prototype, "sizeChange", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number), - tslib_1.__metadata("design:paramtypes", [Number]) - ], ResizerDirective.prototype, "splitSize", null); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number), - tslib_1.__metadata("design:paramtypes", [Number]) - ], ResizerDirective.prototype, "resizerWidth", null); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number), - tslib_1.__metadata("design:paramtypes", [Number]) - ], ResizerDirective.prototype, "resizerHeight", null); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerLeft", null); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerTop", null); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerRight", null); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerBottom", null); - ResizerDirective = tslib_1.__decorate([ - Directive({ - selector: '[resizer]', - host: { '(mousedown)': 'startDrag()' } - }), - tslib_1.__param(1, Inject(DOCUMENT)), - tslib_1.__metadata("design:paramtypes", [ElementRef, Object]) - ], ResizerDirective); - return ResizerDirective; -}()); -export { ResizerDirective }; -//# sourceMappingURL=resizer.js.map \ No newline at end of file diff --git a/dist/esm5/dsl-editor/dsl-editor.component.js b/dist/esm5/dsl-editor/dsl-editor.component.js deleted file mode 100644 index aeaaa4b..0000000 --- a/dist/esm5/dsl-editor/dsl-editor.component.js +++ /dev/null @@ -1,158 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation } from '@angular/core'; -import * as _ from 'lodash'; -import * as CodeMirror from 'codemirror-minified'; -import * as _$ from 'jquery'; -var $ = _$; -import 'codemirror-minified/addon/lint/lint'; -import 'codemirror-minified/addon/hint/show-hint'; -import 'codemirror-minified/addon/display/placeholder'; -import 'codemirror-minified/addon/scroll/annotatescrollbar'; -import 'codemirror-minified/addon/scroll/simplescrollbars'; -var DslEditorComponent = /** @class */ (function () { - function DslEditorComponent(element) { - var _this = this; - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.debounce = 0; - this.dslChange = new EventEmitter(); - this.focus = new EventEmitter(); - this.blur = new EventEmitter(); - this.editor = new EventEmitter(); - this._dslChangedHandler = function () { - _this._dsl = _this.doc.getValue(); - _this.dslChange.emit(_this._dsl); - }; - } - Object.defineProperty(DslEditorComponent.prototype, "dsl", { - set: function (dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - var cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DslEditorComponent.prototype, "lintOptions", { - set: function (lintOptions) { - this._lint = lintOptions; - if (this.doc) { - this.doc.setOption('lint', this._lint); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DslEditorComponent.prototype, "hintOptions", { - set: function (hintOptions) { - this._hint = hintOptions; - if (this.doc) { - this.doc.setOption('hintOptions', this._hint); - } - }, - enumerable: true, - configurable: true - }); - DslEditorComponent.prototype.ngOnInit = function () { - var _this = this; - var options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - electricChars: false, - smartIndent: false, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - if (this._hint) { - options.hintOptions = this._hint; - } - this.doc = CodeMirror.fromTextArea($('#dsl-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this.debounce ? _.debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); - this.doc.on('focus', function () { return _this.focus.emit(); }); - this.doc.on('blur', function () { return _this.blur.emit(); }); - this.editor.emit(this.doc); - }; - DslEditorComponent.prototype.ngOnDestroy = function () { - }; - tslib_1.__decorate([ - Input('line-numbers'), - tslib_1.__metadata("design:type", Object) - ], DslEditorComponent.prototype, "lineNumbers", void 0); - tslib_1.__decorate([ - Input('line-wrapping'), - tslib_1.__metadata("design:type", Object) - ], DslEditorComponent.prototype, "lineWrapping", void 0); - tslib_1.__decorate([ - Input('scrollbar-style'), - tslib_1.__metadata("design:type", String) - ], DslEditorComponent.prototype, "scrollbarStyle", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String) - ], DslEditorComponent.prototype, "placeholder", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], DslEditorComponent.prototype, "debounce", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], DslEditorComponent.prototype, "dslChange", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], DslEditorComponent.prototype, "focus", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], DslEditorComponent.prototype, "blur", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], DslEditorComponent.prototype, "editor", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) - ], DslEditorComponent.prototype, "dsl", null); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object), - tslib_1.__metadata("design:paramtypes", [Object]) - ], DslEditorComponent.prototype, "lintOptions", null); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object), - tslib_1.__metadata("design:paramtypes", [Object]) - ], DslEditorComponent.prototype, "hintOptions", null); - DslEditorComponent = tslib_1.__decorate([ - Component({ - selector: 'dsl-editor', - template: "\n \n ", - styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "], - encapsulation: ViewEncapsulation.None - }), - tslib_1.__metadata("design:paramtypes", [ElementRef]) - ], DslEditorComponent); - return DslEditorComponent; -}()); -export { DslEditorComponent }; -//# sourceMappingURL=dsl-editor.component.js.map \ No newline at end of file diff --git a/dist/esm5/editor/editor-utils.js b/dist/esm5/editor/editor-utils.js deleted file mode 100644 index 40454b6..0000000 --- a/dist/esm5/editor/editor-utils.js +++ /dev/null @@ -1,112 +0,0 @@ -import { Flo } from '../shared/flo-common'; -import * as _ from 'lodash'; -var joint = Flo.joint; -import * as _$ from 'jquery'; -var $ = _$; -var Utils = /** @class */ (function () { - function Utils() { - } - Utils.fanRoute = function (graph, cell) { - if (cell instanceof joint.dia.Element) { - var links = graph.getConnectedLinks(cell); - var groupsOfOverlappingLinks = _.groupBy(links, function (link) { - // the key of the group is the model id of the link's source or target, but not our cell id. - var sourceId = link.get('source').id; - var targetId = link.get('target').id; - return cell.id !== sourceId ? sourceId : targetId; - }); - _.each(groupsOfOverlappingLinks, function (group, key) { - // If the member of the group has both source and target model adjust vertices. - var toRoute = {}; - if (key !== undefined) { - group.forEach(function (link) { - if (link.get('source').id === cell.get('id') && link.get('target').id) { - toRoute[link.get('target').id] = link; - } - else if (link.get('target').id === cell.get('id') && link.get('source').id) { - toRoute[link.get('source').id] = link; - } - }); - Object.keys(toRoute).forEach(function (k) { - Utils.fanRoute(graph, toRoute[k]); - }); - } - }); - } - else if (cell instanceof joint.dia.Link) { - // The cell is a link. Let's find its source and target models. - var srcId_1 = cell.get('source').id || cell.previous('source').id; - var trgId_1 = cell.get('target').id || cell.previous('target').id; - // If one of the ends is not a model, the link has no siblings. - if (!srcId_1 || !trgId_1) { - return; - } - var siblings = graph.getLinks().filter(function (sibling) { - var _srcId = sibling.get('source').id; - var _trgId = sibling.get('target').id; - var vertices = sibling.get('vertices'); - var fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); - return ((_srcId === srcId_1 && _trgId === trgId_1) || (_srcId === trgId_1 && _trgId === srcId_1)) && fanRouted; - }); - switch (siblings.length) { - case 0: - // The link was removed and had no siblings. - break; - case 1: - // There is only one link between the source and target. No vertices needed. - var vertices = cell.get('vertices'); - if (vertices && vertices.length && cell.get('fanRouted')) { - cell.unset('vertices'); - } - break; - default: - // There is more than one siblings. We need to create vertices. - // First of all we'll find the middle point of the link. - var source = graph.getCell(srcId_1); - var target = graph.getCell(trgId_1); - if (!source || !target) { - // When clearing the graph it may happen that some nodes are gone and some are left - return; - } - var srcCenter = source.getBBox().center(); - var trgCenter = target.getBBox().center(); - var midPoint_1 = joint.g.line(srcCenter, trgCenter).midpoint(); - // Then find the angle it forms. - var theta_1 = srcCenter.theta(trgCenter); - // This is the maximum distance between links - var gap_1 = 20; - siblings.forEach(function (sibling, index) { - // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. - var offset = gap_1 * Math.ceil(index / 2); - // Now we need the vertices to be placed at points which are 'offset' pixels distant - // from the first link and forms a perpendicular angle to it. And as index goes up - // alternate left and right. - // - // ^ odd indexes - // | - // |----> index 0 line (straight line between a source center and a target center. - // | - // v even indexes - var sign = index % 2 ? 1 : -1; - var angle = joint.g.toRad(theta_1 + sign * 90); - // We found the vertex. - var vertex = joint.g.point.fromPolar(offset, angle, midPoint_1); - sibling.set('fanRouted', true); - sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); - }); - } - } - }; - Utils.isCustomPaperEvent = function (args) { - return args.length === 5 && - _.isString(args[0]) && - (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && - args[1] instanceof $.Event && - args[2] instanceof joint.dia.CellView && - _.isNumber(args[3]) && - _.isNumber(args[4]); - }; - return Utils; -}()); -export { Utils }; -//# sourceMappingURL=editor-utils.js.map \ No newline at end of file diff --git a/dist/esm5/editor/editor.component.js b/dist/esm5/editor/editor.component.js deleted file mode 100644 index 5eb2e9f..0000000 --- a/dist/esm5/editor/editor.component.js +++ /dev/null @@ -1,1195 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, Input, Output, ElementRef, EventEmitter, ViewEncapsulation } from '@angular/core'; -import { debounceTime } from 'rxjs/operators'; -import { Flo } from '../shared/flo-common'; -import { Shapes, Constants } from '../shared/shapes'; -import { Utils } from './editor-utils'; -import { CompositeDisposable, Disposable } from 'ts-disposables'; -import * as _$ from 'jquery'; -import * as _ from 'lodash'; -import { Subject, BehaviorSubject } from 'rxjs'; -var joint = Flo.joint; -var $ = _$; -var SCROLLBAR_SIZE = 17; -var EditorComponent = /** @class */ (function () { - function EditorComponent(element) { - var _this = this; - this.element = element; - /** - * Flag specifying whether the Flo-Editor is in read-only mode. - */ - this._readOnlyCanvas = false; - /** - * Grid size - */ - this._gridSize = 1; - this._hiddenPalette = false; - this.textToGraphEventEmitter = new EventEmitter(); - this.graphToTextEventEmitter = new EventEmitter(); - this._graphToTextSyncEnabled = true; - this.validationEventEmitter = new EventEmitter(); - this._disposables = new CompositeDisposable(); - this._dslText = ''; - this.textToGraphConversionCompleted = new Subject(); - this.graphToTextConversionCompleted = new Subject(); - this.paletteReady = new BehaviorSubject(false); - /** - * Min zoom percent value - */ - this.minZoom = 5; - /** - * Max zoom percent value - */ - this.maxZoom = 400; - /** - * Zoom percent increment/decrement step - */ - this.zoomStep = 5; - this.paperPadding = 0; - this.floApi = new EventEmitter(); - this.validationMarkers = new EventEmitter(); - this.contentValidated = new EventEmitter(); - this.dslChange = new EventEmitter(); - this._resizeHandler = function () { return _this.autosizePaper(); }; - var self = this; - this.editorContext = new (/** @class */ (function () { - function DefaultRunnableContext() { - } - Object.defineProperty(DefaultRunnableContext.prototype, "zoomPercent", { - get: function () { - return self.zoomPercent; - }, - set: function (percent) { - self.zoomPercent = percent; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "noPalette", { - get: function () { - return self.noPalette; - }, - set: function (noPalette) { - self.noPalette = noPalette; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "gridSize", { - get: function () { - return self.gridSize; - }, - set: function (gridSize) { - self.gridSize = gridSize; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "readOnlyCanvas", { - get: function () { - return self.readOnlyCanvas; - }, - set: function (readOnly) { - self.readOnlyCanvas = readOnly; - }, - enumerable: true, - configurable: true - }); - DefaultRunnableContext.prototype.setDsl = function (dsl) { - self.dsl = dsl; - }; - DefaultRunnableContext.prototype.updateGraph = function () { - return self.updateGraphRepresentation(); - }; - DefaultRunnableContext.prototype.updateText = function () { - return self.updateTextRepresentation(); - }; - DefaultRunnableContext.prototype.performLayout = function () { - return self.doLayout(); - }; - DefaultRunnableContext.prototype.clearGraph = function () { - var _this = this; - self.selection = undefined; - self.graph.clear(); - if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { - return self.metamodel.load().then(function (data) { - self.editor.setDefaultContent(_this, data); - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - }); - } - else { - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - } - }; - DefaultRunnableContext.prototype.getGraph = function () { - return self.graph; - }; - DefaultRunnableContext.prototype.getPaper = function () { - return self.paper; - }; - Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextSync", { - get: function () { - return self.graphToTextSync; - }, - set: function (sync) { - self.graphToTextSync = sync; - }, - enumerable: true, - configurable: true - }); - DefaultRunnableContext.prototype.getMinZoom = function () { - return self.minZoom; - }; - DefaultRunnableContext.prototype.getMaxZoom = function () { - return self.maxZoom; - }; - DefaultRunnableContext.prototype.getZoomStep = function () { - return self.zoomStep; - }; - DefaultRunnableContext.prototype.fitToPage = function () { - self.fitToPage(); - }; - DefaultRunnableContext.prototype.createNode = function (metadata, props, position) { - return self.createNode(metadata, props, position); - }; - DefaultRunnableContext.prototype.createLink = function (source, target, metadata, props) { - return self.createLink(source, target, metadata, props); - }; - Object.defineProperty(DefaultRunnableContext.prototype, "selection", { - get: function () { - return self.selection; - }, - set: function (newSelection) { - self.selection = newSelection; - }, - enumerable: true, - configurable: true - }); - DefaultRunnableContext.prototype.deleteSelectedNode = function () { - if (self.selection) { - if (self.editor && self.editor.preDelete) { - self.editor.preDelete(self.editorContext, self.selection.model); - } - else { - if (self.selection.model instanceof joint.dia.Element) { - self.graph.getConnectedLinks(self.selection.model).forEach(function (l) { return l.remove(); }); - } - } - self.selection.model.remove(); - self.selection = undefined; - } - }; - Object.defineProperty(DefaultRunnableContext.prototype, "textToGraphConversionObservable", { - get: function () { - return self.textToGraphConversionCompleted; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextConversionObservable", { - get: function () { - return self.graphToTextConversionCompleted; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "paletteReady", { - get: function () { - return self.paletteReady; - }, - enumerable: true, - configurable: true - }); - return DefaultRunnableContext; - }()))(); - } - EditorComponent.prototype.ngOnInit = function () { - var _this = this; - this.initGraph(); - this.initPaper(); - this.initGraphListeners(); - this.initPaperListeners(); - this.initMetamodel(); - $(window).on('resize', this._resizeHandler); - this._disposables.add(Disposable.create(function () { return $(window).off('resize', _this._resizeHandler); })); - /* - * Execute resize to get the right size for the SVG element on the editor canvas. - * Executed via timeout to let angular render the DOM first and elements to have the right width and height - */ - window.setTimeout(this._resizeHandler); - this.floApi.emit(this.editorContext); - }; - EditorComponent.prototype.ngOnDestroy = function () { - this._disposables.dispose(); - }; - Object.defineProperty(EditorComponent.prototype, "noPalette", { - get: function () { - return this._hiddenPalette; - }, - set: function (hidden) { - this._hiddenPalette = hidden; - // If palette is not shown ensure that canvas starts from the left==0! - if (hidden) { - $('#paper-container', this.element.nativeElement).css('left', 0); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(EditorComponent.prototype, "graphToTextSync", { - get: function () { - return this._graphToTextSyncEnabled; - }, - set: function (sync) { - this._graphToTextSyncEnabled = sync; - // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion - // this.performGraphToTextSyncing(); - }, - enumerable: true, - configurable: true - }); - EditorComponent.prototype.performGraphToTextSyncing = function () { - if (this._graphToTextSyncEnabled) { - this.graphToTextEventEmitter.emit(); - } - }; - EditorComponent.prototype.createHandle = function (element, kind, action, location) { - if (!location) { - var bbox = element.model.getBBox(); - location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); - } - var handle = Shapes.Factory.createHandle({ - renderer: this.renderer, - paper: this.paper, - parent: element.model, - kind: kind, - position: location - }); - var view = this.paper.findViewByModel(handle); - view.on('cell:pointerdown', function () { - if (action) { - action(); - } - }); - view.on('cell:mouseover', function () { - handle.attr('image/filter', { - name: 'dropShadow', - args: { dx: 1, dy: 1, blur: 1, color: 'black' } - }); - }); - view.on('cell:mouseout', function () { - handle.removeAttr('image/filter'); - }); - view.setInteractivity(false); - return handle; - }; - EditorComponent.prototype.removeEmbeddedChildrenOfType = function (element, types) { - var embeds = element.getEmbeddedCells(); - for (var i = 0; i < embeds.length; i++) { - if (types.indexOf(embeds[i].get('type')) >= 0) { - embeds[i].remove(); - } - } - }; - Object.defineProperty(EditorComponent.prototype, "selection", { - get: function () { - return this._selection; - }, - set: function (newSelection) { - var _this = this; - if (newSelection && (newSelection.model.get('type') === joint.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint.shapes.flo.HANDLE_TYPE)) { - newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); - } - if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { - newSelection = undefined; - } - if (newSelection !== this._selection) { - if (this._selection) { - var elementview = this.paper.findViewByModel(this._selection.model); - if (elementview) { // May have been removed from the graph - this.removeEmbeddedChildrenOfType(elementview.model, joint.shapes.flo.HANDLE_TYPE); - elementview.unhighlight(); - } - } - if (newSelection) { - newSelection.highlight(); - if (this.editor && this.editor.createHandles) { - this.editor.createHandles(this.editorContext, function (owner, kind, action, location) { return _this.createHandle(owner, kind, action, location); }, newSelection); - } - } - this._selection = newSelection; - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(EditorComponent.prototype, "readOnlyCanvas", { - get: function () { - return this._readOnlyCanvas; - }, - set: function (value) { - var _this = this; - if (this._readOnlyCanvas === value) { - // Nothing to do - return; - } - if (value) { - this.selection = undefined; - } - if (this.graph) { - this.graph.getLinks().forEach(function (link) { - if (value) { - link.attr('.link-tools/display', 'none'); - link.attr('.marker-vertices/display', 'none'); - link.attr('.connection-wrap/display', 'none'); - } - else { - link.removeAttr('.link-tools/display'); - if (_this.editor && _this.editor.allowLinkVertexEdit) { - link.removeAttr('.marker-vertices/display'); - } - link.removeAttr('.connection-wrap/display'); - } - }); - } - this._readOnlyCanvas = value; - }, - enumerable: true, - configurable: true - }); - /** - * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - EditorComponent.prototype.showDragFeedback = function (dragDescriptor) { - if (this.editor && this.editor.showDragFeedback) { - this.editor.showDragFeedback(this.editorContext, dragDescriptor); - } - else { - var magnet = void 0; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint.V(magnet).addClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint.V(magnet).addClass('dnd-target-feedback'); - } - } - } - } - }; - /** - * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - EditorComponent.prototype.hideDragFeedback = function (dragDescriptor) { - if (this.editor && this.editor.hideDragFeedback) { - this.editor.hideDragFeedback(this.editorContext, dragDescriptor); - } - else { - var magnet = void 0; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint.V(magnet).removeClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint.V(magnet).removeClass('dnd-target-feedback'); - } - } - } - } - }; - /** - * Sets the new DnD info object - the descriptor for DnD - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - EditorComponent.prototype.setDragDescriptor = function (dragDescriptor) { - if (this.highlighted === dragDescriptor) { - return; - } - if (this.highlighted && dragDescriptor && _.isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { - if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { - return; - } - if (this.highlighted.source && - dragDescriptor.source && - this.highlighted.target && - dragDescriptor.target && - this.highlighted.source.view.model === dragDescriptor.source.view.model && - this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && - this.highlighted.target.view.model === dragDescriptor.target.view.model && - this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { - return; - } - } - if (this.highlighted) { - this.hideDragFeedback(this.highlighted); - } - this.highlighted = dragDescriptor; - if (this.highlighted) { - this.showDragFeedback(this.highlighted); - } - }; - /** - * Handles DnD events when a node is being dragged over canvas - * - * @param draggedView The Joint JS view object being dragged - * @param targetUnderMouse The Joint JS view under mouse cursor - * @param x X coordinate of the mouse on the canvas - * @param y Y coordinate of the mosue on the canvas - * @param context DnD context (palette or canvas) - */ - EditorComponent.prototype.handleNodeDragging = function (draggedView, targetUnderMouse, x, y, sourceComponent) { - if (this.editor && this.editor.calculateDragDescriptor) { - this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint.g.point(x, y), sourceComponent)); - } - }; - /** - * Handles DnD drop event when a node is being dragged and dropped on the main canvas - */ - EditorComponent.prototype.handleNodeDropping = function () { - if (this.highlighted && this.editor && this.editor.handleNodeDropping) { - this.editor.handleNodeDropping(this.editorContext, this.highlighted); - } - this.setDragDescriptor(undefined); - }; - /** - * Hides DOM Node (used to determine drop target DOM element) - * @param domNode DOM node to hide - * @returns - */ - EditorComponent.prototype._hideNode = function (domNode) { - var oldVisibility = { - visibility: domNode.style ? domNode.style.display : undefined, - children: [] - }; - for (var i = 0; i < domNode.children.length; i++) { - var node = domNode.children.item(i); - if (node instanceof HTMLElement) { - oldVisibility.children.push(this._hideNode(node)); - } - } - domNode.style.display = 'none'; - return oldVisibility; - }; - /** - * Restored DOM node original visibility (used to determine drop target DOM element) - * @param domNode DOM node to restore visibility of - * @param oldVisibility original visibility parameter - */ - EditorComponent.prototype._restoreNodeVisibility = function (domNode, oldVisibility) { - if (domNode.style) { - domNode.style.display = oldVisibility.visibility; - } - var j = 0; - for (var i = 0; i < domNode.childNodes.length; i++) { - if (j < oldVisibility.children.length) { - var node = domNode.children.item(i); - if (node instanceof HTMLElement) { - this._restoreNodeVisibility(node, oldVisibility.children[j++]); - } - } - } - }; - /** - * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. - * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location - * (bounding box of a link for testing is bad). - * The result of that is that links can only be the drop target when dragging from the palette currently. - * When DnDing shapes on the canvas drop target cannot be a link. - * - * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked - * - e.g. Drag-n-Drop) - */ - EditorComponent.prototype.getTargetViewFromEvent = function (event, x, y, excludeViews) { - var _this = this; - if (excludeViews === void 0) { excludeViews = []; } - if (!x && !y) { - var l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); - x = l.x; - y = l.y; - } - // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing - // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); - // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); - // if (underMouse) { - // return underMouse; - // } - var oldVisibility = excludeViews.map(function (_x) { return _this._hideNode(_x.el); }); - var targetElement = document.elementFromPoint(event.clientX, event.clientY); - excludeViews.forEach(function (excluded, i) { - _this._restoreNodeVisibility(excluded.el, oldVisibility[i]); - }); - return this.paper.findView($(targetElement)); - }; - EditorComponent.prototype.handleDnDFromPalette = function (dndEvent) { - switch (dndEvent.type) { - case Flo.DnDEventType.DRAG: - this.handleDragFromPalette(dndEvent); - break; - case Flo.DnDEventType.DROP: - this.handleDropFromPalette(dndEvent); - break; - default: - break; - } - }; - EditorComponent.prototype.handleDragFromPalette = function (dnDEvent) { - console.debug('Dragging from palette'); - if (dnDEvent.view && !this.readOnlyCanvas) { - var location_1 = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); - this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location_1.x, location_1.y, [dnDEvent.view]), location_1.x, location_1.y, Constants.PALETTE_CONTEXT); - } - }; - EditorComponent.prototype.createNode = function (metadata, props, position) { - return Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.paper, - metadata: metadata, - props: props, - position: position - }); - }; - EditorComponent.prototype.createLink = function (source, target, metadata, props) { - return Shapes.Factory.createLink({ - renderer: this.renderer, - paper: this.paper, - source: source, - target: target, - metadata: metadata, - props: props - }); - }; - EditorComponent.prototype.handleDropFromPalette = function (event) { - var cellview = event.view; - var evt = event.event; - if (this.paper.el === evt.target || $.contains(this.paper.el, evt.target)) { - if (this.readOnlyCanvas) { - this.setDragDescriptor(undefined); - } - else { - var metadata = cellview.model.attr('metadata'); - var props = cellview.model.attr('props'); - var position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); - /* Calculate target element before creating the new - * element under mouse location. Otherwise target - * element would be the newly created element because - * it's under the mouse pointer - */ - var targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); - var newNode = this.createNode(metadata, props, position); - var newView = this.paper.findViewByModel(newNode); - this.handleNodeDragging(newView, targetElement, position.x, position.y, Constants.PALETTE_CONTEXT); - this.handleNodeDropping(); - } - } - }; - EditorComponent.prototype.fitToContent = function (gridWidth, gridHeight, padding, opt) { - var paper = this.paper; - if (joint.util.isObject(gridWidth)) { - // first parameter is an option object - opt = gridWidth; - gridWidth = opt.gridWidth || 1; - gridHeight = opt.gridHeight || 1; - padding = opt.padding || 0; - } - else { - opt = opt || {}; - gridWidth = gridWidth || 1; - gridHeight = gridHeight || 1; - padding = padding || 0; - } - var paddingJson = joint.util.normalizeSides(padding); - // Calculate the paper size to accomodate all the graph's elements. - var bbox = joint.V(paper.viewport).getBBox(); - var currentScale = paper.scale(); - var currentTranslate = paper.translate(); - bbox.x *= currentScale.sx; - bbox.y *= currentScale.sy; - bbox.width *= currentScale.sx; - bbox.height *= currentScale.sy; - var calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; - var calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; - var tx = 0; - var ty = 0; - if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { - tx = (-bbox.x / gridWidth) * gridWidth; - tx += paddingJson.left; - } - else if (opt.allowNewOrigin === 'same') { - tx = currentTranslate.tx; - } - calcWidth += tx; - if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { - ty = (-bbox.y / gridHeight) * gridHeight; - ty += paddingJson.top; - } - else if (opt.allowNewOrigin === 'same') { - ty = currentTranslate.ty; - } - calcHeight += ty; - calcWidth += paddingJson.right; - calcHeight += paddingJson.bottom; - // Make sure the resulting width and height are greater than minimum. - calcWidth = Math.max(calcWidth, opt.minWidth || 0); - calcHeight = Math.max(calcHeight, opt.minHeight || 0); - // Make sure the resulting width and height are lesser than maximum. - calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); - calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); - var dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; - var originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; - // Change the dimensions only if there is a size discrepency or an origin change - if (originChange) { - paper.translate(tx, ty); - } - if (dimensionChange) { - paper.setDimensions(calcWidth, calcHeight); - } - }; - EditorComponent.prototype.autosizePaper = function () { - var parent = $('#paper-container', this.element.nativeElement); - var parentWidth = parent.innerWidth(); - var parentHeight = parent.innerHeight(); - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth - SCROLLBAR_SIZE, - minHeight: parentHeight - SCROLLBAR_SIZE, - allowNewOrigin: 'same' - }); - }; - EditorComponent.prototype.fitToPage = function () { - var parent = $('#paper-container', this.element.nativeElement); - var minScale = this.minZoom / 100; - var maxScale = 2; - var parentWidth = parent.innerWidth(); - var parentHeight = parent.innerHeight(); - this.paper.scaleContentToFit({ - padding: this.paperPadding, - minScaleX: minScale, - minScaleY: minScale, - maxScaleX: maxScale, - maxScaleY: maxScale, - fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } - }); - /** - * Size the canvas appropriately and allow origin movement - */ - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth, - minHeight: parentHeight, - maxWidth: parentWidth, - maxHeight: parentHeight, - allowNewOrigin: 'any' - }); - }; - Object.defineProperty(EditorComponent.prototype, "zoomPercent", { - get: function () { - return Math.round(joint.V(this.paper.viewport).scale().sx * 100); - }, - set: function (percent) { - if (!isNaN(percent)) { - if (percent < this.minZoom) { - percent = this.minZoom; - } - else if (percent >= this.maxZoom) { - percent = this.maxZoom; - } - else { - if (percent <= 0) { - percent = 0.00001; - } - } - this.paper.scale(percent / 100, percent / 100); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(EditorComponent.prototype, "gridSize", { - get: function () { - return this._gridSize; - }, - set: function (size) { - if (!isNaN(size) && size >= 1) { - this._gridSize = size; - if (this.paper) { - this.paper.setGridSize(size); - } - } - }, - enumerable: true, - configurable: true - }); - EditorComponent.prototype.validateContent = function () { - var _this = this; - return new Promise(function (resolve) { - if (_this.editor && _this.editor.validate) { - return _this.editor - .validate(_this.graph, _this.dsl, _this.editorContext) - .then(function (allMarkers) { - _this.graph.getCells() - .forEach(function (cell) { return _this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : []); }); - _this.validationMarkers.emit(allMarkers); - _this.contentValidated.emit(true); - resolve(); - }); - } - else { - resolve(); - } - }); - }; - EditorComponent.prototype.markElement = function (cell, markers) { - var errorMessages = markers.map(function (m) { return m.message; }); - var errorCell = cell.getEmbeddedCells().find(function (e) { return e.attr('./kind') === Constants.ERROR_DECORATION_KIND; }); - if (errorCell) { - if (errorMessages.length === 0) { - errorCell.remove(); - } - else { - // Without rewrite we merge this list with existing errors - errorCell.attr('messages', errorMessages, { rewrite: true }); - } - } - else if (errorMessages.length > 0) { - var error = Shapes.Factory.createDecoration({ - renderer: this.renderer, - paper: this.paper, - parent: cell, - kind: Constants.ERROR_DECORATION_KIND, - messages: errorMessages - }); - var pt = void 0; - var view = this.paper.findViewByModel(error); - if (cell instanceof joint.dia.Element) { - pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); - error.set('position', pt); - view.setInteractivity(false); - } - else { - // TODO: do something for the link perhaps? - } - } - }; - EditorComponent.prototype.doLayout = function () { - if (this.renderer && this.renderer.layout) { - return this.renderer.layout(this.paper); - } - }; - Object.defineProperty(EditorComponent.prototype, "dsl", { - get: function () { - return this._dslText; - }, - set: function (dslText) { - if (this._dslText !== dslText) { - this._dslText = dslText; - this.textToGraphEventEmitter.emit(); - } - }, - enumerable: true, - configurable: true - }); - /** - * Ask the server to parse the supplied text into a JSON graph of nodes and links, - * then update the view based on that new information. - */ - EditorComponent.prototype.updateGraphRepresentation = function () { - var _this = this; - console.debug("Updating graph to represent '" + this._dslText + "'"); - if (this.metamodel && this.metamodel.textToGraph) { - return this.metamodel.textToGraph(this.editorContext, this._dslText).then(function () { - _this.textToGraphConversionCompleted.next(); - return _this.validateContent(); - }); - } - else { - this.textToGraphConversionCompleted.next(); - return this.validateContent(); - } - }; - EditorComponent.prototype.updateTextRepresentation = function () { - var _this = this; - if (this.metamodel && this.metamodel.graphToText) { - return this.metamodel.graphToText(this.editorContext).then(function (text) { - if (_this._dslText !== text) { - _this._dslText = text; - _this.dslChange.emit(text); - } - _this.graphToTextConversionCompleted.next(); - return _this.validateContent(); - }) - .catch(function (error) { - // Validation may reveal why the graph couldn't be - // converted so let it run - _this.graphToTextConversionCompleted.next(); - return _this.validateContent(); - }); - } - else { - this.graphToTextConversionCompleted.next(); - return this.validateContent(); - } - }; - EditorComponent.prototype.initMetamodel = function () { - var _this = this; - this.metamodel.load().then(function (data) { - _this.updateGraphRepresentation(); - var textSyncSubscription = _this.graphToTextEventEmitter.pipe(debounceTime(100)).subscribe(function () { - if (_this._graphToTextSyncEnabled) { - _this.updateTextRepresentation(); - } - }); - _this._disposables.add(Disposable.create(function () { return textSyncSubscription.unsubscribe(); })); - // Setup content validated event emitter. Emit not validated when graph to text conversion required - var graphValidatedSubscription1 = _this.graphToTextEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); - _this._disposables.add(Disposable.create(function () { return graphValidatedSubscription1.unsubscribe; })); - // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); - // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); - var graphSyncSubscription = _this.textToGraphEventEmitter.pipe(debounceTime(300)).subscribe(function () { return _this.updateGraphRepresentation(); }); - _this._disposables.add(Disposable.create(function () { return graphSyncSubscription.unsubscribe(); })); - // Setup content validated event emitter. Emit not validated when text to graph conversion required - var graphValidatedSubscription2 = _this.textToGraphEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); - _this._disposables.add(Disposable.create(function () { return graphValidatedSubscription2.unsubscribe; })); - if (_this.editor && _this.editor.setDefaultContent) { - _this.editor.setDefaultContent(_this.editorContext, data); - } - }); - }; - EditorComponent.prototype.initGraph = function () { - this.graph = new joint.dia.Graph(); - this.graph.set('type', Constants.CANVAS_CONTEXT); - this.graph.set('paperPadding', this.paperPadding); - }; - EditorComponent.prototype.handleNodeCreation = function (node) { - var _this = this; - node.on('change:size', this._resizeHandler); - node.on('change:position', this._resizeHandler); - if (node.attr('metadata')) { - node.on('change:attrs', function (cell, attrs, changeData) { - var propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, node))) { - _this.performGraphToTextSyncing(); - } - if (_this.renderer && _this.renderer.refreshVisuals) { - _this.renderer.refreshVisuals(node, propAttr, _this.paper); - } - } - }); - } - }; - /** - * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples - * are 'change:source', 'change:target'. - */ - EditorComponent.prototype.handleLinkEvent = function (event, link) { - if (this.renderer && this.renderer.handleLinkEvent) { - this.renderer.handleLinkEvent(this.editorContext, event, link); - } - }; - EditorComponent.prototype.handleLinkCreation = function (link) { - var _this = this; - this.handleLinkEvent('add', link); - link.on('change:source', function (l) { - _this.autosizePaper(); - var newSourceId = l.get('source').id; - var oldSourceId = l.previous('source').id; - if (newSourceId !== oldSourceId) { - _this.performGraphToTextSyncing(); - } - _this.handleLinkEvent('change:source', l); - }); - link.on('change:target', function (l) { - _this.autosizePaper(); - var newTargetId = l.get('target').id; - var oldTargetId = l.previous('target').id; - if (newTargetId !== oldTargetId) { - _this.performGraphToTextSyncing(); - } - _this.handleLinkEvent('change:target', l); - }); - link.on('change:vertices', this._resizeHandler); - link.on('change:attrs', function (cell, attrs, changeData) { - var propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, link))) { - var sourceId = link.get('source').id; - var targetId = link.get('target').id; - _this.performGraphToTextSyncing(); - } - if (_this.renderer && _this.renderer.refreshVisuals) { - _this.renderer.refreshVisuals(link, propAttr, _this.paper); - } - } - }); - this.paper.findViewByModel(link).on('link:options', function () { return _this.handleLinkEvent('options', link); }); - if (this.readOnlyCanvas) { - link.attr('.link-tools/display', 'none'); - } - }; - EditorComponent.prototype.initGraphListeners = function () { - var _this = this; - this.graph.on('add', function (element) { - if (element instanceof joint.dia.Link) { - _this.handleLinkCreation(element); - } - else if (element instanceof joint.dia.Element) { - _this.handleNodeCreation(element); - } - if (element.get('type') === joint.shapes.flo.NODE_TYPE || element.get('type') === joint.shapes.flo.LINK_TYPE) { - _this.performGraphToTextSyncing(); - } - _this.autosizePaper(); - }); - this.graph.on('remove', function (element) { - if (element instanceof joint.dia.Link) { - _this.handleLinkEvent('remove', element); - } - if (_this.selection && _this.selection.model === element) { - _this.selection = undefined; - } - if (element.isLink()) { - window.setTimeout(function () { return _this.performGraphToTextSyncing(); }, 100); - } - else if (element.get('type') === joint.shapes.flo.NODE_TYPE) { - _this.performGraphToTextSyncing(); - } - _this.autosizePaper(); - }); - // Set if link is fan-routed. Should be called before routing call - this.graph.on('change:vertices', function (link, changed, opt) { - if (opt.fanRouted) { - link.set('fanRouted', true); - } - else { - link.unset('fanRouted'); - } - }); - // adjust vertices when a cell is removed or its source/target was changed - this.graph.on('add remove change:source change:target change:vertices change:position', _.partial(Utils.fanRoute, this.graph)); - }; - EditorComponent.prototype.initPaperListeners = function () { - var _this = this; - // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element - this.paper.on('cell:pointerclick', function (cellView) { - if (!_this.readOnlyCanvas) { - _this.selection = cellView; - } - }); - this.paper.on('blank:pointerclick', function () { - _this.selection = undefined; - }); - this.paper.on('scale', this._resizeHandler); - this.paper.on('all', function () { - if (Utils.isCustomPaperEvent(arguments)) { - arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); - } - }); - this.paper.on('dragging-node-over-canvas', function (dndEvent) { - console.debug("Canvas DnD type = " + dndEvent.type); - var location = _this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); - switch (dndEvent.type) { - case Flo.DnDEventType.DRAG: - _this.handleNodeDragging(dndEvent.view, _this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, Constants.CANVAS_CONTEXT); - break; - case Flo.DnDEventType.DROP: - _this.handleNodeDropping(); - break; - default: - break; - } - }); - // JointJS now no longer grabs focus if working in a paper element - crude... - $('#flow-view', this.element.nativeElement).on('mousedown', function () { - $('#palette-filter-textfield', _this.element.nativeElement).focus(); - }); - }; - EditorComponent.prototype.initPaper = function () { - var _this = this; - var options = { - el: $('#paper', this.element.nativeElement), - gridSize: this._gridSize, - drawGrid: true, - model: this.graph, - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.shapes.flo.ElementView /*joint.dia.ElementView*/, - linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint.shapes.flo.LinkView, - // Enable link snapping within 25px lookup radius - snapLinks: { radius: 25 }, - defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ function (cellView, magnet) { - if (_this.renderer && _this.renderer.createLink) { - var linkEnd = { - id: cellView.model.id - }; - if (magnet) { - linkEnd.selector = cellView.getSelector(magnet, undefined); - } - if (magnet.getAttribute('port')) { - linkEnd.port = magnet.getAttribute('port'); - } - if (magnet.getAttribute('port') === 'input') { - return _this.renderer.createLink(undefined, linkEnd); - } - else { - return _this.renderer.createLink(linkEnd, undefined); - } - } - else { - return new joint.shapes.flo.Link(); - } - }, - // decide whether to create a link if the user clicks a magnet - validateMagnet: function (cellView, magnet) { - if (_this.readOnlyCanvas) { - return false; - } - else { - if (_this.editor && _this.editor.validatePort) { - return _this.editor.validatePort(_this.editorContext, cellView, magnet); - } - else { - return true; - } - } - }, - interactive: function (cellView, event) { - if (_this.readOnlyCanvas) { - return false; - } - else { - if (_this.editor && _this.editor.interactive) { - if (typeof _this.editor.interactive === 'function') { - // Type for interactive is wrong in JointJS have to cast to - return _this.editor.interactive(cellView, event); - } - else { - return _this.editor.interactive; - } - } - return true; - } - }, - highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { - 'default': { - name: 'addClass', - options: { - className: 'highlighted' - } - } - }, - markAvailable: true - }; - if (this.renderer && this.renderer.getLinkAnchorPoint) { - options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; - } - if (this.editor && this.editor.validateLink) { - var self_1 = this; - options.validateConnection = function (cellViewS, magnetS, cellViewT, magnetT, end, linkView) { - return self_1.editor.validateLink(_this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); - }; - } - // The paper is what will represent the graph on the screen - this.paper = new joint.dia.Paper(options); - this._disposables.add(Disposable.create(function () { return _this.paper.remove(); })); - }; - EditorComponent.prototype.updatePaletteReadyState = function (ready) { - this.paletteReady.next(ready); - }; - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "metamodel", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "renderer", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "editor", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number) - ], EditorComponent.prototype, "paletteSize", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "minZoom", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "maxZoom", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "zoomStep", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "paperPadding", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "floApi", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "validationMarkers", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "contentValidated", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], EditorComponent.prototype, "dslChange", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", String), - tslib_1.__metadata("design:paramtypes", [String]) - ], EditorComponent.prototype, "dsl", null); - EditorComponent = tslib_1.__decorate([ - Component({ - selector: 'flo-editor', - template: "\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ", - styles: ["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "], - encapsulation: ViewEncapsulation.None - }), - tslib_1.__metadata("design:paramtypes", [ElementRef]) - ], EditorComponent); - return EditorComponent; -}()); -export { EditorComponent }; -//# sourceMappingURL=editor.component.js.map \ No newline at end of file diff --git a/dist/esm5/index.js b/dist/esm5/index.js deleted file mode 100644 index e50ba34..0000000 --- a/dist/esm5/index.js +++ /dev/null @@ -1,12 +0,0 @@ -export { FloModule } from './module'; -export { Palette } from './palette/palette.component'; -export { EditorComponent } from './editor/editor.component'; -export { DslEditorComponent } from './dsl-editor/dsl-editor.component'; -export { CodeEditorComponent } from './code-editor/code-editor.component'; -export { PropertiesGroupComponent } from './properties/properties.group.component'; -export { DynamicFormPropertyComponent } from './properties/df.property.component'; -export { ResizerDirective } from './directives/resizer'; -export * from './shared/flo-common'; -export * from './shared/flo-properties'; -export * from './shared/shapes'; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/esm5/module.js b/dist/esm5/module.js deleted file mode 100644 index bb89c48..0000000 --- a/dist/esm5/module.js +++ /dev/null @@ -1,42 +0,0 @@ -import * as tslib_1 from "tslib"; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { CommonModule } from '@angular/common'; -import { Palette } from './palette/palette.component'; -import { EditorComponent } from './editor/editor.component'; -import { ResizerDirective } from './directives/resizer'; -import { DslEditorComponent } from './dsl-editor/dsl-editor.component'; -import { CodeEditorComponent } from './code-editor/code-editor.component'; -import { PropertiesGroupComponent } from './properties/properties.group.component'; -import { DynamicFormPropertyComponent } from './properties/df.property.component'; -var FloModule = /** @class */ (function () { - function FloModule() { - } - FloModule = tslib_1.__decorate([ - NgModule({ - imports: [ - FormsModule, - CommonModule, - ReactiveFormsModule - ], - declarations: [ - Palette, - EditorComponent, - ResizerDirective, - DslEditorComponent, - CodeEditorComponent, - PropertiesGroupComponent, - DynamicFormPropertyComponent - ], - exports: [ - EditorComponent, - DslEditorComponent, - DynamicFormPropertyComponent, - PropertiesGroupComponent - ] - }) - ], FloModule); - return FloModule; -}()); -export { FloModule }; -//# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/dist/esm5/palette/palette.component.js b/dist/esm5/palette/palette.component.js deleted file mode 100644 index 9862077..0000000 --- a/dist/esm5/palette/palette.component.js +++ /dev/null @@ -1,460 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, ElementRef, Input, Output, EventEmitter, Inject, ViewEncapsulation } from '@angular/core'; -import { Subject } from 'rxjs'; -import { debounceTime } from 'rxjs/operators'; -import { dia } from 'jointjs'; -import { Flo } from '../shared/flo-common'; -import { Shapes, Constants } from '../shared/shapes'; -import { DOCUMENT } from '@angular/platform-browser'; -import * as _$ from 'jquery'; -var joint = Flo.joint; -var $ = _$; -var DEBOUNCE_TIME = 300; -joint.shapes.flo.PaletteGroupHeader = joint.shapes.basic.Generic.extend({ - // The path is the open/close arrow, defaults to vertical (open) - markup: '', - defaults: joint.util.deepSupplement({ - type: 'palette.groupheader', - size: { width: 170, height: 30 }, - position: { x: 0, y: 0 }, - attrs: { - 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, - 'text': { - text: '', - fill: '#eeeeee', - 'ref-x': 0.5, - 'ref-y': 7, - 'x-alignment': 'middle', - 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ - }, - 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } - }, - // custom properties - isOpen: true - }, joint.shapes.basic.Generic.prototype.defaults) -}); -var Palette = /** @class */ (function () { - function Palette(element, document) { - var _this = this; - this.element = element; - this.document = document; - this._metamodelListener = { - metadataError: function (data) { }, - metadataAboutToChange: function () { }, - metadataChanged: function () { return _this.rebuildPalette(); } - }; - this.initialized = false; - this._filterText = ''; - this.filterTextModel = new Subject(); - this.paletteEntryPadding = { width: 12, height: 12 }; - this.onPaletteEntryDrop = new EventEmitter(); - this.paletteReady = new EventEmitter(); - this.paletteFocus = new EventEmitter(); - this.mouseMoveHanlder = function (e) { return _this.handleDrag(e); }; - this.mouseUpHanlder = function (e) { return _this.handleMouseUp(e); }; - this.paletteGraph = new joint.dia.Graph(); - this.paletteGraph.set('type', Constants.PALETTE_CONTEXT); - this._filterText = ''; - this.closedGroups = new Set(); - } - Object.defineProperty(Palette.prototype, "paletteSize", { - set: function (size) { - console.debug('Palette Size: ' + size); - if (this._paletteSize !== size) { - this._paletteSize = size; - this.rebuildPalette(); - } - }, - enumerable: true, - configurable: true - }); - Palette.prototype.onFocus = function () { - this.paletteFocus.emit(); - }; - Palette.prototype.ngOnInit = function () { - var _this = this; - var element = $('#palette-paper', this.element.nativeElement); - // Create the paper for the palette using the specified element view - this.palette = new joint.dia.Paper({ - el: element, - gridSize: 1, - model: this.paletteGraph, - height: $(this.element.nativeElement.parentNode).height(), - width: $(this.element.nativeElement.parentNode).width(), - elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.dia.ElementView), - interactive: false - }); - this.palette.on('cell:pointerup', function (cellview, evt) { - if (_this.viewBeingDragged) { - _this.trigger({ - type: Flo.DnDEventType.DROP, - view: _this.viewBeingDragged, - event: evt - }); - _this.viewBeingDragged = undefined; - } - _this.clickedElement = undefined; - $('#palette-floater').remove(); - if (_this.floaterpaper) { - _this.floaterpaper.remove(); - } - }); - // Toggle the header open/closed on a click - this.palette.on('cell:pointerclick', function (cellview, event) { - // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? - // Click position within the element would be: evt.offsetX, evt.offsetY - var cell = cellview.model; - if (cell.attributes.header) { - // Toggle the header open/closed - if (cell.get('isOpen')) { - _this.rotateClosed(cell); - } - else { - _this.rotateOpen(cell); - } - } - // TODO [palette] ensure other mouse handling events do nothing for headers - // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) - }); - $(this.document).on('mouseup', this.mouseUpHanlder); - if (this.metamodel) { - this.metamodel.load().then(function (data) { - _this.buildPalette(data); - // Add listener to metamodel - if (_this.metamodel && _this.metamodel.subscribe) { - _this.metamodel.subscribe(_this._metamodelListener); - } - // Add debounced listener to filter text changes - _this.filterTextModel - .pipe(debounceTime(DEBOUNCE_TIME)) - .subscribe(function (value) { return _this.rebuildPalette(); }); - _this.initialized = true; - }); - } - else { - console.error('No Metamodel service specified for palette!'); - } - this._paletteSize = this._paletteSize || $(this.element.nativeElement.parentNode).width(); - }; - Palette.prototype.ngOnDestroy = function () { - if (this.metamodel && this.metamodel.unsubscribe) { - this.metamodel.unsubscribe(this._metamodelListener); - } - $(this.document).off('mouseup', this.mouseUpHanlder); - this.palette.remove(); - }; - Palette.prototype.ngOnChanges = function (changes) { - // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { - // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); - // } - }; - Palette.prototype.createPaletteGroup = function (title, isOpen) { - var newGroupHeader = new joint.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); - newGroupHeader.set('header', title); - if (!isOpen) { - newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); - newGroupHeader.set('isOpen', false); - } - this.paletteGraph.addCell(newGroupHeader); - return newGroupHeader; - }; - Palette.prototype.createPaletteEntry = function (title, metadata) { - return Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.palette, - metadata: metadata - }); - }; - Palette.prototype.buildPalette = function (metamodel) { - var _this = this; - var startTime = new Date().getTime(); - this.paletteReady.emit(false); - this.paletteGraph.clear(); - var filterText = this.filterText; - if (filterText) { - filterText = filterText.toLowerCase(); - } - var paletteNodes = []; - var groupAdded = new Set(); - var parentWidth = this._paletteSize; - console.debug("Parent Width: " + parentWidth); - // The field closedGroups tells us which should not be shown - // Work out the list of active groups/nodes based on the filter text - this.metamodel.groups().forEach(function (group) { - if (metamodel && metamodel.has(group)) { - Array.from(metamodel.get(group).keys()).sort().forEach(function (name) { - var node = metamodel.get(group).get(name); - if (node) { - var nodeActive = !(node.metadata && node.metadata.noPaletteEntry); - if (nodeActive && filterText) { - nodeActive = false; - if (name.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - else if (group.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { - // nodeActive = true; - // } - // else if (node.properties) { - // Object.keys(node.properties).sort().forEach(function(propertyName) { - // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || - // (node.properties[propertyName].description && - // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { - // nodeActive=true; - // } - // }); - // } - } - if (nodeActive) { - if (!groupAdded.has(group)) { - var header = _this.createPaletteGroup(group, !_this.closedGroups.has(group)); - header.set('size', { width: parentWidth, height: 30 }); - paletteNodes.push(header); - groupAdded.add(group); - } - if (!_this.closedGroups.has(group)) { - paletteNodes.push(_this.createPaletteEntry(name, node)); - } - } - } - }); - } - }); - var cellWidth = 0, cellHeight = 0; - // Determine the size of the palette entry cell (width and height) - paletteNodes.forEach(function (pnode) { - if (pnode.attr('metadata/name')) { - var dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (cellWidth < dimension.width) { - cellWidth = dimension.width; - } - if (cellHeight < dimension.height) { - cellHeight = dimension.height; - } - } - }); - // Adjust the palette entry cell size with paddings. - cellWidth += 2 * this.paletteEntryPadding.width; - cellHeight += 2 * this.paletteEntryPadding.height; - // Align palette entries row to be at the center - var startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; - var xpos = startX; - var ypos = 0; - var prevNode; - // Layout palette entry nodes - paletteNodes.forEach(function (pnode) { - var dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (pnode.get('header')) { //attributes.attrs.header) { - // Palette entry header - xpos = startX; - pnode.set('position', { x: 0, y: ypos }); - ypos += dimension.height + 5; - } - else { - // Palette entry element - if (xpos + cellWidth > parentWidth) { - // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line - xpos = startX; - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - else { - // Enough real estate to place entry in a row - adjust y position - if (prevNode && prevNode.attr('metadata/name')) { - ypos -= cellHeight; - } - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - // increment x position and y position (can be reorganized) - xpos += cellWidth; - ypos += cellHeight; - } - prevNode = pnode; - }); - this.palette.setDimensions(parentWidth, ypos); - this.paletteReady.emit(true); - console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); - }; - Palette.prototype.rebuildPalette = function () { - var _this = this; - if (this.initialized && this.metamodel) { - this.metamodel.load().then(function (metamodel) { return _this.buildPalette(metamodel); }); - } - }; - Object.defineProperty(Palette.prototype, "filterText", { - get: function () { - return this._filterText; - }, - set: function (text) { - if (this._filterText !== text) { - this._filterText = text; - this.filterTextModel.next(text); - } - }, - enumerable: true, - configurable: true - }); - Palette.prototype.getPaletteView = function (view) { - var self = this; - return view.extend({ - pointerdown: function ( /*evt, x, y*/) { - // Remove the tooltip - // $('.node-tooltip').remove(); - // TODO move metadata to the right place (not inside attrs I think) - self.clickedElement = this.model; - if (self.clickedElement && self.clickedElement.attr('metadata')) { - $(self.document).on('mousemove', self.mouseMoveHanlder); - } - }, - pointermove: function ( /*evt, x, y*/) { - // Nothing to prevent move within the palette canvas - }, - }); - }; - Palette.prototype.handleMouseUp = function (event) { - $(this.document).off('mousemove', this.mouseMoveHanlder); - }; - Palette.prototype.trigger = function (event) { - this.onPaletteEntryDrop.emit(event); - }; - Palette.prototype.handleDrag = function (event) { - // TODO offsetX/Y not on firefox - // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); - // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); - if (this.clickedElement && this.clickedElement.attr('metadata')) { - if (!this.viewBeingDragged) { - var dataOfClickedElement = this.clickedElement.attr('metadata'); - // custom div if not already built. - $('
', { - id: 'palette-floater' - }).appendTo($('body')); - var floatergraph = new joint.dia.Graph(); - floatergraph.set('type', Constants.FEEDBACK_CONTEXT); - var parent_1 = $('#palette-floater'); - this.floaterpaper = new joint.dia.Paper({ - el: $('#palette-floater'), - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint.dia.ElementView, - gridSize: 10, - model: floatergraph, - height: parent_1.height(), - width: parent_1.width(), - validateMagnet: function () { return false; }, - validateConnection: function () { return false; } - }); - // TODO float thing needs to be bigger otherwise icon label is missing - // Initiative drag and drop - create draggable element - var floaternode = Shapes.Factory.createNode({ - 'renderer': this.renderer, - 'paper': this.floaterpaper, - 'graph': floatergraph, - 'metadata': dataOfClickedElement - }); - // Only node view expected - var box = this.floaterpaper.findViewByModel(floaternode).getBBox(); - var size = floaternode.get('size'); - // Account for node real size including ports - floaternode.translate(box.width - size.width, box.height - size.height); - this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); - $('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - } - else { - $('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - this.trigger({ - type: Flo.DnDEventType.DRAG, - view: this.viewBeingDragged, - event: event - }); - } - } - }; - /* - * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) - */ - Palette.prototype.rotateOpen = function (element) { - var _this = this; - setTimeout(function () { return _this.doRotateOpen(element, 90); }); - }; - Palette.prototype.doRotateOpen = function (element, angle) { - var _this = this; - angle -= 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle <= 0) { - element.set('isOpen', true); - this.closedGroups.delete(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(function () { return _this.doRotateOpen(element, angle); }, 10); - } - }; - Palette.prototype.doRotateClose = function (element, angle) { - var _this = this; - angle += 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle >= 90) { - element.set('isOpen', false); - this.closedGroups.add(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(function () { return _this.doRotateClose(element, angle); }, 10); - } - }; - // TODO better name for this function as this does the animation *and* updates the palette - /* - * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) - */ - Palette.prototype.rotateClosed = function (element) { - var _this = this; - setTimeout(function () { return _this.doRotateClose(element, 0); }); - }; - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], Palette.prototype, "metamodel", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], Palette.prototype, "renderer", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], Palette.prototype, "paletteEntryPadding", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], Palette.prototype, "onPaletteEntryDrop", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], Palette.prototype, "paletteReady", void 0); - tslib_1.__decorate([ - Output(), - tslib_1.__metadata("design:type", Object) - ], Palette.prototype, "paletteFocus", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Number), - tslib_1.__metadata("design:paramtypes", [Number]) - ], Palette.prototype, "paletteSize", null); - Palette = tslib_1.__decorate([ - Component({ - selector: 'flo-palette', - template: "\n
\n \n
\n
\n
\n
\n ", - styles: ["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "], - encapsulation: ViewEncapsulation.None - }), - tslib_1.__param(1, Inject(DOCUMENT)), - tslib_1.__metadata("design:paramtypes", [ElementRef, Object]) - ], Palette); - return Palette; -}()); -export { Palette }; -//# sourceMappingURL=palette.component.js.map \ No newline at end of file diff --git a/dist/esm5/properties/df.property.component.js b/dist/esm5/properties/df.property.component.js deleted file mode 100644 index a46b78b..0000000 --- a/dist/esm5/properties/df.property.component.js +++ /dev/null @@ -1,50 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, Input, ViewEncapsulation } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { Properties } from '../shared/flo-properties'; -var DynamicFormPropertyComponent = /** @class */ (function () { - function DynamicFormPropertyComponent() { - } - Object.defineProperty(DynamicFormPropertyComponent.prototype, "types", { - get: function () { - return Properties.InputType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DynamicFormPropertyComponent.prototype, "control", { - get: function () { - return this.form.controls[this.model.id]; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DynamicFormPropertyComponent.prototype, "errorData", { - get: function () { - var _this = this; - return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) - .filter(function (e) { return _this.control.errors && _this.control.errors[e.id]; }); - }, - enumerable: true, - configurable: true - }); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Object) - ], DynamicFormPropertyComponent.prototype, "model", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", FormGroup) - ], DynamicFormPropertyComponent.prototype, "form", void 0); - DynamicFormPropertyComponent = tslib_1.__decorate([ - Component({ - selector: 'df-property', - template: "\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ", - encapsulation: ViewEncapsulation.None - }), - tslib_1.__metadata("design:paramtypes", []) - ], DynamicFormPropertyComponent); - return DynamicFormPropertyComponent; -}()); -export { DynamicFormPropertyComponent }; -//# sourceMappingURL=df.property.component.js.map \ No newline at end of file diff --git a/dist/esm5/properties/properties.group.component.js b/dist/esm5/properties/properties.group.component.js deleted file mode 100644 index 47b0499..0000000 --- a/dist/esm5/properties/properties.group.component.js +++ /dev/null @@ -1,51 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Component, Input, ViewEncapsulation } from '@angular/core'; -import { FormGroup, FormControl } from '@angular/forms'; -import { Properties } from '../shared/flo-properties'; -var PropertiesGroupComponent = /** @class */ (function () { - function PropertiesGroupComponent() { - } - PropertiesGroupComponent.prototype.ngOnInit = function () { - var _this = this; - if (this.propertiesGroupModel.isLoading) { - var subscription_1 = this.propertiesGroupModel.loadedSubject.subscribe(function (loaded) { - if (loaded) { - subscription_1.unsubscribe(); - _this.createGroupControls(); - } - }); - } - else { - this.createGroupControls(); - } - }; - PropertiesGroupComponent.prototype.createGroupControls = function () { - var _this = this; - this.propertiesGroupModel.getControlsModels().forEach(function (c) { - if (c.validation) { - _this.form.addControl(c.id, new FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); - } - else { - _this.form.addControl(c.id, new FormControl(c.value || '')); - } - }); - }; - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", Properties.PropertiesGroupModel) - ], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); - tslib_1.__decorate([ - Input(), - tslib_1.__metadata("design:type", FormGroup) - ], PropertiesGroupComponent.prototype, "form", void 0); - PropertiesGroupComponent = tslib_1.__decorate([ - Component({ - selector: 'properties-group', - template: "\n
\n \n
\n ", - encapsulation: ViewEncapsulation.None - }) - ], PropertiesGroupComponent); - return PropertiesGroupComponent; -}()); -export { PropertiesGroupComponent }; -//# sourceMappingURL=properties.group.component.js.map \ No newline at end of file diff --git a/dist/esm5/shared/flo-common.js b/dist/esm5/shared/flo-common.js deleted file mode 100644 index 4ae8eb8..0000000 --- a/dist/esm5/shared/flo-common.js +++ /dev/null @@ -1,57 +0,0 @@ -import * as _joint from 'jointjs'; -import * as _$ from 'jquery'; -var $ = _$; -export var Flo; -(function (Flo) { - Flo.joint = _joint; - var DnDEventType; - (function (DnDEventType) { - DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; - DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; - })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); - var Severity; - (function (Severity) { - Severity[Severity["Error"] = 0] = "Error"; - Severity[Severity["Warning"] = 1] = "Warning"; - })(Severity = Flo.Severity || (Flo.Severity = {})); - function findMagnetByClass(view, className) { - if (className && className.startsWith('.')) { - className = className.substr(1); - } - var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0; }); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByClass = findMagnetByClass; - function findMagnetByPort(view, port) { - var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('port') === port; }); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByPort = findMagnetByPort; - /** - * Return the metadata for a particular palette entry in a particular group. - * @param name - name of the palette entry - * @param group - group in which the palette entry should exist (e.g. sinks) - * @return - */ - function getMetadata(metamodel, name, group) { - var groupObj = metamodel && group ? metamodel.get(group) : undefined; - if (name && groupObj && groupObj.get(name)) { - return metamodel.get(group).get(name); - } - else { - return { - name: name, - group: group, - unresolved: true, - get: function (property) { return new Promise(function (resolve) { return resolve(); }); }, - properties: function () { return Promise.resolve(new Map()); } - }; - } - } - Flo.getMetadata = getMetadata; -})(Flo || (Flo = {})); -//# sourceMappingURL=flo-common.js.map \ No newline at end of file diff --git a/dist/esm5/shared/flo-properties.js b/dist/esm5/shared/flo-properties.js deleted file mode 100644 index 6123464..0000000 --- a/dist/esm5/shared/flo-properties.js +++ /dev/null @@ -1,345 +0,0 @@ -import * as tslib_1 from "tslib"; -import { Subject, Observable } from 'rxjs'; -import { debounceTime, mergeMap } from 'rxjs/operators'; -export var Properties; -(function (Properties) { - var InputType; - (function (InputType) { - InputType[InputType["TEXT"] = 0] = "TEXT"; - InputType[InputType["NUMBER"] = 1] = "NUMBER"; - InputType[InputType["SELECT"] = 2] = "SELECT"; - InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; - InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; - InputType[InputType["EMAIL"] = 5] = "EMAIL"; - InputType[InputType["URL"] = 6] = "URL"; - InputType[InputType["CODE"] = 7] = "CODE"; - })(InputType = Properties.InputType || (Properties.InputType = {})); - var GenericControlModel = /** @class */ (function () { - function GenericControlModel(_property, type, validation) { - this._property = _property; - this.type = type; - this.validation = validation; - } - Object.defineProperty(GenericControlModel.prototype, "id", { - get: function () { - return this.property.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "name", { - get: function () { - return this.property.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "description", { - get: function () { - return this.property.description; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "defaultValue", { - get: function () { - return this.property.defaultValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "value", { - get: function () { - return this.getValue(); - }, - set: function (value) { - this.setValue(value); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "property", { - get: function () { - return this._property; - }, - enumerable: true, - configurable: true - }); - GenericControlModel.prototype.setValue = function (value) { - this.property.value = value; - }; - GenericControlModel.prototype.getValue = function () { - return this.property.value; - }; - return GenericControlModel; - }()); - Properties.GenericControlModel = GenericControlModel; - var CheckBoxControlModel = /** @class */ (function (_super) { - tslib_1.__extends(CheckBoxControlModel, _super); - function CheckBoxControlModel(_property, validation) { - return _super.call(this, _property, InputType.CHECKBOX, validation) || this; - } - CheckBoxControlModel.prototype.getValue = function () { - var res = _super.prototype.getValue.call(this); - var type = typeof res; - switch (type) { - case 'boolean': - return res; - case 'string': - switch (res.trim().toLowerCase()) { - case 'true': - case '1': - return true; - case 'false': - case '0': - return false; - default: - return this.property.defaultValue; - } - case 'number': - var num = res; - if (num === 0) { - return false; - } - else if (num === 1) { - return true; - } - else { - return this.property.defaultValue; - } - } - return this.property.defaultValue; - }; - return CheckBoxControlModel; - }(GenericControlModel)); - Properties.CheckBoxControlModel = CheckBoxControlModel; - var AbstractCodeControlModel = /** @class */ (function (_super) { - tslib_1.__extends(AbstractCodeControlModel, _super); - function AbstractCodeControlModel(_property, encode, decode, validation) { - var _this = _super.call(this, _property, InputType.CODE, validation) || this; - _this.encode = encode; - _this.decode = decode; - return _this; - } - Object.defineProperty(AbstractCodeControlModel.prototype, "value", { - get: function () { - var dsl = _super.prototype.getValue.call(this); - if (dsl && this.decode) { - return this.decode(dsl); - } - else { - return dsl; - } - }, - set: function (value) { - if (value && this.encode) { - _super.prototype.setValue.call(this, this.encode(value)); - } - else { - _super.prototype.setValue.call(this, value); - } - }, - enumerable: true, - configurable: true - }); - return AbstractCodeControlModel; - }(GenericControlModel)); - Properties.AbstractCodeControlModel = AbstractCodeControlModel; - var GenericCodeControlModel = /** @class */ (function (_super) { - tslib_1.__extends(GenericCodeControlModel, _super); - function GenericCodeControlModel(_property, language, encode, decode, validation) { - var _this = _super.call(this, _property, encode, decode, validation) || this; - _this.language = language; - return _this; - } - return GenericCodeControlModel; - }(AbstractCodeControlModel)); - Properties.GenericCodeControlModel = GenericCodeControlModel; - var CodeControlModelWithDynamicLanguageProperty = /** @class */ (function (_super) { - tslib_1.__extends(CodeControlModelWithDynamicLanguageProperty, _super); - function CodeControlModelWithDynamicLanguageProperty(_property, _languagePropertyName, _groupModel, encode, decode, validation) { - var _this = _super.call(this, _property, encode, decode, validation) || this; - _this._languagePropertyName = _languagePropertyName; - _this._groupModel = _groupModel; - return _this; - } - Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "language", { - get: function () { - var value = this.languageControlModel.value; - return value ? value : this.languageControlModel.defaultValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "languageControlModel", { - get: function () { - var _this = this; - if (!this._langControlModel) { - // Cast to Properties.ControlModel from Properties.ControlModel | undefined - // Should not be undefined! - this._langControlModel = this._groupModel.getControlsModels().find(function (c) { return c.id === _this._languagePropertyName; }); - } - return this._langControlModel; - }, - enumerable: true, - configurable: true - }); - return CodeControlModelWithDynamicLanguageProperty; - }(AbstractCodeControlModel)); - Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; - var GenericListControlModel = /** @class */ (function (_super) { - tslib_1.__extends(GenericListControlModel, _super); - function GenericListControlModel(property, validation) { - return _super.call(this, property, InputType.TEXT, validation) || this; - } - Object.defineProperty(GenericListControlModel.prototype, "value", { - get: function () { - return this.property.value ? this.property.value.join(', ') : ''; - }, - set: function (value) { - this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; - }, - enumerable: true, - configurable: true - }); - return GenericListControlModel; - }(GenericControlModel)); - Properties.GenericListControlModel = GenericListControlModel; - var SelectControlModel = /** @class */ (function (_super) { - tslib_1.__extends(SelectControlModel, _super); - function SelectControlModel(_property, type, options) { - var _this = _super.call(this, _property, type) || this; - _this.options = options; - if (_property.defaultValue === undefined) { - options.unshift({ - name: 'SELECT', - value: _property.defaultValue - }); - } - return _this; - } - return SelectControlModel; - }(GenericControlModel)); - Properties.SelectControlModel = SelectControlModel; - var DefaultCellPropertiesSource = /** @class */ (function () { - function DefaultCellPropertiesSource(cell) { - this.cell = cell; - } - DefaultCellPropertiesSource.prototype.getProperties = function () { - var _this = this; - var metadata = this.cell.attr('metadata'); - return Promise.resolve(metadata.properties().then(function (propsMetadata) { return Array.from(propsMetadata.values()).map(function (m) { return _this.createProperty(m); }); })); - }; - DefaultCellPropertiesSource.prototype.createProperty = function (metadata) { - return { - id: metadata.id, - name: metadata.name, - type: metadata.type, - defaultValue: metadata.defaultValue, - attr: "props/" + metadata.name, - value: this.cell.attr("props/" + metadata.name), - description: metadata.description, - valueOptions: metadata.options - }; - }; - DefaultCellPropertiesSource.prototype.applyChanges = function (properties) { - var _this = this; - this.cell.trigger('batch:start', { batchName: 'update properties' }); - properties.forEach(function (property) { - if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || - (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { - var currentValue = _this.cell.attr(property.attr); - if (currentValue !== undefined && currentValue !== null) { - // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync - _this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); - _this.cell.removeAttr(property.attr); - } - } - else { - _this.cell.attr(property.attr, property.value); - } - }); - this.cell.trigger('batch:stop', { batchName: 'update properties' }); - }; - return DefaultCellPropertiesSource; - }()); - Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; - var PropertiesGroupModel = /** @class */ (function () { - function PropertiesGroupModel(propertiesSource) { - this.loading = true; - this.propertiesSource = propertiesSource; - } - PropertiesGroupModel.prototype.load = function () { - var _this = this; - this.loading = true; - this._loadedSubject = new Subject(); - this.propertiesSource.getProperties().then(function (properties) { - _this.controlModels = properties.map(function (p) { return _this.createControlModel(p); }); - _this.loading = false; - _this._loadedSubject.next(true); - _this._loadedSubject.complete(); - }); - }; - Object.defineProperty(PropertiesGroupModel.prototype, "isLoading", { - get: function () { - return this.loading; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(PropertiesGroupModel.prototype, "loadedSubject", { - get: function () { - return this._loadedSubject; - }, - enumerable: true, - configurable: true - }); - PropertiesGroupModel.prototype.getControlsModels = function () { - return this.controlModels; - }; - PropertiesGroupModel.prototype.createControlModel = function (property) { - return new GenericControlModel(property, InputType.TEXT); - }; - PropertiesGroupModel.prototype.applyChanges = function () { - if (this.loading) { - return; - } - var properties = this.controlModels.map(function (cm) { return cm.property; }); - this.propertiesSource.applyChanges(properties); - }; - return PropertiesGroupModel; - }()); - Properties.PropertiesGroupModel = PropertiesGroupModel; - var Validators; - (function (Validators) { - function uniqueResource(service, debounce) { - return function (control) { - return new Observable(function (obs) { - if (control.valueChanges && control.value) { - control.valueChanges - .pipe(debounceTime(debounce), mergeMap(function (value) { return service(value); })) - .subscribe(function () { - obs.next({ uniqueResource: true }); - obs.complete(); - }, function () { - obs.next(undefined); - obs.complete(); - }); - } - else { - obs.next(undefined); - obs.complete(); - } - }); - }; - } - Validators.uniqueResource = uniqueResource; - function noneOf(excluded) { - return function (control) { - return excluded.find(function (e) { return e === control.value; }) ? { 'noneOf': { value: control.value } } : {}; - }; - } - Validators.noneOf = noneOf; - })(Validators = Properties.Validators || (Properties.Validators = {})); -})(Properties || (Properties = {})); -//# sourceMappingURL=flo-properties.js.map \ No newline at end of file diff --git a/dist/esm5/shared/shapes.js b/dist/esm5/shared/shapes.js deleted file mode 100644 index e563eda..0000000 --- a/dist/esm5/shared/shapes.js +++ /dev/null @@ -1,497 +0,0 @@ -import { Flo } from './flo-common'; -import * as _ from 'lodash'; -import * as _$ from 'jquery'; -var joint = Flo.joint; -var $ = _$; -var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); -var isFF = navigator.userAgent.indexOf('Firefox') > 0; -var IMAGE_W = 120; -var IMAGE_H = 35; -var ERROR_MARKER_SIZE = { width: 16, height: 16 }; -var HANDLE_SIZE = { width: 10, height: 10 }; -joint.shapes.flo = {}; -joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; -joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; -joint.shapes.flo.DECORATION_TYPE = 'decoration'; -joint.shapes.flo.HANDLE_TYPE = 'handle'; -var HANDLE_ICON_MAP = new Map(); -var REMOVE = 'remove'; -HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); -var DECORATION_ICON_MAP = new Map(); -var ERROR = 'error'; -DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); -joint.util.cloneDeep = function (obj) { - return _.cloneDeepWith(obj, function (o) { - if (_.isObject(o) && !_.isPlainObject(o)) { - return o; - } - }); -}; -joint.util.filter.redscale = function (args) { - var amount = Number.isFinite(args.amount) ? args.amount : 1; - return _.template('', { - a: 1 - 0.96 * amount, - b: 0.95 * amount, - c: 0.01 * amount, - d: 0.3 * amount, - e: 0.2 * amount, - f: 1 - 0.9 * amount, - g: 0.7 * amount, - h: 0.05 * amount, - i: 0.05 * amount, - k: 1 - 0.1 * amount - }); -}; -joint.util.filter.orangescale = function (args) { - var amount = Number.isFinite(args.amount) ? args.amount : 1; - return _.template('', { - a: 1.0 + 0.5 * amount, - b: 1.4 * amount, - c: 0.2 * amount, - d: 0.3 * amount, - e: 0.3 * amount, - f: 1 + 0.05 * amount, - g: 0.2 * amount, - h: 0.15 * amount, - i: 0.3 * amount, - k: 0.3 * amount, - l: 1 - 0.6 * amount - }); -}; -joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ - markup: '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.NODE_TYPE, - position: { x: 0, y: 0 }, - size: { width: IMAGE_W, height: IMAGE_H }, - attrs: { - '.': { magnet: false }, - // rounded edges around image - '.border': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - 'fill-opacity': 0, - stroke: '#eeeeee', - 'stroke-width': 0 - }, - '.box': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - //'fill-opacity': 0, // see through - stroke: '#6db33f', - fill: '#eeeeee', - 'stroke-width': 1 - }, - '.input-port': { - port: 'input', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.output-port': { - port: 'output', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.label': { - 'text-anchor': 'middle', - 'ref-x': 0.5, - // 'ref-y': -12, // jointjs specific: relative position to ref'd element - 'ref-y': 0.3, - ref: '.border', - fill: 'black', - 'font-size': 14 - }, - '.label2': { - 'text': '\u21d2', - 'text-anchor': 'middle', - 'ref-x': 0.15, - 'ref-y': 0.2, - ref: '.border', - // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', - fill: 'black', - 'font-size': 24 - }, - '.shape': {}, - '.image': { - width: IMAGE_W, - height: IMAGE_H - } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); -joint.shapes.flo.Link = joint.dia.Link.extend({ - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.LINK_TYPE, - attrs: { - '.connection': { stroke: '#34302d', 'stroke-width': 2 }, - // Lots of alternatives that have been played with: - // '.smoooth': true - // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, - // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, - // '.connection': { 'stroke':'black'}, - // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, - // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, - // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) - // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, - // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, - // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, - // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, - '.marker-arrowheads': { display: 'none' }, - '.tool-options': { display: 'none' } - }, - }, joint.dia.Link.prototype.defaults) -}); -joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ - options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), - _beforeArrowheadMove: function () { - if (this.model.get('source').id) { - this._oldSource = this.model.get('source'); - } - if (this.model.get('target').id) { - this._oldTarget = this.model.get('target'); - } - joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); - }, - _afterArrowheadMove: function () { - joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); - if (!this.model.get('source').id) { - if (this._oldSource) { - this.model.set('source', this._oldSource); - } - else { - this.model.remove(); - } - } - if (!this.model.get('target').id) { - if (this._oldTarget) { - this.model.set('target', this._oldTarget); - } - else { - this.model.remove(); - } - } - delete this._oldSource; - delete this._oldTarget; - } -}); -// TODO: must do cleanup for the `mainElementView' -joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ - // canShowTooltip: true, - beingDragged: false, - // _tempZorder: 0, - _tempOpacity: 1.0, - _hovering: false, - dragLinkStart: function (evt, magnet, x, y) { - this.model.startBatch('add-link'); - var linkView = this.addLinkFromMagnet(magnet, x, y); - // backwards compatiblity events - joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); - linkView.notify('link:pointerdown', evt, x, y); - /*** START MAIN DIFF ***/ - var sourceOrTarget = $(magnet).attr('port') === 'input' ? 'source' : 'target'; - linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); - /*** END MAIN DIFF ***/ - this.eventData(evt, { linkView: linkView }); - }, - addLinkFromMagnet: function (magnet, x, y) { - var paper = this.paper; - var graph = paper.model; - var link = paper.getDefaultLink(this, magnet); - var sourceEnd, targetEnd; - /*** START MAIN DIFF ***/ - if ($(magnet).attr('port') === 'input') { - sourceEnd = { x: x, y: y }; - targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); - } - else { - sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); - targetEnd = { x: x, y: y }; - } - /*** END MAIN DIFF ***/ - link.set({ - source: sourceEnd, - target: targetEnd - }).addTo(graph, { - async: false, - ui: true - }); - return link.findView(paper); - }, - // pointerdown: function(evt: any, x: number, y: number) { - // // this.canShowTooltip = false; - // // this.hideTooltip(); - // this.beingDragged = false; - // this._tempOpacity = this.model.attr('./opacity'); - // - // this.model.trigger('batch:start'); - // - // if ( // target is a valid magnet start linking - // evt.target.getAttribute('magnet') && - // this.paper.options.validateMagnet.call(this.paper, this, evt.target) - // ) { - // let link = this.paper.getDefaultLink(this, evt.target); - // if ($(evt.target).attr('port') === 'input') { - // link.set({ - // source: { x: x, y: y }, - // target: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // } - // }); - // } else { - // link.set({ - // source: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // }, - // target: { x: x, y: y } - // }); - // } - // this.paper.model.addCell(link); - // this._linkView = this.paper.findViewByModel(link); - // if ($(evt.target).attr('port') === 'input') { - // this._linkView.startArrowheadMove('source'); - // } else { - // this._linkView.startArrowheadMove('target'); - // } - // this.paper.__creatingLinkFromPort = true; - // } else { - // this._dx = x; - // this._dy = y; - // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); - // } - // }, - drag: function (evt, x, y) { - var interactive = _.isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : - this.options.interactive; - if (interactive !== false) { - this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DRAG, view: this, event: evt }); - } - joint.dia.ElementView.prototype.drag.apply(this, arguments); - }, - dragEnd: function (evt, x, y) { - this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DROP, view: this, event: evt }); - joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); - }, -}); -joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ - markup: '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.DECORATION_TYPE, - size: ERROR_MARKER_SIZE, - attrs: { - 'image': ERROR_MARKER_SIZE - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); -export var Constants; -(function (Constants) { - Constants.REMOVE_HANDLE_TYPE = REMOVE; - Constants.PROPERTIES_HANDLE_TYPE = 'properties'; - Constants.ERROR_DECORATION_KIND = ERROR; - Constants.PALETTE_CONTEXT = 'palette'; - Constants.CANVAS_CONTEXT = 'canvas'; - Constants.FEEDBACK_CONTEXT = 'feedback'; -})(Constants || (Constants = {})); -export var Shapes; -(function (Shapes) { - var Factory = /** @class */ (function () { - function Factory() { - } - /** - * Create a JointJS node that embeds extra metadata (properties). - */ - Factory.createNode = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var metadata = params.metadata; - var position = params.position; - var props = params.props; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - var node; - if (!position) { - position = { x: 0, y: 0 }; - } - if (renderer && _.isFunction(renderer.createNode)) { - node = renderer.createNode(metadata, props); - } - else { - node = new joint.shapes.flo.Node(); - if (metadata) { - node.attr('.label/text', metadata.name); - } - } - node.set('type', joint.shapes.flo.NODE_TYPE); - if (position) { - node.set('position', position); - } - if (props) { - Array.from(props.keys()).forEach(function (key) { return node.attr("props/" + key, props.get(key)); }); - } - node.attr('metadata', metadata); - if (graph) { - graph.addCell(node); - } - if (renderer && _.isFunction(renderer.initializeNewNode)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewNode(node, descriptor); - } - return node; - }; - Factory.createLink = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var metadata = params.metadata; - var source = params.source; - var target = params.target; - var props = params.props; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - var link; - if (renderer && _.isFunction(renderer.createLink)) { - link = renderer.createLink(source, target, metadata, props); - } - else { - link = new joint.shapes.flo.Link(); - } - if (source) { - link.set('source', source); - } - if (target) { - link.set('target', target); - } - link.set('type', joint.shapes.flo.LINK_TYPE); - if (metadata) { - link.attr('metadata', metadata); - } - if (props) { - Array.from(props.keys()).forEach(function (key) { return link.attr("props/" + key, props.get(key)); }); - } - if (graph) { - graph.addCell(link); - } - if (renderer && _.isFunction(renderer.initializeNewLink)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewLink(link, descriptor); - } - // prevent creation of link breaks - link.attr('.marker-vertices/display', 'none'); - return link; - }; - Factory.createDecoration = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var parent = params.parent; - var kind = params.kind; - var messages = params.messages; - var location = params.position; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - if (!location) { - location = { x: 0, y: 0 }; - } - var decoration; - if (renderer && _.isFunction(renderer.createDecoration)) { - decoration = renderer.createDecoration(kind, parent); - } - else { - decoration = new joint.shapes.flo.ErrorDecoration({ - attrs: { - image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, - } - }); - } - decoration.set('type', joint.shapes.flo.DECORATION_TYPE); - decoration.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - decoration.set('z', parent.get('z') + 1); - } - decoration.attr('./kind', kind); - decoration.attr('messages', messages); - if (graph) { - graph.addCell(decoration); - } - parent.embed(decoration); - if (renderer && _.isFunction(renderer.initializeNewDecoration)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewDecoration(decoration, descriptor); - } - return decoration; - }; - Factory.createHandle = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var parent = params.parent; - var kind = params.kind; - var location = params.position; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - var handle; - if (!location) { - location = { x: 0, y: 0 }; - } - if (renderer && _.isFunction(renderer.createHandle)) { - handle = renderer.createHandle(kind, parent); - } - else { - handle = new joint.shapes.flo.ErrorDecoration({ - size: HANDLE_SIZE, - attrs: { - 'image': { - 'xlink:href': HANDLE_ICON_MAP.get(kind) - } - } - }); - } - handle.set('type', joint.shapes.flo.HANDLE_TYPE); - handle.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - handle.set('z', parent.get('z') + 1); - } - handle.attr('./kind', kind); - if (graph) { - graph.addCell(handle); - } - parent.embed(handle); - if (renderer && _.isFunction(renderer.initializeNewHandle)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewHandle(handle, descriptor); - } - return handle; - }; - return Factory; - }()); - Shapes.Factory = Factory; -})(Shapes || (Shapes = {})); -//# sourceMappingURL=shapes.js.map \ No newline at end of file diff --git a/dist/esm5/spring-flo.js b/dist/esm5/spring-flo.js deleted file mode 100644 index 31c32cd..0000000 --- a/dist/esm5/spring-flo.js +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Generated bundle index. Do not edit. - */ -export * from './index'; -//# sourceMappingURL=spring-flo.js.map \ No newline at end of file diff --git a/dist/fesm2015/spring-flo.js b/dist/fesm2015/spring-flo.js deleted file mode 100644 index 7744b71..0000000 --- a/dist/fesm2015/spring-flo.js +++ /dev/null @@ -1,3902 +0,0 @@ -import * as _joint from 'jointjs'; -import * as _$ from 'jquery'; -import { isEqual, partial, debounce, cloneDeepWith, isObject, isPlainObject, template, isFunction, groupBy, each, isString, isNumber } from 'lodash'; -import { __decorate, __metadata, __param } from 'tslib'; -import { Component, ElementRef, Input, Output, EventEmitter, Inject, ViewEncapsulation, Directive, forwardRef, NgModule } from '@angular/core'; -import { Subject, BehaviorSubject, fromEvent, Observable } from 'rxjs'; -import { debounceTime, sampleTime, mergeMap } from 'rxjs/operators'; -import { DOCUMENT } from '@angular/platform-browser'; -import { CompositeDisposable, Disposable } from 'ts-disposables'; -import { fromTextArea, findModeByName } from 'codemirror-minified'; -import 'codemirror-minified/addon/lint/lint'; -import 'codemirror-minified/addon/hint/show-hint'; -import 'codemirror-minified/addon/display/placeholder'; -import 'codemirror-minified/addon/scroll/annotatescrollbar'; -import 'codemirror-minified/addon/scroll/simplescrollbars'; -import { NG_VALUE_ACCESSOR, FormGroup, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; -import 'codemirror-minified/mode/meta'; -import 'codemirror-minified/addon/edit/matchbrackets'; -import 'codemirror-minified/addon/edit/closebrackets'; -import 'codemirror-minified/addon/lint/javascript-lint'; -import 'codemirror-minified/addon/lint/coffeescript-lint'; -import 'codemirror-minified/addon/lint/json-lint'; -import 'codemirror-minified/addon/lint/yaml-lint'; -import 'codemirror-minified/mode/groovy/groovy'; -import 'codemirror-minified/mode/javascript/javascript'; -import 'codemirror-minified/mode/python/python'; -import 'codemirror-minified/mode/ruby/ruby'; -import 'codemirror-minified/mode/clike/clike'; -import 'codemirror-minified/mode/yaml/yaml'; -import 'codemirror-minified/mode/coffeescript/coffeescript'; -import { CommonModule } from '@angular/common'; - -const $ = _$; -var Flo; -(function (Flo) { - Flo.joint = _joint; - let DnDEventType; - (function (DnDEventType) { - DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; - DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; - })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); - let Severity; - (function (Severity) { - Severity[Severity["Error"] = 0] = "Error"; - Severity[Severity["Warning"] = 1] = "Warning"; - })(Severity = Flo.Severity || (Flo.Severity = {})); - function findMagnetByClass(view, className) { - if (className && className.startsWith('.')) { - className = className.substr(1); - } - const element = view.$('[magnet]').toArray().find((magnet) => magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByClass = findMagnetByClass; - function findMagnetByPort(view, port) { - const element = view.$('[magnet]').toArray().find((magnet) => magnet.getAttribute('port') === port); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByPort = findMagnetByPort; - /** - * Return the metadata for a particular palette entry in a particular group. - * @param name - name of the palette entry - * @param group - group in which the palette entry should exist (e.g. sinks) - * @return - */ - function getMetadata(metamodel, name, group) { - const groupObj = metamodel && group ? metamodel.get(group) : undefined; - if (name && groupObj && groupObj.get(name)) { - return metamodel.get(group).get(name); - } - else { - return { - name: name, - group: group, - unresolved: true, - get: (property) => new Promise(resolve => resolve()), - properties: () => Promise.resolve(new Map()) - }; - } - } - Flo.getMetadata = getMetadata; -})(Flo || (Flo = {})); - -const joint = Flo.joint; -const $$1 = _$; -const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); -const isFF = navigator.userAgent.indexOf('Firefox') > 0; -const IMAGE_W = 120; -const IMAGE_H = 35; -const ERROR_MARKER_SIZE = { width: 16, height: 16 }; -const HANDLE_SIZE = { width: 10, height: 10 }; -joint.shapes.flo = {}; -joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; -joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; -joint.shapes.flo.DECORATION_TYPE = 'decoration'; -joint.shapes.flo.HANDLE_TYPE = 'handle'; -const HANDLE_ICON_MAP = new Map(); -const REMOVE = 'remove'; -HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); -const DECORATION_ICON_MAP = new Map(); -const ERROR = 'error'; -DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); -joint.util.cloneDeep = (obj) => { - return cloneDeepWith(obj, (o) => { - if (isObject(o) && !isPlainObject(o)) { - return o; - } - }); -}; -joint.util.filter.redscale = (args) => { - let amount = Number.isFinite(args.amount) ? args.amount : 1; - return template('', { - a: 1 - 0.96 * amount, - b: 0.95 * amount, - c: 0.01 * amount, - d: 0.3 * amount, - e: 0.2 * amount, - f: 1 - 0.9 * amount, - g: 0.7 * amount, - h: 0.05 * amount, - i: 0.05 * amount, - k: 1 - 0.1 * amount - }); -}; -joint.util.filter.orangescale = (args) => { - let amount = Number.isFinite(args.amount) ? args.amount : 1; - return template('', { - a: 1.0 + 0.5 * amount, - b: 1.4 * amount, - c: 0.2 * amount, - d: 0.3 * amount, - e: 0.3 * amount, - f: 1 + 0.05 * amount, - g: 0.2 * amount, - h: 0.15 * amount, - i: 0.3 * amount, - k: 0.3 * amount, - l: 1 - 0.6 * amount - }); -}; -joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ - markup: '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.NODE_TYPE, - position: { x: 0, y: 0 }, - size: { width: IMAGE_W, height: IMAGE_H }, - attrs: { - '.': { magnet: false }, - // rounded edges around image - '.border': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - 'fill-opacity': 0, - stroke: '#eeeeee', - 'stroke-width': 0 - }, - '.box': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - //'fill-opacity': 0, // see through - stroke: '#6db33f', - fill: '#eeeeee', - 'stroke-width': 1 - }, - '.input-port': { - port: 'input', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.output-port': { - port: 'output', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.label': { - 'text-anchor': 'middle', - 'ref-x': 0.5, - // 'ref-y': -12, // jointjs specific: relative position to ref'd element - 'ref-y': 0.3, - ref: '.border', - fill: 'black', - 'font-size': 14 - }, - '.label2': { - 'text': '\u21d2', - 'text-anchor': 'middle', - 'ref-x': 0.15, - 'ref-y': 0.2, - ref: '.border', - // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', - fill: 'black', - 'font-size': 24 - }, - '.shape': {}, - '.image': { - width: IMAGE_W, - height: IMAGE_H - } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); -joint.shapes.flo.Link = joint.dia.Link.extend({ - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.LINK_TYPE, - attrs: { - '.connection': { stroke: '#34302d', 'stroke-width': 2 }, - // Lots of alternatives that have been played with: - // '.smoooth': true - // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, - // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, - // '.connection': { 'stroke':'black'}, - // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, - // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, - // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) - // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, - // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, - // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, - // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, - '.marker-arrowheads': { display: 'none' }, - '.tool-options': { display: 'none' } - }, - }, joint.dia.Link.prototype.defaults) -}); -joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ - options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), - _beforeArrowheadMove: function () { - if (this.model.get('source').id) { - this._oldSource = this.model.get('source'); - } - if (this.model.get('target').id) { - this._oldTarget = this.model.get('target'); - } - joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); - }, - _afterArrowheadMove: function () { - joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); - if (!this.model.get('source').id) { - if (this._oldSource) { - this.model.set('source', this._oldSource); - } - else { - this.model.remove(); - } - } - if (!this.model.get('target').id) { - if (this._oldTarget) { - this.model.set('target', this._oldTarget); - } - else { - this.model.remove(); - } - } - delete this._oldSource; - delete this._oldTarget; - } -}); -// TODO: must do cleanup for the `mainElementView' -joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ - // canShowTooltip: true, - beingDragged: false, - // _tempZorder: 0, - _tempOpacity: 1.0, - _hovering: false, - dragLinkStart: function (evt, magnet, x, y) { - this.model.startBatch('add-link'); - const linkView = this.addLinkFromMagnet(magnet, x, y); - // backwards compatiblity events - joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); - linkView.notify('link:pointerdown', evt, x, y); - /*** START MAIN DIFF ***/ - const sourceOrTarget = $$1(magnet).attr('port') === 'input' ? 'source' : 'target'; - linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); - /*** END MAIN DIFF ***/ - this.eventData(evt, { linkView: linkView }); - }, - addLinkFromMagnet: function (magnet, x, y) { - const paper = this.paper; - const graph = paper.model; - const link = paper.getDefaultLink(this, magnet); - let sourceEnd, targetEnd; - /*** START MAIN DIFF ***/ - if ($$1(magnet).attr('port') === 'input') { - sourceEnd = { x: x, y: y }; - targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); - } - else { - sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); - targetEnd = { x: x, y: y }; - } - /*** END MAIN DIFF ***/ - link.set({ - source: sourceEnd, - target: targetEnd - }).addTo(graph, { - async: false, - ui: true - }); - return link.findView(paper); - }, - // pointerdown: function(evt: any, x: number, y: number) { - // // this.canShowTooltip = false; - // // this.hideTooltip(); - // this.beingDragged = false; - // this._tempOpacity = this.model.attr('./opacity'); - // - // this.model.trigger('batch:start'); - // - // if ( // target is a valid magnet start linking - // evt.target.getAttribute('magnet') && - // this.paper.options.validateMagnet.call(this.paper, this, evt.target) - // ) { - // let link = this.paper.getDefaultLink(this, evt.target); - // if ($(evt.target).attr('port') === 'input') { - // link.set({ - // source: { x: x, y: y }, - // target: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // } - // }); - // } else { - // link.set({ - // source: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // }, - // target: { x: x, y: y } - // }); - // } - // this.paper.model.addCell(link); - // this._linkView = this.paper.findViewByModel(link); - // if ($(evt.target).attr('port') === 'input') { - // this._linkView.startArrowheadMove('source'); - // } else { - // this._linkView.startArrowheadMove('target'); - // } - // this.paper.__creatingLinkFromPort = true; - // } else { - // this._dx = x; - // this._dy = y; - // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); - // } - // }, - drag: function (evt, x, y) { - let interactive = isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : - this.options.interactive; - if (interactive !== false) { - this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DRAG, view: this, event: evt }); - } - joint.dia.ElementView.prototype.drag.apply(this, arguments); - }, - dragEnd: function (evt, x, y) { - this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DROP, view: this, event: evt }); - joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); - }, -}); -joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ - markup: '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.DECORATION_TYPE, - size: ERROR_MARKER_SIZE, - attrs: { - 'image': ERROR_MARKER_SIZE - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); -var Constants; -(function (Constants) { - Constants.REMOVE_HANDLE_TYPE = REMOVE; - Constants.PROPERTIES_HANDLE_TYPE = 'properties'; - Constants.ERROR_DECORATION_KIND = ERROR; - Constants.PALETTE_CONTEXT = 'palette'; - Constants.CANVAS_CONTEXT = 'canvas'; - Constants.FEEDBACK_CONTEXT = 'feedback'; -})(Constants || (Constants = {})); -var Shapes; -(function (Shapes) { - class Factory { - /** - * Create a JointJS node that embeds extra metadata (properties). - */ - static createNode(params) { - let renderer = params.renderer; - let paper = params.paper; - let metadata = params.metadata; - let position = params.position; - let props = params.props; - let graph = params.graph || (params.paper ? params.paper.model : undefined); - let node; - if (!position) { - position = { x: 0, y: 0 }; - } - if (renderer && isFunction(renderer.createNode)) { - node = renderer.createNode(metadata, props); - } - else { - node = new joint.shapes.flo.Node(); - if (metadata) { - node.attr('.label/text', metadata.name); - } - } - node.set('type', joint.shapes.flo.NODE_TYPE); - if (position) { - node.set('position', position); - } - if (props) { - Array.from(props.keys()).forEach(key => node.attr(`props/${key}`, props.get(key))); - } - node.attr('metadata', metadata); - if (graph) { - graph.addCell(node); - } - if (renderer && isFunction(renderer.initializeNewNode)) { - let descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewNode(node, descriptor); - } - return node; - } - static createLink(params) { - let renderer = params.renderer; - let paper = params.paper; - let metadata = params.metadata; - let source = params.source; - let target = params.target; - let props = params.props; - let graph = params.graph || (params.paper ? params.paper.model : undefined); - let link; - if (renderer && isFunction(renderer.createLink)) { - link = renderer.createLink(source, target, metadata, props); - } - else { - link = new joint.shapes.flo.Link(); - } - if (source) { - link.set('source', source); - } - if (target) { - link.set('target', target); - } - link.set('type', joint.shapes.flo.LINK_TYPE); - if (metadata) { - link.attr('metadata', metadata); - } - if (props) { - Array.from(props.keys()).forEach(key => link.attr(`props/${key}`, props.get(key))); - } - if (graph) { - graph.addCell(link); - } - if (renderer && isFunction(renderer.initializeNewLink)) { - let descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewLink(link, descriptor); - } - // prevent creation of link breaks - link.attr('.marker-vertices/display', 'none'); - return link; - } - static createDecoration(params) { - let renderer = params.renderer; - let paper = params.paper; - let parent = params.parent; - let kind = params.kind; - let messages = params.messages; - let location = params.position; - let graph = params.graph || (params.paper ? params.paper.model : undefined); - if (!location) { - location = { x: 0, y: 0 }; - } - let decoration; - if (renderer && isFunction(renderer.createDecoration)) { - decoration = renderer.createDecoration(kind, parent); - } - else { - decoration = new joint.shapes.flo.ErrorDecoration({ - attrs: { - image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, - } - }); - } - decoration.set('type', joint.shapes.flo.DECORATION_TYPE); - decoration.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - decoration.set('z', parent.get('z') + 1); - } - decoration.attr('./kind', kind); - decoration.attr('messages', messages); - if (graph) { - graph.addCell(decoration); - } - parent.embed(decoration); - if (renderer && isFunction(renderer.initializeNewDecoration)) { - let descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewDecoration(decoration, descriptor); - } - return decoration; - } - static createHandle(params) { - let renderer = params.renderer; - let paper = params.paper; - let parent = params.parent; - let kind = params.kind; - let location = params.position; - let graph = params.graph || (params.paper ? params.paper.model : undefined); - let handle; - if (!location) { - location = { x: 0, y: 0 }; - } - if (renderer && isFunction(renderer.createHandle)) { - handle = renderer.createHandle(kind, parent); - } - else { - handle = new joint.shapes.flo.ErrorDecoration({ - size: HANDLE_SIZE, - attrs: { - 'image': { - 'xlink:href': HANDLE_ICON_MAP.get(kind) - } - } - }); - } - handle.set('type', joint.shapes.flo.HANDLE_TYPE); - handle.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - handle.set('z', parent.get('z') + 1); - } - handle.attr('./kind', kind); - if (graph) { - graph.addCell(handle); - } - parent.embed(handle); - if (renderer && isFunction(renderer.initializeNewHandle)) { - let descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewHandle(handle, descriptor); - } - return handle; - } - } - Shapes.Factory = Factory; -})(Shapes || (Shapes = {})); - -const joint$1 = Flo.joint; -const $$2 = _$; -const DEBOUNCE_TIME = 300; -joint$1.shapes.flo.PaletteGroupHeader = joint$1.shapes.basic.Generic.extend({ - // The path is the open/close arrow, defaults to vertical (open) - markup: '', - defaults: joint$1.util.deepSupplement({ - type: 'palette.groupheader', - size: { width: 170, height: 30 }, - position: { x: 0, y: 0 }, - attrs: { - 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, - 'text': { - text: '', - fill: '#eeeeee', - 'ref-x': 0.5, - 'ref-y': 7, - 'x-alignment': 'middle', - 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ - }, - 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } - }, - // custom properties - isOpen: true - }, joint$1.shapes.basic.Generic.prototype.defaults) -}); -let Palette = class Palette { - constructor(element, document) { - this.element = element; - this.document = document; - this._metamodelListener = { - metadataError: (data) => { }, - metadataAboutToChange: () => { }, - metadataChanged: () => this.rebuildPalette() - }; - this.initialized = false; - this._filterText = ''; - this.filterTextModel = new Subject(); - this.paletteEntryPadding = { width: 12, height: 12 }; - this.onPaletteEntryDrop = new EventEmitter(); - this.paletteReady = new EventEmitter(); - this.paletteFocus = new EventEmitter(); - this.mouseMoveHanlder = (e) => this.handleDrag(e); - this.mouseUpHanlder = (e) => this.handleMouseUp(e); - this.paletteGraph = new joint$1.dia.Graph(); - this.paletteGraph.set('type', Constants.PALETTE_CONTEXT); - this._filterText = ''; - this.closedGroups = new Set(); - } - set paletteSize(size) { - console.debug('Palette Size: ' + size); - if (this._paletteSize !== size) { - this._paletteSize = size; - this.rebuildPalette(); - } - } - onFocus() { - this.paletteFocus.emit(); - } - ngOnInit() { - let element = $$2('#palette-paper', this.element.nativeElement); - // Create the paper for the palette using the specified element view - this.palette = new joint$1.dia.Paper({ - el: element, - gridSize: 1, - model: this.paletteGraph, - height: $$2(this.element.nativeElement.parentNode).height(), - width: $$2(this.element.nativeElement.parentNode).width(), - elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView), - interactive: false - }); - this.palette.on('cell:pointerup', (cellview, evt) => { - if (this.viewBeingDragged) { - this.trigger({ - type: Flo.DnDEventType.DROP, - view: this.viewBeingDragged, - event: evt - }); - this.viewBeingDragged = undefined; - } - this.clickedElement = undefined; - $$2('#palette-floater').remove(); - if (this.floaterpaper) { - this.floaterpaper.remove(); - } - }); - // Toggle the header open/closed on a click - this.palette.on('cell:pointerclick', (cellview, event) => { - // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? - // Click position within the element would be: evt.offsetX, evt.offsetY - const cell = cellview.model; - if (cell.attributes.header) { - // Toggle the header open/closed - if (cell.get('isOpen')) { - this.rotateClosed(cell); - } - else { - this.rotateOpen(cell); - } - } - // TODO [palette] ensure other mouse handling events do nothing for headers - // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) - }); - $$2(this.document).on('mouseup', this.mouseUpHanlder); - if (this.metamodel) { - this.metamodel.load().then(data => { - this.buildPalette(data); - // Add listener to metamodel - if (this.metamodel && this.metamodel.subscribe) { - this.metamodel.subscribe(this._metamodelListener); - } - // Add debounced listener to filter text changes - this.filterTextModel - .pipe(debounceTime(DEBOUNCE_TIME)) - .subscribe((value) => this.rebuildPalette()); - this.initialized = true; - }); - } - else { - console.error('No Metamodel service specified for palette!'); - } - this._paletteSize = this._paletteSize || $$2(this.element.nativeElement.parentNode).width(); - } - ngOnDestroy() { - if (this.metamodel && this.metamodel.unsubscribe) { - this.metamodel.unsubscribe(this._metamodelListener); - } - $$2(this.document).off('mouseup', this.mouseUpHanlder); - this.palette.remove(); - } - ngOnChanges(changes) { - // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { - // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); - // } - } - createPaletteGroup(title, isOpen) { - let newGroupHeader = new joint$1.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); - newGroupHeader.set('header', title); - if (!isOpen) { - newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); - newGroupHeader.set('isOpen', false); - } - this.paletteGraph.addCell(newGroupHeader); - return newGroupHeader; - } - createPaletteEntry(title, metadata) { - return Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.palette, - metadata: metadata - }); - } - buildPalette(metamodel) { - let startTime = new Date().getTime(); - this.paletteReady.emit(false); - this.paletteGraph.clear(); - let filterText = this.filterText; - if (filterText) { - filterText = filterText.toLowerCase(); - } - let paletteNodes = []; - let groupAdded = new Set(); - let parentWidth = this._paletteSize; - console.debug(`Parent Width: ${parentWidth}`); - // The field closedGroups tells us which should not be shown - // Work out the list of active groups/nodes based on the filter text - this.metamodel.groups().forEach(group => { - if (metamodel && metamodel.has(group)) { - Array.from(metamodel.get(group).keys()).sort().forEach(name => { - let node = metamodel.get(group).get(name); - if (node) { - let nodeActive = !(node.metadata && node.metadata.noPaletteEntry); - if (nodeActive && filterText) { - nodeActive = false; - if (name.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - else if (group.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { - // nodeActive = true; - // } - // else if (node.properties) { - // Object.keys(node.properties).sort().forEach(function(propertyName) { - // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || - // (node.properties[propertyName].description && - // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { - // nodeActive=true; - // } - // }); - // } - } - if (nodeActive) { - if (!groupAdded.has(group)) { - let header = this.createPaletteGroup(group, !this.closedGroups.has(group)); - header.set('size', { width: parentWidth, height: 30 }); - paletteNodes.push(header); - groupAdded.add(group); - } - if (!this.closedGroups.has(group)) { - paletteNodes.push(this.createPaletteEntry(name, node)); - } - } - } - }); - } - }); - let cellWidth = 0, cellHeight = 0; - // Determine the size of the palette entry cell (width and height) - paletteNodes.forEach(pnode => { - if (pnode.attr('metadata/name')) { - let dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (cellWidth < dimension.width) { - cellWidth = dimension.width; - } - if (cellHeight < dimension.height) { - cellHeight = dimension.height; - } - } - }); - // Adjust the palette entry cell size with paddings. - cellWidth += 2 * this.paletteEntryPadding.width; - cellHeight += 2 * this.paletteEntryPadding.height; - // Align palette entries row to be at the center - let startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; - let xpos = startX; - let ypos = 0; - let prevNode; - // Layout palette entry nodes - paletteNodes.forEach(pnode => { - let dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (pnode.get('header')) { //attributes.attrs.header) { - // Palette entry header - xpos = startX; - pnode.set('position', { x: 0, y: ypos }); - ypos += dimension.height + 5; - } - else { - // Palette entry element - if (xpos + cellWidth > parentWidth) { - // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line - xpos = startX; - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - else { - // Enough real estate to place entry in a row - adjust y position - if (prevNode && prevNode.attr('metadata/name')) { - ypos -= cellHeight; - } - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - // increment x position and y position (can be reorganized) - xpos += cellWidth; - ypos += cellHeight; - } - prevNode = pnode; - }); - this.palette.setDimensions(parentWidth, ypos); - this.paletteReady.emit(true); - console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); - } - rebuildPalette() { - if (this.initialized && this.metamodel) { - this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); - } - } - set filterText(text) { - if (this._filterText !== text) { - this._filterText = text; - this.filterTextModel.next(text); - } - } - get filterText() { - return this._filterText; - } - getPaletteView(view) { - let self = this; - return view.extend({ - pointerdown: function ( /*evt, x, y*/) { - // Remove the tooltip - // $('.node-tooltip').remove(); - // TODO move metadata to the right place (not inside attrs I think) - self.clickedElement = this.model; - if (self.clickedElement && self.clickedElement.attr('metadata')) { - $$2(self.document).on('mousemove', self.mouseMoveHanlder); - } - }, - pointermove: function ( /*evt, x, y*/) { - // Nothing to prevent move within the palette canvas - }, - }); - } - handleMouseUp(event) { - $$2(this.document).off('mousemove', this.mouseMoveHanlder); - } - trigger(event) { - this.onPaletteEntryDrop.emit(event); - } - handleDrag(event) { - // TODO offsetX/Y not on firefox - // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); - // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); - if (this.clickedElement && this.clickedElement.attr('metadata')) { - if (!this.viewBeingDragged) { - let dataOfClickedElement = this.clickedElement.attr('metadata'); - // custom div if not already built. - $$2('
', { - id: 'palette-floater' - }).appendTo($$2('body')); - let floatergraph = new joint$1.dia.Graph(); - floatergraph.set('type', Constants.FEEDBACK_CONTEXT); - const parent = $$2('#palette-floater'); - this.floaterpaper = new joint$1.dia.Paper({ - el: $$2('#palette-floater'), - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView, - gridSize: 10, - model: floatergraph, - height: parent.height(), - width: parent.width(), - validateMagnet: () => false, - validateConnection: () => false - }); - // TODO float thing needs to be bigger otherwise icon label is missing - // Initiative drag and drop - create draggable element - let floaternode = Shapes.Factory.createNode({ - 'renderer': this.renderer, - 'paper': this.floaterpaper, - 'graph': floatergraph, - 'metadata': dataOfClickedElement - }); - // Only node view expected - let box = this.floaterpaper.findViewByModel(floaternode).getBBox(); - let size = floaternode.get('size'); - // Account for node real size including ports - floaternode.translate(box.width - size.width, box.height - size.height); - this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); - $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - } - else { - $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - this.trigger({ - type: Flo.DnDEventType.DRAG, - view: this.viewBeingDragged, - event: event - }); - } - } - } - /* - * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) - */ - rotateOpen(element) { - setTimeout(() => this.doRotateOpen(element, 90)); - } - doRotateOpen(element, angle) { - angle -= 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle <= 0) { - element.set('isOpen', true); - this.closedGroups.delete(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(() => this.doRotateOpen(element, angle), 10); - } - } - doRotateClose(element, angle) { - angle += 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle >= 90) { - element.set('isOpen', false); - this.closedGroups.add(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(() => this.doRotateClose(element, angle), 10); - } - } - // TODO better name for this function as this does the animation *and* updates the palette - /* - * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) - */ - rotateClosed(element) { - setTimeout(() => this.doRotateClose(element, 0)); - } -}; -__decorate([ - Input(), - __metadata("design:type", Object) -], Palette.prototype, "metamodel", void 0); -__decorate([ - Input(), - __metadata("design:type", Object) -], Palette.prototype, "renderer", void 0); -__decorate([ - Input(), - __metadata("design:type", Object) -], Palette.prototype, "paletteEntryPadding", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], Palette.prototype, "onPaletteEntryDrop", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], Palette.prototype, "paletteReady", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], Palette.prototype, "paletteFocus", void 0); -__decorate([ - Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) -], Palette.prototype, "paletteSize", null); -Palette = __decorate([ - Component({ - selector: 'flo-palette', - template: ` -
- -
-
-
-
- `, - styles: [` - /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */ - - #palette-floater { - /* TODO size relative to paper that goes on it? */ - opacity: 0.75; - width:170px; - height:60px; - background-color: transparent; - /* - background-color: #6db33f; - */ - float:left; - position: absolute; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - } - - #palette-floater.joint-paper > svg { - background-color: transparent; - } - - #palette-paper-container { - overflow-y: auto; - overflow-x: hidden; - background-color: white; - color: white; - } - - /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */ - - /* Palette START */ - - .palette-filter { - border: 3px solid #6db33f; - } - - .palette-filter-textfield { - width: 100%; - font-size:24px; - /* border: 3px solid #6db33f; - */ font-family: "Varela Round",sans-serif; - /* padding: 2px; */ - } - - .palette-paper { - background-color: #eeeeee; - /* - border-right: 7px solid; - */ - border-color: #6db33f; - /* width: 170px; - height:100%; - float: left; - */ - } - - /* Palette END */ - `], - encapsulation: ViewEncapsulation.None - }), - __param(1, Inject(DOCUMENT)), - __metadata("design:paramtypes", [ElementRef, Object]) -], Palette); - -const joint$2 = Flo.joint; -const $$3 = _$; -class Utils { - static fanRoute(graph, cell) { - if (cell instanceof joint$2.dia.Element) { - const links = graph.getConnectedLinks(cell); - const groupsOfOverlappingLinks = groupBy(links, (link) => { - // the key of the group is the model id of the link's source or target, but not our cell id. - const sourceId = link.get('source').id; - const targetId = link.get('target').id; - return cell.id !== sourceId ? sourceId : targetId; - }); - each(groupsOfOverlappingLinks, (group, key) => { - // If the member of the group has both source and target model adjust vertices. - let toRoute = {}; - if (key !== undefined) { - group.forEach((link) => { - if (link.get('source').id === cell.get('id') && link.get('target').id) { - toRoute[link.get('target').id] = link; - } - else if (link.get('target').id === cell.get('id') && link.get('source').id) { - toRoute[link.get('source').id] = link; - } - }); - Object.keys(toRoute).forEach(k => { - Utils.fanRoute(graph, toRoute[k]); - }); - } - }); - } - else if (cell instanceof joint$2.dia.Link) { - // The cell is a link. Let's find its source and target models. - let srcId = cell.get('source').id || cell.previous('source').id; - let trgId = cell.get('target').id || cell.previous('target').id; - // If one of the ends is not a model, the link has no siblings. - if (!srcId || !trgId) { - return; - } - const siblings = graph.getLinks().filter((sibling) => { - const _srcId = sibling.get('source').id; - const _trgId = sibling.get('target').id; - const vertices = sibling.get('vertices'); - const fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); - return ((_srcId === srcId && _trgId === trgId) || (_srcId === trgId && _trgId === srcId)) && fanRouted; - }); - switch (siblings.length) { - case 0: - // The link was removed and had no siblings. - break; - case 1: - // There is only one link between the source and target. No vertices needed. - let vertices = cell.get('vertices'); - if (vertices && vertices.length && cell.get('fanRouted')) { - cell.unset('vertices'); - } - break; - default: - // There is more than one siblings. We need to create vertices. - // First of all we'll find the middle point of the link. - let source = graph.getCell(srcId); - let target = graph.getCell(trgId); - if (!source || !target) { - // When clearing the graph it may happen that some nodes are gone and some are left - return; - } - let srcCenter = source.getBBox().center(); - let trgCenter = target.getBBox().center(); - let midPoint = joint$2.g.line(srcCenter, trgCenter).midpoint(); - // Then find the angle it forms. - let theta = srcCenter.theta(trgCenter); - // This is the maximum distance between links - let gap = 20; - siblings.forEach((sibling, index) => { - // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. - let offset = gap * Math.ceil(index / 2); - // Now we need the vertices to be placed at points which are 'offset' pixels distant - // from the first link and forms a perpendicular angle to it. And as index goes up - // alternate left and right. - // - // ^ odd indexes - // | - // |----> index 0 line (straight line between a source center and a target center. - // | - // v even indexes - let sign = index % 2 ? 1 : -1; - let angle = joint$2.g.toRad(theta + sign * 90); - // We found the vertex. - let vertex = joint$2.g.point.fromPolar(offset, angle, midPoint); - sibling.set('fanRouted', true); - sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); - }); - } - } - } - static isCustomPaperEvent(args) { - return args.length === 5 && - isString(args[0]) && - (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && - args[1] instanceof $$3.Event && - args[2] instanceof joint$2.dia.CellView && - isNumber(args[3]) && - isNumber(args[4]); - } -} - -const joint$3 = Flo.joint; -const $$4 = _$; -const SCROLLBAR_SIZE = 17; -let EditorComponent = class EditorComponent { - constructor(element) { - this.element = element; - /** - * Flag specifying whether the Flo-Editor is in read-only mode. - */ - this._readOnlyCanvas = false; - /** - * Grid size - */ - this._gridSize = 1; - this._hiddenPalette = false; - this.textToGraphEventEmitter = new EventEmitter(); - this.graphToTextEventEmitter = new EventEmitter(); - this._graphToTextSyncEnabled = true; - this.validationEventEmitter = new EventEmitter(); - this._disposables = new CompositeDisposable(); - this._dslText = ''; - this.textToGraphConversionCompleted = new Subject(); - this.graphToTextConversionCompleted = new Subject(); - this.paletteReady = new BehaviorSubject(false); - /** - * Min zoom percent value - */ - this.minZoom = 5; - /** - * Max zoom percent value - */ - this.maxZoom = 400; - /** - * Zoom percent increment/decrement step - */ - this.zoomStep = 5; - this.paperPadding = 0; - this.floApi = new EventEmitter(); - this.validationMarkers = new EventEmitter(); - this.contentValidated = new EventEmitter(); - this.dslChange = new EventEmitter(); - this._resizeHandler = () => this.autosizePaper(); - let self = this; - this.editorContext = new (class DefaultRunnableContext { - set zoomPercent(percent) { - self.zoomPercent = percent; - } - get zoomPercent() { - return self.zoomPercent; - } - set noPalette(noPalette) { - self.noPalette = noPalette; - } - get noPalette() { - return self.noPalette; - } - set gridSize(gridSize) { - self.gridSize = gridSize; - } - get gridSize() { - return self.gridSize; - } - set readOnlyCanvas(readOnly) { - self.readOnlyCanvas = readOnly; - } - get readOnlyCanvas() { - return self.readOnlyCanvas; - } - setDsl(dsl) { - self.dsl = dsl; - } - updateGraph() { - return self.updateGraphRepresentation(); - } - updateText() { - return self.updateTextRepresentation(); - } - performLayout() { - return self.doLayout(); - } - clearGraph() { - self.selection = undefined; - self.graph.clear(); - if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { - return self.metamodel.load().then(data => { - self.editor.setDefaultContent(this, data); - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - }); - } - else { - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - } - } - getGraph() { - return self.graph; - } - getPaper() { - return self.paper; - } - get graphToTextSync() { - return self.graphToTextSync; - } - set graphToTextSync(sync) { - self.graphToTextSync = sync; - } - getMinZoom() { - return self.minZoom; - } - getMaxZoom() { - return self.maxZoom; - } - getZoomStep() { - return self.zoomStep; - } - fitToPage() { - self.fitToPage(); - } - createNode(metadata, props, position) { - return self.createNode(metadata, props, position); - } - createLink(source, target, metadata, props) { - return self.createLink(source, target, metadata, props); - } - get selection() { - return self.selection; - } - set selection(newSelection) { - self.selection = newSelection; - } - deleteSelectedNode() { - if (self.selection) { - if (self.editor && self.editor.preDelete) { - self.editor.preDelete(self.editorContext, self.selection.model); - } - else { - if (self.selection.model instanceof joint$3.dia.Element) { - self.graph.getConnectedLinks(self.selection.model).forEach((l) => l.remove()); - } - } - self.selection.model.remove(); - self.selection = undefined; - } - } - get textToGraphConversionObservable() { - return self.textToGraphConversionCompleted; - } - get graphToTextConversionObservable() { - return self.graphToTextConversionCompleted; - } - get paletteReady() { - return self.paletteReady; - } - })(); - } - ngOnInit() { - this.initGraph(); - this.initPaper(); - this.initGraphListeners(); - this.initPaperListeners(); - this.initMetamodel(); - $$4(window).on('resize', this._resizeHandler); - this._disposables.add(Disposable.create(() => $$4(window).off('resize', this._resizeHandler))); - /* - * Execute resize to get the right size for the SVG element on the editor canvas. - * Executed via timeout to let angular render the DOM first and elements to have the right width and height - */ - window.setTimeout(this._resizeHandler); - this.floApi.emit(this.editorContext); - } - ngOnDestroy() { - this._disposables.dispose(); - } - get noPalette() { - return this._hiddenPalette; - } - set noPalette(hidden) { - this._hiddenPalette = hidden; - // If palette is not shown ensure that canvas starts from the left==0! - if (hidden) { - $$4('#paper-container', this.element.nativeElement).css('left', 0); - } - } - get graphToTextSync() { - return this._graphToTextSyncEnabled; - } - set graphToTextSync(sync) { - this._graphToTextSyncEnabled = sync; - // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion - // this.performGraphToTextSyncing(); - } - performGraphToTextSyncing() { - if (this._graphToTextSyncEnabled) { - this.graphToTextEventEmitter.emit(); - } - } - createHandle(element, kind, action, location) { - if (!location) { - let bbox = element.model.getBBox(); - location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); - } - let handle = Shapes.Factory.createHandle({ - renderer: this.renderer, - paper: this.paper, - parent: element.model, - kind: kind, - position: location - }); - const view = this.paper.findViewByModel(handle); - view.on('cell:pointerdown', () => { - if (action) { - action(); - } - }); - view.on('cell:mouseover', () => { - handle.attr('image/filter', { - name: 'dropShadow', - args: { dx: 1, dy: 1, blur: 1, color: 'black' } - }); - }); - view.on('cell:mouseout', () => { - handle.removeAttr('image/filter'); - }); - view.setInteractivity(false); - return handle; - } - removeEmbeddedChildrenOfType(element, types) { - let embeds = element.getEmbeddedCells(); - for (let i = 0; i < embeds.length; i++) { - if (types.indexOf(embeds[i].get('type')) >= 0) { - embeds[i].remove(); - } - } - } - get selection() { - return this._selection; - } - set selection(newSelection) { - if (newSelection && (newSelection.model.get('type') === joint$3.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint$3.shapes.flo.HANDLE_TYPE)) { - newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); - } - if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { - newSelection = undefined; - } - if (newSelection !== this._selection) { - if (this._selection) { - const elementview = this.paper.findViewByModel(this._selection.model); - if (elementview) { // May have been removed from the graph - this.removeEmbeddedChildrenOfType(elementview.model, joint$3.shapes.flo.HANDLE_TYPE); - elementview.unhighlight(); - } - } - if (newSelection) { - newSelection.highlight(); - if (this.editor && this.editor.createHandles) { - this.editor.createHandles(this.editorContext, (owner, kind, action, location) => this.createHandle(owner, kind, action, location), newSelection); - } - } - this._selection = newSelection; - } - } - get readOnlyCanvas() { - return this._readOnlyCanvas; - } - set readOnlyCanvas(value) { - if (this._readOnlyCanvas === value) { - // Nothing to do - return; - } - if (value) { - this.selection = undefined; - } - if (this.graph) { - this.graph.getLinks().forEach((link) => { - if (value) { - link.attr('.link-tools/display', 'none'); - link.attr('.marker-vertices/display', 'none'); - link.attr('.connection-wrap/display', 'none'); - } - else { - link.removeAttr('.link-tools/display'); - if (this.editor && this.editor.allowLinkVertexEdit) { - link.removeAttr('.marker-vertices/display'); - } - link.removeAttr('.connection-wrap/display'); - } - }); - } - this._readOnlyCanvas = value; - } - /** - * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - showDragFeedback(dragDescriptor) { - if (this.editor && this.editor.showDragFeedback) { - this.editor.showDragFeedback(this.editorContext, dragDescriptor); - } - else { - let magnet; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint$3.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint$3.V(magnet).addClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint$3.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint$3.V(magnet).addClass('dnd-target-feedback'); - } - } - } - } - } - /** - * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - hideDragFeedback(dragDescriptor) { - if (this.editor && this.editor.hideDragFeedback) { - this.editor.hideDragFeedback(this.editorContext, dragDescriptor); - } - else { - let magnet; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint$3.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint$3.V(magnet).removeClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint$3.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint$3.V(magnet).removeClass('dnd-target-feedback'); - } - } - } - } - } - /** - * Sets the new DnD info object - the descriptor for DnD - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - setDragDescriptor(dragDescriptor) { - if (this.highlighted === dragDescriptor) { - return; - } - if (this.highlighted && dragDescriptor && isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { - if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { - return; - } - if (this.highlighted.source && - dragDescriptor.source && - this.highlighted.target && - dragDescriptor.target && - this.highlighted.source.view.model === dragDescriptor.source.view.model && - this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && - this.highlighted.target.view.model === dragDescriptor.target.view.model && - this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { - return; - } - } - if (this.highlighted) { - this.hideDragFeedback(this.highlighted); - } - this.highlighted = dragDescriptor; - if (this.highlighted) { - this.showDragFeedback(this.highlighted); - } - } - /** - * Handles DnD events when a node is being dragged over canvas - * - * @param draggedView The Joint JS view object being dragged - * @param targetUnderMouse The Joint JS view under mouse cursor - * @param x X coordinate of the mouse on the canvas - * @param y Y coordinate of the mosue on the canvas - * @param context DnD context (palette or canvas) - */ - handleNodeDragging(draggedView, targetUnderMouse, x, y, sourceComponent) { - if (this.editor && this.editor.calculateDragDescriptor) { - this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint$3.g.point(x, y), sourceComponent)); - } - } - /** - * Handles DnD drop event when a node is being dragged and dropped on the main canvas - */ - handleNodeDropping() { - if (this.highlighted && this.editor && this.editor.handleNodeDropping) { - this.editor.handleNodeDropping(this.editorContext, this.highlighted); - } - this.setDragDescriptor(undefined); - } - /** - * Hides DOM Node (used to determine drop target DOM element) - * @param domNode DOM node to hide - * @returns - */ - _hideNode(domNode) { - let oldVisibility = { - visibility: domNode.style ? domNode.style.display : undefined, - children: [] - }; - for (let i = 0; i < domNode.children.length; i++) { - let node = domNode.children.item(i); - if (node instanceof HTMLElement) { - oldVisibility.children.push(this._hideNode(node)); - } - } - domNode.style.display = 'none'; - return oldVisibility; - } - /** - * Restored DOM node original visibility (used to determine drop target DOM element) - * @param domNode DOM node to restore visibility of - * @param oldVisibility original visibility parameter - */ - _restoreNodeVisibility(domNode, oldVisibility) { - if (domNode.style) { - domNode.style.display = oldVisibility.visibility; - } - let j = 0; - for (let i = 0; i < domNode.childNodes.length; i++) { - if (j < oldVisibility.children.length) { - let node = domNode.children.item(i); - if (node instanceof HTMLElement) { - this._restoreNodeVisibility(node, oldVisibility.children[j++]); - } - } - } - } - /** - * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. - * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location - * (bounding box of a link for testing is bad). - * The result of that is that links can only be the drop target when dragging from the palette currently. - * When DnDing shapes on the canvas drop target cannot be a link. - * - * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked - * - e.g. Drag-n-Drop) - */ - getTargetViewFromEvent(event, x, y, excludeViews = []) { - if (!x && !y) { - let l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); - x = l.x; - y = l.y; - } - // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing - // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); - // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); - // if (underMouse) { - // return underMouse; - // } - let oldVisibility = excludeViews.map(_x => this._hideNode(_x.el)); - let targetElement = document.elementFromPoint(event.clientX, event.clientY); - excludeViews.forEach((excluded, i) => { - this._restoreNodeVisibility(excluded.el, oldVisibility[i]); - }); - return this.paper.findView($$4(targetElement)); - } - handleDnDFromPalette(dndEvent) { - switch (dndEvent.type) { - case Flo.DnDEventType.DRAG: - this.handleDragFromPalette(dndEvent); - break; - case Flo.DnDEventType.DROP: - this.handleDropFromPalette(dndEvent); - break; - default: - break; - } - } - handleDragFromPalette(dnDEvent) { - console.debug('Dragging from palette'); - if (dnDEvent.view && !this.readOnlyCanvas) { - let location = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); - this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location.x, location.y, [dnDEvent.view]), location.x, location.y, Constants.PALETTE_CONTEXT); - } - } - createNode(metadata, props, position) { - return Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.paper, - metadata: metadata, - props: props, - position: position - }); - } - createLink(source, target, metadata, props) { - return Shapes.Factory.createLink({ - renderer: this.renderer, - paper: this.paper, - source: source, - target: target, - metadata: metadata, - props: props - }); - } - handleDropFromPalette(event) { - let cellview = event.view; - let evt = event.event; - if (this.paper.el === evt.target || $$4.contains(this.paper.el, evt.target)) { - if (this.readOnlyCanvas) { - this.setDragDescriptor(undefined); - } - else { - let metadata = cellview.model.attr('metadata'); - let props = cellview.model.attr('props'); - let position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); - /* Calculate target element before creating the new - * element under mouse location. Otherwise target - * element would be the newly created element because - * it's under the mouse pointer - */ - let targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); - let newNode = this.createNode(metadata, props, position); - let newView = this.paper.findViewByModel(newNode); - this.handleNodeDragging(newView, targetElement, position.x, position.y, Constants.PALETTE_CONTEXT); - this.handleNodeDropping(); - } - } - } - fitToContent(gridWidth, gridHeight, padding, opt) { - const paper = this.paper; - if (joint$3.util.isObject(gridWidth)) { - // first parameter is an option object - opt = gridWidth; - gridWidth = opt.gridWidth || 1; - gridHeight = opt.gridHeight || 1; - padding = opt.padding || 0; - } - else { - opt = opt || {}; - gridWidth = gridWidth || 1; - gridHeight = gridHeight || 1; - padding = padding || 0; - } - const paddingJson = joint$3.util.normalizeSides(padding); - // Calculate the paper size to accomodate all the graph's elements. - const bbox = joint$3.V(paper.viewport).getBBox(); - const currentScale = paper.scale(); - const currentTranslate = paper.translate(); - bbox.x *= currentScale.sx; - bbox.y *= currentScale.sy; - bbox.width *= currentScale.sx; - bbox.height *= currentScale.sy; - let calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; - let calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; - let tx = 0; - let ty = 0; - if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { - tx = (-bbox.x / gridWidth) * gridWidth; - tx += paddingJson.left; - } - else if (opt.allowNewOrigin === 'same') { - tx = currentTranslate.tx; - } - calcWidth += tx; - if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { - ty = (-bbox.y / gridHeight) * gridHeight; - ty += paddingJson.top; - } - else if (opt.allowNewOrigin === 'same') { - ty = currentTranslate.ty; - } - calcHeight += ty; - calcWidth += paddingJson.right; - calcHeight += paddingJson.bottom; - // Make sure the resulting width and height are greater than minimum. - calcWidth = Math.max(calcWidth, opt.minWidth || 0); - calcHeight = Math.max(calcHeight, opt.minHeight || 0); - // Make sure the resulting width and height are lesser than maximum. - calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); - calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); - const dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; - const originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; - // Change the dimensions only if there is a size discrepency or an origin change - if (originChange) { - paper.translate(tx, ty); - } - if (dimensionChange) { - paper.setDimensions(calcWidth, calcHeight); - } - } - autosizePaper() { - let parent = $$4('#paper-container', this.element.nativeElement); - const parentWidth = parent.innerWidth(); - const parentHeight = parent.innerHeight(); - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth - SCROLLBAR_SIZE, - minHeight: parentHeight - SCROLLBAR_SIZE, - allowNewOrigin: 'same' - }); - } - fitToPage() { - let parent = $$4('#paper-container', this.element.nativeElement); - let minScale = this.minZoom / 100; - let maxScale = 2; - const parentWidth = parent.innerWidth(); - const parentHeight = parent.innerHeight(); - this.paper.scaleContentToFit({ - padding: this.paperPadding, - minScaleX: minScale, - minScaleY: minScale, - maxScaleX: maxScale, - maxScaleY: maxScale, - fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } - }); - /** - * Size the canvas appropriately and allow origin movement - */ - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth, - minHeight: parentHeight, - maxWidth: parentWidth, - maxHeight: parentHeight, - allowNewOrigin: 'any' - }); - } - get zoomPercent() { - return Math.round(joint$3.V(this.paper.viewport).scale().sx * 100); - } - set zoomPercent(percent) { - if (!isNaN(percent)) { - if (percent < this.minZoom) { - percent = this.minZoom; - } - else if (percent >= this.maxZoom) { - percent = this.maxZoom; - } - else { - if (percent <= 0) { - percent = 0.00001; - } - } - this.paper.scale(percent / 100, percent / 100); - } - } - get gridSize() { - return this._gridSize; - } - set gridSize(size) { - if (!isNaN(size) && size >= 1) { - this._gridSize = size; - if (this.paper) { - this.paper.setGridSize(size); - } - } - } - validateContent() { - return new Promise(resolve => { - if (this.editor && this.editor.validate) { - return this.editor - .validate(this.graph, this.dsl, this.editorContext) - .then(allMarkers => { - this.graph.getCells() - .forEach((cell) => this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : [])); - this.validationMarkers.emit(allMarkers); - this.contentValidated.emit(true); - resolve(); - }); - } - else { - resolve(); - } - }); - } - markElement(cell, markers) { - let errorMessages = markers.map(m => m.message); - let errorCell = cell.getEmbeddedCells().find((e) => e.attr('./kind') === Constants.ERROR_DECORATION_KIND); - if (errorCell) { - if (errorMessages.length === 0) { - errorCell.remove(); - } - else { - // Without rewrite we merge this list with existing errors - errorCell.attr('messages', errorMessages, { rewrite: true }); - } - } - else if (errorMessages.length > 0) { - let error = Shapes.Factory.createDecoration({ - renderer: this.renderer, - paper: this.paper, - parent: cell, - kind: Constants.ERROR_DECORATION_KIND, - messages: errorMessages - }); - let pt; - const view = this.paper.findViewByModel(error); - if (cell instanceof joint$3.dia.Element) { - pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); - error.set('position', pt); - view.setInteractivity(false); - } - } - } - doLayout() { - if (this.renderer && this.renderer.layout) { - return this.renderer.layout(this.paper); - } - } - set dsl(dslText) { - if (this._dslText !== dslText) { - this._dslText = dslText; - this.textToGraphEventEmitter.emit(); - } - } - get dsl() { - return this._dslText; - } - /** - * Ask the server to parse the supplied text into a JSON graph of nodes and links, - * then update the view based on that new information. - */ - updateGraphRepresentation() { - console.debug(`Updating graph to represent '${this._dslText}'`); - if (this.metamodel && this.metamodel.textToGraph) { - return this.metamodel.textToGraph(this.editorContext, this._dslText).then(() => { - this.textToGraphConversionCompleted.next(); - return this.validateContent(); - }); - } - else { - this.textToGraphConversionCompleted.next(); - return this.validateContent(); - } - } - updateTextRepresentation() { - if (this.metamodel && this.metamodel.graphToText) { - return this.metamodel.graphToText(this.editorContext).then(text => { - if (this._dslText !== text) { - this._dslText = text; - this.dslChange.emit(text); - } - this.graphToTextConversionCompleted.next(); - return this.validateContent(); - }) - .catch(error => { - // Validation may reveal why the graph couldn't be - // converted so let it run - this.graphToTextConversionCompleted.next(); - return this.validateContent(); - }); - } - else { - this.graphToTextConversionCompleted.next(); - return this.validateContent(); - } - } - initMetamodel() { - this.metamodel.load().then(data => { - this.updateGraphRepresentation(); - let textSyncSubscription = this.graphToTextEventEmitter.pipe(debounceTime(100)).subscribe(() => { - if (this._graphToTextSyncEnabled) { - this.updateTextRepresentation(); - } - }); - this._disposables.add(Disposable.create(() => textSyncSubscription.unsubscribe())); - // Setup content validated event emitter. Emit not validated when graph to text conversion required - let graphValidatedSubscription1 = this.graphToTextEventEmitter.subscribe(() => this.contentValidated.emit(false)); - this._disposables.add(Disposable.create(() => graphValidatedSubscription1.unsubscribe)); - // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); - // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); - let graphSyncSubscription = this.textToGraphEventEmitter.pipe(debounceTime(300)).subscribe(() => this.updateGraphRepresentation()); - this._disposables.add(Disposable.create(() => graphSyncSubscription.unsubscribe())); - // Setup content validated event emitter. Emit not validated when text to graph conversion required - let graphValidatedSubscription2 = this.textToGraphEventEmitter.subscribe(() => this.contentValidated.emit(false)); - this._disposables.add(Disposable.create(() => graphValidatedSubscription2.unsubscribe)); - if (this.editor && this.editor.setDefaultContent) { - this.editor.setDefaultContent(this.editorContext, data); - } - }); - } - initGraph() { - this.graph = new joint$3.dia.Graph(); - this.graph.set('type', Constants.CANVAS_CONTEXT); - this.graph.set('paperPadding', this.paperPadding); - } - handleNodeCreation(node) { - node.on('change:size', this._resizeHandler); - node.on('change:position', this._resizeHandler); - if (node.attr('metadata')) { - node.on('change:attrs', (cell, attrs, changeData) => { - let propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - let propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (this.renderer && this.renderer.isSemanticProperty && this.renderer.isSemanticProperty(propAttr, node))) { - this.performGraphToTextSyncing(); - } - if (this.renderer && this.renderer.refreshVisuals) { - this.renderer.refreshVisuals(node, propAttr, this.paper); - } - } - }); - } - } - /** - * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples - * are 'change:source', 'change:target'. - */ - handleLinkEvent(event, link) { - if (this.renderer && this.renderer.handleLinkEvent) { - this.renderer.handleLinkEvent(this.editorContext, event, link); - } - } - handleLinkCreation(link) { - this.handleLinkEvent('add', link); - link.on('change:source', (l) => { - this.autosizePaper(); - let newSourceId = l.get('source').id; - let oldSourceId = l.previous('source').id; - if (newSourceId !== oldSourceId) { - this.performGraphToTextSyncing(); - } - this.handleLinkEvent('change:source', l); - }); - link.on('change:target', (l) => { - this.autosizePaper(); - let newTargetId = l.get('target').id; - let oldTargetId = l.previous('target').id; - if (newTargetId !== oldTargetId) { - this.performGraphToTextSyncing(); - } - this.handleLinkEvent('change:target', l); - }); - link.on('change:vertices', this._resizeHandler); - link.on('change:attrs', (cell, attrs, changeData) => { - let propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - let propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (this.renderer && this.renderer.isSemanticProperty && this.renderer.isSemanticProperty(propAttr, link))) { - let sourceId = link.get('source').id; - let targetId = link.get('target').id; - this.performGraphToTextSyncing(); - } - if (this.renderer && this.renderer.refreshVisuals) { - this.renderer.refreshVisuals(link, propAttr, this.paper); - } - } - }); - this.paper.findViewByModel(link).on('link:options', () => this.handleLinkEvent('options', link)); - if (this.readOnlyCanvas) { - link.attr('.link-tools/display', 'none'); - } - } - initGraphListeners() { - this.graph.on('add', (element) => { - if (element instanceof joint$3.dia.Link) { - this.handleLinkCreation(element); - } - else if (element instanceof joint$3.dia.Element) { - this.handleNodeCreation(element); - } - if (element.get('type') === joint$3.shapes.flo.NODE_TYPE || element.get('type') === joint$3.shapes.flo.LINK_TYPE) { - this.performGraphToTextSyncing(); - } - this.autosizePaper(); - }); - this.graph.on('remove', (element) => { - if (element instanceof joint$3.dia.Link) { - this.handleLinkEvent('remove', element); - } - if (this.selection && this.selection.model === element) { - this.selection = undefined; - } - if (element.isLink()) { - window.setTimeout(() => this.performGraphToTextSyncing(), 100); - } - else if (element.get('type') === joint$3.shapes.flo.NODE_TYPE) { - this.performGraphToTextSyncing(); - } - this.autosizePaper(); - }); - // Set if link is fan-routed. Should be called before routing call - this.graph.on('change:vertices', (link, changed, opt) => { - if (opt.fanRouted) { - link.set('fanRouted', true); - } - else { - link.unset('fanRouted'); - } - }); - // adjust vertices when a cell is removed or its source/target was changed - this.graph.on('add remove change:source change:target change:vertices change:position', partial(Utils.fanRoute, this.graph)); - } - initPaperListeners() { - // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element - this.paper.on('cell:pointerclick', (cellView) => { - if (!this.readOnlyCanvas) { - this.selection = cellView; - } - }); - this.paper.on('blank:pointerclick', () => { - this.selection = undefined; - }); - this.paper.on('scale', this._resizeHandler); - this.paper.on('all', function () { - if (Utils.isCustomPaperEvent(arguments)) { - arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); - } - }); - this.paper.on('dragging-node-over-canvas', (dndEvent) => { - console.debug(`Canvas DnD type = ${dndEvent.type}`); - let location = this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); - switch (dndEvent.type) { - case Flo.DnDEventType.DRAG: - this.handleNodeDragging(dndEvent.view, this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, Constants.CANVAS_CONTEXT); - break; - case Flo.DnDEventType.DROP: - this.handleNodeDropping(); - break; - default: - break; - } - }); - // JointJS now no longer grabs focus if working in a paper element - crude... - $$4('#flow-view', this.element.nativeElement).on('mousedown', () => { - $$4('#palette-filter-textfield', this.element.nativeElement).focus(); - }); - } - initPaper() { - let options = { - el: $$4('#paper', this.element.nativeElement), - gridSize: this._gridSize, - drawGrid: true, - model: this.graph, - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$3.shapes.flo.ElementView /*joint.dia.ElementView*/, - linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint$3.shapes.flo.LinkView, - // Enable link snapping within 25px lookup radius - snapLinks: { radius: 25 }, - defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ (cellView, magnet) => { - if (this.renderer && this.renderer.createLink) { - let linkEnd = { - id: cellView.model.id - }; - if (magnet) { - linkEnd.selector = cellView.getSelector(magnet, undefined); - } - if (magnet.getAttribute('port')) { - linkEnd.port = magnet.getAttribute('port'); - } - if (magnet.getAttribute('port') === 'input') { - return this.renderer.createLink(undefined, linkEnd); - } - else { - return this.renderer.createLink(linkEnd, undefined); - } - } - else { - return new joint$3.shapes.flo.Link(); - } - }, - // decide whether to create a link if the user clicks a magnet - validateMagnet: (cellView, magnet) => { - if (this.readOnlyCanvas) { - return false; - } - else { - if (this.editor && this.editor.validatePort) { - return this.editor.validatePort(this.editorContext, cellView, magnet); - } - else { - return true; - } - } - }, - interactive: (cellView, event) => { - if (this.readOnlyCanvas) { - return false; - } - else { - if (this.editor && this.editor.interactive) { - if (typeof this.editor.interactive === 'function') { - // Type for interactive is wrong in JointJS have to cast to - return this.editor.interactive(cellView, event); - } - else { - return this.editor.interactive; - } - } - return true; - } - }, - highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { - 'default': { - name: 'addClass', - options: { - className: 'highlighted' - } - } - }, - markAvailable: true - }; - if (this.renderer && this.renderer.getLinkAnchorPoint) { - options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; - } - if (this.editor && this.editor.validateLink) { - const self = this; - options.validateConnection = (cellViewS, magnetS, cellViewT, magnetT, end, linkView) => self.editor.validateLink(this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); - } - // The paper is what will represent the graph on the screen - this.paper = new joint$3.dia.Paper(options); - this._disposables.add(Disposable.create(() => this.paper.remove())); - } - updatePaletteReadyState(ready) { - this.paletteReady.next(ready); - } -}; -__decorate([ - Input(), - __metadata("design:type", Object) -], EditorComponent.prototype, "metamodel", void 0); -__decorate([ - Input(), - __metadata("design:type", Object) -], EditorComponent.prototype, "renderer", void 0); -__decorate([ - Input(), - __metadata("design:type", Object) -], EditorComponent.prototype, "editor", void 0); -__decorate([ - Input(), - __metadata("design:type", Number) -], EditorComponent.prototype, "paletteSize", void 0); -__decorate([ - Input(), - __metadata("design:type", Object) -], EditorComponent.prototype, "minZoom", void 0); -__decorate([ - Input(), - __metadata("design:type", Object) -], EditorComponent.prototype, "maxZoom", void 0); -__decorate([ - Input(), - __metadata("design:type", Object) -], EditorComponent.prototype, "zoomStep", void 0); -__decorate([ - Input(), - __metadata("design:type", Object) -], EditorComponent.prototype, "paperPadding", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], EditorComponent.prototype, "floApi", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], EditorComponent.prototype, "validationMarkers", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], EditorComponent.prototype, "contentValidated", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], EditorComponent.prototype, "dslChange", void 0); -__decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) -], EditorComponent.prototype, "dsl", null); -EditorComponent = __decorate([ - Component({ - selector: 'flo-editor', - template: ` - -
-
-
- -
- - - -
- -
-
-
- - - - - - - - - - -
- - - - - -
-
- -
-
-
- `, - styles: [` - /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library - - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - /* - A complete list of SVG properties that can be set through CSS is here: - http://www.w3.org/TR/SVG/styling.html - - Important note: Presentation attributes have a lower precedence over CSS style rules. - */ - - - /* .viewport is a node wrapping all diagram elements in the paper */ - .joint-viewport { - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - } - - .joint-paper > svg, - .joint-paper-background, - .joint-paper-grid { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - } - - /* - 1. IE can't handle paths without the \`d\` attribute for bounding box calculation - 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will - break the links rendering. - - path:not([d]) { - display: none; - } - - */ - - - /* magnet is an element that can be either source or a target of a link */ - [magnet=true]:not(.joint-element) { - cursor: crosshair; - } - [magnet=true]:not(.joint-element):hover { - opacity: .7; - } - - /* - - Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class "element basic Rect". - This makes it possible to easilly style elements in CSS and have generic CSS rules applying to - the whole group of elements. Each plugin can provide its own stylesheet. - - */ - - .joint-element { - /* Give the user a hint that he can drag&drop the element. */ - cursor: move; - } - - .joint-element * { - user-drag: none; - } - - .joint-element .scalable * { - /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */ - vector-effect: non-scaling-stroke; - } - /* - - connection-wrap is a element of the joint.dia.Link that follows the .connection of that link. - In other words, the \`d\` attribute of the .connection-wrap contains the same data as the \`d\` attribute of the - .connection . The advantage of using .connection-wrap is to be able to catch pointer events - in the neighborhood of the .connection . This is especially handy if the .connection is - very thin. - - */ - - .marker-source, - .marker-target { - /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */ - vector-effect: non-scaling-stroke; - } - - /* Paper */ - .joint-paper { - position: relative; - } - /* Paper */ - - /* Highlighting */ - .joint-highlight-opacity { - opacity: 0.3; - } - /* Highlighting */ - - /* - - Vertex markers are \`\` elements that appear at connection vertex positions. - - */ - - .joint-link .connection-wrap, - .joint-link .connection { - fill: none; - } - - /* element wrapping .marker-vertex-group. */ - .marker-vertices { - opacity: 0; - cursor: move; - } - .marker-arrowheads { - opacity: 0; - cursor: move; - cursor: -webkit-grab; - cursor: -moz-grab; - /* display: none; */ /* setting \`display: none\` on .marker-arrowheads effectivelly switches of links reconnecting */ - } - .link-tools { - opacity: 0; - cursor: pointer; - } - .link-tools .tool-options { - display: none; /* by default, we don't display link options tool */ - } - .joint-link:hover .marker-vertices, - .joint-link:hover .marker-arrowheads, - .joint-link:hover .link-tools { - opacity: 1; - } - - /* element used to remove a vertex */ - .marker-vertex-remove { - cursor: pointer; - opacity: .1; - } - - .marker-vertex-group:hover .marker-vertex-remove { - opacity: 1; - } - - .marker-vertex-remove-area { - opacity: .1; - cursor: pointer; - } - .marker-vertex-group:hover .marker-vertex-remove-area { - opacity: 1; - } - - /* - Example of custom changes (in pure CSS only!): - - Do not show marker vertices at all: .marker-vertices { display: none; } - Do not allow adding new vertices: .connection-wrap { pointer-events: none; } - */ - - /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */ - .joint-element .fobj { - overflow: hidden; - } - .joint-element .fobj body { - background-color: transparent; - margin: 0px; - position: static; - } - .joint-element .fobj div { - text-align: center; - vertical-align: middle; - display: table-cell; - padding: 0px 5px 0px 5px; - } - - /* Paper */ - .joint-paper.joint-theme-dark { - background-color: #18191b; - } - /* Paper */ - - /* Links */ - .joint-link.joint-theme-dark .connection-wrap { - stroke: #8F8FF3; - stroke-width: 15; - stroke-linecap: round; - stroke-linejoin: round; - opacity: 0; - cursor: move; - } - .joint-link.joint-theme-dark .connection-wrap:hover { - opacity: .4; - stroke-opacity: .4; - } - .joint-link.joint-theme-dark .connection { - stroke-linejoin: round; - } - .joint-link.joint-theme-dark .link-tools .tool-remove circle { - fill: #F33636; - } - .joint-link.joint-theme-dark .link-tools .tool-remove path { - fill: white; - } - .joint-link.joint-theme-dark .link-tools [event="link:options"] circle { - fill: green; - } - /* element inside .marker-vertex-group element */ - .joint-link.joint-theme-dark .marker-vertex { - fill: #5652DB; - } - .joint-link.joint-theme-dark .marker-vertex:hover { - fill: #8E8CE1; - stroke: none; - } - .joint-link.joint-theme-dark .marker-arrowhead { - fill: #5652DB; - } - .joint-link.joint-theme-dark .marker-arrowhead:hover { - fill: #8E8CE1; - stroke: none; - } - /* element used to remove a vertex */ - .joint-link.joint-theme-dark .marker-vertex-remove-area { - fill: green; - stroke: darkgreen; - } - .joint-link.joint-theme-dark .marker-vertex-remove { - fill: white; - stroke: white; - } - /* Links */ - /* Paper */ - .joint-paper.joint-theme-default { - background-color: #FFFFFF; - } - /* Paper */ - - /* Links */ - .joint-link.joint-theme-default .connection-wrap { - stroke: #000000; - stroke-width: 15; - stroke-linecap: round; - stroke-linejoin: round; - opacity: 0; - cursor: move; - } - .joint-link.joint-theme-default .connection-wrap:hover { - opacity: .4; - stroke-opacity: .4; - } - .joint-link.joint-theme-default .connection { - stroke-linejoin: round; - } - .joint-link.joint-theme-default .link-tools .tool-remove circle { - fill: #FF0000; - } - .joint-link.joint-theme-default .link-tools .tool-remove path { - fill: #FFFFFF; - } - - /* element inside .marker-vertex-group element */ - .joint-link.joint-theme-default .marker-vertex { - fill: #1ABC9C; - } - .joint-link.joint-theme-default .marker-vertex:hover { - fill: #34495E; - stroke: none; - } - - .joint-link.joint-theme-default .marker-arrowhead { - fill: #1ABC9C; - } - .joint-link.joint-theme-default .marker-arrowhead:hover { - fill: #F39C12; - stroke: none; - } - - /* element used to remove a vertex */ - .joint-link.joint-theme-default .marker-vertex-remove { - fill: #FFFFFF; - } - /* Links */ - - @font-face { - font-family: 'lato-light'; - src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); - font-weight: normal; - font-style: normal; - } - - /* Links */ - .joint-link.joint-theme-material .connection-wrap { - stroke: #000000; - stroke-width: 15; - stroke-linecap: round; - stroke-linejoin: round; - opacity: 0; - cursor: move; - } - .joint-link.joint-theme-material .connection-wrap:hover { - opacity: .4; - stroke-opacity: .4; - } - .joint-link.joint-theme-material .connection { - stroke-linejoin: round; - } - .joint-link.joint-theme-material .link-tools .tool-remove circle { - fill: #C64242; - } - .joint-link.joint-theme-material .link-tools .tool-remove path { - fill: #FFFFFF; - } - - /* element inside .marker-vertex-group element */ - .joint-link.joint-theme-material .marker-vertex { - fill: #d0d8e8; - } - .joint-link.joint-theme-material .marker-vertex:hover { - fill: #5fa9ee; - stroke: none; - } - - .joint-link.joint-theme-material .marker-arrowhead { - fill: #d0d8e8; - } - .joint-link.joint-theme-material .marker-arrowhead:hover { - fill: #5fa9ee; - stroke: none; - } - - /* element used to remove a vertex */ - .joint-link.joint-theme-material .marker-vertex-remove-area { - fill: #5fa9ee; - } - .joint-link.joint-theme-material .marker-vertex-remove { - fill: white; - } - /* Links */ - - /* Links */ - .joint-link.joint-theme-modern .connection-wrap { - stroke: #000000; - stroke-width: 15; - stroke-linecap: round; - stroke-linejoin: round; - opacity: 0; - cursor: move; - } - .joint-link.joint-theme-modern .connection-wrap:hover { - opacity: .4; - stroke-opacity: .4; - } - .joint-link.joint-theme-modern .connection { - stroke-linejoin: round; - } - .joint-link.joint-theme-modern .link-tools .tool-remove circle { - fill: #FF0000; - } - .joint-link.joint-theme-modern .link-tools .tool-remove path { - fill: #FFFFFF; - } - - /* element inside .marker-vertex-group element */ - .joint-link.joint-theme-modern .marker-vertex { - fill: #1ABC9C; - } - .joint-link.joint-theme-modern .marker-vertex:hover { - fill: #34495E; - stroke: none; - } - - .joint-link.joint-theme-modern .marker-arrowhead { - fill: #1ABC9C; - } - .joint-link.joint-theme-modern .marker-arrowhead:hover { - fill: #F39C12; - stroke: none; - } - - /* element used to remove a vertex */ - .joint-link.joint-theme-modern .marker-vertex-remove { - fill: white; - } - /* Links */ - flo-view { - width:100%; - height:100%; - margin: 0; - background-color: #eeeeee; - font-family: "Varela Round",sans-serif; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - } - - .canvas { - border: 1px solid; - border-color: #6db33f; - border-radius: 2px; - margin-top: 3px; - } - - /* Canvas contains the palette on the left and the paper on the right */ - - .paper { - padding: 0px; - background-color: #ffffff; - /* height: 100%; - width: 100%; - position: relative; - overflow: hidden; - *//* margin-left: 400px; */ - } - - #sidebar-resizer { - background-color: #34302d; - position: absolute; - top: 0; - bottom: 0; - width: 6px; - cursor: e-resize; - } - - #palette-container { - background-color: #EEE; - position: absolute; - top: 0; - bottom: 0; - left: 0; - overflow: auto; - } - - #paper-container { - position: absolute; - top: 0; - bottom: 0; - right: 0; - overflow: auto; - color: #FFF; - background-color: #FFF; - } - - /* Tooltip START */ - - .node-tooltip .tooltip-description { - margin-top: 5px; - margin-left: 0px; - margin-bottom: 5px; - } - - .node-tooltip { - display:none; - position:absolute; - border:1px solid #333; - background-color:#34302d;/*#161616;*/ - border-radius:5px; - padding:5px; - color:#fff; - /* font-size:12px Arial;*/ - font-family: "Varela Round",sans-serif; - font-size: 19px; - z-index: 100; - } - - .tooltip-title-type { - font-size: 24px; - font-weight: bold; - } - - .tooltip-title-group { - padding-left: 5px; - font-size: 20px; - font-style: italic; - } - - .node-tooltip-option-name { - font-family: monospace;/*"Varela Round",sans-serif;*/ - font-size: 17px; - font-weight: bold; - padding-right: 20px; - - } - - .node-tooltip-option-description { - font-family: "Varela Round",sans-serif; - font-size: 18px; - } - - /* Tooltip END */ - - - /* Validation Error Marker on Canvas START */ - - .error-tooltip p { - margin-top: 5px; - margin-left: 0px; - margin-bottom: 5px; - color:#fff; - } - .error-tooltip { - display:none; - position:absolute; - border:1px solid #333; - background-color:red;/*#161616;*/ - border-radius:5px; - padding:5px; - color:#fff; - /* font-size:12px Arial;*/ - font-family: "Varela Round",sans-serif; - font-size: 20px; - z-index: 100; - } - - /* Validation Error Marker on Canvas END */ - - /* Controls on Canvas START */ - - .canvas-controls-container { - position: absolute; - right: 15px; - top: 5px; - } - - .canvas-control { - background: transparent; - font-family: "Varela Round",sans-serif; - font-size: 11px; - vertical-align: middle; - margin: 0px; - } - - .zoom-canvas-control { - border: 0px; - padding: 0px; - margin: 0px; - outline: none; - } - - .zoom-canvas-input { - text-align: right; - font-weight:bold; - color: black; - background-color: transparent; - } - - .zoom-canvas-label { - padding-right: 4px; - color: black; - } - - /* Controls on Canvas END */ - - - - - /* START - FLO CANVAS STYLES - override joint js styles */ - - .highlighted { - outline: none; - } - - .joint-element.highlighted rect { - stroke: #34302d; - stroke-width: 3; - } - - .joint-type-handle { - cursor: pointer; - } - - .available-magnet { - stroke-width: 3; - } - - .link { - fill: none; - stroke: #ccc; - stroke-width: 1.5px; - } - - .link-tools .tool-options { - display: none; /* by default, we don't display link options tool */ - } - - /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */ - .link-tools .tool-options circle { - fill: transparent; - stroke: transparent; - } - - .link-tools .tool-options path { - fill: black; - stroke: black; - } - - .link-tools .tool-remove circle { - fill: red; - stroke: red; - } - - .link-tools .tool-remove path { - fill: white; - stroke: white; - } - - .link-tools-container { - stroke-width: 0; - fill: transparent; - } - - /* END - FLO CANVAS STYLES */ - `], - encapsulation: ViewEncapsulation.None - }), - __metadata("design:paramtypes", [ElementRef]) -], EditorComponent); - -const $$5 = _$; -let ResizerDirective = class ResizerDirective { - constructor(element, document) { - this.element = element; - this.document = document; - this.dragInProgress = false; - this.vertical = true; - this._subscriptions = new CompositeDisposable(); - this.sizeChange = new EventEmitter(); - this.mouseMoveHandler = (e) => { - if (this.dragInProgress) { - this.mousemove(e); - } - }; - } - set splitSize(splitSize) { - if (this.maxSplitSize && splitSize > this.maxSplitSize) { - splitSize = this.maxSplitSize; - } - if (this.vertical) { - // Handle vertical resizer - $$5(this.element.nativeElement).css({ - left: splitSize + 'px' - }); - $$5(this.first).css({ - width: splitSize + 'px' - }); - $$5(this.second).css({ - left: (splitSize + this._size) + 'px' - }); - } - else { - // Handle horizontal resizer - $$5(this.element.nativeElement).css({ - bottom: splitSize + 'px' - }); - $$5(this.first).css({ - bottom: (splitSize + this._size) + 'px' - }); - $$5(this.second).css({ - height: splitSize + 'px' - }); - } - this._splitSize = splitSize; - // Update the local field - this.sizeChange.emit(splitSize); - } - set resizerWidth(width) { - this._size = width; - this.vertical = true; - } - set resizerHeight(height) { - this._size = height; - this.vertical = false; - } - set resizerLeft(first) { - this.first = first; - } - set resizerTop(first) { - this.first = first; - } - set resizerRight(second) { - this.second = second; - } - set resizerBottom(second) { - this.second = second; - } - startDrag() { - this.dragInProgress = true; - } - mousemove(event) { - let size; - if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node - size = event.pageX - $$5(this.first).offset().left; - } - else { - // Handle horizontal resizer Calculate new size relative to palette container DOM node - size = window.innerHeight - event.pageY - $$5(this.second).offset().top; - } - this.splitSize = size; - } - ngOnInit() { - // Need to set left and right elements width and fire events on init when DOM is built - this.splitSize = this._splitSize; - let subscription1 = fromEvent($$5(this.document).get(0), 'mousemove') - .pipe(sampleTime(300)) - .subscribe(this.mouseMoveHandler); - this._subscriptions.add(Disposable.create(() => subscription1.unsubscribe())); - let subscription2 = fromEvent($$5(this.document).get(0), 'mouseup') - .subscribe(e => { - if (this.dragInProgress) { - this.mousemove(e); - this.dragInProgress = false; - } - }); - this._subscriptions.add(Disposable.create(() => subscription2.unsubscribe())); - } - ngOnDestroy() { - this._subscriptions.dispose(); - } -}; -__decorate([ - Input(), - __metadata("design:type", Number) -], ResizerDirective.prototype, "maxSplitSize", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], ResizerDirective.prototype, "sizeChange", void 0); -__decorate([ - Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) -], ResizerDirective.prototype, "splitSize", null); -__decorate([ - Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) -], ResizerDirective.prototype, "resizerWidth", null); -__decorate([ - Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) -], ResizerDirective.prototype, "resizerHeight", null); -__decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) -], ResizerDirective.prototype, "resizerLeft", null); -__decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) -], ResizerDirective.prototype, "resizerTop", null); -__decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) -], ResizerDirective.prototype, "resizerRight", null); -__decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) -], ResizerDirective.prototype, "resizerBottom", null); -ResizerDirective = __decorate([ - Directive({ - selector: '[resizer]', - host: { '(mousedown)': 'startDrag()' } - }), - __param(1, Inject(DOCUMENT)), - __metadata("design:paramtypes", [ElementRef, Object]) -], ResizerDirective); - -const $$6 = _$; -let DslEditorComponent = class DslEditorComponent { - constructor(element) { - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.debounce = 0; - this.dslChange = new EventEmitter(); - this.focus = new EventEmitter(); - this.blur = new EventEmitter(); - this.editor = new EventEmitter(); - this._dslChangedHandler = () => { - this._dsl = this.doc.getValue(); - this.dslChange.emit(this._dsl); - }; - } - set dsl(dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - let cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - } - set lintOptions(lintOptions) { - this._lint = lintOptions; - if (this.doc) { - this.doc.setOption('lint', this._lint); - } - } - set hintOptions(hintOptions) { - this._hint = hintOptions; - if (this.doc) { - this.doc.setOption('hintOptions', this._hint); - } - } - ngOnInit() { - let options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - electricChars: false, - smartIndent: false, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - if (this._hint) { - options.hintOptions = this._hint; - } - this.doc = fromTextArea($$6('#dsl-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this.debounce ? debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); - this.doc.on('focus', () => this.focus.emit()); - this.doc.on('blur', () => this.blur.emit()); - this.editor.emit(this.doc); - } - ngOnDestroy() { - } -}; -__decorate([ - Input('line-numbers'), - __metadata("design:type", Object) -], DslEditorComponent.prototype, "lineNumbers", void 0); -__decorate([ - Input('line-wrapping'), - __metadata("design:type", Object) -], DslEditorComponent.prototype, "lineWrapping", void 0); -__decorate([ - Input('scrollbar-style'), - __metadata("design:type", String) -], DslEditorComponent.prototype, "scrollbarStyle", void 0); -__decorate([ - Input(), - __metadata("design:type", String) -], DslEditorComponent.prototype, "placeholder", void 0); -__decorate([ - Input(), - __metadata("design:type", Object) -], DslEditorComponent.prototype, "debounce", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], DslEditorComponent.prototype, "dslChange", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], DslEditorComponent.prototype, "focus", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], DslEditorComponent.prototype, "blur", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], DslEditorComponent.prototype, "editor", void 0); -__decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) -], DslEditorComponent.prototype, "dsl", null); -__decorate([ - Input(), - __metadata("design:type", Object), - __metadata("design:paramtypes", [Object]) -], DslEditorComponent.prototype, "lintOptions", null); -__decorate([ - Input(), - __metadata("design:type", Object), - __metadata("design:paramtypes", [Object]) -], DslEditorComponent.prototype, "hintOptions", null); -DslEditorComponent = __decorate([ - Component({ - selector: 'dsl-editor', - template: ` - - `, - styles: [` - .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */ - - .CodeMirror { - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - height: 100%; - } - .CodeMirror-hint { - max-width: 38em; - } - .CodeMirror-vertical-ruler-error { - background-color: rgba(188, 0, 0, 0.5); - } - .CodeMirror-vertical-ruler-warning { - background-color: rgba(255, 188, 0, 0.5); - } - - - /* Code Mirror related styles END */ - `], - encapsulation: ViewEncapsulation.None - }), - __metadata("design:paramtypes", [ElementRef]) -], DslEditorComponent); - -var CodeEditorComponent_1; -const $$7 = _$; -let CodeEditorComponent = CodeEditorComponent_1 = class CodeEditorComponent { - constructor(element) { - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.dslChange = new EventEmitter(); - this.focus = new EventEmitter(); - this.blur = new EventEmitter(); - this.editor = new EventEmitter(); - this._dslChangedHandler = () => { - this._dsl = this.doc.getValue(); - this.dslChange.emit(this._dsl); - if (this._onChangeHandler) { - this._onChangeHandler(this._dsl); - } - }; - } - set dsl(dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - let cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - } - set language(_language) { - if (this._language !== _language) { - this._language = _language; - this.loadEditorMode(); - } - } - ngOnInit() { - let options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - matchBrackets: true, - autoCloseBrackets: true, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - this.doc = fromTextArea($$7('#code-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this._dslChangedHandler); - this.doc.on('focus', () => { - this.focus.emit(); - if (this._onTouchHandler) { - this._onTouchHandler(); - } - }); - this.doc.on('blur', () => this.blur.emit()); - this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); - this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); - this.loadEditorMode(); - this.editor.emit(this.doc); - } - loadEditorMode() { - // CodeMirror doc object must be initialized - if (!this.doc) { - return; - } - const info = this._language ? findModeByName(this._language) : undefined; - // Set proper editor mode - if (info) { - this.doc.setOption('mode', info.mime); - // (CodeMirror).autoLoadMode(this.doc, info.mode); - } - else { - this.doc.setOption('mode', 'text/plain'); - } - // Set proper Lint mode - this.doc.setOption('lint', this.getLintOptions()); - } - ngOnDestroy() { - } - writeValue(obj) { - this.dsl = obj; - } - registerOnChange(fn) { - this._onChangeHandler = fn; - } - registerOnTouched(fn) { - this._onTouchHandler = fn; - } - getLintOptions() { - switch (this._language) { - case 'javascript': - case 'json': - case 'coffeescript': - case 'yaml': - return { - onUpdateLinting: (annotations) => { - const warnings = []; - const errors = []; - if (this.overviewRuler) { - if (Array.isArray(annotations)) { - annotations.forEach((a) => { - if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { - if (a.severity === 'error') { - errors.push(a); - } - else if (a.severity === 'warning') { - warnings.push(a); - } - } - }); - } - } - this.warningRuler.update(warnings); - this.errorRuler.update(errors); - } - }; - } - return false; - } -}; -__decorate([ - Input('line-numbers'), - __metadata("design:type", Object) -], CodeEditorComponent.prototype, "lineNumbers", void 0); -__decorate([ - Input('line-wrapping'), - __metadata("design:type", Object) -], CodeEditorComponent.prototype, "lineWrapping", void 0); -__decorate([ - Input('scrollbar-style'), - __metadata("design:type", String) -], CodeEditorComponent.prototype, "scrollbarStyle", void 0); -__decorate([ - Input(), - __metadata("design:type", String) -], CodeEditorComponent.prototype, "placeholder", void 0); -__decorate([ - Input('overview-ruler'), - __metadata("design:type", Boolean) -], CodeEditorComponent.prototype, "overviewRuler", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], CodeEditorComponent.prototype, "dslChange", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], CodeEditorComponent.prototype, "focus", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], CodeEditorComponent.prototype, "blur", void 0); -__decorate([ - Output(), - __metadata("design:type", Object) -], CodeEditorComponent.prototype, "editor", void 0); -__decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) -], CodeEditorComponent.prototype, "dsl", null); -__decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) -], CodeEditorComponent.prototype, "language", null); -CodeEditorComponent = CodeEditorComponent_1 = __decorate([ - Component({ - selector: 'code-editor', - template: ` -
- -
- `, - styles: [` - .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror { - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - height: 100%; - } - .CodeMirror-hint { - max-width: 38em; - } - .CodeMirror-vertical-ruler-error { - background-color: rgba(188, 0, 0, 0.5); - } - .CodeMirror-vertical-ruler-warning { - background-color: rgba(255, 188, 0, 0.5); - } - .CodeMirror-lint-tooltip { - z-index: 2000; - } - `], - encapsulation: ViewEncapsulation.None, - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => CodeEditorComponent_1), - multi: true - } - ] - }), - __metadata("design:paramtypes", [ElementRef]) -], CodeEditorComponent); - -var Properties; -(function (Properties) { - let InputType; - (function (InputType) { - InputType[InputType["TEXT"] = 0] = "TEXT"; - InputType[InputType["NUMBER"] = 1] = "NUMBER"; - InputType[InputType["SELECT"] = 2] = "SELECT"; - InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; - InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; - InputType[InputType["EMAIL"] = 5] = "EMAIL"; - InputType[InputType["URL"] = 6] = "URL"; - InputType[InputType["CODE"] = 7] = "CODE"; - })(InputType = Properties.InputType || (Properties.InputType = {})); - class GenericControlModel { - constructor(_property, type, validation) { - this._property = _property; - this.type = type; - this.validation = validation; - } - get id() { - return this.property.id; - } - get name() { - return this.property.name; - } - get description() { - return this.property.description; - } - get defaultValue() { - return this.property.defaultValue; - } - get value() { - return this.getValue(); - } - set value(value) { - this.setValue(value); - } - get property() { - return this._property; - } - setValue(value) { - this.property.value = value; - } - getValue() { - return this.property.value; - } - } - Properties.GenericControlModel = GenericControlModel; - class CheckBoxControlModel extends GenericControlModel { - constructor(_property, validation) { - super(_property, InputType.CHECKBOX, validation); - } - getValue() { - const res = super.getValue(); - const type = typeof res; - switch (type) { - case 'boolean': - return res; - case 'string': - switch (res.trim().toLowerCase()) { - case 'true': - case '1': - return true; - case 'false': - case '0': - return false; - default: - return this.property.defaultValue; - } - case 'number': - const num = res; - if (num === 0) { - return false; - } - else if (num === 1) { - return true; - } - else { - return this.property.defaultValue; - } - } - return this.property.defaultValue; - } - } - Properties.CheckBoxControlModel = CheckBoxControlModel; - class AbstractCodeControlModel extends GenericControlModel { - constructor(_property, encode, decode, validation) { - super(_property, InputType.CODE, validation); - this.encode = encode; - this.decode = decode; - } - set value(value) { - if (value && this.encode) { - super.setValue(this.encode(value)); - } - else { - super.setValue(value); - } - } - get value() { - let dsl = super.getValue(); - if (dsl && this.decode) { - return this.decode(dsl); - } - else { - return dsl; - } - } - } - Properties.AbstractCodeControlModel = AbstractCodeControlModel; - class GenericCodeControlModel extends AbstractCodeControlModel { - constructor(_property, language, encode, decode, validation) { - super(_property, encode, decode, validation); - this.language = language; - } - } - Properties.GenericCodeControlModel = GenericCodeControlModel; - class CodeControlModelWithDynamicLanguageProperty extends AbstractCodeControlModel { - constructor(_property, _languagePropertyName, _groupModel, encode, decode, validation) { - super(_property, encode, decode, validation); - this._languagePropertyName = _languagePropertyName; - this._groupModel = _groupModel; - } - get language() { - const value = this.languageControlModel.value; - return value ? value : this.languageControlModel.defaultValue; - } - get languageControlModel() { - if (!this._langControlModel) { - // Cast to Properties.ControlModel from Properties.ControlModel | undefined - // Should not be undefined! - this._langControlModel = this._groupModel.getControlsModels().find(c => c.id === this._languagePropertyName); - } - return this._langControlModel; - } - } - Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; - class GenericListControlModel extends GenericControlModel { - constructor(property, validation) { - super(property, InputType.TEXT, validation); - } - get value() { - return this.property.value ? this.property.value.join(', ') : ''; - } - set value(value) { - this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; - } - } - Properties.GenericListControlModel = GenericListControlModel; - class SelectControlModel extends GenericControlModel { - constructor(_property, type, options) { - super(_property, type); - this.options = options; - if (_property.defaultValue === undefined) { - options.unshift({ - name: 'SELECT', - value: _property.defaultValue - }); - } - } - } - Properties.SelectControlModel = SelectControlModel; - class DefaultCellPropertiesSource { - constructor(cell) { - this.cell = cell; - } - getProperties() { - let metadata = this.cell.attr('metadata'); - return Promise.resolve(metadata.properties().then(propsMetadata => Array.from(propsMetadata.values()).map(m => this.createProperty(m)))); - } - createProperty(metadata) { - return { - id: metadata.id, - name: metadata.name, - type: metadata.type, - defaultValue: metadata.defaultValue, - attr: `props/${metadata.name}`, - value: this.cell.attr(`props/${metadata.name}`), - description: metadata.description, - valueOptions: metadata.options - }; - } - applyChanges(properties) { - this.cell.trigger('batch:start', { batchName: 'update properties' }); - properties.forEach(property => { - if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || - (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { - let currentValue = this.cell.attr(property.attr); - if (currentValue !== undefined && currentValue !== null) { - // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync - this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); - this.cell.removeAttr(property.attr); - } - } - else { - this.cell.attr(property.attr, property.value); - } - }); - this.cell.trigger('batch:stop', { batchName: 'update properties' }); - } - } - Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; - class PropertiesGroupModel { - constructor(propertiesSource) { - this.loading = true; - this.propertiesSource = propertiesSource; - } - load() { - this.loading = true; - this._loadedSubject = new Subject(); - this.propertiesSource.getProperties().then(properties => { - this.controlModels = properties.map(p => this.createControlModel(p)); - this.loading = false; - this._loadedSubject.next(true); - this._loadedSubject.complete(); - }); - } - get isLoading() { - return this.loading; - } - get loadedSubject() { - return this._loadedSubject; - } - getControlsModels() { - return this.controlModels; - } - createControlModel(property) { - return new GenericControlModel(property, InputType.TEXT); - } - applyChanges() { - if (this.loading) { - return; - } - let properties = this.controlModels.map(cm => cm.property); - this.propertiesSource.applyChanges(properties); - } - } - Properties.PropertiesGroupModel = PropertiesGroupModel; - let Validators; - (function (Validators) { - function uniqueResource(service, debounce$$1) { - return (control) => { - return new Observable(obs => { - if (control.valueChanges && control.value) { - control.valueChanges - .pipe(debounceTime(debounce$$1), mergeMap(value => service(value))) - .subscribe(() => { - obs.next({ uniqueResource: true }); - obs.complete(); - }, () => { - obs.next(undefined); - obs.complete(); - }); - } - else { - obs.next(undefined); - obs.complete(); - } - }); - }; - } - Validators.uniqueResource = uniqueResource; - function noneOf(excluded) { - return (control) => { - return excluded.find(e => e === control.value) ? { 'noneOf': { value: control.value } } : {}; - }; - } - Validators.noneOf = noneOf; - })(Validators = Properties.Validators || (Properties.Validators = {})); -})(Properties || (Properties = {})); - -let PropertiesGroupComponent = class PropertiesGroupComponent { - ngOnInit() { - if (this.propertiesGroupModel.isLoading) { - let subscription = this.propertiesGroupModel.loadedSubject.subscribe(loaded => { - if (loaded) { - subscription.unsubscribe(); - this.createGroupControls(); - } - }); - } - else { - this.createGroupControls(); - } - } - createGroupControls() { - this.propertiesGroupModel.getControlsModels().forEach(c => { - if (c.validation) { - this.form.addControl(c.id, new FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); - } - else { - this.form.addControl(c.id, new FormControl(c.value || '')); - } - }); - } -}; -__decorate([ - Input(), - __metadata("design:type", Properties.PropertiesGroupModel) -], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); -__decorate([ - Input(), - __metadata("design:type", FormGroup) -], PropertiesGroupComponent.prototype, "form", void 0); -PropertiesGroupComponent = __decorate([ - Component({ - selector: 'properties-group', - template: ` -
- -
- `, - encapsulation: ViewEncapsulation.None - }) -], PropertiesGroupComponent); - -let DynamicFormPropertyComponent = class DynamicFormPropertyComponent { - constructor() { } - get types() { - return Properties.InputType; - } - get control() { - return this.form.controls[this.model.id]; - } - get errorData() { - return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) - .filter(e => this.control.errors && this.control.errors[e.id]); - } -}; -__decorate([ - Input(), - __metadata("design:type", Object) -], DynamicFormPropertyComponent.prototype, "model", void 0); -__decorate([ - Input(), - __metadata("design:type", FormGroup) -], DynamicFormPropertyComponent.prototype, "form", void 0); -DynamicFormPropertyComponent = __decorate([ - Component({ - selector: 'df-property', - template: ` - - - - - - - -
- - - - - - - - - - - - - - - - - -
-
-
{{model.description}}
-
{{e.message}}
-
- - - - `, - encapsulation: ViewEncapsulation.None - }), - __metadata("design:paramtypes", []) -], DynamicFormPropertyComponent); - -let FloModule = class FloModule { -}; -FloModule = __decorate([ - NgModule({ - imports: [ - FormsModule, - CommonModule, - ReactiveFormsModule - ], - declarations: [ - Palette, - EditorComponent, - ResizerDirective, - DslEditorComponent, - CodeEditorComponent, - PropertiesGroupComponent, - DynamicFormPropertyComponent - ], - exports: [ - EditorComponent, - DslEditorComponent, - DynamicFormPropertyComponent, - PropertiesGroupComponent - ] - }) -], FloModule); - -/** - * Generated bundle index. Do not edit. - */ - -export { FloModule, Palette, EditorComponent, DslEditorComponent, CodeEditorComponent, PropertiesGroupComponent, DynamicFormPropertyComponent, ResizerDirective, Flo, Properties, Constants, Shapes }; -//# sourceMappingURL=spring-flo.js.map diff --git a/dist/fesm5/spring-flo.js b/dist/fesm5/spring-flo.js deleted file mode 100644 index f5f72c0..0000000 --- a/dist/fesm5/spring-flo.js +++ /dev/null @@ -1,3326 +0,0 @@ -import * as _joint from 'jointjs'; -import * as _$ from 'jquery'; -import { isEqual, partial, debounce, cloneDeepWith, isObject, isPlainObject, template, isFunction, groupBy, each, isString, isNumber } from 'lodash'; -import { __decorate, __metadata, __param, __extends } from 'tslib'; -import { Component, ElementRef, Input, Output, EventEmitter, Inject, ViewEncapsulation, Directive, forwardRef, NgModule } from '@angular/core'; -import { Subject, BehaviorSubject, fromEvent, Observable } from 'rxjs'; -import { debounceTime, sampleTime, mergeMap } from 'rxjs/operators'; -import { DOCUMENT } from '@angular/platform-browser'; -import { CompositeDisposable, Disposable } from 'ts-disposables'; -import { fromTextArea, findModeByName } from 'codemirror-minified'; -import 'codemirror-minified/addon/lint/lint'; -import 'codemirror-minified/addon/hint/show-hint'; -import 'codemirror-minified/addon/display/placeholder'; -import 'codemirror-minified/addon/scroll/annotatescrollbar'; -import 'codemirror-minified/addon/scroll/simplescrollbars'; -import { NG_VALUE_ACCESSOR, FormGroup, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; -import 'codemirror-minified/mode/meta'; -import 'codemirror-minified/addon/edit/matchbrackets'; -import 'codemirror-minified/addon/edit/closebrackets'; -import 'codemirror-minified/addon/lint/javascript-lint'; -import 'codemirror-minified/addon/lint/coffeescript-lint'; -import 'codemirror-minified/addon/lint/json-lint'; -import 'codemirror-minified/addon/lint/yaml-lint'; -import 'codemirror-minified/mode/groovy/groovy'; -import 'codemirror-minified/mode/javascript/javascript'; -import 'codemirror-minified/mode/python/python'; -import 'codemirror-minified/mode/ruby/ruby'; -import 'codemirror-minified/mode/clike/clike'; -import 'codemirror-minified/mode/yaml/yaml'; -import 'codemirror-minified/mode/coffeescript/coffeescript'; -import { CommonModule } from '@angular/common'; - -var $ = _$; -var Flo; -(function (Flo) { - Flo.joint = _joint; - var DnDEventType; - (function (DnDEventType) { - DnDEventType[DnDEventType["DRAG"] = 0] = "DRAG"; - DnDEventType[DnDEventType["DROP"] = 1] = "DROP"; - })(DnDEventType = Flo.DnDEventType || (Flo.DnDEventType = {})); - var Severity; - (function (Severity) { - Severity[Severity["Error"] = 0] = "Error"; - Severity[Severity["Warning"] = 1] = "Warning"; - })(Severity = Flo.Severity || (Flo.Severity = {})); - function findMagnetByClass(view, className) { - if (className && className.startsWith('.')) { - className = className.substr(1); - } - var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('class').split(/\s+/).indexOf(className) >= 0; }); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByClass = findMagnetByClass; - function findMagnetByPort(view, port) { - var element = view.$('[magnet]').toArray().find(function (magnet) { return magnet.getAttribute('port') === port; }); - if (element) { - return view.findMagnet($(element)); - } - } - Flo.findMagnetByPort = findMagnetByPort; - /** - * Return the metadata for a particular palette entry in a particular group. - * @param name - name of the palette entry - * @param group - group in which the palette entry should exist (e.g. sinks) - * @return - */ - function getMetadata(metamodel, name, group) { - var groupObj = metamodel && group ? metamodel.get(group) : undefined; - if (name && groupObj && groupObj.get(name)) { - return metamodel.get(group).get(name); - } - else { - return { - name: name, - group: group, - unresolved: true, - get: function (property) { return new Promise(function (resolve) { return resolve(); }); }, - properties: function () { return Promise.resolve(new Map()); } - }; - } - } - Flo.getMetadata = getMetadata; -})(Flo || (Flo = {})); - -var joint = Flo.joint; -var $$1 = _$; -var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); -var isFF = navigator.userAgent.indexOf('Firefox') > 0; -var IMAGE_W = 120; -var IMAGE_H = 35; -var ERROR_MARKER_SIZE = { width: 16, height: 16 }; -var HANDLE_SIZE = { width: 10, height: 10 }; -joint.shapes.flo = {}; -joint.shapes.flo.NODE_TYPE = 'sinspctr.IntNode'; -joint.shapes.flo.LINK_TYPE = 'sinspctr.Link'; -joint.shapes.flo.DECORATION_TYPE = 'decoration'; -joint.shapes.flo.HANDLE_TYPE = 'handle'; -var HANDLE_ICON_MAP = new Map(); -var REMOVE = 'remove'; -HANDLE_ICON_MAP.set(REMOVE, 'icons/delete.svg'); -var DECORATION_ICON_MAP = new Map(); -var ERROR = 'error'; -DECORATION_ICON_MAP.set(ERROR, 'icons/error.svg'); -joint.util.cloneDeep = function (obj) { - return cloneDeepWith(obj, function (o) { - if (isObject(o) && !isPlainObject(o)) { - return o; - } - }); -}; -joint.util.filter.redscale = function (args) { - var amount = Number.isFinite(args.amount) ? args.amount : 1; - return template('', { - a: 1 - 0.96 * amount, - b: 0.95 * amount, - c: 0.01 * amount, - d: 0.3 * amount, - e: 0.2 * amount, - f: 1 - 0.9 * amount, - g: 0.7 * amount, - h: 0.05 * amount, - i: 0.05 * amount, - k: 1 - 0.1 * amount - }); -}; -joint.util.filter.orangescale = function (args) { - var amount = Number.isFinite(args.amount) ? args.amount : 1; - return template('', { - a: 1.0 + 0.5 * amount, - b: 1.4 * amount, - c: 0.2 * amount, - d: 0.3 * amount, - e: 0.3 * amount, - f: 1 + 0.05 * amount, - g: 0.2 * amount, - h: 0.15 * amount, - i: 0.3 * amount, - k: 0.3 * amount, - l: 1 - 0.6 * amount - }); -}; -joint.shapes.flo.Node = joint.shapes.basic.Generic.extend({ - markup: '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.NODE_TYPE, - position: { x: 0, y: 0 }, - size: { width: IMAGE_W, height: IMAGE_H }, - attrs: { - '.': { magnet: false }, - // rounded edges around image - '.border': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - 'fill-opacity': 0, - stroke: '#eeeeee', - 'stroke-width': 0 - }, - '.box': { - width: IMAGE_W, - height: IMAGE_H, - rx: 3, - ry: 3, - //'fill-opacity': 0, // see through - stroke: '#6db33f', - fill: '#eeeeee', - 'stroke-width': 1 - }, - '.input-port': { - port: 'input', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + -4 + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.output-port': { - port: 'output', - height: 8, width: 8, - magnet: true, - fill: '#eeeeee', - transform: 'translate(' + (IMAGE_W - 4) + ',' + ((IMAGE_H / 2) - 4) + ')', - stroke: '#34302d', - 'stroke-width': 1 - }, - '.label': { - 'text-anchor': 'middle', - 'ref-x': 0.5, - // 'ref-y': -12, // jointjs specific: relative position to ref'd element - 'ref-y': 0.3, - ref: '.border', - fill: 'black', - 'font-size': 14 - }, - '.label2': { - 'text': '\u21d2', - 'text-anchor': 'middle', - 'ref-x': 0.15, - 'ref-y': 0.2, - ref: '.border', - // transform: 'translate(' + (IMAGE_W/2) + ',' + (IMAGE_H/2) + ')', - fill: 'black', - 'font-size': 24 - }, - '.shape': {}, - '.image': { - width: IMAGE_W, - height: IMAGE_H - } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); -joint.shapes.flo.Link = joint.dia.Link.extend({ - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.LINK_TYPE, - attrs: { - '.connection': { stroke: '#34302d', 'stroke-width': 2 }, - // Lots of alternatives that have been played with: - // '.smoooth': true - // '.marker-source': { stroke: '#9B59B6', fill: '#9B59B6', d: 'M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z' }, - // '.marker-target': { stroke: '#F39C12', fill: '#F39C12', d: 'M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z' }, - // '.connection': { 'stroke':'black'}, - // '.': { filter: { name: 'dropShadow', args: { dx: 1, dy: 1, blur: 2 } } }, - // '.connection': { 'stroke-width': 10, 'stroke-linecap': 'round' }, - // This means: moveto 10 0, lineto 0 5, lineto, 10 10 closepath(z) - // '.marker-target': { d: 'M 5 0 L 0 7 L 5 14 z', stroke: '#34302d','stroke-width': 1}, - // '.marker-target': { d: 'M 14 2 L 9,2 L9,0 L 0,7 L 9,14 L 9,12 L 14,12 z', 'stroke-width': 1, fill: '#34302d', stroke: '#34302d'}, - // '.marker-source': {d: 'M 5 0 L 5,10 L 0,10 L 0,0 z', 'stroke-width': 0, fill: '#34302d', stroke: '#34302d'}, - // '.marker-target': { stroke: '#E74C3C', fill: '#E74C3C', d: 'M 10 0 L 0 5 L 10 10 z' }, - '.marker-arrowheads': { display: 'none' }, - '.tool-options': { display: 'none' } - }, - }, joint.dia.Link.prototype.defaults) -}); -joint.shapes.flo.LinkView = joint.dia.LinkView.extend({ - options: joint.util.deepSupplement({}, joint.dia.LinkView.prototype.options), - _beforeArrowheadMove: function () { - if (this.model.get('source').id) { - this._oldSource = this.model.get('source'); - } - if (this.model.get('target').id) { - this._oldTarget = this.model.get('target'); - } - joint.dia.LinkView.prototype._beforeArrowheadMove.apply(this, arguments); - }, - _afterArrowheadMove: function () { - joint.dia.LinkView.prototype._afterArrowheadMove.apply(this, arguments); - if (!this.model.get('source').id) { - if (this._oldSource) { - this.model.set('source', this._oldSource); - } - else { - this.model.remove(); - } - } - if (!this.model.get('target').id) { - if (this._oldTarget) { - this.model.set('target', this._oldTarget); - } - else { - this.model.remove(); - } - } - delete this._oldSource; - delete this._oldTarget; - } -}); -// TODO: must do cleanup for the `mainElementView' -joint.shapes.flo.ElementView = joint.dia.ElementView.extend({ - // canShowTooltip: true, - beingDragged: false, - // _tempZorder: 0, - _tempOpacity: 1.0, - _hovering: false, - dragLinkStart: function (evt, magnet, x, y) { - this.model.startBatch('add-link'); - var linkView = this.addLinkFromMagnet(magnet, x, y); - // backwards compatiblity events - joint.dia.CellView.prototype.pointerdown.apply(linkView, [evt, x, y]); - linkView.notify('link:pointerdown', evt, x, y); - /*** START MAIN DIFF ***/ - var sourceOrTarget = $$1(magnet).attr('port') === 'input' ? 'source' : 'target'; - linkView.eventData(evt, linkView.startArrowheadMove(sourceOrTarget, { whenNotAllowed: 'remove' })); - /*** END MAIN DIFF ***/ - this.eventData(evt, { linkView: linkView }); - }, - addLinkFromMagnet: function (magnet, x, y) { - var paper = this.paper; - var graph = paper.model; - var link = paper.getDefaultLink(this, magnet); - var sourceEnd, targetEnd; - /*** START MAIN DIFF ***/ - if ($$1(magnet).attr('port') === 'input') { - sourceEnd = { x: x, y: y }; - targetEnd = this.getLinkEnd(magnet, x, y, link, 'target'); - } - else { - sourceEnd = this.getLinkEnd(magnet, x, y, link, 'source'); - targetEnd = { x: x, y: y }; - } - /*** END MAIN DIFF ***/ - link.set({ - source: sourceEnd, - target: targetEnd - }).addTo(graph, { - async: false, - ui: true - }); - return link.findView(paper); - }, - // pointerdown: function(evt: any, x: number, y: number) { - // // this.canShowTooltip = false; - // // this.hideTooltip(); - // this.beingDragged = false; - // this._tempOpacity = this.model.attr('./opacity'); - // - // this.model.trigger('batch:start'); - // - // if ( // target is a valid magnet start linking - // evt.target.getAttribute('magnet') && - // this.paper.options.validateMagnet.call(this.paper, this, evt.target) - // ) { - // let link = this.paper.getDefaultLink(this, evt.target); - // if ($(evt.target).attr('port') === 'input') { - // link.set({ - // source: { x: x, y: y }, - // target: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // } - // }); - // } else { - // link.set({ - // source: { - // id: this.model.id, - // selector: this.getSelector(evt.target), - // port: evt.target.getAttribute('port') - // }, - // target: { x: x, y: y } - // }); - // } - // this.paper.model.addCell(link); - // this._linkView = this.paper.findViewByModel(link); - // if ($(evt.target).attr('port') === 'input') { - // this._linkView.startArrowheadMove('source'); - // } else { - // this._linkView.startArrowheadMove('target'); - // } - // this.paper.__creatingLinkFromPort = true; - // } else { - // this._dx = x; - // this._dy = y; - // joint.dia.CellView.prototype.pointerdown.apply(this, arguments); - // } - // }, - drag: function (evt, x, y) { - var interactive = isFunction(this.options.interactive) ? this.options.interactive(this, 'pointermove') : - this.options.interactive; - if (interactive !== false) { - this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DRAG, view: this, event: evt }); - } - joint.dia.ElementView.prototype.drag.apply(this, arguments); - }, - dragEnd: function (evt, x, y) { - this.paper.trigger('dragging-node-over-canvas', { type: Flo.DnDEventType.DROP, view: this, event: evt }); - joint.dia.ElementView.prototype.dragEnd.apply(this, arguments); - }, -}); -joint.shapes.flo.ErrorDecoration = joint.shapes.basic.Generic.extend({ - markup: '', - defaults: joint.util.deepSupplement({ - type: joint.shapes.flo.DECORATION_TYPE, - size: ERROR_MARKER_SIZE, - attrs: { - 'image': ERROR_MARKER_SIZE - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); -var Constants; -(function (Constants) { - Constants.REMOVE_HANDLE_TYPE = REMOVE; - Constants.PROPERTIES_HANDLE_TYPE = 'properties'; - Constants.ERROR_DECORATION_KIND = ERROR; - Constants.PALETTE_CONTEXT = 'palette'; - Constants.CANVAS_CONTEXT = 'canvas'; - Constants.FEEDBACK_CONTEXT = 'feedback'; -})(Constants || (Constants = {})); -var Shapes; -(function (Shapes) { - var Factory = /** @class */ (function () { - function Factory() { - } - /** - * Create a JointJS node that embeds extra metadata (properties). - */ - Factory.createNode = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var metadata = params.metadata; - var position = params.position; - var props = params.props; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - var node; - if (!position) { - position = { x: 0, y: 0 }; - } - if (renderer && isFunction(renderer.createNode)) { - node = renderer.createNode(metadata, props); - } - else { - node = new joint.shapes.flo.Node(); - if (metadata) { - node.attr('.label/text', metadata.name); - } - } - node.set('type', joint.shapes.flo.NODE_TYPE); - if (position) { - node.set('position', position); - } - if (props) { - Array.from(props.keys()).forEach(function (key) { return node.attr("props/" + key, props.get(key)); }); - } - node.attr('metadata', metadata); - if (graph) { - graph.addCell(node); - } - if (renderer && isFunction(renderer.initializeNewNode)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewNode(node, descriptor); - } - return node; - }; - Factory.createLink = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var metadata = params.metadata; - var source = params.source; - var target = params.target; - var props = params.props; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - var link; - if (renderer && isFunction(renderer.createLink)) { - link = renderer.createLink(source, target, metadata, props); - } - else { - link = new joint.shapes.flo.Link(); - } - if (source) { - link.set('source', source); - } - if (target) { - link.set('target', target); - } - link.set('type', joint.shapes.flo.LINK_TYPE); - if (metadata) { - link.attr('metadata', metadata); - } - if (props) { - Array.from(props.keys()).forEach(function (key) { return link.attr("props/" + key, props.get(key)); }); - } - if (graph) { - graph.addCell(link); - } - if (renderer && isFunction(renderer.initializeNewLink)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewLink(link, descriptor); - } - // prevent creation of link breaks - link.attr('.marker-vertices/display', 'none'); - return link; - }; - Factory.createDecoration = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var parent = params.parent; - var kind = params.kind; - var messages = params.messages; - var location = params.position; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - if (!location) { - location = { x: 0, y: 0 }; - } - var decoration; - if (renderer && isFunction(renderer.createDecoration)) { - decoration = renderer.createDecoration(kind, parent); - } - else { - decoration = new joint.shapes.flo.ErrorDecoration({ - attrs: { - image: { 'xlink:href': DECORATION_ICON_MAP.get(kind) }, - } - }); - } - decoration.set('type', joint.shapes.flo.DECORATION_TYPE); - decoration.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - decoration.set('z', parent.get('z') + 1); - } - decoration.attr('./kind', kind); - decoration.attr('messages', messages); - if (graph) { - graph.addCell(decoration); - } - parent.embed(decoration); - if (renderer && isFunction(renderer.initializeNewDecoration)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewDecoration(decoration, descriptor); - } - return decoration; - }; - Factory.createHandle = function (params) { - var renderer = params.renderer; - var paper = params.paper; - var parent = params.parent; - var kind = params.kind; - var location = params.position; - var graph = params.graph || (params.paper ? params.paper.model : undefined); - var handle; - if (!location) { - location = { x: 0, y: 0 }; - } - if (renderer && isFunction(renderer.createHandle)) { - handle = renderer.createHandle(kind, parent); - } - else { - handle = new joint.shapes.flo.ErrorDecoration({ - size: HANDLE_SIZE, - attrs: { - 'image': { - 'xlink:href': HANDLE_ICON_MAP.get(kind) - } - } - }); - } - handle.set('type', joint.shapes.flo.HANDLE_TYPE); - handle.set('position', location); - if ((isChrome || isFF) && parent && typeof parent.get('z') === 'number') { - handle.set('z', parent.get('z') + 1); - } - handle.attr('./kind', kind); - if (graph) { - graph.addCell(handle); - } - parent.embed(handle); - if (renderer && isFunction(renderer.initializeNewHandle)) { - var descriptor = { - paper: paper, - graph: graph - }; - renderer.initializeNewHandle(handle, descriptor); - } - return handle; - }; - return Factory; - }()); - Shapes.Factory = Factory; -})(Shapes || (Shapes = {})); - -var joint$1 = Flo.joint; -var $$2 = _$; -var DEBOUNCE_TIME = 300; -joint$1.shapes.flo.PaletteGroupHeader = joint$1.shapes.basic.Generic.extend({ - // The path is the open/close arrow, defaults to vertical (open) - markup: '', - defaults: joint$1.util.deepSupplement({ - type: 'palette.groupheader', - size: { width: 170, height: 30 }, - position: { x: 0, y: 0 }, - attrs: { - 'rect': { fill: '#34302d', 'stroke-width': 1, stroke: '#6db33f', 'follow-scale': true, width: 80, height: 40 }, - 'text': { - text: '', - fill: '#eeeeee', - 'ref-x': 0.5, - 'ref-y': 7, - 'x-alignment': 'middle', - 'font-size': 18 /*, 'font-weight': 'bold', 'font-variant': 'small-caps', 'text-transform': 'capitalize'*/ - }, - 'path': { fill: 'white', 'stroke-width': 2, stroke: 'white' /*,transform:'rotate(90,15,15)'*/ } - }, - // custom properties - isOpen: true - }, joint$1.shapes.basic.Generic.prototype.defaults) -}); -var Palette = /** @class */ (function () { - function Palette(element, document) { - var _this = this; - this.element = element; - this.document = document; - this._metamodelListener = { - metadataError: function (data) { }, - metadataAboutToChange: function () { }, - metadataChanged: function () { return _this.rebuildPalette(); } - }; - this.initialized = false; - this._filterText = ''; - this.filterTextModel = new Subject(); - this.paletteEntryPadding = { width: 12, height: 12 }; - this.onPaletteEntryDrop = new EventEmitter(); - this.paletteReady = new EventEmitter(); - this.paletteFocus = new EventEmitter(); - this.mouseMoveHanlder = function (e) { return _this.handleDrag(e); }; - this.mouseUpHanlder = function (e) { return _this.handleMouseUp(e); }; - this.paletteGraph = new joint$1.dia.Graph(); - this.paletteGraph.set('type', Constants.PALETTE_CONTEXT); - this._filterText = ''; - this.closedGroups = new Set(); - } - Object.defineProperty(Palette.prototype, "paletteSize", { - set: function (size) { - console.debug('Palette Size: ' + size); - if (this._paletteSize !== size) { - this._paletteSize = size; - this.rebuildPalette(); - } - }, - enumerable: true, - configurable: true - }); - Palette.prototype.onFocus = function () { - this.paletteFocus.emit(); - }; - Palette.prototype.ngOnInit = function () { - var _this = this; - var element = $$2('#palette-paper', this.element.nativeElement); - // Create the paper for the palette using the specified element view - this.palette = new joint$1.dia.Paper({ - el: element, - gridSize: 1, - model: this.paletteGraph, - height: $$2(this.element.nativeElement.parentNode).height(), - width: $$2(this.element.nativeElement.parentNode).width(), - elementView: this.getPaletteView(this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView), - interactive: false - }); - this.palette.on('cell:pointerup', function (cellview, evt) { - if (_this.viewBeingDragged) { - _this.trigger({ - type: Flo.DnDEventType.DROP, - view: _this.viewBeingDragged, - event: evt - }); - _this.viewBeingDragged = undefined; - } - _this.clickedElement = undefined; - $$2('#palette-floater').remove(); - if (_this.floaterpaper) { - _this.floaterpaper.remove(); - } - }); - // Toggle the header open/closed on a click - this.palette.on('cell:pointerclick', function (cellview, event) { - // TODO [design][palette] should the user need to click on the arrow rather than anywhere on the header? - // Click position within the element would be: evt.offsetX, evt.offsetY - var cell = cellview.model; - if (cell.attributes.header) { - // Toggle the header open/closed - if (cell.get('isOpen')) { - _this.rotateClosed(cell); - } - else { - _this.rotateOpen(cell); - } - } - // TODO [palette] ensure other mouse handling events do nothing for headers - // TODO [palette] move 'metadata' field to the right place (not inside attrs I think) - }); - $$2(this.document).on('mouseup', this.mouseUpHanlder); - if (this.metamodel) { - this.metamodel.load().then(function (data) { - _this.buildPalette(data); - // Add listener to metamodel - if (_this.metamodel && _this.metamodel.subscribe) { - _this.metamodel.subscribe(_this._metamodelListener); - } - // Add debounced listener to filter text changes - _this.filterTextModel - .pipe(debounceTime(DEBOUNCE_TIME)) - .subscribe(function (value) { return _this.rebuildPalette(); }); - _this.initialized = true; - }); - } - else { - console.error('No Metamodel service specified for palette!'); - } - this._paletteSize = this._paletteSize || $$2(this.element.nativeElement.parentNode).width(); - }; - Palette.prototype.ngOnDestroy = function () { - if (this.metamodel && this.metamodel.unsubscribe) { - this.metamodel.unsubscribe(this._metamodelListener); - } - $$2(this.document).off('mouseup', this.mouseUpHanlder); - this.palette.remove(); - }; - Palette.prototype.ngOnChanges = function (changes) { - // if (changes.hasOwnProperty('paletteSize') || changes.hasOwnProperty('filterText')) { - // this.metamodel.load().then(metamodel => this.buildPalette(metamodel)); - // } - }; - Palette.prototype.createPaletteGroup = function (title, isOpen) { - var newGroupHeader = new joint$1.shapes.flo.PaletteGroupHeader({ attrs: { text: { text: title } } }); - newGroupHeader.set('header', title); - if (!isOpen) { - newGroupHeader.attr({ 'path': { 'transform': 'rotate(-90,15,13)' } }); - newGroupHeader.set('isOpen', false); - } - this.paletteGraph.addCell(newGroupHeader); - return newGroupHeader; - }; - Palette.prototype.createPaletteEntry = function (title, metadata) { - return Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.palette, - metadata: metadata - }); - }; - Palette.prototype.buildPalette = function (metamodel) { - var _this = this; - var startTime = new Date().getTime(); - this.paletteReady.emit(false); - this.paletteGraph.clear(); - var filterText = this.filterText; - if (filterText) { - filterText = filterText.toLowerCase(); - } - var paletteNodes = []; - var groupAdded = new Set(); - var parentWidth = this._paletteSize; - console.debug("Parent Width: " + parentWidth); - // The field closedGroups tells us which should not be shown - // Work out the list of active groups/nodes based on the filter text - this.metamodel.groups().forEach(function (group) { - if (metamodel && metamodel.has(group)) { - Array.from(metamodel.get(group).keys()).sort().forEach(function (name) { - var node = metamodel.get(group).get(name); - if (node) { - var nodeActive = !(node.metadata && node.metadata.noPaletteEntry); - if (nodeActive && filterText) { - nodeActive = false; - if (name.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - else if (group.toLowerCase().indexOf(filterText) !== -1) { - nodeActive = true; - } - // else if (node.description && node.description.toLowerCase().indexOf(filterText) !== -1) { - // nodeActive = true; - // } - // else if (node.properties) { - // Object.keys(node.properties).sort().forEach(function(propertyName) { - // if (propertyName.toLowerCase().indexOf(filterText) !== -1 || - // (node.properties[propertyName].description && - // node.properties[propertyName].description.toLowerCase().indexOf(filterText) !== -1)) { - // nodeActive=true; - // } - // }); - // } - } - if (nodeActive) { - if (!groupAdded.has(group)) { - var header = _this.createPaletteGroup(group, !_this.closedGroups.has(group)); - header.set('size', { width: parentWidth, height: 30 }); - paletteNodes.push(header); - groupAdded.add(group); - } - if (!_this.closedGroups.has(group)) { - paletteNodes.push(_this.createPaletteEntry(name, node)); - } - } - } - }); - } - }); - var cellWidth = 0, cellHeight = 0; - // Determine the size of the palette entry cell (width and height) - paletteNodes.forEach(function (pnode) { - if (pnode.attr('metadata/name')) { - var dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (cellWidth < dimension.width) { - cellWidth = dimension.width; - } - if (cellHeight < dimension.height) { - cellHeight = dimension.height; - } - } - }); - // Adjust the palette entry cell size with paddings. - cellWidth += 2 * this.paletteEntryPadding.width; - cellHeight += 2 * this.paletteEntryPadding.height; - // Align palette entries row to be at the center - var startX = parentWidth >= cellWidth ? (parentWidth - Math.floor(parentWidth / cellWidth) * cellWidth) / 2 : 0; - var xpos = startX; - var ypos = 0; - var prevNode; - // Layout palette entry nodes - paletteNodes.forEach(function (pnode) { - var dimension = { - width: pnode.get('size').width, - height: pnode.get('size').height - }; - if (pnode.get('header')) { //attributes.attrs.header) { - // Palette entry header - xpos = startX; - pnode.set('position', { x: 0, y: ypos }); - ypos += dimension.height + 5; - } - else { - // Palette entry element - if (xpos + cellWidth > parentWidth) { - // Not enough real estate to place entry in a row - reset x position and leave the y pos which is next line - xpos = startX; - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - else { - // Enough real estate to place entry in a row - adjust y position - if (prevNode && prevNode.attr('metadata/name')) { - ypos -= cellHeight; - } - pnode.set('position', { x: xpos + (cellWidth - dimension.width) / 2, y: ypos + (cellHeight - dimension.height) / 2 }); - } - // increment x position and y position (can be reorganized) - xpos += cellWidth; - ypos += cellHeight; - } - prevNode = pnode; - }); - this.palette.setDimensions(parentWidth, ypos); - this.paletteReady.emit(true); - console.debug('buildPalette took ' + (new Date().getTime() - startTime) + 'ms'); - }; - Palette.prototype.rebuildPalette = function () { - var _this = this; - if (this.initialized && this.metamodel) { - this.metamodel.load().then(function (metamodel) { return _this.buildPalette(metamodel); }); - } - }; - Object.defineProperty(Palette.prototype, "filterText", { - get: function () { - return this._filterText; - }, - set: function (text) { - if (this._filterText !== text) { - this._filterText = text; - this.filterTextModel.next(text); - } - }, - enumerable: true, - configurable: true - }); - Palette.prototype.getPaletteView = function (view) { - var self = this; - return view.extend({ - pointerdown: function ( /*evt, x, y*/) { - // Remove the tooltip - // $('.node-tooltip').remove(); - // TODO move metadata to the right place (not inside attrs I think) - self.clickedElement = this.model; - if (self.clickedElement && self.clickedElement.attr('metadata')) { - $$2(self.document).on('mousemove', self.mouseMoveHanlder); - } - }, - pointermove: function ( /*evt, x, y*/) { - // Nothing to prevent move within the palette canvas - }, - }); - }; - Palette.prototype.handleMouseUp = function (event) { - $$2(this.document).off('mousemove', this.mouseMoveHanlder); - }; - Palette.prototype.trigger = function (event) { - this.onPaletteEntryDrop.emit(event); - }; - Palette.prototype.handleDrag = function (event) { - // TODO offsetX/Y not on firefox - // console.debug("tracking move: x="+event.pageX+",y="+event.pageY); - // console.debug('Element = ' + (this.clickedElement ? this.clickedElement.attr('metadata/name'): 'null')); - if (this.clickedElement && this.clickedElement.attr('metadata')) { - if (!this.viewBeingDragged) { - var dataOfClickedElement = this.clickedElement.attr('metadata'); - // custom div if not already built. - $$2('
', { - id: 'palette-floater' - }).appendTo($$2('body')); - var floatergraph = new joint$1.dia.Graph(); - floatergraph.set('type', Constants.FEEDBACK_CONTEXT); - var parent_1 = $$2('#palette-floater'); - this.floaterpaper = new joint$1.dia.Paper({ - el: $$2('#palette-floater'), - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$1.dia.ElementView, - gridSize: 10, - model: floatergraph, - height: parent_1.height(), - width: parent_1.width(), - validateMagnet: function () { return false; }, - validateConnection: function () { return false; } - }); - // TODO float thing needs to be bigger otherwise icon label is missing - // Initiative drag and drop - create draggable element - var floaternode = Shapes.Factory.createNode({ - 'renderer': this.renderer, - 'paper': this.floaterpaper, - 'graph': floatergraph, - 'metadata': dataOfClickedElement - }); - // Only node view expected - var box = this.floaterpaper.findViewByModel(floaternode).getBBox(); - var size = floaternode.get('size'); - // Account for node real size including ports - floaternode.translate(box.width - size.width, box.height - size.height); - this.viewBeingDragged = this.floaterpaper.findViewByModel(floaternode); - $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - } - else { - $$2('#palette-floater').offset({ left: event.pageX + 5, top: event.pageY + 5 }); - this.trigger({ - type: Flo.DnDEventType.DRAG, - view: this.viewBeingDragged, - event: event - }); - } - } - }; - /* - * Modify the rotation of the arrow in the header from horizontal(closed) to vertical(open) - */ - Palette.prototype.rotateOpen = function (element) { - var _this = this; - setTimeout(function () { return _this.doRotateOpen(element, 90); }); - }; - Palette.prototype.doRotateOpen = function (element, angle) { - var _this = this; - angle -= 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle <= 0) { - element.set('isOpen', true); - this.closedGroups.delete(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(function () { return _this.doRotateOpen(element, angle); }, 10); - } - }; - Palette.prototype.doRotateClose = function (element, angle) { - var _this = this; - angle += 10; - element.attr({ 'path': { 'transform': 'rotate(-' + angle + ',15,13)' } }); - if (angle >= 90) { - element.set('isOpen', false); - this.closedGroups.add(element.get('header')); - this.rebuildPalette(); - } - else { - setTimeout(function () { return _this.doRotateClose(element, angle); }, 10); - } - }; - // TODO better name for this function as this does the animation *and* updates the palette - /* - * Modify the rotation of the arrow in the header from vertical(open) to horizontal(closed) - */ - Palette.prototype.rotateClosed = function (element) { - var _this = this; - setTimeout(function () { return _this.doRotateClose(element, 0); }); - }; - __decorate([ - Input(), - __metadata("design:type", Object) - ], Palette.prototype, "metamodel", void 0); - __decorate([ - Input(), - __metadata("design:type", Object) - ], Palette.prototype, "renderer", void 0); - __decorate([ - Input(), - __metadata("design:type", Object) - ], Palette.prototype, "paletteEntryPadding", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], Palette.prototype, "onPaletteEntryDrop", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], Palette.prototype, "paletteReady", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], Palette.prototype, "paletteFocus", void 0); - __decorate([ - Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) - ], Palette.prototype, "paletteSize", null); - Palette = __decorate([ - Component({ - selector: 'flo-palette', - template: "\n
\n \n
\n
\n
\n
\n ", - styles: ["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "], - encapsulation: ViewEncapsulation.None - }), - __param(1, Inject(DOCUMENT)), - __metadata("design:paramtypes", [ElementRef, Object]) - ], Palette); - return Palette; -}()); - -var joint$2 = Flo.joint; -var $$3 = _$; -var Utils = /** @class */ (function () { - function Utils() { - } - Utils.fanRoute = function (graph, cell) { - if (cell instanceof joint$2.dia.Element) { - var links = graph.getConnectedLinks(cell); - var groupsOfOverlappingLinks = groupBy(links, function (link) { - // the key of the group is the model id of the link's source or target, but not our cell id. - var sourceId = link.get('source').id; - var targetId = link.get('target').id; - return cell.id !== sourceId ? sourceId : targetId; - }); - each(groupsOfOverlappingLinks, function (group, key) { - // If the member of the group has both source and target model adjust vertices. - var toRoute = {}; - if (key !== undefined) { - group.forEach(function (link) { - if (link.get('source').id === cell.get('id') && link.get('target').id) { - toRoute[link.get('target').id] = link; - } - else if (link.get('target').id === cell.get('id') && link.get('source').id) { - toRoute[link.get('source').id] = link; - } - }); - Object.keys(toRoute).forEach(function (k) { - Utils.fanRoute(graph, toRoute[k]); - }); - } - }); - } - else if (cell instanceof joint$2.dia.Link) { - // The cell is a link. Let's find its source and target models. - var srcId_1 = cell.get('source').id || cell.previous('source').id; - var trgId_1 = cell.get('target').id || cell.previous('target').id; - // If one of the ends is not a model, the link has no siblings. - if (!srcId_1 || !trgId_1) { - return; - } - var siblings = graph.getLinks().filter(function (sibling) { - var _srcId = sibling.get('source').id; - var _trgId = sibling.get('target').id; - var vertices = sibling.get('vertices'); - var fanRouted = !vertices || vertices.length === 0 || sibling.get('fanRouted'); - return ((_srcId === srcId_1 && _trgId === trgId_1) || (_srcId === trgId_1 && _trgId === srcId_1)) && fanRouted; - }); - switch (siblings.length) { - case 0: - // The link was removed and had no siblings. - break; - case 1: - // There is only one link between the source and target. No vertices needed. - var vertices = cell.get('vertices'); - if (vertices && vertices.length && cell.get('fanRouted')) { - cell.unset('vertices'); - } - break; - default: - // There is more than one siblings. We need to create vertices. - // First of all we'll find the middle point of the link. - var source = graph.getCell(srcId_1); - var target = graph.getCell(trgId_1); - if (!source || !target) { - // When clearing the graph it may happen that some nodes are gone and some are left - return; - } - var srcCenter = source.getBBox().center(); - var trgCenter = target.getBBox().center(); - var midPoint_1 = joint$2.g.line(srcCenter, trgCenter).midpoint(); - // Then find the angle it forms. - var theta_1 = srcCenter.theta(trgCenter); - // This is the maximum distance between links - var gap_1 = 20; - siblings.forEach(function (sibling, index) { - // We want the offset values to be calculated as follows 0, 20, 20, 40, 40, 60, 60 .. - var offset = gap_1 * Math.ceil(index / 2); - // Now we need the vertices to be placed at points which are 'offset' pixels distant - // from the first link and forms a perpendicular angle to it. And as index goes up - // alternate left and right. - // - // ^ odd indexes - // | - // |----> index 0 line (straight line between a source center and a target center. - // | - // v even indexes - var sign = index % 2 ? 1 : -1; - var angle = joint$2.g.toRad(theta_1 + sign * 90); - // We found the vertex. - var vertex = joint$2.g.point.fromPolar(offset, angle, midPoint_1); - sibling.set('fanRouted', true); - sibling.set('vertices', [{ x: vertex.x, y: vertex.y }], { 'fanRouted': true }); - }); - } - } - }; - Utils.isCustomPaperEvent = function (args) { - return args.length === 5 && - isString(args[0]) && - (args[0].indexOf('link:') === 0 || args[0].indexOf('element:') === 0) && - args[1] instanceof $$3.Event && - args[2] instanceof joint$2.dia.CellView && - isNumber(args[3]) && - isNumber(args[4]); - }; - return Utils; -}()); - -var joint$3 = Flo.joint; -var $$4 = _$; -var SCROLLBAR_SIZE = 17; -var EditorComponent = /** @class */ (function () { - function EditorComponent(element) { - var _this = this; - this.element = element; - /** - * Flag specifying whether the Flo-Editor is in read-only mode. - */ - this._readOnlyCanvas = false; - /** - * Grid size - */ - this._gridSize = 1; - this._hiddenPalette = false; - this.textToGraphEventEmitter = new EventEmitter(); - this.graphToTextEventEmitter = new EventEmitter(); - this._graphToTextSyncEnabled = true; - this.validationEventEmitter = new EventEmitter(); - this._disposables = new CompositeDisposable(); - this._dslText = ''; - this.textToGraphConversionCompleted = new Subject(); - this.graphToTextConversionCompleted = new Subject(); - this.paletteReady = new BehaviorSubject(false); - /** - * Min zoom percent value - */ - this.minZoom = 5; - /** - * Max zoom percent value - */ - this.maxZoom = 400; - /** - * Zoom percent increment/decrement step - */ - this.zoomStep = 5; - this.paperPadding = 0; - this.floApi = new EventEmitter(); - this.validationMarkers = new EventEmitter(); - this.contentValidated = new EventEmitter(); - this.dslChange = new EventEmitter(); - this._resizeHandler = function () { return _this.autosizePaper(); }; - var self = this; - this.editorContext = new (/** @class */ (function () { - function DefaultRunnableContext() { - } - Object.defineProperty(DefaultRunnableContext.prototype, "zoomPercent", { - get: function () { - return self.zoomPercent; - }, - set: function (percent) { - self.zoomPercent = percent; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "noPalette", { - get: function () { - return self.noPalette; - }, - set: function (noPalette) { - self.noPalette = noPalette; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "gridSize", { - get: function () { - return self.gridSize; - }, - set: function (gridSize) { - self.gridSize = gridSize; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "readOnlyCanvas", { - get: function () { - return self.readOnlyCanvas; - }, - set: function (readOnly) { - self.readOnlyCanvas = readOnly; - }, - enumerable: true, - configurable: true - }); - DefaultRunnableContext.prototype.setDsl = function (dsl) { - self.dsl = dsl; - }; - DefaultRunnableContext.prototype.updateGraph = function () { - return self.updateGraphRepresentation(); - }; - DefaultRunnableContext.prototype.updateText = function () { - return self.updateTextRepresentation(); - }; - DefaultRunnableContext.prototype.performLayout = function () { - return self.doLayout(); - }; - DefaultRunnableContext.prototype.clearGraph = function () { - var _this = this; - self.selection = undefined; - self.graph.clear(); - if (self.metamodel && self.metamodel.load && self.editor && self.editor.setDefaultContent) { - return self.metamodel.load().then(function (data) { - self.editor.setDefaultContent(_this, data); - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - }); - } - else { - if (!self.graphToTextSync) { - return self.updateTextRepresentation(); - } - } - }; - DefaultRunnableContext.prototype.getGraph = function () { - return self.graph; - }; - DefaultRunnableContext.prototype.getPaper = function () { - return self.paper; - }; - Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextSync", { - get: function () { - return self.graphToTextSync; - }, - set: function (sync) { - self.graphToTextSync = sync; - }, - enumerable: true, - configurable: true - }); - DefaultRunnableContext.prototype.getMinZoom = function () { - return self.minZoom; - }; - DefaultRunnableContext.prototype.getMaxZoom = function () { - return self.maxZoom; - }; - DefaultRunnableContext.prototype.getZoomStep = function () { - return self.zoomStep; - }; - DefaultRunnableContext.prototype.fitToPage = function () { - self.fitToPage(); - }; - DefaultRunnableContext.prototype.createNode = function (metadata, props, position) { - return self.createNode(metadata, props, position); - }; - DefaultRunnableContext.prototype.createLink = function (source, target, metadata, props) { - return self.createLink(source, target, metadata, props); - }; - Object.defineProperty(DefaultRunnableContext.prototype, "selection", { - get: function () { - return self.selection; - }, - set: function (newSelection) { - self.selection = newSelection; - }, - enumerable: true, - configurable: true - }); - DefaultRunnableContext.prototype.deleteSelectedNode = function () { - if (self.selection) { - if (self.editor && self.editor.preDelete) { - self.editor.preDelete(self.editorContext, self.selection.model); - } - else { - if (self.selection.model instanceof joint$3.dia.Element) { - self.graph.getConnectedLinks(self.selection.model).forEach(function (l) { return l.remove(); }); - } - } - self.selection.model.remove(); - self.selection = undefined; - } - }; - Object.defineProperty(DefaultRunnableContext.prototype, "textToGraphConversionObservable", { - get: function () { - return self.textToGraphConversionCompleted; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "graphToTextConversionObservable", { - get: function () { - return self.graphToTextConversionCompleted; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DefaultRunnableContext.prototype, "paletteReady", { - get: function () { - return self.paletteReady; - }, - enumerable: true, - configurable: true - }); - return DefaultRunnableContext; - }()))(); - } - EditorComponent.prototype.ngOnInit = function () { - var _this = this; - this.initGraph(); - this.initPaper(); - this.initGraphListeners(); - this.initPaperListeners(); - this.initMetamodel(); - $$4(window).on('resize', this._resizeHandler); - this._disposables.add(Disposable.create(function () { return $$4(window).off('resize', _this._resizeHandler); })); - /* - * Execute resize to get the right size for the SVG element on the editor canvas. - * Executed via timeout to let angular render the DOM first and elements to have the right width and height - */ - window.setTimeout(this._resizeHandler); - this.floApi.emit(this.editorContext); - }; - EditorComponent.prototype.ngOnDestroy = function () { - this._disposables.dispose(); - }; - Object.defineProperty(EditorComponent.prototype, "noPalette", { - get: function () { - return this._hiddenPalette; - }, - set: function (hidden) { - this._hiddenPalette = hidden; - // If palette is not shown ensure that canvas starts from the left==0! - if (hidden) { - $$4('#paper-container', this.element.nativeElement).css('left', 0); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(EditorComponent.prototype, "graphToTextSync", { - get: function () { - return this._graphToTextSyncEnabled; - }, - set: function (sync) { - this._graphToTextSyncEnabled = sync; - // Try commenting the sync out. Just set the flag but don't kick off graph->text conversion - // this.performGraphToTextSyncing(); - }, - enumerable: true, - configurable: true - }); - EditorComponent.prototype.performGraphToTextSyncing = function () { - if (this._graphToTextSyncEnabled) { - this.graphToTextEventEmitter.emit(); - } - }; - EditorComponent.prototype.createHandle = function (element, kind, action, location) { - if (!location) { - var bbox = element.model.getBBox(); - location = bbox.origin().offset(bbox.width / 2, bbox.height / 2); - } - var handle = Shapes.Factory.createHandle({ - renderer: this.renderer, - paper: this.paper, - parent: element.model, - kind: kind, - position: location - }); - var view = this.paper.findViewByModel(handle); - view.on('cell:pointerdown', function () { - if (action) { - action(); - } - }); - view.on('cell:mouseover', function () { - handle.attr('image/filter', { - name: 'dropShadow', - args: { dx: 1, dy: 1, blur: 1, color: 'black' } - }); - }); - view.on('cell:mouseout', function () { - handle.removeAttr('image/filter'); - }); - view.setInteractivity(false); - return handle; - }; - EditorComponent.prototype.removeEmbeddedChildrenOfType = function (element, types) { - var embeds = element.getEmbeddedCells(); - for (var i = 0; i < embeds.length; i++) { - if (types.indexOf(embeds[i].get('type')) >= 0) { - embeds[i].remove(); - } - } - }; - Object.defineProperty(EditorComponent.prototype, "selection", { - get: function () { - return this._selection; - }, - set: function (newSelection) { - var _this = this; - if (newSelection && (newSelection.model.get('type') === joint$3.shapes.flo.DECORATION_TYPE || newSelection.model.get('type') === joint$3.shapes.flo.HANDLE_TYPE)) { - newSelection = this.paper.findViewByModel(this.graph.getCell(newSelection.model.get('parent'))); - } - if (newSelection && (!newSelection.model.attr('metadata') || newSelection.model.attr('metadata/metadata/unselectable'))) { - newSelection = undefined; - } - if (newSelection !== this._selection) { - if (this._selection) { - var elementview = this.paper.findViewByModel(this._selection.model); - if (elementview) { // May have been removed from the graph - this.removeEmbeddedChildrenOfType(elementview.model, joint$3.shapes.flo.HANDLE_TYPE); - elementview.unhighlight(); - } - } - if (newSelection) { - newSelection.highlight(); - if (this.editor && this.editor.createHandles) { - this.editor.createHandles(this.editorContext, function (owner, kind, action, location) { return _this.createHandle(owner, kind, action, location); }, newSelection); - } - } - this._selection = newSelection; - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(EditorComponent.prototype, "readOnlyCanvas", { - get: function () { - return this._readOnlyCanvas; - }, - set: function (value) { - var _this = this; - if (this._readOnlyCanvas === value) { - // Nothing to do - return; - } - if (value) { - this.selection = undefined; - } - if (this.graph) { - this.graph.getLinks().forEach(function (link) { - if (value) { - link.attr('.link-tools/display', 'none'); - link.attr('.marker-vertices/display', 'none'); - link.attr('.connection-wrap/display', 'none'); - } - else { - link.removeAttr('.link-tools/display'); - if (_this.editor && _this.editor.allowLinkVertexEdit) { - link.removeAttr('.marker-vertices/display'); - } - link.removeAttr('.connection-wrap/display'); - } - }); - } - this._readOnlyCanvas = value; - }, - enumerable: true, - configurable: true - }); - /** - * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - EditorComponent.prototype.showDragFeedback = function (dragDescriptor) { - if (this.editor && this.editor.showDragFeedback) { - this.editor.showDragFeedback(this.editorContext, dragDescriptor); - } - else { - var magnet = void 0; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint$3.V(dragDescriptor.source.view.el).addClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint$3.V(magnet).addClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint$3.V(dragDescriptor.target.view.el).addClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint$3.V(magnet).addClass('dnd-target-feedback'); - } - } - } - } - }; - /** - * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - EditorComponent.prototype.hideDragFeedback = function (dragDescriptor) { - if (this.editor && this.editor.hideDragFeedback) { - this.editor.hideDragFeedback(this.editorContext, dragDescriptor); - } - else { - var magnet = void 0; - if (dragDescriptor.source && dragDescriptor.source.view) { - joint$3.V(dragDescriptor.source.view.el).removeClass('dnd-source-feedback'); - if (dragDescriptor.source.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.source.view, dragDescriptor.source.cssClassSelector); - if (magnet) { - joint$3.V(magnet).removeClass('dnd-source-feedback'); - } - } - } - if (dragDescriptor.target && dragDescriptor.target.view) { - joint$3.V(dragDescriptor.target.view.el).removeClass('dnd-target-feedback'); - if (dragDescriptor.target.cssClassSelector) { - magnet = Flo.findMagnetByClass(dragDescriptor.target.view, dragDescriptor.target.cssClassSelector); - if (magnet) { - joint$3.V(magnet).removeClass('dnd-target-feedback'); - } - } - } - } - }; - /** - * Sets the new DnD info object - the descriptor for DnD - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - EditorComponent.prototype.setDragDescriptor = function (dragDescriptor) { - if (this.highlighted === dragDescriptor) { - return; - } - if (this.highlighted && dragDescriptor && isEqual(this.highlighted.sourceComponent, dragDescriptor.sourceComponent)) { - if (this.highlighted.source === dragDescriptor.source && this.highlighted.target === dragDescriptor.target) { - return; - } - if (this.highlighted.source && - dragDescriptor.source && - this.highlighted.target && - dragDescriptor.target && - this.highlighted.source.view.model === dragDescriptor.source.view.model && - this.highlighted.source.cssClassSelector === dragDescriptor.source.cssClassSelector && - this.highlighted.target.view.model === dragDescriptor.target.view.model && - this.highlighted.target.cssClassSelector === dragDescriptor.target.cssClassSelector) { - return; - } - } - if (this.highlighted) { - this.hideDragFeedback(this.highlighted); - } - this.highlighted = dragDescriptor; - if (this.highlighted) { - this.showDragFeedback(this.highlighted); - } - }; - /** - * Handles DnD events when a node is being dragged over canvas - * - * @param draggedView The Joint JS view object being dragged - * @param targetUnderMouse The Joint JS view under mouse cursor - * @param x X coordinate of the mouse on the canvas - * @param y Y coordinate of the mosue on the canvas - * @param context DnD context (palette or canvas) - */ - EditorComponent.prototype.handleNodeDragging = function (draggedView, targetUnderMouse, x, y, sourceComponent) { - if (this.editor && this.editor.calculateDragDescriptor) { - this.setDragDescriptor(this.editor.calculateDragDescriptor(this.editorContext, draggedView, targetUnderMouse, joint$3.g.point(x, y), sourceComponent)); - } - }; - /** - * Handles DnD drop event when a node is being dragged and dropped on the main canvas - */ - EditorComponent.prototype.handleNodeDropping = function () { - if (this.highlighted && this.editor && this.editor.handleNodeDropping) { - this.editor.handleNodeDropping(this.editorContext, this.highlighted); - } - this.setDragDescriptor(undefined); - }; - /** - * Hides DOM Node (used to determine drop target DOM element) - * @param domNode DOM node to hide - * @returns - */ - EditorComponent.prototype._hideNode = function (domNode) { - var oldVisibility = { - visibility: domNode.style ? domNode.style.display : undefined, - children: [] - }; - for (var i = 0; i < domNode.children.length; i++) { - var node = domNode.children.item(i); - if (node instanceof HTMLElement) { - oldVisibility.children.push(this._hideNode(node)); - } - } - domNode.style.display = 'none'; - return oldVisibility; - }; - /** - * Restored DOM node original visibility (used to determine drop target DOM element) - * @param domNode DOM node to restore visibility of - * @param oldVisibility original visibility parameter - */ - EditorComponent.prototype._restoreNodeVisibility = function (domNode, oldVisibility) { - if (domNode.style) { - domNode.style.display = oldVisibility.visibility; - } - var j = 0; - for (var i = 0; i < domNode.childNodes.length; i++) { - if (j < oldVisibility.children.length) { - var node = domNode.children.item(i); - if (node instanceof HTMLElement) { - this._restoreNodeVisibility(node, oldVisibility.children[j++]); - } - } - } - }; - /** - * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. - * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location - * (bounding box of a link for testing is bad). - * The result of that is that links can only be the drop target when dragging from the palette currently. - * When DnDing shapes on the canvas drop target cannot be a link. - * - * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked - * - e.g. Drag-n-Drop) - */ - EditorComponent.prototype.getTargetViewFromEvent = function (event, x, y, excludeViews) { - var _this = this; - if (excludeViews === void 0) { excludeViews = []; } - if (!x && !y) { - var l = this.paper.snapToGrid({ x: event.clientX, y: event.clientY }); - x = l.x; - y = l.y; - } - // TODO: See if next code paragraph is needed. Most likely it's just code executed for nothing - // let elements = this.graph.findModelsFromPoint(joint.g.point(x, y)); - // let underMouse = elements.find(e => !_.isUndefined(excludeViews.find(x => x === this.paper.findViewByModel(e)))); - // if (underMouse) { - // return underMouse; - // } - var oldVisibility = excludeViews.map(function (_x) { return _this._hideNode(_x.el); }); - var targetElement = document.elementFromPoint(event.clientX, event.clientY); - excludeViews.forEach(function (excluded, i) { - _this._restoreNodeVisibility(excluded.el, oldVisibility[i]); - }); - return this.paper.findView($$4(targetElement)); - }; - EditorComponent.prototype.handleDnDFromPalette = function (dndEvent) { - switch (dndEvent.type) { - case Flo.DnDEventType.DRAG: - this.handleDragFromPalette(dndEvent); - break; - case Flo.DnDEventType.DROP: - this.handleDropFromPalette(dndEvent); - break; - default: - break; - } - }; - EditorComponent.prototype.handleDragFromPalette = function (dnDEvent) { - console.debug('Dragging from palette'); - if (dnDEvent.view && !this.readOnlyCanvas) { - var location_1 = this.paper.snapToGrid({ x: dnDEvent.event.clientX, y: dnDEvent.event.clientY }); - this.handleNodeDragging(dnDEvent.view, this.getTargetViewFromEvent(dnDEvent.event, location_1.x, location_1.y, [dnDEvent.view]), location_1.x, location_1.y, Constants.PALETTE_CONTEXT); - } - }; - EditorComponent.prototype.createNode = function (metadata, props, position) { - return Shapes.Factory.createNode({ - renderer: this.renderer, - paper: this.paper, - metadata: metadata, - props: props, - position: position - }); - }; - EditorComponent.prototype.createLink = function (source, target, metadata, props) { - return Shapes.Factory.createLink({ - renderer: this.renderer, - paper: this.paper, - source: source, - target: target, - metadata: metadata, - props: props - }); - }; - EditorComponent.prototype.handleDropFromPalette = function (event) { - var cellview = event.view; - var evt = event.event; - if (this.paper.el === evt.target || $$4.contains(this.paper.el, evt.target)) { - if (this.readOnlyCanvas) { - this.setDragDescriptor(undefined); - } - else { - var metadata = cellview.model.attr('metadata'); - var props = cellview.model.attr('props'); - var position = this.paper.snapToGrid({ x: evt.clientX, y: evt.clientY }); - /* Calculate target element before creating the new - * element under mouse location. Otherwise target - * element would be the newly created element because - * it's under the mouse pointer - */ - var targetElement = this.getTargetViewFromEvent(evt, position.x, position.y, [event.view]); - var newNode = this.createNode(metadata, props, position); - var newView = this.paper.findViewByModel(newNode); - this.handleNodeDragging(newView, targetElement, position.x, position.y, Constants.PALETTE_CONTEXT); - this.handleNodeDropping(); - } - } - }; - EditorComponent.prototype.fitToContent = function (gridWidth, gridHeight, padding, opt) { - var paper = this.paper; - if (joint$3.util.isObject(gridWidth)) { - // first parameter is an option object - opt = gridWidth; - gridWidth = opt.gridWidth || 1; - gridHeight = opt.gridHeight || 1; - padding = opt.padding || 0; - } - else { - opt = opt || {}; - gridWidth = gridWidth || 1; - gridHeight = gridHeight || 1; - padding = padding || 0; - } - var paddingJson = joint$3.util.normalizeSides(padding); - // Calculate the paper size to accomodate all the graph's elements. - var bbox = joint$3.V(paper.viewport).getBBox(); - var currentScale = paper.scale(); - var currentTranslate = paper.translate(); - bbox.x *= currentScale.sx; - bbox.y *= currentScale.sy; - bbox.width *= currentScale.sx; - bbox.height *= currentScale.sy; - var calcWidth = Math.max((bbox.width + bbox.x) / gridWidth, 1) * gridWidth; - var calcHeight = Math.max((bbox.height + bbox.y) / gridHeight, 1) * gridHeight; - var tx = 0; - var ty = 0; - if ((opt.allowNewOrigin === 'negative' && bbox.x < 0) || (opt.allowNewOrigin === 'positive' && bbox.x >= 0) || opt.allowNewOrigin === 'any') { - tx = (-bbox.x / gridWidth) * gridWidth; - tx += paddingJson.left; - } - else if (opt.allowNewOrigin === 'same') { - tx = currentTranslate.tx; - } - calcWidth += tx; - if ((opt.allowNewOrigin === 'negative' && bbox.y < 0) || (opt.allowNewOrigin === 'positive' && bbox.y >= 0) || opt.allowNewOrigin === 'any') { - ty = (-bbox.y / gridHeight) * gridHeight; - ty += paddingJson.top; - } - else if (opt.allowNewOrigin === 'same') { - ty = currentTranslate.ty; - } - calcHeight += ty; - calcWidth += paddingJson.right; - calcHeight += paddingJson.bottom; - // Make sure the resulting width and height are greater than minimum. - calcWidth = Math.max(calcWidth, opt.minWidth || 0); - calcHeight = Math.max(calcHeight, opt.minHeight || 0); - // Make sure the resulting width and height are lesser than maximum. - calcWidth = Math.min(calcWidth, opt.maxWidth || Number.MAX_VALUE); - calcHeight = Math.min(calcHeight, opt.maxHeight || Number.MAX_VALUE); - var dimensionChange = calcWidth !== paper.options.width || calcHeight !== paper.options.height; - var originChange = tx !== currentTranslate.tx || ty !== currentTranslate.ty; - // Change the dimensions only if there is a size discrepency or an origin change - if (originChange) { - paper.translate(tx, ty); - } - if (dimensionChange) { - paper.setDimensions(calcWidth, calcHeight); - } - }; - EditorComponent.prototype.autosizePaper = function () { - var parent = $$4('#paper-container', this.element.nativeElement); - var parentWidth = parent.innerWidth(); - var parentHeight = parent.innerHeight(); - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth - SCROLLBAR_SIZE, - minHeight: parentHeight - SCROLLBAR_SIZE, - allowNewOrigin: 'same' - }); - }; - EditorComponent.prototype.fitToPage = function () { - var parent = $$4('#paper-container', this.element.nativeElement); - var minScale = this.minZoom / 100; - var maxScale = 2; - var parentWidth = parent.innerWidth(); - var parentHeight = parent.innerHeight(); - this.paper.scaleContentToFit({ - padding: this.paperPadding, - minScaleX: minScale, - minScaleY: minScale, - maxScaleX: maxScale, - maxScaleY: maxScale, - fittingBBox: { x: 0, y: 0, width: parentWidth - SCROLLBAR_SIZE, height: parentHeight - SCROLLBAR_SIZE } - }); - /** - * Size the canvas appropriately and allow origin movement - */ - this.fitToContent(this.gridSize, this.gridSize, this.paperPadding, { - minWidth: parentWidth, - minHeight: parentHeight, - maxWidth: parentWidth, - maxHeight: parentHeight, - allowNewOrigin: 'any' - }); - }; - Object.defineProperty(EditorComponent.prototype, "zoomPercent", { - get: function () { - return Math.round(joint$3.V(this.paper.viewport).scale().sx * 100); - }, - set: function (percent) { - if (!isNaN(percent)) { - if (percent < this.minZoom) { - percent = this.minZoom; - } - else if (percent >= this.maxZoom) { - percent = this.maxZoom; - } - else { - if (percent <= 0) { - percent = 0.00001; - } - } - this.paper.scale(percent / 100, percent / 100); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(EditorComponent.prototype, "gridSize", { - get: function () { - return this._gridSize; - }, - set: function (size) { - if (!isNaN(size) && size >= 1) { - this._gridSize = size; - if (this.paper) { - this.paper.setGridSize(size); - } - } - }, - enumerable: true, - configurable: true - }); - EditorComponent.prototype.validateContent = function () { - var _this = this; - return new Promise(function (resolve) { - if (_this.editor && _this.editor.validate) { - return _this.editor - .validate(_this.graph, _this.dsl, _this.editorContext) - .then(function (allMarkers) { - _this.graph.getCells() - .forEach(function (cell) { return _this.markElement(cell, allMarkers.has(cell.id) ? allMarkers.get(cell.id) : []); }); - _this.validationMarkers.emit(allMarkers); - _this.contentValidated.emit(true); - resolve(); - }); - } - else { - resolve(); - } - }); - }; - EditorComponent.prototype.markElement = function (cell, markers) { - var errorMessages = markers.map(function (m) { return m.message; }); - var errorCell = cell.getEmbeddedCells().find(function (e) { return e.attr('./kind') === Constants.ERROR_DECORATION_KIND; }); - if (errorCell) { - if (errorMessages.length === 0) { - errorCell.remove(); - } - else { - // Without rewrite we merge this list with existing errors - errorCell.attr('messages', errorMessages, { rewrite: true }); - } - } - else if (errorMessages.length > 0) { - var error = Shapes.Factory.createDecoration({ - renderer: this.renderer, - paper: this.paper, - parent: cell, - kind: Constants.ERROR_DECORATION_KIND, - messages: errorMessages - }); - var pt = void 0; - var view = this.paper.findViewByModel(error); - if (cell instanceof joint$3.dia.Element) { - pt = cell.getBBox().topRight().offset(-error.get('size').width, 0); - error.set('position', pt); - view.setInteractivity(false); - } - } - }; - EditorComponent.prototype.doLayout = function () { - if (this.renderer && this.renderer.layout) { - return this.renderer.layout(this.paper); - } - }; - Object.defineProperty(EditorComponent.prototype, "dsl", { - get: function () { - return this._dslText; - }, - set: function (dslText) { - if (this._dslText !== dslText) { - this._dslText = dslText; - this.textToGraphEventEmitter.emit(); - } - }, - enumerable: true, - configurable: true - }); - /** - * Ask the server to parse the supplied text into a JSON graph of nodes and links, - * then update the view based on that new information. - */ - EditorComponent.prototype.updateGraphRepresentation = function () { - var _this = this; - console.debug("Updating graph to represent '" + this._dslText + "'"); - if (this.metamodel && this.metamodel.textToGraph) { - return this.metamodel.textToGraph(this.editorContext, this._dslText).then(function () { - _this.textToGraphConversionCompleted.next(); - return _this.validateContent(); - }); - } - else { - this.textToGraphConversionCompleted.next(); - return this.validateContent(); - } - }; - EditorComponent.prototype.updateTextRepresentation = function () { - var _this = this; - if (this.metamodel && this.metamodel.graphToText) { - return this.metamodel.graphToText(this.editorContext).then(function (text) { - if (_this._dslText !== text) { - _this._dslText = text; - _this.dslChange.emit(text); - } - _this.graphToTextConversionCompleted.next(); - return _this.validateContent(); - }) - .catch(function (error) { - // Validation may reveal why the graph couldn't be - // converted so let it run - _this.graphToTextConversionCompleted.next(); - return _this.validateContent(); - }); - } - else { - this.graphToTextConversionCompleted.next(); - return this.validateContent(); - } - }; - EditorComponent.prototype.initMetamodel = function () { - var _this = this; - this.metamodel.load().then(function (data) { - _this.updateGraphRepresentation(); - var textSyncSubscription = _this.graphToTextEventEmitter.pipe(debounceTime(100)).subscribe(function () { - if (_this._graphToTextSyncEnabled) { - _this.updateTextRepresentation(); - } - }); - _this._disposables.add(Disposable.create(function () { return textSyncSubscription.unsubscribe(); })); - // Setup content validated event emitter. Emit not validated when graph to text conversion required - var graphValidatedSubscription1 = _this.graphToTextEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); - _this._disposables.add(Disposable.create(function () { return graphValidatedSubscription1.unsubscribe; })); - // let validationSubscription = this.validationEventEmitter.pipe(debounceTime(100)).subscribe(() => this.validateGraph()); - // this._disposables.add(Disposable.create(() => validationSubscription.unsubscribe())); - var graphSyncSubscription = _this.textToGraphEventEmitter.pipe(debounceTime(300)).subscribe(function () { return _this.updateGraphRepresentation(); }); - _this._disposables.add(Disposable.create(function () { return graphSyncSubscription.unsubscribe(); })); - // Setup content validated event emitter. Emit not validated when text to graph conversion required - var graphValidatedSubscription2 = _this.textToGraphEventEmitter.subscribe(function () { return _this.contentValidated.emit(false); }); - _this._disposables.add(Disposable.create(function () { return graphValidatedSubscription2.unsubscribe; })); - if (_this.editor && _this.editor.setDefaultContent) { - _this.editor.setDefaultContent(_this.editorContext, data); - } - }); - }; - EditorComponent.prototype.initGraph = function () { - this.graph = new joint$3.dia.Graph(); - this.graph.set('type', Constants.CANVAS_CONTEXT); - this.graph.set('paperPadding', this.paperPadding); - }; - EditorComponent.prototype.handleNodeCreation = function (node) { - var _this = this; - node.on('change:size', this._resizeHandler); - node.on('change:position', this._resizeHandler); - if (node.attr('metadata')) { - node.on('change:attrs', function (cell, attrs, changeData) { - var propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, node))) { - _this.performGraphToTextSyncing(); - } - if (_this.renderer && _this.renderer.refreshVisuals) { - _this.renderer.refreshVisuals(node, propAttr, _this.paper); - } - } - }); - } - }; - /** - * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples - * are 'change:source', 'change:target'. - */ - EditorComponent.prototype.handleLinkEvent = function (event, link) { - if (this.renderer && this.renderer.handleLinkEvent) { - this.renderer.handleLinkEvent(this.editorContext, event, link); - } - }; - EditorComponent.prototype.handleLinkCreation = function (link) { - var _this = this; - this.handleLinkEvent('add', link); - link.on('change:source', function (l) { - _this.autosizePaper(); - var newSourceId = l.get('source').id; - var oldSourceId = l.previous('source').id; - if (newSourceId !== oldSourceId) { - _this.performGraphToTextSyncing(); - } - _this.handleLinkEvent('change:source', l); - }); - link.on('change:target', function (l) { - _this.autosizePaper(); - var newTargetId = l.get('target').id; - var oldTargetId = l.previous('target').id; - if (newTargetId !== oldTargetId) { - _this.performGraphToTextSyncing(); - } - _this.handleLinkEvent('change:target', l); - }); - link.on('change:vertices', this._resizeHandler); - link.on('change:attrs', function (cell, attrs, changeData) { - var propertyPath = changeData ? changeData.propertyPath : undefined; - if (propertyPath) { - var propAttr = propertyPath.substr(propertyPath.indexOf('/') + 1); - if (propAttr.indexOf('metadata') === 0 || - propAttr.indexOf('props') === 0 || - (_this.renderer && _this.renderer.isSemanticProperty && _this.renderer.isSemanticProperty(propAttr, link))) { - var sourceId = link.get('source').id; - var targetId = link.get('target').id; - _this.performGraphToTextSyncing(); - } - if (_this.renderer && _this.renderer.refreshVisuals) { - _this.renderer.refreshVisuals(link, propAttr, _this.paper); - } - } - }); - this.paper.findViewByModel(link).on('link:options', function () { return _this.handleLinkEvent('options', link); }); - if (this.readOnlyCanvas) { - link.attr('.link-tools/display', 'none'); - } - }; - EditorComponent.prototype.initGraphListeners = function () { - var _this = this; - this.graph.on('add', function (element) { - if (element instanceof joint$3.dia.Link) { - _this.handleLinkCreation(element); - } - else if (element instanceof joint$3.dia.Element) { - _this.handleNodeCreation(element); - } - if (element.get('type') === joint$3.shapes.flo.NODE_TYPE || element.get('type') === joint$3.shapes.flo.LINK_TYPE) { - _this.performGraphToTextSyncing(); - } - _this.autosizePaper(); - }); - this.graph.on('remove', function (element) { - if (element instanceof joint$3.dia.Link) { - _this.handleLinkEvent('remove', element); - } - if (_this.selection && _this.selection.model === element) { - _this.selection = undefined; - } - if (element.isLink()) { - window.setTimeout(function () { return _this.performGraphToTextSyncing(); }, 100); - } - else if (element.get('type') === joint$3.shapes.flo.NODE_TYPE) { - _this.performGraphToTextSyncing(); - } - _this.autosizePaper(); - }); - // Set if link is fan-routed. Should be called before routing call - this.graph.on('change:vertices', function (link, changed, opt) { - if (opt.fanRouted) { - link.set('fanRouted', true); - } - else { - link.unset('fanRouted'); - } - }); - // adjust vertices when a cell is removed or its source/target was changed - this.graph.on('add remove change:source change:target change:vertices change:position', partial(Utils.fanRoute, this.graph)); - }; - EditorComponent.prototype.initPaperListeners = function () { - var _this = this; - // https://stackoverflow.com/questions/20463533/how-to-add-an-onclick-event-to-a-joint-js-element - this.paper.on('cell:pointerclick', function (cellView) { - if (!_this.readOnlyCanvas) { - _this.selection = cellView; - } - }); - this.paper.on('blank:pointerclick', function () { - _this.selection = undefined; - }); - this.paper.on('scale', this._resizeHandler); - this.paper.on('all', function () { - if (Utils.isCustomPaperEvent(arguments)) { - arguments[2].trigger.apply(arguments[2], [arguments[0], arguments[1], arguments[3], arguments[4]]); - } - }); - this.paper.on('dragging-node-over-canvas', function (dndEvent) { - console.debug("Canvas DnD type = " + dndEvent.type); - var location = _this.paper.snapToGrid({ x: dndEvent.event.clientX, y: dndEvent.event.clientY }); - switch (dndEvent.type) { - case Flo.DnDEventType.DRAG: - _this.handleNodeDragging(dndEvent.view, _this.getTargetViewFromEvent(dndEvent.event, location.x, location.y, [dndEvent.view]), location.x, location.y, Constants.CANVAS_CONTEXT); - break; - case Flo.DnDEventType.DROP: - _this.handleNodeDropping(); - break; - default: - break; - } - }); - // JointJS now no longer grabs focus if working in a paper element - crude... - $$4('#flow-view', this.element.nativeElement).on('mousedown', function () { - $$4('#palette-filter-textfield', _this.element.nativeElement).focus(); - }); - }; - EditorComponent.prototype.initPaper = function () { - var _this = this; - var options = { - el: $$4('#paper', this.element.nativeElement), - gridSize: this._gridSize, - drawGrid: true, - model: this.graph, - elementView: this.renderer && this.renderer.getNodeView ? this.renderer.getNodeView() : joint$3.shapes.flo.ElementView /*joint.dia.ElementView*/, - linkView: this.renderer && this.renderer.getLinkView ? this.renderer.getLinkView() : joint$3.shapes.flo.LinkView, - // Enable link snapping within 25px lookup radius - snapLinks: { radius: 25 }, - defaultLink: /*this.renderer && this.renderer.createDefaultLink ? this.renderer.createDefaultLink: new joint.shapes.flo.Link*/ function (cellView, magnet) { - if (_this.renderer && _this.renderer.createLink) { - var linkEnd = { - id: cellView.model.id - }; - if (magnet) { - linkEnd.selector = cellView.getSelector(magnet, undefined); - } - if (magnet.getAttribute('port')) { - linkEnd.port = magnet.getAttribute('port'); - } - if (magnet.getAttribute('port') === 'input') { - return _this.renderer.createLink(undefined, linkEnd); - } - else { - return _this.renderer.createLink(linkEnd, undefined); - } - } - else { - return new joint$3.shapes.flo.Link(); - } - }, - // decide whether to create a link if the user clicks a magnet - validateMagnet: function (cellView, magnet) { - if (_this.readOnlyCanvas) { - return false; - } - else { - if (_this.editor && _this.editor.validatePort) { - return _this.editor.validatePort(_this.editorContext, cellView, magnet); - } - else { - return true; - } - } - }, - interactive: function (cellView, event) { - if (_this.readOnlyCanvas) { - return false; - } - else { - if (_this.editor && _this.editor.interactive) { - if (typeof _this.editor.interactive === 'function') { - // Type for interactive is wrong in JointJS have to cast to - return _this.editor.interactive(cellView, event); - } - else { - return _this.editor.interactive; - } - } - return true; - } - }, - highlighting: this.editor && this.editor.highlighting ? this.editor.highlighting : { - 'default': { - name: 'addClass', - options: { - className: 'highlighted' - } - } - }, - markAvailable: true - }; - if (this.renderer && this.renderer.getLinkAnchorPoint) { - options.linkConnectionPoint = this.renderer.getLinkAnchorPoint; - } - if (this.editor && this.editor.validateLink) { - var self_1 = this; - options.validateConnection = function (cellViewS, magnetS, cellViewT, magnetT, end, linkView) { - return self_1.editor.validateLink(_this.editorContext, cellViewS, magnetS, cellViewT, magnetT, end === 'source', linkView); - }; - } - // The paper is what will represent the graph on the screen - this.paper = new joint$3.dia.Paper(options); - this._disposables.add(Disposable.create(function () { return _this.paper.remove(); })); - }; - EditorComponent.prototype.updatePaletteReadyState = function (ready) { - this.paletteReady.next(ready); - }; - __decorate([ - Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "metamodel", void 0); - __decorate([ - Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "renderer", void 0); - __decorate([ - Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "editor", void 0); - __decorate([ - Input(), - __metadata("design:type", Number) - ], EditorComponent.prototype, "paletteSize", void 0); - __decorate([ - Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "minZoom", void 0); - __decorate([ - Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "maxZoom", void 0); - __decorate([ - Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "zoomStep", void 0); - __decorate([ - Input(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "paperPadding", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "floApi", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "validationMarkers", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "contentValidated", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], EditorComponent.prototype, "dslChange", void 0); - __decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], EditorComponent.prototype, "dsl", null); - EditorComponent = __decorate([ - Component({ - selector: 'flo-editor', - template: "\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ", - styles: ["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "], - encapsulation: ViewEncapsulation.None - }), - __metadata("design:paramtypes", [ElementRef]) - ], EditorComponent); - return EditorComponent; -}()); - -var $$5 = _$; -var ResizerDirective = /** @class */ (function () { - function ResizerDirective(element, document) { - var _this = this; - this.element = element; - this.document = document; - this.dragInProgress = false; - this.vertical = true; - this._subscriptions = new CompositeDisposable(); - this.sizeChange = new EventEmitter(); - this.mouseMoveHandler = function (e) { - if (_this.dragInProgress) { - _this.mousemove(e); - } - }; - } - Object.defineProperty(ResizerDirective.prototype, "splitSize", { - set: function (splitSize) { - if (this.maxSplitSize && splitSize > this.maxSplitSize) { - splitSize = this.maxSplitSize; - } - if (this.vertical) { - // Handle vertical resizer - $$5(this.element.nativeElement).css({ - left: splitSize + 'px' - }); - $$5(this.first).css({ - width: splitSize + 'px' - }); - $$5(this.second).css({ - left: (splitSize + this._size) + 'px' - }); - } - else { - // Handle horizontal resizer - $$5(this.element.nativeElement).css({ - bottom: splitSize + 'px' - }); - $$5(this.first).css({ - bottom: (splitSize + this._size) + 'px' - }); - $$5(this.second).css({ - height: splitSize + 'px' - }); - } - this._splitSize = splitSize; - // Update the local field - this.sizeChange.emit(splitSize); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerWidth", { - set: function (width) { - this._size = width; - this.vertical = true; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerHeight", { - set: function (height) { - this._size = height; - this.vertical = false; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerLeft", { - set: function (first) { - this.first = first; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerTop", { - set: function (first) { - this.first = first; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerRight", { - set: function (second) { - this.second = second; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ResizerDirective.prototype, "resizerBottom", { - set: function (second) { - this.second = second; - }, - enumerable: true, - configurable: true - }); - ResizerDirective.prototype.startDrag = function () { - this.dragInProgress = true; - }; - ResizerDirective.prototype.mousemove = function (event) { - var size; - if (this.vertical) { // Handle vertical resizer. Calculate new size relative to palette container DOM node - size = event.pageX - $$5(this.first).offset().left; - } - else { - // Handle horizontal resizer Calculate new size relative to palette container DOM node - size = window.innerHeight - event.pageY - $$5(this.second).offset().top; - } - this.splitSize = size; - }; - ResizerDirective.prototype.ngOnInit = function () { - // Need to set left and right elements width and fire events on init when DOM is built - var _this = this; - this.splitSize = this._splitSize; - var subscription1 = fromEvent($$5(this.document).get(0), 'mousemove') - .pipe(sampleTime(300)) - .subscribe(this.mouseMoveHandler); - this._subscriptions.add(Disposable.create(function () { return subscription1.unsubscribe(); })); - var subscription2 = fromEvent($$5(this.document).get(0), 'mouseup') - .subscribe(function (e) { - if (_this.dragInProgress) { - _this.mousemove(e); - _this.dragInProgress = false; - } - }); - this._subscriptions.add(Disposable.create(function () { return subscription2.unsubscribe(); })); - }; - ResizerDirective.prototype.ngOnDestroy = function () { - this._subscriptions.dispose(); - }; - __decorate([ - Input(), - __metadata("design:type", Number) - ], ResizerDirective.prototype, "maxSplitSize", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], ResizerDirective.prototype, "sizeChange", void 0); - __decorate([ - Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) - ], ResizerDirective.prototype, "splitSize", null); - __decorate([ - Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) - ], ResizerDirective.prototype, "resizerWidth", null); - __decorate([ - Input(), - __metadata("design:type", Number), - __metadata("design:paramtypes", [Number]) - ], ResizerDirective.prototype, "resizerHeight", null); - __decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerLeft", null); - __decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerTop", null); - __decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerRight", null); - __decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], ResizerDirective.prototype, "resizerBottom", null); - ResizerDirective = __decorate([ - Directive({ - selector: '[resizer]', - host: { '(mousedown)': 'startDrag()' } - }), - __param(1, Inject(DOCUMENT)), - __metadata("design:paramtypes", [ElementRef, Object]) - ], ResizerDirective); - return ResizerDirective; -}()); - -var $$6 = _$; -var DslEditorComponent = /** @class */ (function () { - function DslEditorComponent(element) { - var _this = this; - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.debounce = 0; - this.dslChange = new EventEmitter(); - this.focus = new EventEmitter(); - this.blur = new EventEmitter(); - this.editor = new EventEmitter(); - this._dslChangedHandler = function () { - _this._dsl = _this.doc.getValue(); - _this.dslChange.emit(_this._dsl); - }; - } - Object.defineProperty(DslEditorComponent.prototype, "dsl", { - set: function (dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - var cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DslEditorComponent.prototype, "lintOptions", { - set: function (lintOptions) { - this._lint = lintOptions; - if (this.doc) { - this.doc.setOption('lint', this._lint); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DslEditorComponent.prototype, "hintOptions", { - set: function (hintOptions) { - this._hint = hintOptions; - if (this.doc) { - this.doc.setOption('hintOptions', this._hint); - } - }, - enumerable: true, - configurable: true - }); - DslEditorComponent.prototype.ngOnInit = function () { - var _this = this; - var options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - electricChars: false, - smartIndent: false, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - if (this._hint) { - options.hintOptions = this._hint; - } - this.doc = fromTextArea($$6('#dsl-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this.debounce ? debounce(this._dslChangedHandler, this.debounce) : this._dslChangedHandler); - this.doc.on('focus', function () { return _this.focus.emit(); }); - this.doc.on('blur', function () { return _this.blur.emit(); }); - this.editor.emit(this.doc); - }; - DslEditorComponent.prototype.ngOnDestroy = function () { - }; - __decorate([ - Input('line-numbers'), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "lineNumbers", void 0); - __decorate([ - Input('line-wrapping'), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "lineWrapping", void 0); - __decorate([ - Input('scrollbar-style'), - __metadata("design:type", String) - ], DslEditorComponent.prototype, "scrollbarStyle", void 0); - __decorate([ - Input(), - __metadata("design:type", String) - ], DslEditorComponent.prototype, "placeholder", void 0); - __decorate([ - Input(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "debounce", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "dslChange", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "focus", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "blur", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], DslEditorComponent.prototype, "editor", void 0); - __decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], DslEditorComponent.prototype, "dsl", null); - __decorate([ - Input(), - __metadata("design:type", Object), - __metadata("design:paramtypes", [Object]) - ], DslEditorComponent.prototype, "lintOptions", null); - __decorate([ - Input(), - __metadata("design:type", Object), - __metadata("design:paramtypes", [Object]) - ], DslEditorComponent.prototype, "hintOptions", null); - DslEditorComponent = __decorate([ - Component({ - selector: 'dsl-editor', - template: "\n \n ", - styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "], - encapsulation: ViewEncapsulation.None - }), - __metadata("design:paramtypes", [ElementRef]) - ], DslEditorComponent); - return DslEditorComponent; -}()); - -var $$7 = _$; -var CodeEditorComponent = /** @class */ (function () { - function CodeEditorComponent(element) { - var _this = this; - this.element = element; - this._dsl = ''; - this._lint = false; - this.lineNumbers = false; - this.lineWrapping = false; - this.dslChange = new EventEmitter(); - this.focus = new EventEmitter(); - this.blur = new EventEmitter(); - this.editor = new EventEmitter(); - this._dslChangedHandler = function () { - _this._dsl = _this.doc.getValue(); - _this.dslChange.emit(_this._dsl); - if (_this._onChangeHandler) { - _this._onChangeHandler(_this._dsl); - } - }; - } - CodeEditorComponent_1 = CodeEditorComponent; - Object.defineProperty(CodeEditorComponent.prototype, "dsl", { - set: function (dsl) { - this._dsl = dsl; - if (this.doc && this._dsl !== this.doc.getValue()) { - var cursorPosition = this.doc.getCursor(); - this.doc.setValue(this._dsl || ''); - this.doc.setCursor(cursorPosition); - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CodeEditorComponent.prototype, "language", { - set: function (_language) { - if (this._language !== _language) { - this._language = _language; - this.loadEditorMode(); - } - }, - enumerable: true, - configurable: true - }); - CodeEditorComponent.prototype.ngOnInit = function () { - var _this = this; - var options = { - value: this._dsl || '', - gutters: ['CodeMirror-lint-markers'], - extraKeys: { 'Ctrl-Space': 'autocomplete' }, - lineNumbers: this.lineNumbers, - lineWrapping: this.lineWrapping, - matchBrackets: true, - autoCloseBrackets: true, - }; - if (this.scrollbarStyle) { - options.scrollbarStyle = this.scrollbarStyle; - } - if (this._lint) { - options.lint = this._lint; - } - this.doc = fromTextArea($$7('#code-editor-host', this.element.nativeElement)[0], options); - if (this.placeholder) { - this.doc.setOption('placeholder', this.placeholder); - } - // Turns out "value" in the option doesn't set it. - this.doc.setValue(this._dsl || ''); - this.doc.on('change', this._dslChangedHandler); - this.doc.on('focus', function () { - _this.focus.emit(); - if (_this._onTouchHandler) { - _this._onTouchHandler(); - } - }); - this.doc.on('blur', function () { return _this.blur.emit(); }); - this.warningRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-warning'); - this.errorRuler = this.doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); - this.loadEditorMode(); - this.editor.emit(this.doc); - }; - CodeEditorComponent.prototype.loadEditorMode = function () { - // CodeMirror doc object must be initialized - if (!this.doc) { - return; - } - var info = this._language ? findModeByName(this._language) : undefined; - // Set proper editor mode - if (info) { - this.doc.setOption('mode', info.mime); - // (CodeMirror).autoLoadMode(this.doc, info.mode); - } - else { - this.doc.setOption('mode', 'text/plain'); - } - // Set proper Lint mode - this.doc.setOption('lint', this.getLintOptions()); - }; - CodeEditorComponent.prototype.ngOnDestroy = function () { - }; - CodeEditorComponent.prototype.writeValue = function (obj) { - this.dsl = obj; - }; - CodeEditorComponent.prototype.registerOnChange = function (fn) { - this._onChangeHandler = fn; - }; - CodeEditorComponent.prototype.registerOnTouched = function (fn) { - this._onTouchHandler = fn; - }; - CodeEditorComponent.prototype.getLintOptions = function () { - var _this = this; - switch (this._language) { - case 'javascript': - case 'json': - case 'coffeescript': - case 'yaml': - return { - onUpdateLinting: function (annotations) { - var warnings = []; - var errors = []; - if (_this.overviewRuler) { - if (Array.isArray(annotations)) { - annotations.forEach(function (a) { - if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { - if (a.severity === 'error') { - errors.push(a); - } - else if (a.severity === 'warning') { - warnings.push(a); - } - } - }); - } - } - _this.warningRuler.update(warnings); - _this.errorRuler.update(errors); - } - }; - } - return false; - }; - var CodeEditorComponent_1; - __decorate([ - Input('line-numbers'), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "lineNumbers", void 0); - __decorate([ - Input('line-wrapping'), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "lineWrapping", void 0); - __decorate([ - Input('scrollbar-style'), - __metadata("design:type", String) - ], CodeEditorComponent.prototype, "scrollbarStyle", void 0); - __decorate([ - Input(), - __metadata("design:type", String) - ], CodeEditorComponent.prototype, "placeholder", void 0); - __decorate([ - Input('overview-ruler'), - __metadata("design:type", Boolean) - ], CodeEditorComponent.prototype, "overviewRuler", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "dslChange", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "focus", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "blur", void 0); - __decorate([ - Output(), - __metadata("design:type", Object) - ], CodeEditorComponent.prototype, "editor", void 0); - __decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], CodeEditorComponent.prototype, "dsl", null); - __decorate([ - Input(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) - ], CodeEditorComponent.prototype, "language", null); - CodeEditorComponent = CodeEditorComponent_1 = __decorate([ - Component({ - selector: 'code-editor', - template: "\n
\n \n
\n ", - styles: ["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "], - encapsulation: ViewEncapsulation.None, - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(function () { return CodeEditorComponent_1; }), - multi: true - } - ] - }), - __metadata("design:paramtypes", [ElementRef]) - ], CodeEditorComponent); - return CodeEditorComponent; -}()); - -var Properties; -(function (Properties) { - var InputType; - (function (InputType) { - InputType[InputType["TEXT"] = 0] = "TEXT"; - InputType[InputType["NUMBER"] = 1] = "NUMBER"; - InputType[InputType["SELECT"] = 2] = "SELECT"; - InputType[InputType["CHECKBOX"] = 3] = "CHECKBOX"; - InputType[InputType["PASSWORD"] = 4] = "PASSWORD"; - InputType[InputType["EMAIL"] = 5] = "EMAIL"; - InputType[InputType["URL"] = 6] = "URL"; - InputType[InputType["CODE"] = 7] = "CODE"; - })(InputType = Properties.InputType || (Properties.InputType = {})); - var GenericControlModel = /** @class */ (function () { - function GenericControlModel(_property, type, validation) { - this._property = _property; - this.type = type; - this.validation = validation; - } - Object.defineProperty(GenericControlModel.prototype, "id", { - get: function () { - return this.property.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "name", { - get: function () { - return this.property.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "description", { - get: function () { - return this.property.description; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "defaultValue", { - get: function () { - return this.property.defaultValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "value", { - get: function () { - return this.getValue(); - }, - set: function (value) { - this.setValue(value); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(GenericControlModel.prototype, "property", { - get: function () { - return this._property; - }, - enumerable: true, - configurable: true - }); - GenericControlModel.prototype.setValue = function (value) { - this.property.value = value; - }; - GenericControlModel.prototype.getValue = function () { - return this.property.value; - }; - return GenericControlModel; - }()); - Properties.GenericControlModel = GenericControlModel; - var CheckBoxControlModel = /** @class */ (function (_super) { - __extends(CheckBoxControlModel, _super); - function CheckBoxControlModel(_property, validation) { - return _super.call(this, _property, InputType.CHECKBOX, validation) || this; - } - CheckBoxControlModel.prototype.getValue = function () { - var res = _super.prototype.getValue.call(this); - var type = typeof res; - switch (type) { - case 'boolean': - return res; - case 'string': - switch (res.trim().toLowerCase()) { - case 'true': - case '1': - return true; - case 'false': - case '0': - return false; - default: - return this.property.defaultValue; - } - case 'number': - var num = res; - if (num === 0) { - return false; - } - else if (num === 1) { - return true; - } - else { - return this.property.defaultValue; - } - } - return this.property.defaultValue; - }; - return CheckBoxControlModel; - }(GenericControlModel)); - Properties.CheckBoxControlModel = CheckBoxControlModel; - var AbstractCodeControlModel = /** @class */ (function (_super) { - __extends(AbstractCodeControlModel, _super); - function AbstractCodeControlModel(_property, encode, decode, validation) { - var _this = _super.call(this, _property, InputType.CODE, validation) || this; - _this.encode = encode; - _this.decode = decode; - return _this; - } - Object.defineProperty(AbstractCodeControlModel.prototype, "value", { - get: function () { - var dsl = _super.prototype.getValue.call(this); - if (dsl && this.decode) { - return this.decode(dsl); - } - else { - return dsl; - } - }, - set: function (value) { - if (value && this.encode) { - _super.prototype.setValue.call(this, this.encode(value)); - } - else { - _super.prototype.setValue.call(this, value); - } - }, - enumerable: true, - configurable: true - }); - return AbstractCodeControlModel; - }(GenericControlModel)); - Properties.AbstractCodeControlModel = AbstractCodeControlModel; - var GenericCodeControlModel = /** @class */ (function (_super) { - __extends(GenericCodeControlModel, _super); - function GenericCodeControlModel(_property, language, encode, decode, validation) { - var _this = _super.call(this, _property, encode, decode, validation) || this; - _this.language = language; - return _this; - } - return GenericCodeControlModel; - }(AbstractCodeControlModel)); - Properties.GenericCodeControlModel = GenericCodeControlModel; - var CodeControlModelWithDynamicLanguageProperty = /** @class */ (function (_super) { - __extends(CodeControlModelWithDynamicLanguageProperty, _super); - function CodeControlModelWithDynamicLanguageProperty(_property, _languagePropertyName, _groupModel, encode, decode, validation) { - var _this = _super.call(this, _property, encode, decode, validation) || this; - _this._languagePropertyName = _languagePropertyName; - _this._groupModel = _groupModel; - return _this; - } - Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "language", { - get: function () { - var value = this.languageControlModel.value; - return value ? value : this.languageControlModel.defaultValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CodeControlModelWithDynamicLanguageProperty.prototype, "languageControlModel", { - get: function () { - var _this = this; - if (!this._langControlModel) { - // Cast to Properties.ControlModel from Properties.ControlModel | undefined - // Should not be undefined! - this._langControlModel = this._groupModel.getControlsModels().find(function (c) { return c.id === _this._languagePropertyName; }); - } - return this._langControlModel; - }, - enumerable: true, - configurable: true - }); - return CodeControlModelWithDynamicLanguageProperty; - }(AbstractCodeControlModel)); - Properties.CodeControlModelWithDynamicLanguageProperty = CodeControlModelWithDynamicLanguageProperty; - var GenericListControlModel = /** @class */ (function (_super) { - __extends(GenericListControlModel, _super); - function GenericListControlModel(property, validation) { - return _super.call(this, property, InputType.TEXT, validation) || this; - } - Object.defineProperty(GenericListControlModel.prototype, "value", { - get: function () { - return this.property.value ? this.property.value.join(', ') : ''; - }, - set: function (value) { - this.property.value = value && value.trim() ? value.split(/\s*,\s*/) : undefined; - }, - enumerable: true, - configurable: true - }); - return GenericListControlModel; - }(GenericControlModel)); - Properties.GenericListControlModel = GenericListControlModel; - var SelectControlModel = /** @class */ (function (_super) { - __extends(SelectControlModel, _super); - function SelectControlModel(_property, type, options) { - var _this = _super.call(this, _property, type) || this; - _this.options = options; - if (_property.defaultValue === undefined) { - options.unshift({ - name: 'SELECT', - value: _property.defaultValue - }); - } - return _this; - } - return SelectControlModel; - }(GenericControlModel)); - Properties.SelectControlModel = SelectControlModel; - var DefaultCellPropertiesSource = /** @class */ (function () { - function DefaultCellPropertiesSource(cell) { - this.cell = cell; - } - DefaultCellPropertiesSource.prototype.getProperties = function () { - var _this = this; - var metadata = this.cell.attr('metadata'); - return Promise.resolve(metadata.properties().then(function (propsMetadata) { return Array.from(propsMetadata.values()).map(function (m) { return _this.createProperty(m); }); })); - }; - DefaultCellPropertiesSource.prototype.createProperty = function (metadata) { - return { - id: metadata.id, - name: metadata.name, - type: metadata.type, - defaultValue: metadata.defaultValue, - attr: "props/" + metadata.name, - value: this.cell.attr("props/" + metadata.name), - description: metadata.description, - valueOptions: metadata.options - }; - }; - DefaultCellPropertiesSource.prototype.applyChanges = function (properties) { - var _this = this; - this.cell.trigger('batch:start', { batchName: 'update properties' }); - properties.forEach(function (property) { - if ((typeof property.value === 'boolean' && !property.defaultValue && !property.value) || - (property.value === property.defaultValue || property.value === '' || property.value === undefined || property.value === null)) { - var currentValue = _this.cell.attr(property.attr); - if (currentValue !== undefined && currentValue !== null) { - // Remove attr doesn't fire appropriate event. Set default value first as a workaround to schedule DSL resync - _this.cell.attr(property.attr, property.defaultValue === undefined ? null : property.defaultValue); - _this.cell.removeAttr(property.attr); - } - } - else { - _this.cell.attr(property.attr, property.value); - } - }); - this.cell.trigger('batch:stop', { batchName: 'update properties' }); - }; - return DefaultCellPropertiesSource; - }()); - Properties.DefaultCellPropertiesSource = DefaultCellPropertiesSource; - var PropertiesGroupModel = /** @class */ (function () { - function PropertiesGroupModel(propertiesSource) { - this.loading = true; - this.propertiesSource = propertiesSource; - } - PropertiesGroupModel.prototype.load = function () { - var _this = this; - this.loading = true; - this._loadedSubject = new Subject(); - this.propertiesSource.getProperties().then(function (properties) { - _this.controlModels = properties.map(function (p) { return _this.createControlModel(p); }); - _this.loading = false; - _this._loadedSubject.next(true); - _this._loadedSubject.complete(); - }); - }; - Object.defineProperty(PropertiesGroupModel.prototype, "isLoading", { - get: function () { - return this.loading; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(PropertiesGroupModel.prototype, "loadedSubject", { - get: function () { - return this._loadedSubject; - }, - enumerable: true, - configurable: true - }); - PropertiesGroupModel.prototype.getControlsModels = function () { - return this.controlModels; - }; - PropertiesGroupModel.prototype.createControlModel = function (property) { - return new GenericControlModel(property, InputType.TEXT); - }; - PropertiesGroupModel.prototype.applyChanges = function () { - if (this.loading) { - return; - } - var properties = this.controlModels.map(function (cm) { return cm.property; }); - this.propertiesSource.applyChanges(properties); - }; - return PropertiesGroupModel; - }()); - Properties.PropertiesGroupModel = PropertiesGroupModel; - var Validators; - (function (Validators) { - function uniqueResource(service, debounce$$1) { - return function (control) { - return new Observable(function (obs) { - if (control.valueChanges && control.value) { - control.valueChanges - .pipe(debounceTime(debounce$$1), mergeMap(function (value) { return service(value); })) - .subscribe(function () { - obs.next({ uniqueResource: true }); - obs.complete(); - }, function () { - obs.next(undefined); - obs.complete(); - }); - } - else { - obs.next(undefined); - obs.complete(); - } - }); - }; - } - Validators.uniqueResource = uniqueResource; - function noneOf(excluded) { - return function (control) { - return excluded.find(function (e) { return e === control.value; }) ? { 'noneOf': { value: control.value } } : {}; - }; - } - Validators.noneOf = noneOf; - })(Validators = Properties.Validators || (Properties.Validators = {})); -})(Properties || (Properties = {})); - -var PropertiesGroupComponent = /** @class */ (function () { - function PropertiesGroupComponent() { - } - PropertiesGroupComponent.prototype.ngOnInit = function () { - var _this = this; - if (this.propertiesGroupModel.isLoading) { - var subscription_1 = this.propertiesGroupModel.loadedSubject.subscribe(function (loaded) { - if (loaded) { - subscription_1.unsubscribe(); - _this.createGroupControls(); - } - }); - } - else { - this.createGroupControls(); - } - }; - PropertiesGroupComponent.prototype.createGroupControls = function () { - var _this = this; - this.propertiesGroupModel.getControlsModels().forEach(function (c) { - if (c.validation) { - _this.form.addControl(c.id, new FormControl(c.value || '', c.validation.validator, c.validation.asyncValidator)); - } - else { - _this.form.addControl(c.id, new FormControl(c.value || '')); - } - }); - }; - __decorate([ - Input(), - __metadata("design:type", Properties.PropertiesGroupModel) - ], PropertiesGroupComponent.prototype, "propertiesGroupModel", void 0); - __decorate([ - Input(), - __metadata("design:type", FormGroup) - ], PropertiesGroupComponent.prototype, "form", void 0); - PropertiesGroupComponent = __decorate([ - Component({ - selector: 'properties-group', - template: "\n
\n \n
\n ", - encapsulation: ViewEncapsulation.None - }) - ], PropertiesGroupComponent); - return PropertiesGroupComponent; -}()); - -var DynamicFormPropertyComponent = /** @class */ (function () { - function DynamicFormPropertyComponent() { - } - Object.defineProperty(DynamicFormPropertyComponent.prototype, "types", { - get: function () { - return Properties.InputType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DynamicFormPropertyComponent.prototype, "control", { - get: function () { - return this.form.controls[this.model.id]; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DynamicFormPropertyComponent.prototype, "errorData", { - get: function () { - var _this = this; - return (this.model.validation && this.model.validation.errorData ? this.model.validation.errorData : []) - .filter(function (e) { return _this.control.errors && _this.control.errors[e.id]; }); - }, - enumerable: true, - configurable: true - }); - __decorate([ - Input(), - __metadata("design:type", Object) - ], DynamicFormPropertyComponent.prototype, "model", void 0); - __decorate([ - Input(), - __metadata("design:type", FormGroup) - ], DynamicFormPropertyComponent.prototype, "form", void 0); - DynamicFormPropertyComponent = __decorate([ - Component({ - selector: 'df-property', - template: "\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ", - encapsulation: ViewEncapsulation.None - }), - __metadata("design:paramtypes", []) - ], DynamicFormPropertyComponent); - return DynamicFormPropertyComponent; -}()); - -var FloModule = /** @class */ (function () { - function FloModule() { - } - FloModule = __decorate([ - NgModule({ - imports: [ - FormsModule, - CommonModule, - ReactiveFormsModule - ], - declarations: [ - Palette, - EditorComponent, - ResizerDirective, - DslEditorComponent, - CodeEditorComponent, - PropertiesGroupComponent, - DynamicFormPropertyComponent - ], - exports: [ - EditorComponent, - DslEditorComponent, - DynamicFormPropertyComponent, - PropertiesGroupComponent - ] - }) - ], FloModule); - return FloModule; -}()); - -/** - * Generated bundle index. Do not edit. - */ - -export { FloModule, Palette, EditorComponent, DslEditorComponent, CodeEditorComponent, PropertiesGroupComponent, DynamicFormPropertyComponent, ResizerDirective, Flo, Properties, Constants, Shapes }; -//# sourceMappingURL=spring-flo.js.map diff --git a/dist/out-tsc/code-editor/code-editor.component.d.ts b/dist/out-tsc/code-editor/code-editor.component.d.ts deleted file mode 100644 index 2bb359e..0000000 --- a/dist/out-tsc/code-editor/code-editor.component.d.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { ElementRef, OnInit, OnDestroy } from '@angular/core'; -import { ControlValueAccessor } from '@angular/forms'; -import 'codemirror-minified/mode/meta'; -import 'codemirror-minified/addon/lint/lint'; -import 'codemirror-minified/addon/hint/show-hint'; -import 'codemirror-minified/addon/edit/matchbrackets'; -import 'codemirror-minified/addon/edit/closebrackets'; -import 'codemirror-minified/addon/display/placeholder'; -import 'codemirror-minified/addon/scroll/annotatescrollbar'; -import 'codemirror-minified/addon/scroll/simplescrollbars'; -import 'codemirror-minified/addon/lint/javascript-lint'; -import 'codemirror-minified/addon/lint/coffeescript-lint'; -import 'codemirror-minified/addon/lint/json-lint'; -import 'codemirror-minified/addon/lint/yaml-lint'; -import 'codemirror-minified/mode/groovy/groovy'; -import 'codemirror-minified/mode/javascript/javascript'; -import 'codemirror-minified/mode/python/python'; -import 'codemirror-minified/mode/ruby/ruby'; -import 'codemirror-minified/mode/clike/clike'; -import 'codemirror-minified/mode/yaml/yaml'; -import 'codemirror-minified/mode/coffeescript/coffeescript'; -export declare class CodeEditorComponent implements OnInit, OnDestroy, ControlValueAccessor { - private element; - private doc; - private _dsl; - private _lint; - private _language; - private errorRuler; - private warningRuler; - private _onChangeHandler; - private _onTouchHandler; - private lineNumbers; - private lineWrapping; - private scrollbarStyle; - private placeholder; - private overviewRuler; - private dslChange; - private focus; - private blur; - private editor; - private _dslChangedHandler; - constructor(element: ElementRef); - dsl: string; - language: string; - ngOnInit(): void; - private loadEditorMode; - ngOnDestroy(): void; - writeValue(obj: any): void; - registerOnChange(fn: (_: any) => void): void; - registerOnTouched(fn: () => void): void; - private getLintOptions; -} diff --git a/dist/out-tsc/directives/resizer.d.ts b/dist/out-tsc/directives/resizer.d.ts deleted file mode 100644 index 376e2b5..0000000 --- a/dist/out-tsc/directives/resizer.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { EventEmitter, ElementRef, OnInit, OnDestroy } from '@angular/core'; -export declare class ResizerDirective implements OnInit, OnDestroy { - private element; - private document; - private dragInProgress; - private vertical; - private first; - private second; - private _size; - private _splitSize; - private _subscriptions; - maxSplitSize: number; - sizeChange: EventEmitter; - private mouseMoveHandler; - splitSize: number; - resizerWidth: number; - resizerHeight: number; - resizerLeft: string; - resizerTop: string; - resizerRight: string; - resizerBottom: string; - constructor(element: ElementRef, document: any); - startDrag(): void; - private mousemove; - ngOnInit(): void; - ngOnDestroy(): void; -} diff --git a/dist/out-tsc/dsl-editor/dsl-editor.component.d.ts b/dist/out-tsc/dsl-editor/dsl-editor.component.d.ts deleted file mode 100644 index fcb1229..0000000 --- a/dist/out-tsc/dsl-editor/dsl-editor.component.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ElementRef, OnInit, OnDestroy } from '@angular/core'; -import * as CodeMirror from 'codemirror-minified'; -import 'codemirror-minified/addon/lint/lint'; -import 'codemirror-minified/addon/hint/show-hint'; -import 'codemirror-minified/addon/display/placeholder'; -import 'codemirror-minified/addon/scroll/annotatescrollbar'; -import 'codemirror-minified/addon/scroll/simplescrollbars'; -export declare class DslEditorComponent implements OnInit, OnDestroy { - private element; - private doc; - private _dsl; - private _lint; - private _hint; - private lineNumbers; - private lineWrapping; - private scrollbarStyle; - private placeholder; - private debounce; - private dslChange; - private focus; - private blur; - private editor; - private _dslChangedHandler; - constructor(element: ElementRef); - dsl: string; - lintOptions: boolean | CodeMirror.LintOptions; - hintOptions: any; - ngOnInit(): void; - ngOnDestroy(): void; -} diff --git a/dist/out-tsc/editor/editor-utils.d.ts b/dist/out-tsc/editor/editor-utils.d.ts deleted file mode 100644 index 3d5c091..0000000 --- a/dist/out-tsc/editor/editor-utils.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { dia } from 'jointjs'; -export declare class Utils { - static fanRoute(graph: dia.Graph, cell: dia.Cell): void; - static isCustomPaperEvent(args: any): boolean; -} diff --git a/dist/out-tsc/editor/editor.component.d.ts b/dist/out-tsc/editor/editor.component.d.ts deleted file mode 100644 index 9748bd8..0000000 --- a/dist/out-tsc/editor/editor.component.d.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { ElementRef, EventEmitter, OnInit, OnDestroy } from '@angular/core'; -import { dia } from 'jointjs'; -import { Flo } from '../shared/flo-common'; -export interface VisibilityState { - visibility: string; - children: Array; -} -export declare class EditorComponent implements OnInit, OnDestroy { - private element; - /** - * Joint JS Graph object representing the Graph model - */ - private graph; - /** - * Joint JS Paper object representing the canvas control containing the graph view - */ - private paper; - /** - * Currently selected element - */ - private _selection; - /** - * Current DnD descriptor for frag in progress - */ - private highlighted; - /** - * Flag specifying whether the Flo-Editor is in read-only mode. - */ - private _readOnlyCanvas; - /** - * Grid size - */ - private _gridSize; - private _hiddenPalette; - private editorContext; - private textToGraphEventEmitter; - private graphToTextEventEmitter; - private _graphToTextSyncEnabled; - private validationEventEmitter; - private _disposables; - private _dslText; - private textToGraphConversionCompleted; - private graphToTextConversionCompleted; - private paletteReady; - /** - * Metamodel. Retrieves metadata about elements that can be shown in Flo - */ - metamodel: Flo.Metamodel; - /** - * Renders elements. - */ - renderer: Flo.Renderer; - /** - * Editor. Provides domain specific editing capabilities on top of standard Flo features - */ - editor: Flo.Editor; - /** - * Size (Width) of the palette - */ - paletteSize: number; - /** - * Min zoom percent value - */ - minZoom: number; - /** - * Max zoom percent value - */ - maxZoom: number; - /** - * Zoom percent increment/decrement step - */ - zoomStep: number; - paperPadding: number; - floApi: EventEmitter; - validationMarkers: EventEmitter>; - contentValidated: EventEmitter; - private dslChange; - private _resizeHandler; - constructor(element: ElementRef); - ngOnInit(): void; - ngOnDestroy(): void; - noPalette: boolean; - graphToTextSync: boolean; - private performGraphToTextSyncing; - createHandle(element: dia.CellView, kind: string, action: () => void, location: dia.Point): dia.Element; - removeEmbeddedChildrenOfType(element: dia.Cell, types: Array): void; - selection: dia.CellView; - readOnlyCanvas: boolean; - /** - * Displays graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - showDragFeedback(dragDescriptor: Flo.DnDDescriptor): void; - /** - * Hides graphical feedback for the drag and drop in progress based on current drag and drop descriptor object - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - hideDragFeedback(dragDescriptor: Flo.DnDDescriptor): void; - /** - * Sets the new DnD info object - the descriptor for DnD - * - * @param dragDescriptor DnD info object. Has on info on graph node being dragged (drag source) and what it is - * being dragged over at the moment (drop target) - */ - setDragDescriptor(dragDescriptor?: Flo.DnDDescriptor): void; - /** - * Handles DnD events when a node is being dragged over canvas - * - * @param draggedView The Joint JS view object being dragged - * @param targetUnderMouse The Joint JS view under mouse cursor - * @param x X coordinate of the mouse on the canvas - * @param y Y coordinate of the mosue on the canvas - * @param context DnD context (palette or canvas) - */ - handleNodeDragging(draggedView: dia.CellView, targetUnderMouse: dia.CellView, x: number, y: number, sourceComponent: string): void; - /** - * Handles DnD drop event when a node is being dragged and dropped on the main canvas - */ - handleNodeDropping(): void; - /** - * Hides DOM Node (used to determine drop target DOM element) - * @param domNode DOM node to hide - * @returns - */ - private _hideNode; - /** - * Restored DOM node original visibility (used to determine drop target DOM element) - * @param domNode DOM node to restore visibility of - * @param oldVisibility original visibility parameter - */ - _restoreNodeVisibility(domNode: HTMLElement, oldVisibility: VisibilityState): void; - /** - * Unfortunately we can't just use event.target because often draggable shape on the canvas overlaps the target. - * We can easily find the element(s) at location, but only nodes :-( Unclear how to find links at location - * (bounding box of a link for testing is bad). - * The result of that is that links can only be the drop target when dragging from the palette currently. - * When DnDing shapes on the canvas drop target cannot be a link. - * - * Excluded views enables you to choose to filter some possible answers (useful in the case where elements are stacked - * - e.g. Drag-n-Drop) - */ - getTargetViewFromEvent(event: MouseEvent, x: number, y: number, excludeViews?: Array): dia.CellView; - handleDnDFromPalette(dndEvent: Flo.DnDEvent): void; - handleDragFromPalette(dnDEvent: Flo.DnDEvent): void; - createNode(metadata: Flo.ElementMetadata, props: Map, position: dia.Point): dia.Element; - createLink(source: Flo.LinkEnd, target: Flo.LinkEnd, metadata: Flo.ElementMetadata, props: Map): dia.Link; - handleDropFromPalette(event: Flo.DnDEvent): void; - private fitToContent; - autosizePaper(): void; - fitToPage(): void; - zoomPercent: number; - gridSize: number; - validateContent(): Promise; - markElement(cell: dia.Cell, markers: Array): void; - doLayout(): Promise; - dsl: string; - /** - * Ask the server to parse the supplied text into a JSON graph of nodes and links, - * then update the view based on that new information. - */ - updateGraphRepresentation(): Promise; - updateTextRepresentation(): Promise; - initMetamodel(): void; - initGraph(): void; - handleNodeCreation(node: dia.Element): void; - /** - * Forwards a link event occurrence to any handlers in the editor service, if they are defined. Event examples - * are 'change:source', 'change:target'. - */ - handleLinkEvent(event: string, link: dia.Link): void; - handleLinkCreation(link: dia.Link): void; - initGraphListeners(): void; - initPaperListeners(): void; - initPaper(): void; - updatePaletteReadyState(ready: boolean): void; -} diff --git a/dist/out-tsc/index.d.ts b/dist/out-tsc/index.d.ts deleted file mode 100644 index af70569..0000000 --- a/dist/out-tsc/index.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { FloModule } from './module'; -export { Palette } from './palette/palette.component'; -export { EditorComponent } from './editor/editor.component'; -export { DslEditorComponent } from './dsl-editor/dsl-editor.component'; -export { CodeEditorComponent } from './code-editor/code-editor.component'; -export { PropertiesGroupComponent } from './properties/properties.group.component'; -export { DynamicFormPropertyComponent } from './properties/df.property.component'; -export { ResizerDirective } from './directives/resizer'; -export * from './shared/flo-common'; -export * from './shared/flo-properties'; -export * from './shared/shapes'; diff --git a/dist/out-tsc/module.d.ts b/dist/out-tsc/module.d.ts deleted file mode 100644 index 0071cea..0000000 --- a/dist/out-tsc/module.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare class FloModule { -} diff --git a/dist/out-tsc/palette/palette.component.d.ts b/dist/out-tsc/palette/palette.component.d.ts deleted file mode 100644 index 955d06a..0000000 --- a/dist/out-tsc/palette/palette.component.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ElementRef, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core'; -import { dia } from 'jointjs'; -import { Flo } from '../shared/flo-common'; -export declare class Palette implements OnInit, OnDestroy, OnChanges { - private element; - private document; - private _metamodelListener; - /** - * The names of any groups in the palette that have been deliberately closed (the arrow clicked on) - */ - private closedGroups; - /** - * Model of the clicked element - */ - private clickedElement; - private viewBeingDragged; - private initialized; - private _paletteSize; - private _filterText; - private paletteGraph; - private palette; - private floaterpaper; - private filterTextModel; - metamodel: Flo.Metamodel; - renderer: Flo.Renderer; - paletteEntryPadding: dia.Size; - onPaletteEntryDrop: EventEmitter; - paletteReady: EventEmitter; - paletteFocus: EventEmitter; - private mouseMoveHanlder; - private mouseUpHanlder; - paletteSize: number; - constructor(element: ElementRef, document: any); - onFocus(): void; - ngOnInit(): void; - ngOnDestroy(): void; - ngOnChanges(changes: SimpleChanges): void; - private createPaletteGroup; - private createPaletteEntry; - private buildPalette; - rebuildPalette(): void; - filterText: string; - private getPaletteView; - private handleMouseUp; - private trigger; - private handleDrag; - private rotateOpen; - private doRotateOpen; - private doRotateClose; - private rotateClosed; -} diff --git a/dist/out-tsc/properties/df.property.component.d.ts b/dist/out-tsc/properties/df.property.component.d.ts deleted file mode 100644 index c5923dc..0000000 --- a/dist/out-tsc/properties/df.property.component.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { FormGroup, AbstractControl } from '@angular/forms'; -import { Properties } from '../shared/flo-properties'; -export declare class DynamicFormPropertyComponent { - model: Properties.ControlModel; - form: FormGroup; - constructor(); - readonly types: typeof Properties.InputType; - readonly control: AbstractControl; - readonly errorData: Properties.ErrorData[]; -} diff --git a/dist/out-tsc/properties/properties.group.component.d.ts b/dist/out-tsc/properties/properties.group.component.d.ts deleted file mode 100644 index 4d310bb..0000000 --- a/dist/out-tsc/properties/properties.group.component.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { Properties } from '../shared/flo-properties'; -export declare class PropertiesGroupComponent implements OnInit { - propertiesGroupModel: Properties.PropertiesGroupModel; - form: FormGroup; - ngOnInit(): void; - createGroupControls(): void; -} diff --git a/dist/out-tsc/shared/flo-common.d.ts b/dist/out-tsc/shared/flo-common.d.ts deleted file mode 100644 index 9fcba14..0000000 --- a/dist/out-tsc/shared/flo-common.d.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { dia, g } from 'jointjs'; -import { Observable } from 'rxjs'; -export declare namespace Flo { - const joint: any; - enum DnDEventType { - DRAG = 0, - DROP = 1 - } - interface DnDEvent { - type: DnDEventType; - view: dia.CellView; - event: MouseEvent; - } - interface PropertyMetadata { - readonly id: string; - readonly name: string; - readonly description?: string; - readonly defaultValue?: any; - readonly type?: string; - readonly [propName: string]: any; - } - interface ExtraMetadata { - readonly titleProperty?: string; - readonly noEditableProps?: boolean; - readonly noPaletteEntry?: boolean; - readonly unselectable?: boolean; - readonly [propName: string]: any; - readonly allowAdditionalProperties?: boolean; - } - interface ElementMetadata { - readonly name: string; - readonly group: string; - readonly metadata?: ExtraMetadata; - readonly [propName: string]: any; - description?(): Promise; - get(property: String): Promise; - properties(): Promise>; - } - interface ViewerDescriptor { - readonly graph?: dia.Graph; - readonly paper?: dia.Paper; - } - interface MetamodelListener { - metadataError(data: any): void; - metadataAboutToChange(): void; - metadataChanged(): void; - } - interface Metamodel { - textToGraph(flo: EditorContext, dsl: string): Promise; - graphToText(flo: EditorContext): Promise; - load(): Promise>>; - groups(): Array; - refresh?(): Promise>>; - subscribe?(listener: MetamodelListener): void; - unsubscribe?(listener: MetamodelListener): void; - isValidPropertyValue?(element: dia.Element, property: string, value: any): boolean; - } - interface CreationParams { - metadata?: ElementMetadata; - props?: Map; - } - interface ElementCreationParams extends CreationParams { - position?: dia.Point; - } - interface LinkCreationParams extends CreationParams { - source: string; - target: string; - } - interface EmbeddedChildCreationParams extends CreationParams { - parent: dia.Cell; - position?: dia.Point; - } - interface DecorationCreationParams extends EmbeddedChildCreationParams { - kind: string; - messages: Array; - } - interface HandleCreationParams extends EmbeddedChildCreationParams { - kind: string; - } - interface Renderer { - createNode?(metadata: ElementMetadata, props?: Map): dia.Element; - createLink?(source: LinkEnd, target: LinkEnd, metadata?: ElementMetadata, props?: Map): dia.Link; - createHandle?(kind: string, parent: dia.Cell): dia.Element; - createDecoration?(kind: string, parent: dia.Cell): dia.Element; - initializeNewNode?(node: dia.Element, viewerDescriptor: ViewerDescriptor): void; - initializeNewLink?(link: dia.Link, viewerDescriptor: ViewerDescriptor): void; - initializeNewHandle?(handle: dia.Element, viewerDescriptor: ViewerDescriptor): void; - initializeNewDecoration?(decoration: dia.Element, viewerDescriptor: ViewerDescriptor): void; - getNodeView?(): dia.ElementView; - getLinkView?(): dia.LinkView; - layout?(paper: dia.Paper): Promise; - handleLinkEvent?(context: EditorContext, event: string, link: dia.Link): void; - isSemanticProperty?(propertyPath: string, element: dia.Cell): boolean; - refreshVisuals?(cell: dia.Cell, propertyPath: string, paper: dia.Paper): void; - getLinkAnchorPoint?(linkView: dia.LinkView, view: dia.ElementView, port: SVGElement, reference: dia.Point): dia.Point; - } - interface EditorContext { - readonly textToGraphConversionObservable: Observable; - readonly graphToTextConversionObservable: Observable; - readonly paletteReady: Observable; - zoomPercent: number; - gridSize: number; - readOnlyCanvas: boolean; - selection: dia.CellView; - graphToTextSync: boolean; - noPalette: boolean; - setDsl(dsl: string): void; - updateGraph(): Promise; - updateText(): Promise; - performLayout(): Promise; - clearGraph(): Promise; - getGraph(): dia.Graph; - getPaper(): dia.Paper; - getMinZoom(): number; - getMaxZoom(): number; - getZoomStep(): number; - fitToPage(): void; - createNode(metadata: ElementMetadata, props?: Map, position?: dia.Point): dia.Element; - createLink(source: LinkEnd, target: LinkEnd, metadata?: ElementMetadata, props?: Map): dia.Link; - deleteSelectedNode(): void; - [propName: string]: any; - } - interface LinkEndDescriptor { - view: dia.CellView; - cssClassSelector?: string; - } - interface DnDDescriptor { - sourceComponent?: string; - range?: number; - source?: LinkEndDescriptor; - target?: LinkEndDescriptor; - } - interface LinkEnd { - id: string | number; - selector?: string; - port?: string; - } - enum Severity { - Error = 0, - Warning = 1 - } - interface Marker { - severity: Severity; - message: string; - range?: Range; - } - interface Position { - ch: number; - line: number; - } - interface Range { - start: Position; - end: Position; - } - interface Editor { - interactive?: ((cellView: dia.CellView, event: string) => boolean) | boolean | dia.CellView.InteractivityOptions; - allowLinkVertexEdit?: boolean; - highlighting?: any; - createHandles?(context: EditorContext, createHandle: (owner: dia.CellView, kind: string, action: () => void, location: dia.Point) => void, owner: dia.CellView): void; - validatePort?(context: EditorContext, view: dia.CellView, magnet: SVGElement): boolean; - validateLink?(context: EditorContext, cellViewS: dia.CellView, portS: SVGElement, cellViewT: dia.CellView, portT: SVGElement, isSource: boolean, linkView: dia.LinkView): boolean; - calculateDragDescriptor?(context: EditorContext, draggedView: dia.CellView, targetUnderMouse: dia.CellView, coordinate: g.Point, sourceComponent: string): DnDDescriptor; - handleNodeDropping?(context: EditorContext, dragDescriptor: DnDDescriptor): void; - showDragFeedback?(context: EditorContext, dragDescriptor: DnDDescriptor): void; - hideDragFeedback?(context: EditorContext, dragDescriptor: DnDDescriptor): void; - validate?(graph: dia.Graph, dsl: string, flo: EditorContext): Promise>>; - preDelete?(context: EditorContext, deletedElement: dia.Cell): void; - setDefaultContent?(editorContext: EditorContext, data: Map>): void; - } - function findMagnetByClass(view: dia.CellView, className: string): SVGElement | undefined; - function findMagnetByPort(view: dia.CellView, port: string): SVGElement | undefined; - /** - * Return the metadata for a particular palette entry in a particular group. - * @param name - name of the palette entry - * @param group - group in which the palette entry should exist (e.g. sinks) - * @return - */ - function getMetadata(metamodel: Map>, name: string, group: string): ElementMetadata | undefined; -} diff --git a/dist/out-tsc/shared/flo-properties.d.ts b/dist/out-tsc/shared/flo-properties.d.ts deleted file mode 100644 index 17b3497..0000000 --- a/dist/out-tsc/shared/flo-properties.d.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { dia } from 'jointjs'; -import { ValidatorFn, AsyncValidatorFn } from '@angular/forms'; -import { Flo } from './flo-common'; -import { Subject, Observable } from 'rxjs'; -export declare namespace Properties { - enum InputType { - TEXT = 0, - NUMBER = 1, - SELECT = 2, - CHECKBOX = 3, - PASSWORD = 4, - EMAIL = 5, - URL = 6, - CODE = 7 - } - interface Property { - readonly id: string; - readonly name: string; - readonly type?: string; - readonly description?: string; - readonly defaultValue?: any; - value?: any; - readonly valueOptions?: any[]; - readonly [propName: string]: any; - } - interface SelectOption { - name: string; - value: any; - } - interface ErrorData { - id: string; - message: string; - } - interface Validation { - validator?: ValidatorFn | ValidatorFn[] | null; - asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null; - errorData?: Array; - } - interface ControlModel { - readonly type: InputType; - readonly id: string; - value: T; - readonly defaultValue: T; - readonly name?: string; - readonly description?: string; - readonly property: Property; - readonly validation?: Validation; - } - interface CodeControlModel extends ControlModel { - readonly language: string; - } - class GenericControlModel implements ControlModel { - private _property; - type: InputType; - validation?: Validation; - constructor(_property: Property, type: InputType, validation?: Validation); - readonly id: string; - readonly name: string; - readonly description: string; - readonly defaultValue: any; - value: T; - readonly property: Property; - protected setValue(value: T): void; - protected getValue(): T; - } - class CheckBoxControlModel extends GenericControlModel { - constructor(_property: Property, validation?: Validation); - protected getValue(): any; - } - abstract class AbstractCodeControlModel extends GenericControlModel implements CodeControlModel { - private encode?; - private decode?; - abstract language: string; - constructor(_property: Property, encode?: (s: string) => string, decode?: (s: string) => string, validation?: Validation); - value: string; - } - class GenericCodeControlModel extends AbstractCodeControlModel { - language: string; - constructor(_property: Property, language: string, encode?: (s: string) => string, decode?: (s: string) => string, validation?: Validation); - } - class CodeControlModelWithDynamicLanguageProperty extends AbstractCodeControlModel { - private _languagePropertyName; - private _groupModel; - private _langControlModel; - constructor(_property: Properties.Property, _languagePropertyName: string, _groupModel: Properties.PropertiesGroupModel, encode?: (s: string) => string, decode?: (s: string) => string, validation?: Validation); - readonly language: string; - readonly languageControlModel: Properties.ControlModel; - } - class GenericListControlModel extends GenericControlModel { - constructor(property: Property, validation?: Validation); - value: string; - } - class SelectControlModel extends GenericControlModel { - options: Array; - constructor(_property: Property, type: InputType, options: Array); - } - interface PropertiesSource { - getProperties(): Promise; - applyChanges(properties: Property[]): void; - } - class DefaultCellPropertiesSource implements PropertiesSource { - protected cell: dia.Cell; - constructor(cell: dia.Cell); - getProperties(): Promise>; - protected createProperty(metadata: Flo.PropertyMetadata): Property; - applyChanges(properties: Property[]): void; - } - class PropertiesGroupModel { - protected propertiesSource: PropertiesSource; - protected controlModels: Array>; - protected loading: boolean; - protected _loadedSubject: Subject; - constructor(propertiesSource: PropertiesSource); - load(): void; - readonly isLoading: boolean; - readonly loadedSubject: Subject; - getControlsModels(): ControlModel[]; - protected createControlModel(property: Property): ControlModel; - applyChanges(): void; - } - namespace Validators { - function uniqueResource(service: (value: any) => Observable, debounce: number): AsyncValidatorFn; - function noneOf(excluded: Array): ValidatorFn; - } -} diff --git a/dist/out-tsc/shared/shapes.d.ts b/dist/out-tsc/shared/shapes.d.ts deleted file mode 100644 index 142af21..0000000 --- a/dist/out-tsc/shared/shapes.d.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { dia } from 'jointjs'; -import { Flo } from './flo-common'; -export declare namespace Constants { - const REMOVE_HANDLE_TYPE = "remove"; - const PROPERTIES_HANDLE_TYPE = "properties"; - const ERROR_DECORATION_KIND = "error"; - const PALETTE_CONTEXT = "palette"; - const CANVAS_CONTEXT = "canvas"; - const FEEDBACK_CONTEXT = "feedback"; -} -export declare namespace Shapes { - interface CreationParams extends Flo.CreationParams { - renderer?: Flo.Renderer; - paper?: dia.Paper; - graph?: dia.Graph; - } - interface ElementCreationParams extends CreationParams { - position?: dia.Point; - } - interface LinkCreationParams extends CreationParams { - source: Flo.LinkEnd; - target: Flo.LinkEnd; - } - interface EmbeddedChildCreationParams extends CreationParams { - parent: dia.Cell; - position?: dia.Point; - } - interface DecorationCreationParams extends EmbeddedChildCreationParams { - kind: string; - messages: Array; - } - interface HandleCreationParams extends EmbeddedChildCreationParams { - kind: string; - } - interface FilterOptions { - amount: number; - [propName: string]: any; - } - class Factory { - /** - * Create a JointJS node that embeds extra metadata (properties). - */ - static createNode(params: ElementCreationParams): dia.Element; - static createLink(params: LinkCreationParams): dia.Link; - static createDecoration(params: DecorationCreationParams): dia.Element; - static createHandle(params: HandleCreationParams): dia.Element; - } -} diff --git a/dist/out-tsc/spring-flo.d.ts b/dist/out-tsc/spring-flo.d.ts deleted file mode 100644 index 67ff29a..0000000 --- a/dist/out-tsc/spring-flo.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Generated bundle index. Do not edit. - */ -export * from './index'; diff --git a/dist/out-tsc/spring-flo.metadata.json b/dist/out-tsc/spring-flo.metadata.json deleted file mode 100644 index 688daff..0000000 --- a/dist/out-tsc/spring-flo.metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"__symbolic":"module","version":4,"exports":[{"from":"./shared/flo-common"},{"from":"./shared/flo-properties"},{"from":"./shared/shapes"}],"metadata":{"FloModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":12,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@angular/forms","name":"FormsModule","line":14,"character":4},{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":15,"character":4},{"__symbolic":"reference","module":"@angular/forms","name":"ReactiveFormsModule","line":16,"character":4}],"declarations":[{"__symbolic":"reference","name":"Palette"},{"__symbolic":"reference","name":"EditorComponent"},{"__symbolic":"reference","name":"ResizerDirective"},{"__symbolic":"reference","name":"DslEditorComponent"},{"__symbolic":"reference","name":"CodeEditorComponent"},{"__symbolic":"reference","name":"PropertiesGroupComponent"},{"__symbolic":"reference","name":"DynamicFormPropertyComponent"}],"exports":[{"__symbolic":"reference","name":"EditorComponent"},{"__symbolic":"reference","name":"DslEditorComponent"},{"__symbolic":"reference","name":"DynamicFormPropertyComponent"},{"__symbolic":"reference","name":"PropertiesGroupComponent"}]}]}],"members":{}},"Palette":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":37,"character":1},"arguments":[{"selector":"flo-palette","template":"\n
\n \n
\n
\n
\n
\n ","styles":["\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback START */\n\n #palette-floater {\n /* TODO size relative to paper that goes on it? */\n opacity: 0.75;\n width:170px;\n height:60px;\n background-color: transparent;\n /*\n background-color: #6db33f;\n */\n float:left;\n position: absolute;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n #palette-floater.joint-paper > svg {\n background-color: transparent;\n }\n\n #palette-paper-container {\n overflow-y: auto;\n overflow-x: hidden;\n background-color: white;\n color: white;\n }\n\n /* Joint JS paper for drawing palette -> canvas DnD visual feedback END */\n\n /* Palette START */\n\n .palette-filter {\n border: 3px solid #6db33f;\n }\n\n .palette-filter-textfield {\n width: 100%;\n font-size:24px;\n /* border: 3px solid #6db33f;\n */\tfont-family: \"Varela Round\",sans-serif;\n /* \tpadding: 2px; */\n }\n\n .palette-paper {\n background-color: #eeeeee;\n /*\n border-right: 7px solid;\n */\n border-color: #6db33f;\n /* \twidth: 170px;\n height:100%;\n float: left;\n */\n }\n\n /* Palette END */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":109,"character":17},"member":"None"}}]}],"members":{"metamodel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":145,"character":3}}]}],"renderer":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":148,"character":3}}]}],"paletteEntryPadding":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":151,"character":3}}]}],"onPaletteEntryDrop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":154,"character":3}}]}],"paletteReady":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":157,"character":3}}]}],"paletteFocus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":160,"character":3}}]}],"paletteSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":166,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":175,"character":44},"arguments":[{"__symbolic":"reference","module":"@angular/platform-browser","name":"DOCUMENT","line":175,"character":51}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":175,"character":31},{"__symbolic":"reference","name":"any"}]}],"onFocus":[{"__symbolic":"method"}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"createPaletteGroup":[{"__symbolic":"method"}],"createPaletteEntry":[{"__symbolic":"method"}],"buildPalette":[{"__symbolic":"method"}],"rebuildPalette":[{"__symbolic":"method"}],"getPaletteView":[{"__symbolic":"method"}],"handleMouseUp":[{"__symbolic":"method"}],"trigger":[{"__symbolic":"method"}],"handleDrag":[{"__symbolic":"method"}],"rotateOpen":[{"__symbolic":"method"}],"doRotateOpen":[{"__symbolic":"method"}],"doRotateClose":[{"__symbolic":"method"}],"rotateClosed":[{"__symbolic":"method"}]}},"EditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":20,"character":1},"arguments":[{"selector":"flo-editor","template":"\n \n
\n
\n
\n \n
\n\n
\n
\n\n
\n\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n
\n\n
\n
\n
\n ","styles":["\n /*! JointJS v2.2.1 (2018-11-12) - JavaScript diagramming library\n\n\n This Source Code Form is subject to the terms of the Mozilla Public\n License, v. 2.0. If a copy of the MPL was not distributed with this\n file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n /*\n A complete list of SVG properties that can be set through CSS is here:\n http://www.w3.org/TR/SVG/styling.html\n\n Important note: Presentation attributes have a lower precedence over CSS style rules.\n */\n\n\n /* .viewport is a node wrapping all diagram elements in the paper */\n .joint-viewport {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n\n .joint-paper > svg,\n .joint-paper-background,\n .joint-paper-grid {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n /*\n 1. IE can't handle paths without the `d` attribute for bounding box calculation\n 2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will\n break the links rendering.\n\n path:not([d]) {\n display: none;\n }\n\n */\n\n\n /* magnet is an element that can be either source or a target of a link */\n [magnet=true]:not(.joint-element) {\n cursor: crosshair;\n }\n [magnet=true]:not(.joint-element):hover {\n opacity: .7;\n }\n\n /*\n\n Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class \"element basic Rect\".\n This makes it possible to easilly style elements in CSS and have generic CSS rules applying to\n the whole group of elements. Each plugin can provide its own stylesheet.\n\n */\n\n .joint-element {\n /* Give the user a hint that he can drag&drop the element. */\n cursor: move;\n }\n\n .joint-element * {\n user-drag: none;\n }\n\n .joint-element .scalable * {\n /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */\n vector-effect: non-scaling-stroke;\n }\n /*\n\n connection-wrap is a element of the joint.dia.Link that follows the .connection of that link.\n In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the\n .connection . The advantage of using .connection-wrap is to be able to catch pointer events\n in the neighborhood of the .connection . This is especially handy if the .connection is\n very thin.\n\n */\n\n .marker-source,\n .marker-target {\n /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */\n vector-effect: non-scaling-stroke;\n }\n\n /* Paper */\n .joint-paper {\n position: relative;\n }\n /* Paper */\n\n /* Highlighting */\n .joint-highlight-opacity {\n opacity: 0.3;\n }\n /* Highlighting */\n\n /*\n\n Vertex markers are `` elements that appear at connection vertex positions.\n\n */\n\n .joint-link .connection-wrap,\n .joint-link .connection {\n fill: none;\n }\n\n /* element wrapping .marker-vertex-group. */\n .marker-vertices {\n opacity: 0;\n cursor: move;\n }\n .marker-arrowheads {\n opacity: 0;\n cursor: move;\n cursor: -webkit-grab;\n cursor: -moz-grab;\n /* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */\n }\n .link-tools {\n opacity: 0;\n cursor: pointer;\n }\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n .joint-link:hover .marker-vertices,\n .joint-link:hover .marker-arrowheads,\n .joint-link:hover .link-tools {\n opacity: 1;\n }\n\n /* element used to remove a vertex */\n .marker-vertex-remove {\n cursor: pointer;\n opacity: .1;\n }\n\n .marker-vertex-group:hover .marker-vertex-remove {\n opacity: 1;\n }\n\n .marker-vertex-remove-area {\n opacity: .1;\n cursor: pointer;\n }\n .marker-vertex-group:hover .marker-vertex-remove-area {\n opacity: 1;\n }\n\n /*\n Example of custom changes (in pure CSS only!):\n\n Do not show marker vertices at all: .marker-vertices { display: none; }\n Do not allow adding new vertices: .connection-wrap { pointer-events: none; }\n */\n\n /* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */\n .joint-element .fobj {\n overflow: hidden;\n }\n .joint-element .fobj body {\n background-color: transparent;\n margin: 0px;\n position: static;\n }\n .joint-element .fobj div {\n text-align: center;\n vertical-align: middle;\n display: table-cell;\n padding: 0px 5px 0px 5px;\n }\n\n /* Paper */\n .joint-paper.joint-theme-dark {\n background-color: #18191b;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-dark .connection-wrap {\n stroke: #8F8FF3;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-dark .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-dark .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove circle {\n fill: #F33636;\n }\n .joint-link.joint-theme-dark .link-tools .tool-remove path {\n fill: white;\n }\n .joint-link.joint-theme-dark .link-tools [event=\"link:options\"] circle {\n fill: green;\n }\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-dark .marker-vertex {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-vertex:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n .joint-link.joint-theme-dark .marker-arrowhead {\n fill: #5652DB;\n }\n .joint-link.joint-theme-dark .marker-arrowhead:hover {\n fill: #8E8CE1;\n stroke: none;\n }\n /* element used to remove a vertex */\n .joint-link.joint-theme-dark .marker-vertex-remove-area {\n fill: green;\n stroke: darkgreen;\n }\n .joint-link.joint-theme-dark .marker-vertex-remove {\n fill: white;\n stroke: white;\n }\n /* Links */\n /* Paper */\n .joint-paper.joint-theme-default {\n background-color: #FFFFFF;\n }\n /* Paper */\n\n /* Links */\n .joint-link.joint-theme-default .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-default .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-default .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-default .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-default .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-default .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-default .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-default .marker-vertex-remove {\n fill: #FFFFFF;\n }\n /* Links */\n\n @font-face {\n font-family: 'lato-light';\n src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff');\n font-weight: normal;\n font-style: normal;\n }\n\n /* Links */\n .joint-link.joint-theme-material .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-material .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-material .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove circle {\n fill: #C64242;\n }\n .joint-link.joint-theme-material .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-material .marker-vertex {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-vertex:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n .joint-link.joint-theme-material .marker-arrowhead {\n fill: #d0d8e8;\n }\n .joint-link.joint-theme-material .marker-arrowhead:hover {\n fill: #5fa9ee;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-material .marker-vertex-remove-area {\n fill: #5fa9ee;\n }\n .joint-link.joint-theme-material .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n\n /* Links */\n .joint-link.joint-theme-modern .connection-wrap {\n stroke: #000000;\n stroke-width: 15;\n stroke-linecap: round;\n stroke-linejoin: round;\n opacity: 0;\n cursor: move;\n }\n .joint-link.joint-theme-modern .connection-wrap:hover {\n opacity: .4;\n stroke-opacity: .4;\n }\n .joint-link.joint-theme-modern .connection {\n stroke-linejoin: round;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove circle {\n fill: #FF0000;\n }\n .joint-link.joint-theme-modern .link-tools .tool-remove path {\n fill: #FFFFFF;\n }\n\n /* element inside .marker-vertex-group element */\n .joint-link.joint-theme-modern .marker-vertex {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-vertex:hover {\n fill: #34495E;\n stroke: none;\n }\n\n .joint-link.joint-theme-modern .marker-arrowhead {\n fill: #1ABC9C;\n }\n .joint-link.joint-theme-modern .marker-arrowhead:hover {\n fill: #F39C12;\n stroke: none;\n }\n\n /* element used to remove a vertex */\n .joint-link.joint-theme-modern .marker-vertex-remove {\n fill: white;\n }\n /* Links */\n flo-view {\n width:100%;\n height:100%;\n margin: 0;\n background-color: #eeeeee;\n font-family: \"Varela Round\",sans-serif;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n }\n\n .canvas {\n border: 1px solid;\n border-color: #6db33f;\n border-radius: 2px;\n margin-top: 3px;\n }\n\n /* Canvas contains the palette on the left and the paper on the right */\n\n .paper {\n padding: 0px;\n background-color: #ffffff;\n /* \theight: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n *//* \tmargin-left: 400px; */\n }\n\n #sidebar-resizer {\n background-color: #34302d;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: e-resize;\n }\n\n #palette-container {\n background-color: #EEE;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n }\n\n #paper-container {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n overflow: auto;\n color: #FFF;\n background-color: #FFF;\n }\n\n /* Tooltip START */\n\n .node-tooltip .tooltip-description {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n }\n\n .node-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:#34302d;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 19px;\n z-index: 100;\n }\n\n .tooltip-title-type {\n font-size: 24px;\n font-weight: bold;\n }\n\n .tooltip-title-group {\n padding-left: 5px;\n font-size: 20px;\n font-style: italic;\n }\n\n .node-tooltip-option-name {\n font-family: monospace;/*\"Varela Round\",sans-serif;*/\n font-size: 17px;\n font-weight: bold;\n padding-right: 20px;\n\n }\n\n .node-tooltip-option-description {\n font-family: \"Varela Round\",sans-serif;\n font-size: 18px;\n }\n\n /* Tooltip END */\n\n\n /* Validation Error Marker on Canvas START */\n\n .error-tooltip p {\n margin-top: 5px;\n margin-left: 0px;\n margin-bottom: 5px;\n color:#fff;\n }\n .error-tooltip {\n display:none;\n position:absolute;\n border:1px solid #333;\n background-color:red;/*#161616;*/\n border-radius:5px;\n padding:5px;\n color:#fff;\n /*\tfont-size:12px Arial;*/\n font-family: \"Varela Round\",sans-serif;\n font-size: 20px;\n z-index: 100;\n }\n\n /* Validation Error Marker on Canvas END */\n\n /* Controls on Canvas START */\n\n .canvas-controls-container {\n position: absolute;\n right: 15px;\n top: 5px;\n }\n\n .canvas-control {\n background: transparent;\n font-family: \"Varela Round\",sans-serif;\n font-size: 11px;\n vertical-align: middle;\n margin: 0px;\n }\n\n .zoom-canvas-control {\n border: 0px;\n padding: 0px;\n margin: 0px;\n outline: none;\n }\n\n .zoom-canvas-input {\n text-align: right;\n font-weight:bold;\n color: black;\n background-color: transparent;\n }\n\n .zoom-canvas-label {\n padding-right: 4px;\n color: black;\n }\n\n /* Controls on Canvas END */\n\n\n\n\n /* START - FLO CANVAS STYLES - override joint js styles */\n\n .highlighted {\n outline: none;\n }\n\n .joint-element.highlighted rect {\n stroke: #34302d;\n stroke-width: 3;\n }\n\n .joint-type-handle {\n cursor: pointer;\n }\n\n .available-magnet {\n stroke-width: 3;\n }\n\n .link {\n fill: none;\n stroke: #ccc;\n stroke-width: 1.5px;\n }\n\n .link-tools .tool-options {\n display: none; /* by default, we don't display link options tool */\n }\n\n /* Make transparent the circle around the link-tools (cog) icon. It'll allow shape to have a circle clicking area */\n .link-tools .tool-options circle {\n fill: transparent;\n stroke: transparent;\n }\n\n .link-tools .tool-options path {\n fill: black;\n stroke: black;\n }\n\n .link-tools .tool-remove circle {\n fill: red;\n stroke: red;\n }\n\n .link-tools .tool-remove path {\n fill: white;\n stroke: white;\n }\n\n .link-tools-container {\n stroke-width: 0;\n fill: transparent;\n }\n\n /* END - FLO CANVAS STYLES */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":693,"character":17},"member":"None"}}]}],"members":{"metamodel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":752,"character":3}}]}],"renderer":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":758,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":764,"character":3}}]}],"paletteSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":770,"character":3}}]}],"minZoom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":776,"character":3}}]}],"maxZoom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":782,"character":3}}]}],"zoomStep":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":788,"character":3}}]}],"paperPadding":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":791,"character":3}}]}],"floApi":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":794,"character":3}}]}],"validationMarkers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":797,"character":3}}]}],"contentValidated":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":800,"character":3}}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":803,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":808,"character":31}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"performGraphToTextSyncing":[{"__symbolic":"method"}],"createHandle":[{"__symbolic":"method"}],"removeEmbeddedChildrenOfType":[{"__symbolic":"method"}],"showDragFeedback":[{"__symbolic":"method"}],"hideDragFeedback":[{"__symbolic":"method"}],"setDragDescriptor":[{"__symbolic":"method"}],"handleNodeDragging":[{"__symbolic":"method"}],"handleNodeDropping":[{"__symbolic":"method"}],"_hideNode":[{"__symbolic":"method"}],"_restoreNodeVisibility":[{"__symbolic":"method"}],"getTargetViewFromEvent":[{"__symbolic":"method"}],"handleDnDFromPalette":[{"__symbolic":"method"}],"handleDragFromPalette":[{"__symbolic":"method"}],"createNode":[{"__symbolic":"method"}],"createLink":[{"__symbolic":"method"}],"handleDropFromPalette":[{"__symbolic":"method"}],"fitToContent":[{"__symbolic":"method"}],"autosizePaper":[{"__symbolic":"method"}],"fitToPage":[{"__symbolic":"method"}],"validateContent":[{"__symbolic":"method"}],"markElement":[{"__symbolic":"method"}],"doLayout":[{"__symbolic":"method"}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":1577,"character":3}}]}],"updateGraphRepresentation":[{"__symbolic":"method"}],"updateTextRepresentation":[{"__symbolic":"method"}],"initMetamodel":[{"__symbolic":"method"}],"initGraph":[{"__symbolic":"method"}],"handleNodeCreation":[{"__symbolic":"method"}],"handleLinkEvent":[{"__symbolic":"method"}],"handleLinkCreation":[{"__symbolic":"method"}],"initGraphListeners":[{"__symbolic":"method"}],"initPaperListeners":[{"__symbolic":"method"}],"initPaper":[{"__symbolic":"method"}],"updatePaletteReadyState":[{"__symbolic":"method"}]}},"DslEditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":13,"character":1},"arguments":[{"selector":"dsl-editor","template":"\n \n ","styles":["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}/* Code Mirror related styles START */\n\n .CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n\n\n /* Code Mirror related styles END */\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":42,"character":17},"member":"None"}}]}],"members":{"lineNumbers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":54,"character":3},"arguments":["line-numbers"]}]}],"lineWrapping":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3},"arguments":["line-wrapping"]}]}],"scrollbarStyle":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3},"arguments":["scrollbar-style"]}]}],"placeholder":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":63,"character":3}}]}],"debounce":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":66,"character":3}}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":69,"character":3}}]}],"focus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":72,"character":3}}]}],"blur":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":75,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":78,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":86,"character":31}]}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":88,"character":3}}]}],"lintOptions":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":98,"character":3}}]}],"hintOptions":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":106,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}},"CodeEditorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":35,"character":1},"arguments":[{"selector":"code-editor","template":"\n
\n \n
\n ","styles":["\n .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px 4px 4px 4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}.CodeMirror {\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n user-select: none;\n height: 100%;\n }\n .CodeMirror-hint {\n max-width: 38em;\n }\n .CodeMirror-vertical-ruler-error {\n background-color: rgba(188, 0, 0, 0.5);\n }\n .CodeMirror-vertical-ruler-warning {\n background-color: rgba(255, 188, 0, 0.5);\n }\n .CodeMirror-lint-tooltip {\n z-index: 2000;\n }\n "],"encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":64,"character":17},"member":"None"},"providers":[{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":67,"character":15},"useExisting":{"__symbolic":"reference","name":"CodeEditorComponent"},"multi":true}]}]}],"members":{"lineNumbers":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":91,"character":3},"arguments":["line-numbers"]}]}],"lineWrapping":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":94,"character":3},"arguments":["line-wrapping"]}]}],"scrollbarStyle":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":97,"character":3},"arguments":["scrollbar-style"]}]}],"placeholder":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":100,"character":3}}]}],"overviewRuler":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":103,"character":3},"arguments":["overview-ruler"]}]}],"dslChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":106,"character":3}}]}],"focus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":109,"character":3}}]}],"blur":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":112,"character":3}}]}],"editor":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":115,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":126,"character":31}]}],"dsl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":128,"character":3}}]}],"language":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":138,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"loadEditorMode":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"registerOnChange":[{"__symbolic":"method"}],"registerOnTouched":[{"__symbolic":"method"}],"getLintOptions":[{"__symbolic":"method"}]}},"PropertiesGroupComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"properties-group","template":"\n
\n \n
\n ","encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":11,"character":17},"member":"None"}}]}],"members":{"propertiesGroupModel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":18,"character":3}}]}],"ngOnInit":[{"__symbolic":"method"}],"createGroupControls":[{"__symbolic":"method"}]}},"DynamicFormPropertyComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"df-property","template":"\n \n\n \n \n \n\n \n
\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n \n\n \n
\n
\n
{{model.description}}
\n
{{e.message}}
\n
\n \n\n \n ","encapsulation":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewEncapsulation","line":54,"character":17},"member":"None"}}]}],"members":{"model":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":58,"character":3}}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":61,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor"}]}},"ResizerDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":9,"character":1},"arguments":[{"selector":"[resizer]","host":{"(mousedown)":"startDrag()","$quoted$":["(mousedown)"]}}]}],"members":{"maxSplitSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":21,"character":3}}]}],"sizeChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":24,"character":3}}]}],"splitSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"resizerWidth":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":72,"character":3}}]}],"resizerHeight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":78,"character":3}}]}],"resizerLeft":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":84,"character":3}}]}],"resizerTop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":89,"character":3}}]}],"resizerRight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":94,"character":3}}]}],"resizerBottom":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":99,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":104,"character":44},"arguments":[{"__symbolic":"reference","module":"@angular/platform-browser","name":"DOCUMENT","line":104,"character":51}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":104,"character":31},{"__symbolic":"reference","name":"any"}]}],"startDrag":[{"__symbolic":"method"}],"mousemove":[{"__symbolic":"method"}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}}},"origins":{"FloModule":"./module","Palette":"./palette/palette.component","EditorComponent":"./editor/editor.component","DslEditorComponent":"./dsl-editor/dsl-editor.component","CodeEditorComponent":"./code-editor/code-editor.component","PropertiesGroupComponent":"./properties/properties.group.component","DynamicFormPropertyComponent":"./properties/df.property.component","ResizerDirective":"./directives/resizer"},"importAs":"spring-flo"} \ No newline at end of file diff --git a/dist/package.json b/dist/package.json deleted file mode 100644 index 7cf7af3..0000000 --- a/dist/package.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "name": "spring-flo", - "version": "0.8.9", - "description": "Library for quickly building text DSL visualization diagram editor", - "main": "./bundles/spring-flo.umd.js", - "module": "./fesm5/spring-flo.js", - "es2015": "./fesm2015/spring-flo.js", - "esm5": "./esm5/spring-flo.js", - "esm2015": "./esm2015/spring-flo.js", - "fesm5": "./fesm5/spring-flo.js", - "fesm2015": "./fesm2015/spring-flo.js", - "typings": "./out-tsc/spring-flo.d.ts", - "author": "", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "https://github.com/spring-projects/spring-flo.git" - }, - "engines": { - "node": ">= 6.9.0", - "npm": ">= 3.0.0" - }, - "scripts": { - "clean": "rimraf out-tsc dist/*", - "prebuild": "npm run clean", - "build": "node build.js", - "build-demo": "tsc -p src/demo/", - "build-demo:watch": "tsc -p src/demo/ -w", - "serve": "lite-server -c=bs-config.json", - "prestart": "npm run build-demo", - "start": "concurrently \"npm run build-demo:watch\" \"npm run serve\"", - "build-test": "tsc -p src/lib/tsconfig.spec.json", - "build-test:watch": "tsc -p src/lib/tsconfig.spec.json -w", - "pretest": "npm run build-test", - "test": "concurrently \"npm run build-test:watch\" \"karma start karma.conf.js\"", - "pretest:once": "npm run build-test", - "test:once": "karma start karma.conf.js --single-run", - "preintegration": "npm run build && cd integration && npm run clean && npm install", - "integration": "npm run integration:aot && npm run integration:jit", - "integration:jit": "cd integration && npm run e2e", - "integration:aot": "cd integration && npm run e2e:aot", - "lint": "tslint ./src/**/*.ts -t verbose", - "release": "standard-version" - }, - "dependencies": { - "codemirror-minified": "5.44.0", - "jointjs": "2.2.1", - "ts-disposables": "2.2.3" - }, - "peerDependencies": { - "@angular/core": ">=6.0.0 <8.0.0", - "@angular/forms": ">=6.0.0 < 8.0.0", - "@angular/platform-browser": ">=6.0.0 <8.0.0", - "rxjs": ">=6.0.0 <7.0.0" - }, - "devDependencies": { - "@angular/animations": "7.2.10", - "@angular/common": "7.2.10", - "@angular/compiler": "7.2.10", - "@angular/compiler-cli": "7.2.10", - "@angular/core": "7.2.10", - "@angular/forms": "7.2.10", - "@angular/platform-browser": "7.2.10", - "@angular/platform-browser-dynamic": "7.2.10", - "@angular/platform-server": "7.2.10", - "@types/backbone": "1.3.42", - "@types/codemirror": "0.0.64", - "@types/jasmine": "2.5.36", - "@types/jquery": "3.3.4", - "@types/lodash": "4.14.123", - "@types/node": "6.0.46", - "camelcase": "4.0.0", - "chalk": "2.4.1", - "codemirror-minified": "5.44.0", - "concurrently": "4.0.1", - "core-js": "2.6.5", - "glob": "7.1.1", - "gulp": "3.9.1", - "gulp-inline-ng2-template": "5.0.1", - "jasmine-core": "2.5.2", - "jointjs": "2.2.1", - "jquery": "3.1.1", - "jshint": "2.10.2", - "karma": "1.5.0", - "karma-chrome-launcher": "2.0.0", - "karma-cli": "1.0.1", - "karma-html-reporter": "0.2.7", - "karma-jasmine": "1.1.0", - "karma-jasmine-html-reporter": "0.2.2", - "lite-server": "2.4.0", - "ngx-bootstrap": "2.0.5", - "node-sass": "4.9.0", - "rimraf": "2.6.1", - "rollup": "0.62.0", - "rollup-plugin-commonjs": "9.1.3", - "rollup-plugin-node-resolve": "3.3.0", - "rollup-plugin-sourcemaps": "0.4.2", - "rxjs": "6.3.3", - "shelljs": "0.8.1", - "standard-version": "4.0.0", - "systemjs": "0.21.4", - "ts-disposables": "2.2.3", - "tslint": "5.12.1", - "typescript": "3.1.4", - "uglify-js": "3.3.23", - "zone.js": "0.8.29", - "rxjs-compat": "^6.4.0" - } -} \ No newline at end of file From 753538d0e38fd8b83cfed2bccbc812fcd3fd9edf Mon Sep 17 00:00:00 2001 From: Haris khan Date: Tue, 25 Jun 2019 18:14:14 +0800 Subject: [PATCH 10/10] put back dist and out-tsc in git ignore --- package-lock.json | 10068 -------------------------------------------- 1 file changed, 10068 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index ccf7900..0000000 --- a/package-lock.json +++ /dev/null @@ -1,10068 +0,0 @@ -{ - "name": "spring-flo", - "version": "0.8.9", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@angular/animations": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.10.tgz", - "integrity": "sha512-WgklBWYKy8LVlugMJ8XgBB4whNiMng8vY6mpaYhza064nsrQXK+ua1anSOGMGlmCI/5i4EgaycTS05XD/C+Kkw==", - "dev": true, - "requires": { - "tslib": "1.10.0" - } - }, - "@angular/common": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.10.tgz", - "integrity": "sha512-FyiVUhV1MaRogXmVKsw6CMXqWZHsiYMdK651absXtGqWZn6and0jiUwEM9LbV4HRpLbB7F6gwqCvT5Ft8xpzeg==", - "dev": true, - "requires": { - "tslib": "1.10.0" - } - }, - "@angular/compiler": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.10.tgz", - "integrity": "sha512-sRuH+UDogzAHpagorHfj2rbF8HWGEJGsFUn5TGq1vyWA37ALuu/zkemufIcgET16lTiBEvVn7/Oz9Am+JTlGrg==", - "dev": true, - "requires": { - "tslib": "1.10.0" - } - }, - "@angular/compiler-cli": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.10.tgz", - "integrity": "sha512-L/mksAkpb8kywYlHlXi5mAyUNNiSHZpoTV+P2t3nNGmqyXuad92TvdZMCO34TYUyGyFz9AVH2qc6LciY9ipQTA==", - "dev": true, - "requires": { - "canonical-path": "1.0.0", - "chokidar": "2.1.6", - "convert-source-map": "1.6.0", - "dependency-graph": "0.7.2", - "magic-string": "0.25.2", - "minimist": "1.2.0", - "reflect-metadata": "0.1.13", - "shelljs": "0.8.1", - "source-map": "0.6.1", - "tslib": "1.10.0", - "yargs": "9.0.1" - } - }, - "@angular/core": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.10.tgz", - "integrity": "sha512-u2IKaq4G1wpq5w1AI0Q7jnsKuSfR4WDsBLnwtjTIjde1YDqA0n0dYwqrvWzLK6SbzSWjlrAXx0hrz5SlDchmqA==", - "dev": true, - "requires": { - "tslib": "1.10.0" - } - }, - "@angular/forms": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.10.tgz", - "integrity": "sha512-fQccon0Yuni13QJt16npSRlkitPZBLXfWXDFwCEybo/QqtSar3BOJAQFW2yqokrfW5lbO5VDFJ7Pj2dDyBXEAA==", - "dev": true, - "requires": { - "tslib": "1.10.0" - } - }, - "@angular/platform-browser": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.10.tgz", - "integrity": "sha512-78r527d0Nw0svkDw2SBr58H3VEH5VAvn+r+q7NLqIqD8jsOMf8CMztUCDs+h02HhEHveCXWI5EtFXxWepB6wFg==", - "dev": true, - "requires": { - "tslib": "1.10.0" - } - }, - "@angular/platform-browser-dynamic": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.10.tgz", - "integrity": "sha512-ZTJL7iIEL3yDgJLx5/a2wfKsxe0ZHEUSibtbRQNpn35ZI0G9QN7ezbTOqj2+/QGvaY8Y1JeoYCeJrMzaUxDxGg==", - "dev": true, - "requires": { - "tslib": "1.10.0" - } - }, - "@angular/platform-server": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-7.2.10.tgz", - "integrity": "sha512-LkjntWRS05ilYXt0oO+92FALAeruebWlqNVd/hR8T8dsmFMQQyK/aBDw+DBbPceIjwxyhpJd8+CuGmR+pGXvwQ==", - "dev": true, - "requires": { - "domino": "2.1.3", - "tslib": "1.10.0", - "xhr2": "0.1.4" - } - }, - "@types/backbone": { - "version": "1.3.42", - "resolved": "https://registry.npmjs.org/@types/backbone/-/backbone-1.3.42.tgz", - "integrity": "sha512-sg6WhUW1RorO/Yc0yKqVhekBlweLbQqJciHr70FYL4Z8IFhcZngyXaYdfq8MCv/Rf/Nry5Sbsl9jWGzUN+2Zbg==", - "dev": true, - "requires": { - "@types/jquery": "3.3.4", - "@types/underscore": "1.8.18" - } - }, - "@types/codemirror": { - "version": "0.0.64", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.64.tgz", - "integrity": "sha512-nmgOTLuPD7/ypQ1LUP4yJZDCXZ1FB+P5ZbAhxwT2cnret+ukFIaMwRsrR6beknzGDaZPbzIrtzHaKRGmw8i5FQ==", - "dev": true - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/jasmine": { - "version": "2.5.36", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.36.tgz", - "integrity": "sha1-bYBLeaV+k4DXZqJoDpNiwX2VVtI=", - "dev": true - }, - "@types/jquery": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.4.tgz", - "integrity": "sha512-KqgLNDh8oTl43/2B78S7tjwPnOxPtP9wQsLptbuQCmMwqH5QuPZOk36RsNgbs3mnq/3SCyG1l/GJmhKk5Dg68g==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.123", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", - "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==", - "dev": true - }, - "@types/node": { - "version": "6.0.46", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.46.tgz", - "integrity": "sha1-jZ5IVygx8FsRzEx5N1TUNDchnWI=", - "dev": true - }, - "@types/underscore": { - "version": "1.8.18", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.8.18.tgz", - "integrity": "sha512-mXQ8u416FWMPjp2zWrcVmOZtzKQM6IeyVcuE+RGF/04JLBrMjfnmNKn74VN8fIkFzU97TpzkP0ny0p0h65eC7w==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - } - }, - "abbrev": { - "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 - }, - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "2.1.24", - "negotiator": "0.6.1" - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "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" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.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.3" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "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.10", - "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.1.0" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "argparse": { - "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.3" - } - }, - "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-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "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 - }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "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 - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "4.17.11" - } - }, - "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 - }, - "async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "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 - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "axios": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", - "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", - "dev": true, - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "2.0.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "3.1.0" - } - }, - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - } - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "backbone": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz", - "integrity": "sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk=", - "requires": { - "underscore": "1.9.1" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "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.6", - "component-emitter": "1.3.0", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "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.2" - } - }, - "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.2" - } - }, - "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.2" - } - }, - "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-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "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 - }, - "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.18" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "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.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "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.1" - } - } - } - }, - "browser-sync": { - "version": "2.26.7", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.7.tgz", - "integrity": "sha512-lY3emme0OyvA2ujEMpRmyRy9LY6gHLuTr2/ABxhIm3lADOiRXzP4dgekvnDrQqZ/Ec2Fz19lEjm6kglSG5766w==", - "dev": true, - "requires": { - "browser-sync-client": "2.26.6", - "browser-sync-ui": "2.26.4", - "bs-recipes": "1.3.4", - "bs-snippet-injector": "2.0.1", - "chokidar": "2.1.6", - "connect": "3.6.6", - "connect-history-api-fallback": "1.6.0", - "dev-ip": "1.0.1", - "easy-extender": "2.3.4", - "eazy-logger": "3.0.2", - "etag": "1.8.1", - "fresh": "0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "1.15.2", - "immutable": "3.8.2", - "localtunnel": "1.9.2", - "micromatch": "3.1.10", - "opn": "5.3.0", - "portscanner": "2.1.1", - "qs": "6.2.3", - "raw-body": "2.4.0", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "2.1.1", - "ua-parser-js": "0.7.17", - "yargs": "6.4.0" - }, - "dependencies": { - "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" - } - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "1.3.3", - "utils-merge": "1.0.1" - } - }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", - "dev": true, - "requires": { - "accepts": "1.3.7", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "3.1.0", - "engine.io-parser": "2.1.3", - "ws": "3.3.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "3.1.0", - "engine.io-parser": "2.1.3", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "3.3.3", - "xmlhttprequest-ssl": "1.5.5", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "1.0.3" - } - }, - "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", - "dev": true - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.3", - "statuses": "1.3.1", - "unpipe": "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.1.0", - "pinkie-promise": "2.0.1" - } - }, - "http-proxy": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", - "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", - "dev": true, - "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "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.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "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 - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "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.1.0", - "normalize-package-data": "2.5.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", - "dev": true, - "requires": { - "debug": "3.1.0", - "engine.io": "3.2.1", - "has-binary2": "1.0.3", - "socket.io-adapter": "1.1.1", - "socket.io-client": "2.1.1", - "socket.io-parser": "3.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", - "dev": true - }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "3.1.0", - "engine.io-client": "3.2.1", - "has-binary2": "1.0.3", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "3.2.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.2", - "ultron": "1.1.1" - } - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, - "yargs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", - "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "browser-sync-client": { - "version": "2.26.6", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.6.tgz", - "integrity": "sha512-mGrkZdNzttKdf/16I+y+2dTQxoMCIpKbVIMJ/uP8ZpnKu9f9qa/2CYVtLtbjZG8nsM14EwiCrjuFTGBEnT3Gjw==", - "dev": true, - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "1.1.3", - "rxjs": "5.5.12" - }, - "dependencies": { - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - } - } - }, - "browser-sync-ui": { - "version": "2.26.4", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.4.tgz", - "integrity": "sha512-u20P3EsZoM8Pt+puoi3BU3KlbQAH1lAcV+/O4saF26qokrBqIDotmGonfWwoRbUmdxZkM9MBmA0K39ZTG1h4sA==", - "dev": true, - "requires": { - "async-each-series": "0.1.1", - "connect-history-api-fallback": "1.6.0", - "immutable": "3.8.2", - "server-destroy": "1.0.1", - "socket.io-client": "2.2.0", - "stream-throttle": "0.1.3" - }, - "dependencies": { - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "engine.io-client": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz", - "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "3.1.0", - "engine.io-parser": "2.1.3", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "6.1.4", - "xmlhttprequest-ssl": "1.5.5", - "yeast": "0.1.2" - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "1.0.3" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "socket.io-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", - "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "3.1.0", - "engine.io-client": "3.3.2", - "has-binary2": "1.0.3", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "3.3.0", - "to-array": "0.1.4" - } - }, - "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "3.1.0", - "isarray": "2.0.1" - } - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "dev": true, - "requires": { - "async-limiter": "1.0.0" - } - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - } - } - }, - "bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", - "dev": true - }, - "bs-snippet-injector": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", - "dev": true - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "1.1.0", - "buffer-fill": "1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "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 - }, - "builtin-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "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.3.0", - "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" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "camelcase": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.0.0.tgz", - "integrity": "sha1-iw+Q1Evl4oG5A7mIc0m5JZXvB/I=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.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.3", - "braces": "2.3.2", - "fsevents": "1.2.9", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.1.2" - } - }, - "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.1", - "static-extend": "0.1.2" - }, - "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.6" - } - } - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "7.1.1" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codemirror-minified": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/codemirror-minified/-/codemirror-minified-5.44.0.tgz", - "integrity": "sha512-8bc9cFRSYH2e4Oxke7JlskBpZwRa9ELw8Q8vx4Gfn1R7IVwOuoYv0pEVQpvAMavGXCnWWdO5Ft/XGzrqo151qw==" - }, - "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.1" - } - }, - "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 - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - }, - "combine-lists": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", - "dev": true, - "requires": { - "lodash": "4.17.11" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "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 - }, - "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", - "dev": true, - "requires": { - "array-ify": "1.0.0", - "dot-prop": "3.0.0" - } - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "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 - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "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.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - } - }, - "concurrently": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.0.1.tgz", - "integrity": "sha512-D8UI+mlI/bfvrA57SeKOht6sEpb01dKk+8Yee4fbnkk1Ue8r3S+JXoEdFZIpzQlXJGtnxo47Wvvg/kG4ba3U6Q==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "date-fns": "1.30.1", - "lodash": "4.17.11", - "read-pkg": "4.0.1", - "rxjs": "6.2.2", - "spawn-command": "0.0.2-1", - "supports-color": "4.5.0", - "tree-kill": "1.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "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", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "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.5", - "path-key": "2.0.1", - "semver": "5.7.0", - "shebang-command": "1.2.0", - "which": "1.3.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.5", - "get-stream": "4.1.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "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-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" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "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 - }, - "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" - } - }, - "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" - } - }, - "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.3", - "mimic-fn": "2.1.0", - "p-is-promise": "2.1.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 - }, - "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.3.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.2.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.2.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 - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "2.5.0", - "parse-json": "4.0.0", - "pify": "3.0.0" - } - }, - "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", - "dev": true, - "requires": { - "tslib": "1.10.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" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "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.1.0", - "decamelize": "1.2.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "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.3.1", - "decamelize": "1.2.0" - } - } - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "1.3.3", - "utils-merge": "1.0.1" - } - }, - "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 - }, - "connect-logger": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/connect-logger/-/connect-logger-0.0.1.tgz", - "integrity": "sha1-TZmZeKHSC7RgjnzUNNdBZSJVF0s=", - "dev": true, - "requires": { - "moment": "2.24.0" - } - }, - "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" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "conventional-changelog": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz", - "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==", - "dev": true, - "requires": { - "conventional-changelog-angular": "1.6.6", - "conventional-changelog-atom": "0.2.8", - "conventional-changelog-codemirror": "0.3.8", - "conventional-changelog-core": "2.0.11", - "conventional-changelog-ember": "0.3.12", - "conventional-changelog-eslint": "1.0.9", - "conventional-changelog-express": "0.3.6", - "conventional-changelog-jquery": "0.1.0", - "conventional-changelog-jscs": "0.1.0", - "conventional-changelog-jshint": "0.3.8", - "conventional-changelog-preset-loader": "1.1.8" - } - }, - "conventional-changelog-angular": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", - "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" - } - }, - "conventional-changelog-atom": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz", - "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-codemirror": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz", - "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-core": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz", - "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==", - "dev": true, - "requires": { - "conventional-changelog-writer": "3.0.9", - "conventional-commits-parser": "2.1.7", - "dateformat": "3.0.3", - "get-pkg-repo": "1.4.0", - "git-raw-commits": "1.3.6", - "git-remote-origin-url": "2.0.0", - "git-semver-tags": "1.3.6", - "lodash": "4.17.11", - "normalize-package-data": "2.5.0", - "q": "1.5.1", - "read-pkg": "1.1.0", - "read-pkg-up": "1.0.1", - "through2": "2.0.5" - }, - "dependencies": { - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.5.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "conventional-changelog-ember": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz", - "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-eslint": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz", - "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-express": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz", - "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-jquery": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", - "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-jscs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", - "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-jshint": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz", - "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" - } - }, - "conventional-changelog-preset-loader": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", - "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==", - "dev": true - }, - "conventional-changelog-writer": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", - "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "conventional-commits-filter": "1.1.6", - "dateformat": "3.0.3", - "handlebars": "4.1.2", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.11", - "meow": "4.0.1", - "semver": "5.7.0", - "split": "1.0.1", - "through2": "2.0.5" - }, - "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 - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist": "1.2.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.5.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "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" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.5.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "3.2.0", - "strip-indent": "2.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "conventional-commits-filter": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", - "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", - "dev": true, - "requires": { - "is-subset": "0.1.1", - "modify-values": "1.0.1" - } - }, - "conventional-commits-parser": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", - "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", - "dev": true, - "requires": { - "JSONStream": "1.3.5", - "is-text-path": "1.0.1", - "lodash": "4.17.11", - "meow": "4.0.1", - "split2": "2.2.0", - "through2": "2.0.5", - "trim-off-newlines": "1.0.1" - }, - "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 - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist": "1.2.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.5.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "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" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.5.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "3.2.0", - "strip-indent": "2.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "conventional-recommended-bump": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-0.3.0.tgz", - "integrity": "sha1-6Dnej1fLtDRFyLSWdAHeBkTEJdg=", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "conventional-commits-filter": "1.1.6", - "conventional-commits-parser": "1.3.0", - "git-latest-semver-tag": "1.0.2", - "git-raw-commits": "1.3.6", - "meow": "3.7.0", - "object-assign": "4.1.1" - }, - "dependencies": { - "conventional-commits-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-1.3.0.tgz", - "integrity": "sha1-4ye1MZThp61dxjR57pCZpSsCSGU=", - "dev": true, - "requires": { - "JSONStream": "1.3.5", - "is-text-path": "1.0.1", - "lodash": "4.17.11", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.5", - "trim-off-newlines": "1.0.1" - } - }, - "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 - } - } - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "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-js": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", - "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", - "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 - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.5", - "shebang-command": "1.2.0", - "which": "1.3.1" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" - } - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "dagre": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.2.tgz", - "integrity": "sha512-TEOOGZOkCOgCG7AoUIq64sJ3d21SMv8tyoqteLpX+UsUsS9Qw8iap4hhogXY4oB3r0bbZuAjO0atAilgCmsE0Q==", - "requires": { - "graphlib": "2.1.5", - "lodash": "4.17.11" - } - }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "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 - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "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 - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "1.2.0", - "map-obj": "1.0.1" - } - }, - "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 - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "1.0.4" - } - }, - "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.2" - } - }, - "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.2" - } - }, - "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" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", - "dev": true - }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, - "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 - }, - "dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "1.0.1", - "ent": "2.2.0", - "extend": "3.0.2", - "void-elements": "2.0.1" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "1.3.1", - "entities": "1.1.2" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1.3.1" - } - }, - "domino": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.3.tgz", - "integrity": "sha512-EwjTbUv1Q/RLQOdn9k7ClHutrQcWGsfXaRQNOnM/KgK4xDBoLFEcIRFuBSxAx13Vfa63X029gXYrNFrSy+DOSg==", - "dev": true - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0.1.1", - "domelementtype": "1.3.1" - } - }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "requires": { - "lodash": "4.17.11" - } - }, - "eazy-logger": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", - "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", - "dev": true, - "requires": { - "tfunk": "3.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "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" - } - }, - "engine.io": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", - "dev": true, - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-client": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es6-templates": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", - "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", - "dev": true, - "requires": { - "recast": "0.11.23", - "through": "2.3.8" - } - }, - "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 - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "estree-walker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "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 - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-braces": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", - "dev": true, - "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" - }, - "dependencies": { - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", - "dev": true, - "requires": { - "expand-range": "0.1.1" - } - }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "dev": true, - "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" - } - }, - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", - "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true - } - } - }, - "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.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "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.6" - } - }, - "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.1" - } - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.4" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.1.1", - "repeat-element": "1.1.3", - "repeat-string": "1.6.1" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "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" - } - }, - "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.6" - } - } - } - }, - "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.3" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "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.2" - } - }, - "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.1" - } - }, - "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.2" - } - }, - "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.2" - } - }, - "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" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "0.1.1", - "color-support": "1.1.3", - "parse-node-version": "1.0.1", - "time-stamp": "1.1.0" - } - }, - "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-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 - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - }, - "dependencies": { - "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 - } - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "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.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.1" - } - } - } - }, - "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-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "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" - } - }, - "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.1.10", - "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.1" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.3.0", - "parse-filepath": "1.0.2" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "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.2" - } - }, - "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 - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.8", - "mime-types": "2.1.24" - } - }, - "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 - }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "1.0.0" - } - }, - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "jsonfile": "3.0.1", - "universalify": "0.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.14.0", - "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 - }, - "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.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": 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 - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": 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.3.5" - } - }, - "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.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "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" - } - }, - "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.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.3" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.3.5" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": 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.1", - "iconv-lite": "0.4.24", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.3.0", - "nopt": "4.0.1", - "npm-packlist": "1.4.1", - "npmlog": "4.1.2", - "rc": "1.2.8", - "rimraf": "2.6.3", - "semver": "5.7.0", - "tar": "4.4.8" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "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.6" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "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.2", - "os-tmpdir": "1.0.2" - } - }, - "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.5", - "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "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 - }, - "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, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "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.5", - "minizlib": "1.2.1", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.0.3" - } - }, - "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" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - } - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" - }, - "dependencies": { - "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 - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true, - "requires": { - "globule": "0.1.0" - } - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "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-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", - "dev": true, - "requires": { - "hosted-git-info": "2.7.1", - "meow": "3.7.0", - "normalize-package-data": "2.5.0", - "parse-github-repo-url": "1.4.1", - "through2": "2.0.5" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "git-latest-semver-tag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/git-latest-semver-tag/-/git-latest-semver-tag-1.0.2.tgz", - "integrity": "sha1-BhEwy/QnQRHMa+RhKz/zptk+JmA=", - "dev": true, - "requires": { - "git-semver-tags": "1.3.6", - "meow": "3.7.0" - } - }, - "git-raw-commits": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", - "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", - "dev": true, - "requires": { - "dargs": "4.1.0", - "lodash.template": "4.4.0", - "meow": "4.0.1", - "split2": "2.2.0", - "through2": "2.0.5" - }, - "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 - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist": "1.2.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.5.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "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" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.5.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "3.2.0", - "strip-indent": "2.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "dev": true, - "requires": { - "gitconfiglocal": "1.0.0", - "pify": "2.3.0" - } - }, - "git-semver-tags": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", - "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", - "dev": true, - "requires": { - "meow": "4.0.1", - "semver": "5.7.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 - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist": "1.2.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.5.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - }, - "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" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.5.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "3.2.0", - "strip-indent": "2.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true, - "requires": { - "ini": "1.3.5" - } - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "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.2" - }, - "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.1" - } - } - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "4.5.3", - "glob2base": "0.0.12", - "minimatch": "2.0.10", - "ordered-read-streams": "0.1.0", - "through2": "0.6.5", - "unique-stream": "1.0.0" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "0.5.2" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "0.1.1" - } - }, - "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.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" - } - }, - "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.3", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.1" - } - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "1.0.1" - } - }, - "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 - }, - "graphlib": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.5.tgz", - "integrity": "sha512-XvtbqCcw+EM5SqQrIetIKKD+uZVNQtDPD1goIg7K73RuRZtVI5rYMdcCVSHm/AS1sCBZ7vt0p5WgXouucHQaOA==", - "requires": { - "lodash": "4.17.11" - } - }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true, - "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "deprecated": "0.0.1", - "gulp-util": "3.0.8", - "interpret": "1.2.0", - "liftoff": "2.5.0", - "minimist": "1.2.0", - "orchestrator": "0.3.8", - "pretty-hrtime": "1.0.3", - "semver": "4.3.6", - "tildify": "1.2.0", - "v8flags": "2.1.1", - "vinyl-fs": "0.3.14" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "gulp-inline-ng2-template": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-inline-ng2-template/-/gulp-inline-ng2-template-5.0.1.tgz", - "integrity": "sha512-s+Im6A4IFx4ek9qpu1vnKeL9lYHlGNGuoteDvobe56O6w5Nk4jjuOQAqIrpmCpk8bT18XieLEqZe8oe5fDXRhw==", - "dev": true, - "requires": { - "async": "2.6.2", - "clone": "2.1.2", - "es6-templates": "0.2.3", - "extend": "3.0.2", - "isarray": "2.0.4", - "plugin-error": "1.0.1", - "source-map": "0.7.3", - "through2": "2.0.5", - "vinyl-sourcemaps-apply": "0.2.1" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "2.2.0", - "fancy-log": "1.3.3", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.5", - "vinyl": "0.5.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "1.0.2" - } - }, - "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.1", - "optimist": "0.6.1", - "source-map": "0.6.1", - "uglify-js": "3.3.23" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "6.10.0", - "har-schema": "2.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "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-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "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.1" - } - }, - "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.6" - } - } - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "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" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1.3.1", - "domhandler": "2.3.0", - "domutils": "1.5.1", - "entities": "1.0.0", - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "http-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", - "toidentifier": "1.0.0" - } - }, - "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.1.2", - "follow-redirects": "1.7.0", - "requires-port": "1.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.16.1" - } - }, - "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" - } - }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", - "dev": true - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "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 - }, - "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": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "1.0.0", - "is-windows": "1.0.2" - } - }, - "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.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.13.1" - } - }, - "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.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "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.1.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-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-glob": { - "version": "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-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true - }, - "is-my-json-valid": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", - "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", - "dev": true, - "requires": { - "generate-function": "2.3.1", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.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.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dev": true, - "requires": { - "lodash.isfinite": "3.3.2" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "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-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "1.0.0" - } - }, - "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-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "1.9.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.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 - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "1.2.0" - } - }, - "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 - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jasmine-core": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.5.2.tgz", - "integrity": "sha1-b2G9eQYeJ/Q+b5NV5Es8bKtv8pc=", - "dev": true - }, - "jointjs": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jointjs/-/jointjs-2.2.1.tgz", - "integrity": "sha512-2Tu/n97P/Vc6esibSQzdTuNn3IpQsloDUm2mBgbujocthrVPBNx3EYD4UzpbfkFMk5bku8sxSmA1bXZ0KxgXog==", - "requires": { - "backbone": "1.3.3", - "dagre": "0.8.2", - "graphlib": "2.1.5", - "jquery": "3.3.1", - "lodash": "4.17.11" - }, - "dependencies": { - "jquery": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", - "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" - } - } - }, - "jquery": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.1.1.tgz", - "integrity": "sha1-NHwcIcfgBBFeCk2jLOzgQfrTyKM=", - "dev": true - }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "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.10", - "esprima": "4.0.1" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jshint": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz", - "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==", - "dev": true, - "requires": { - "cli": "1.0.1", - "console-browserify": "1.1.0", - "exit": "0.1.2", - "htmlparser2": "3.8.3", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "shelljs": "0.3.0", - "strip-json-comments": "1.0.4" - }, - "dependencies": { - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "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": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "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 - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "karma": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.5.0.tgz", - "integrity": "sha1-nEwU8EAL7ywEyOjmv/WTcQJcwAk=", - "dev": true, - "requires": { - "bluebird": "3.5.5", - "body-parser": "1.19.0", - "chokidar": "1.7.0", - "colors": "1.3.3", - "combine-lists": "1.0.1", - "connect": "3.7.0", - "core-js": "2.6.5", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.1", - "graceful-fs": "4.1.15", - "http-proxy": "1.17.0", - "isbinaryfile": "3.0.3", - "lodash": "3.10.1", - "log4js": "0.6.38", - "mime": "1.6.0", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.2.0", - "range-parser": "1.2.1", - "rimraf": "2.6.1", - "safe-buffer": "5.1.2", - "socket.io": "1.7.3", - "source-map": "0.5.7", - "tmp": "0.0.31", - "useragent": "2.3.0" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.3" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.3", - "fsevents": "1.2.9", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "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.6" - } - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "karma-chrome-launcher": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.0.0.tgz", - "integrity": "sha1-wnkMWjKxVXfQ//Wk1aJwOztDnCU=", - "dev": true, - "requires": { - "fs-access": "1.0.1", - "which": "1.3.1" - } - }, - "karma-cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", - "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", - "dev": true, - "requires": { - "resolve": "1.11.0" - } - }, - "karma-html-reporter": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/karma-html-reporter/-/karma-html-reporter-0.2.7.tgz", - "integrity": "sha1-/XPanxrJn9W6+zCc8HCUIYjnumM=", - "dev": true, - "requires": { - "lodash": "2.2.1", - "mu2": "0.5.21" - }, - "dependencies": { - "lodash": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.2.1.tgz", - "integrity": "sha1-ypNf0UqzwMhyq6zxmLnNpQFECGc=", - "dev": true - } - } - }, - "karma-jasmine": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.0.tgz", - "integrity": "sha1-IuTAa/mhguUpTR9wXjczgRuBCs8=", - "dev": true - }, - "karma-jasmine-html-reporter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", - "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", - "dev": true, - "requires": { - "karma-jasmine": "1.1.0" - } - }, - "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": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "3.0.2", - "findup-sync": "2.0.0", - "fined": "1.2.0", - "flagged-respawn": "1.0.1", - "is-plain-object": "2.0.4", - "object.map": "1.0.1", - "rechoir": "0.6.2", - "resolve": "1.11.0" - } - }, - "limiter": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.4.tgz", - "integrity": "sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg==", - "dev": true - }, - "lite-server": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/lite-server/-/lite-server-2.4.0.tgz", - "integrity": "sha512-Vo06tHpXrqm37i6T7tVdq5PSbrFmvQRw64+dlFXdh1tltv6KCvpE+xzXz2+x6KWJ8ja+GgwSy4P13GUWyhaDHQ==", - "dev": true, - "requires": { - "browser-sync": "2.26.7", - "connect-history-api-fallback": "1.6.0", - "connect-logger": "0.0.1", - "lodash": "4.17.11", - "minimist": "1.2.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "localtunnel": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.2.tgz", - "integrity": "sha512-NEKF7bDJE9U3xzJu3kbayF0WTvng6Pww7tzqNb/XtEARYwqw7CKEX7BvOMg98FtE9es2CRizl61gkV3hS8dqYg==", - "dev": true, - "requires": { - "axios": "0.19.0", - "debug": "4.1.1", - "openurl": "1.1.1", - "yargs": "6.6.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "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.2" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.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 - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.5.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "3.0.1" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } - }, - "log4js": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "semver": "4.3.6" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "magic-string": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", - "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", - "dev": true, - "requires": { - "sourcemap-codec": "1.4.4" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "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-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "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.1" - } - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.5.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "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 - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.5.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "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.2", - "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.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "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": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "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.11" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "is-plain-obj": "1.1.0" - } - }, - "mitt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.3.tgz", - "integrity": "sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==", - "dev": true - }, - "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 - } - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mu2": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/mu2/-/mu2-0.5.21.tgz", - "integrity": "sha1-iIqPD9kOsc/anbgUdvbhmcyeWNM=", - "dev": true - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": 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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "natives": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "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 - }, - "ngx-bootstrap": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ngx-bootstrap/-/ngx-bootstrap-2.0.5.tgz", - "integrity": "sha512-IduTVb78RDVlrz2+bn6GXK/REfM/RsRnz/AENwmrgTOg1AtvahJ9qANxXRNn33Kv9GJmkOYy/MhD3DyzeMb16w==", - "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-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "1.0.12", - "glob": "7.1.1", - "graceful-fs": "4.1.15", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.88.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.2", - "which": "1.3.1" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.8", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.3", - "har-validator": "5.1.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.24", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "node-sass": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz", - "integrity": "sha512-QFHfrZl6lqRU3csypwviz2XLgGNOoWQbo2GOvtsfQqOfL4cy1BtWnhx/XUeAO9LT3ahBzSRXcEO6DdvAH9DzSg==", - "dev": true, - "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.3", - "get-stdin": "4.0.1", - "glob": "7.1.1", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "lodash.mergewith": "4.6.1", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.14.0", - "node-gyp": "3.8.0", - "npmlog": "4.1.2", - "request": "2.79.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.1", - "true-case-path": "1.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "4.1.5", - "which": "1.3.1" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "1.2.1" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "requires": { - "glob": "7.1.1", - "lodash": "4.17.11", - "minimatch": "3.0.4" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.1.1" - } - }, - "normalize-package-data": { - "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.7.1", - "resolve": "1.11.0", - "semver": "5.7.0", - "validate-npm-package-license": "3.0.4" - } - }, - "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.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, - "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 - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "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.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "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.6" - } - }, - "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.6" - } - } - } - }, - "object-path": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", - "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", - "dev": true - }, - "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.1" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "1.0.1", - "array-slice": "1.1.0", - "for-own": "1.0.0", - "isobject": "3.0.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "1.0.0", - "make-iterator": "1.0.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - } - } - }, - "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" - } - }, - "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" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", - "dev": true - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "dev": true, - "requires": { - "end-of-stream": "0.1.5", - "sequencify": "0.0.7", - "stream-consume": "0.1.1" - }, - "dependencies": { - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "dev": true, - "requires": { - "once": "1.3.3" - } - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - } - } - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "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": "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.3.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 - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "1.0.0", - "map-cache": "0.2.2", - "path-root": "0.1.1" - } - }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.2" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "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 - }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, - "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-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-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "0.1.2" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "1.1.0", - "arr-diff": "4.0.0", - "arr-union": "3.1.0", - "extend-shallow": "3.0.2" - } - }, - "portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", - "dev": true, - "requires": { - "async": "1.5.2", - "is-number-like": "1.0.8" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "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 - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "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 - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", - "dev": true - }, - "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.4.1", - "once": "1.4.0" - } - }, - "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 - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "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 - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.4" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "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" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.5.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "readable-stream": { - "version": "2.3.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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "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.15", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "3.1.3", - "private": "0.1.8", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.11.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "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 - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.8.0", - "caseless": "0.11.0", - "combined-stream": "1.0.8", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.24", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.6", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.4.3", - "uuid": "3.3.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.8", - "mime-types": "2.1.24" - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "commander": "2.20.0", - "is-my-json-valid": "2.20.0", - "pinkie-promise": "2.0.1" - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.16.1" - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "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": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "dev": true, - "requires": { - "path-parse": "1.0.6" - } - }, - "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.2", - "global-modules": "1.0.0" - } - }, - "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 - }, - "resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", - "dev": true, - "requires": { - "debug": "2.6.9", - "minimatch": "3.0.4" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.1" - } - }, - "rollup": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.62.0.tgz", - "integrity": "sha512-mZS0aIGfYzuJySJD78znu9/hCJsNfBzg4lDuZGMj0hFVcYHt2evNRHv8aqiu9/w6z6Qn8AQoVl4iyEjDmisGeA==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "@types/node": "6.0.46" - } - }, - "rollup-plugin-commonjs": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.3.tgz", - "integrity": "sha512-g91ZZKZwTW7F7vL6jMee38I8coj/Q9GBdTmXXeFL7ldgC1Ky5WJvHgbKlAiXXTh762qvohhExwUgeQGFh9suGg==", - "dev": true, - "requires": { - "estree-walker": "0.5.2", - "magic-string": "0.22.5", - "resolve": "1.11.0", - "rollup-pluginutils": "2.8.1" - }, - "dependencies": { - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dev": true, - "requires": { - "vlq": "0.2.3" - } - } - } - }, - "rollup-plugin-node-resolve": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", - "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==", - "dev": true, - "requires": { - "builtin-modules": "2.0.0", - "is-module": "1.0.0", - "resolve": "1.11.0" - } - }, - "rollup-plugin-sourcemaps": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", - "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", - "dev": true, - "requires": { - "rollup-pluginutils": "2.8.1", - "source-map-resolve": "0.5.2" - } - }, - "rollup-pluginutils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", - "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", - "dev": true, - "requires": { - "estree-walker": "0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", - "dev": true, - "requires": { - "tslib": "1.10.0" - } - }, - "rxjs-compat": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.5.2.tgz", - "integrity": "sha512-TRMkTp4FgSxE2HtGvxmgRukh3JqdFM7ejAj1Ti/VdodbPGfWvZR5+KdLKRV9jVDFyu2SknM8RD+PR54KGnoLjg==", - "dev": true - }, - "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.15" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "7.1.1", - "lodash": "4.17.11", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.5.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "2.5.1", - "source-map": "0.4.4" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "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.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "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.6.3", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.1", - "statuses": "1.4.0" - }, - "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" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", - "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.7", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.24", - "parseurl": "1.3.3" - }, - "dependencies": { - "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" - } - }, - "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.5.0" - } - }, - "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 - }, - "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.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.3", - "send": "0.16.2" - } - }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", - "dev": true - }, - "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.4", - "split-string": "3.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.1" - } - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "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 - }, - "shelljs": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz", - "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", - "dev": true, - "requires": { - "glob": "7.1.1", - "interpret": "1.2.0", - "rechoir": "0.6.2" - } - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "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 - }, - "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.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.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.6" - } - }, - "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.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "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.1", - "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.2" - } - }, - "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.2" - } - }, - "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.2" - } - }, - "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.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.6" - } - } - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "socket.io": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", - "dev": true, - "requires": { - "debug": "2.3.3", - "engine.io": "1.8.3", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "dev": true, - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.3", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "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 - }, - "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.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "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 - }, - "sourcemap-codec": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", - "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.4" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "2.2.0", - "spdx-license-ids": "3.0.4" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2.3.8" - } - }, - "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.2" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "2.0.5" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" - } - }, - "standard-version": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-4.0.0.tgz", - "integrity": "sha1-5XjO/UOrewKUS9dWlSUFLqwbl4c=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "conventional-changelog": "1.1.24", - "conventional-recommended-bump": "0.3.0", - "figures": "1.7.0", - "fs-access": "1.0.1", - "object-assign": "4.1.1", - "semver": "5.7.0", - "yargs": "6.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.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.1.0", - "pinkie-promise": "2.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "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 - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.15", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.5.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "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.6" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - } - }, - "stream-consume": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", - "dev": true - }, - "stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", - "dev": true, - "requires": { - "commander": "2.20.0", - "limiter": "1.1.4" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "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.2" - } - }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", - "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.1.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "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" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "systemjs": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.21.4.tgz", - "integrity": "sha512-l1O8boHjAIY5UG74Xk4B63LK9QbFxv/FkQa//GGGWaTeQoMhTsWnFrYwPWBScSF4xQFMO/+v9QB4i633h8Oytw==", - "dev": true - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.12", - "inherits": "2.0.3" - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "tfunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", - "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "object-path": "0.9.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "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" - } - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "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.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "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 - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "1.1.32", - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "tree-kill": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "7.1.4" - }, - "dependencies": { - "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "ts-disposables": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/ts-disposables/-/ts-disposables-2.2.3.tgz", - "integrity": "sha1-YWuQnmRlG8icn/xlSEcJ+HAnaVY=" - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, - "tslint": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", - "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "builtin-modules": "1.1.1", - "chalk": "2.4.1", - "commander": "2.20.0", - "diff": "3.5.0", - "glob": "7.1.1", - "js-yaml": "3.13.1", - "minimatch": "3.0.4", - "resolve": "1.11.0", - "semver": "5.7.0", - "tslib": "1.10.0", - "tsutils": "2.29.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "1.10.0" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "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.1.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.4.tgz", - "integrity": "sha512-JZHJtA6ZL15+Q3Dqkbh8iCUmvxD3iJ7ujXS+fVkKnwIVAdHc5BJTDNM0aTrnr2luKulFjU7W+SRhDZvi66Ru7Q==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", - "dev": true - }, - "uglify-js": { - "version": "3.3.23", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.23.tgz", - "integrity": "sha512-Ks+KqLGDsYn4z+pU7JsKCzC0T3mPYl+rU+VcPZiQOazjE4Uqi4UCRY3qPMDbJi7ze37n1lDXj3biz1ik93vqvw==", - "dev": true, - "requires": { - "commander": "2.15.1", - "source-map": "0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - } - } - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, - "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.1" - } - }, - "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.4", - "to-object-path": "0.3.0" - } - } - } - }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "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.1" - }, - "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.6", - "has-values": "0.1.4", - "isobject": "2.1.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.1" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "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 - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.5", - "tmp": "0.0.31" - } - }, - "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 - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "3.1.0", - "spdx-expression-parse": "3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "1.0.4", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "requires": { - "defaults": "1.0.3", - "glob-stream": "3.1.18", - "glob-watcher": "0.0.6", - "graceful-fs": "3.0.11", - "mkdirp": "0.5.1", - "strip-bom": "1.0.0", - "through2": "0.6.5", - "vinyl": "0.4.6" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "1.1.6" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true, - "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" - } - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "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 - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "2.1.1" - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", - "dev": true, - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - } - }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", - "dev": true - }, - "xhr2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", - "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": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, - "zone.js": { - "version": "0.8.29", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", - "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==", - "dev": true - } - } -}