diff --git a/.drone.yml b/.drone.yml index 1730f37..bdb22c2 100644 --- a/.drone.yml +++ b/.drone.yml @@ -2,7 +2,6 @@ kind: pipeline name: default steps: - - name: restore cache image: drillster/drone-volume-cache settings: @@ -45,7 +44,7 @@ steps: image: alpine:3.9 commands: - apk add --no-cache zip - - zip -9r ./dist/plugin.zip static + - zip -9r ./plugin.zip *.js when: event: - tag diff --git a/.gitignore b/.gitignore index c83c91d..d38ddad 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,7 @@ node_modules lib static kfs -plugins \ No newline at end of file +plugins +.rpt2_cache +*.js +*.d.ts \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 30e0627..80c46ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,22 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@angular/common": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.11.tgz", + "integrity": "sha512-LniJjGAeftUJDJh+2+LEjltcGen08C/VMxQ/eUYmesytKy1sN+MWzh3GbpKfEWtWmyUsYTG9lAAJNo3L3jPwsw==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/core": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.11.tgz", + "integrity": "sha512-h2vpvXNAdOqKzbVaZcHnHGMT5A8uDnizk6FgGq6SPyw9s3d+/VxZ9LJaPjUk3g2lICA7og1tUel+2YfF971MlQ==", + "requires": { + "tslib": "^1.7.1" + } + }, "@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", @@ -573,8 +589,7 @@ "@types/node": { "version": "11.13.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.18.tgz", - "integrity": "sha512-sMHdXLccscaxI+Hlzz58yLQue3lQyXP+6aQniDRi5oju3n0123kcjhicVGF20WF7cHiwJ2vxMbXc4skOclosoA==", - "dev": true + "integrity": "sha512-sMHdXLccscaxI+Hlzz58yLQue3lQyXP+6aQniDRi5oju3n0123kcjhicVGF20WF7cHiwJ2vxMbXc4skOclosoA==" }, "@types/q": { "version": "1.5.2", @@ -1318,6 +1333,14 @@ } } }, + "base-x": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.6.tgz", + "integrity": "sha512-4PaF8u2+AlViJxRVjurkLTxpp7CaFRD/jo5rPT9ONnKxyhQ8f59yzamEvq7EkriG56yn5On4ONyaG75HLqr46w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", @@ -1343,6 +1366,11 @@ "tweetnacl": "^0.14.3" } }, + "bech32": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.3.tgz", + "integrity": "sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==" + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1372,6 +1400,101 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bip174": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-1.0.0.tgz", + "integrity": "sha512-AaoWrkYtv6A2y8H+qzs6NvRWypzNbADT8PQGpM9rnP+jLzeol+uzhe3Myeuq/dwrHYtmsW8V71HmX2oXhQGagw==" + }, + "bip32": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.4.tgz", + "integrity": "sha512-ioPytarPDIrWckWMuK4RNUtvwhvWEc2fvuhnO0WEwu732k5OLjUXv4rXi2c/KJHw9ZMNQMkYRJrBw81RujShGQ==", + "requires": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.0", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "dependencies": { + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + } + } + }, + "bip39": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", + "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", + "requires": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + }, + "dependencies": { + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + } + } + }, + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bitcoin-ops": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", + "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==" + }, + "bitcoinjs-lib": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.1.2.tgz", + "integrity": "sha512-Qa1TY8xaFRaLPD2YunfQX1vhHAh0387SJ/Zu7lNSRyzpg8lDru8gv+w6pqxOkcdj4dm4Fn1JmWb0m8Oy+8TfiA==", + "requires": { + "@types/node": "10.12.18", + "bech32": "^1.1.2", + "bip174": "^1.0.0", + "bip32": "^2.0.4", + "bip66": "^1.1.0", + "bitcoin-ops": "^1.4.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "merkle-lib": "^2.0.10", + "pushdata-bitcoin": "^1.0.1", + "randombytes": "^2.0.1", + "tiny-secp256k1": "^1.1.1", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" + }, + "dependencies": { + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + } + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -1395,8 +1518,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { "version": "1.19.0", @@ -1462,8 +1584,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-process-hrtime": { "version": "0.1.3", @@ -1492,7 +1613,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -1579,6 +1699,24 @@ "fast-json-stable-stringify": "2.x" } }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, "bser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", @@ -1629,8 +1767,7 @@ "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "buffers": { "version": "0.1.1", @@ -1897,7 +2034,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -2024,6 +2160,22 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "coinstring": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", + "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", + "requires": { + "bs58": "^2.0.1", + "create-hash": "^1.1.1" + }, + "dependencies": { + "bs58": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", + "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=" + } + } + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -2090,6 +2242,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-versions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-2.0.1.tgz", + "integrity": "sha1-Htwfk2h/2XoyXFn1XkWgfbEGrKY=", + "dev": true + }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -2258,7 +2416,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -2271,7 +2428,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -2813,6 +2969,16 @@ "is-obj": "^1.0.0" } }, + "drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", + "requires": { + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" + } + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -2882,7 +3048,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", - "dev": true, "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -3120,6 +3285,12 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, + "estree-walker": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", + "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3141,7 +3312,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -3421,6 +3591,11 @@ "schema-utils": "^1.0.0" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -4584,7 +4759,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -4594,12 +4768,21 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, + "hdkey": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.1.tgz", + "integrity": "sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA==", + "requires": { + "coinstring": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -4616,7 +4799,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -5149,6 +5331,12 @@ "is-glob": "^2.0.0" } }, + "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-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -6228,7 +6416,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -6462,6 +6649,11 @@ } } }, + "merkle-lib": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", + "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6536,14 +6728,12 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.3", @@ -6652,8 +6842,7 @@ "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nanomatch": { "version": "1.2.13", @@ -7444,7 +7633,6 @@ "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -8285,6 +8473,14 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "pushdata-bitcoin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", + "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", + "requires": { + "bitcoin-ops": "^1.3.0" + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -8312,7 +8508,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -8738,12 +8933,106 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, + "rollup": { + "version": "0.55.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.55.5.tgz", + "integrity": "sha512-2hke9NOy332kxvnmMQOgl7DHm94zihNyYJNd8ZLWo4U0EjFvjUkeWa0+ge+70bTg+mY0xJ7NUsf5kIhDtrGrtA==" + }, + "rollup-plugin-node-resolve": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", + "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", + "dev": true, + "requires": { + "builtin-modules": "^2.0.0", + "is-module": "^1.0.0", + "resolve": "^1.1.6" + }, + "dependencies": { + "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 + } + } + }, + "rollup-plugin-typescript": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript/-/rollup-plugin-typescript-0.8.1.tgz", + "integrity": "sha1-L/fuzCHPa7K0P8J+W2iJUs5xkko=", + "dev": true, + "requires": { + "compare-versions": "2.0.1", + "object-assign": "^4.0.1", + "rollup-pluginutils": "^1.3.1", + "tippex": "^2.1.1", + "typescript": "^1.8.9" + }, + "dependencies": { + "typescript": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-1.8.10.tgz", + "integrity": "sha1-tHXW4N/wv1DyluXKbvn7tccyDx4=", + "dev": true + } + } + }, + "rollup-plugin-typescript2": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.10.0.tgz", + "integrity": "sha512-Sa2/lFV6VvaMmydyt5lL9L6lk78v2X3x1YpATl2hZIyI/HuiRpP0ls5T3Tmfk3Mniuxx33HXUfmcseIvevqI8Q==", + "dev": true, + "requires": { + "fs-extra": "^4.0.2", + "resolve": "^1.5.0", + "rollup-pluginutils": "^2.0.1", + "tslib": "^1.8.0" + }, + "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 + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "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" + } + } + } + }, + "rollup-pluginutils": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", + "dev": true, + "requires": { + "estree-walker": "^0.2.1", + "minimatch": "^3.0.2" + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -8759,6 +9048,19 @@ "aproba": "^1.1.1" } }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "requires": { + "tslib": "^1.9.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==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -9058,6 +9360,21 @@ } } }, + "secp256k1": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", + "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", + "requires": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + } + }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", @@ -9151,7 +9468,6 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -10099,6 +10415,24 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, + "tiny-secp256k1": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.3.tgz", + "integrity": "sha512-ZpobrhOtHP98VYEN51IYQH1YcrbFpnxFhI6ceWa3OEbJn7eHvSd8YFjGPxbedGCy7PNYU1v/+BRsdvyr5uRd4g==", + "requires": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + } + }, + "tippex": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tippex/-/tippex-2.3.1.tgz", + "integrity": "sha1-ov1bcIfXy/sgyYBqbBYQjCwPr9o=", + "dev": true + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -10279,8 +10613,7 @@ "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tslint": { "version": "5.18.0", @@ -10387,6 +10720,11 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" + }, "typescript": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", @@ -10696,6 +11034,14 @@ "spdx-expression-parse": "^3.0.0" } }, + "varuint-bitcoin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.0.tgz", + "integrity": "sha512-jCEPG+COU/1Rp84neKTyDJQr478/hAfVp5xxYn09QEH0yBjbmPeMfuuQIrp+BUD83hybtYZKhr5elV3bvdV1bA==", + "requires": { + "safe-buffer": "^5.1.1" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -10971,6 +11317,14 @@ "string-width": "^1.0.2 || 2" } }, + "wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", + "requires": { + "bs58check": "<3.0.0" + } + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", diff --git a/package.json b/package.json index 33f47fc..542e7fe 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,11 @@ "tsc": "tsc", "start": "npm run build; node lib/FrontblockAdmin.js", "build": "npm run clean; npm run build-backend; npm run build-frontend", - "build-backend": "tsc; webpack --display-error-details --config static.webpack.config.prod.js --progress --colors", - "build-frontend": "cd src/frontend; npm run build; cp -r dist/* ../../static", - "clean": "rm -rf lib static; rm -rf src/frontend/dist", + "build-backend": "tsc; webpack --display-error-details --config src/backend/webpack.prod.js --progress --colors; pwd; cp -r lib/PluginManager/* .", + "build-frontend": "npm run build-dashboard; npm run build-widget", + "build-dashboard": "cd src/frontend/dashboard; npm run build; cp -r dist/* ../../../static", + "build-widget": "rollup -c src/frontend/widget/rollup.config.js", + "clean": "rm -rf lib static dist plugins widget .rpt2_cache *.js *.ts; rm -rf src/frontend/dashboard/dist", "update-frontblock": "rm -rf node_modules/frontblock*; npm install" }, "repository": { @@ -17,22 +19,36 @@ "author": "frontblock.me", "license": "ISC", "dependencies": { + "@angular/common": "^5.2.11", + "@angular/core": "^5.2.2", + "@types/node": "^11.13.10", "@uirouter/angularjs": "^1.0.5", "angular": "^1.7.8", + "bip39": "^3.0.2", + "bitcoinjs-lib": "^5.0.4", "bsert": "0.0.10", "bsock": "^0.1.9", "express": "^4.16.4", "frontblock-generic": "latest", + "hdkey": "^1.1.1", "http": "0.0.0", "key-file-storage": "^2.2.1", "log4js": "^4.4.0", "memfs": "^2.15.5", + "minimist": "^1.2.0", "node-fetch": "^2.6.0", + "rollup": "^0.55.1", + "rxjs": "^6.5.2", + "rxjs-compat": "^6.5.2", "socket.io": "^2.2.0", "stream-buffers": "^3.0.2", - "unzip": "^0.1.11" + "unzip": "^0.1.11", + "uuid": "^3.3.2" }, "devDependencies": { + "rollup-plugin-node-resolve": "^3.0.2", + "rollup-plugin-typescript": "^0.8.1", + "rollup-plugin-typescript2": "^0.10.0", "@types/express": "^4.17.0", "@types/node": "^11.13.18", "@types/semver": "^6.0.1", diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index 3386252..0000000 --- a/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - autoprefixer: {}, - cssnano: {} - } -}; \ No newline at end of file diff --git a/src/backend/FrontblockAdmin.ts b/src/backend/FrontblockAdmin.ts index 9813039..541e56d 100644 --- a/src/backend/FrontblockAdmin.ts +++ b/src/backend/FrontblockAdmin.ts @@ -112,7 +112,7 @@ export class FrontblockAdmin extends ConfigLoader{ //translate RPCs to socket-bound function metadata const loadedPlugins = this.pm.getLoadedPlugins() for(const name in loadedPlugins){ - loadedPlugins[name].exportRPCs().forEach(rpc => { + loadedPlugins[name].backend.exportRPCs().forEach(rpc => { const info = this.rpcToRpcInfo(name, rpc) rpcInfos.push(info) }) @@ -170,6 +170,13 @@ export class FrontblockAdmin extends ConfigLoader{ this.express = express() this.express.use(express.static('static')) + this.express.get('/plugins/:id'+".js", (request, response) => { + let frontend = this.pm.getFrontend(request.params.id) + response.status(200) + response.set('Content-Type', 'application/javascript') + response.send(frontend) + }) + this.httpServer = new http.Server(this.express) this.httpServer.listen(port, () => { logger.info('Admin panel listening for HTTP on *'+port) @@ -257,6 +264,4 @@ export class FrontblockAdmin extends ConfigLoader{ } } -(async() => { - new FrontblockAdmin() -})() \ No newline at end of file +new FrontblockAdmin() diff --git a/src/backend/PluginManager/Plugin.ts b/src/backend/PluginManager/Plugin.ts index fe9755c..cfbc688 100644 --- a/src/backend/PluginManager/Plugin.ts +++ b/src/backend/PluginManager/Plugin.ts @@ -22,7 +22,7 @@ export class PluginManagerPlugin extends PluginManager implements Plugin{ constructor(){ super() - this.loadedPlugins[this.name] = this + this.loadedPlugins[this.name] = {backend:this, frontend: this.loadFrontend(this.name)} } exportRPCs(): import("frontblock-generic/Plugin").socketioRPC[] { @@ -44,8 +44,12 @@ export class PluginManagerPlugin extends PluginManager implements Plugin{ visibility: "private", rpc: async () => { return this.getLoadedPlugins() }, type: 'call' - }, - { + },{ + name: "getLoadedPluginNames", + visibility: "private", + rpc: async () => { return this.getLoadedPluginNames() }, + type: 'call' + },{ name: "installPlugin", visibility: "private", rpc: async(pluginName:string) => { return await this.installPlugin(pluginName) }, diff --git a/src/backend/PluginManager/PluginManager.ts b/src/backend/PluginManager/PluginManager.ts index 373bbf9..2d3888a 100644 --- a/src/backend/PluginManager/PluginManager.ts +++ b/src/backend/PluginManager/PluginManager.ts @@ -29,7 +29,7 @@ type PluginVersion = { export type PluginVersioning = { [pluginName in string]?: PluginVersion | string } -export type PluginMap = {[pluginName:string]: Plugin} +export type PluginMap = {[pluginName:string]: {backend: Plugin, frontend:any}} export type PluginManagerConfig = { resourceLocation: string, @@ -45,11 +45,13 @@ export default class PluginManager extends ConfigLoader { - if (err && err.code === 'ENOENT') { - fs.mkdirSync(path.dirname(dest), {recursive: true}) - } - }) - const file = fs.createWriteStream(dest) file.on('error', err => {throw new Error(err)}) const response = await fetch(url) @@ -119,6 +119,7 @@ export default class PluginManager extends ConfigLoader asset.name === pluginName + '.zip')[0].browser_download_url + const archiveURL = latest.assets.filter(asset => asset.name === 'plugin.zip')[0].browser_download_url const checksumURL = latest.assets.filter(asset => asset.name === 'md5sum.txt')[0].browser_download_url if (!version || ! archiveURL || !checksumURL) throw new Error('Malformed response') - await this.downloadFile(archiveURL, path.join(this.cacheDir, pluginName, version, 'plugin.zip')) - await this.downloadFile(checksumURL, path.join(this.cacheDir, pluginName, version, 'md5sum.txt')) + await fs.access(path.join(this.cacheDir, pluginName), err => { + if (err && err.code === 'ENOENT') { + fs.mkdirSync(path.join(this.cacheDir, pluginName), {recursive: true}) + } + }) + + await this.downloadFile(archiveURL, path.join(this.cacheDir, pluginName, 'plugin.zip')) + await this.downloadFile(checksumURL, path.join(this.cacheDir, pluginName, 'md5sum.txt')) } catch (error) { logger.error(error) } } + private extractPlugin(pluginName: string){ + fs + .createReadStream(path.join(this.cacheDir, pluginName, "plugin.zip")) + .pipe(unzip.Extract({ path: path.join(this.conf.installDir,pluginName) })); + } + public async installPlugin(pluginName: string) { try { await this.downloadPlugin(pluginName) - //TODO do something + await this.extractPlugin(pluginName) + await this.loadPlugin(pluginName) } catch (error) { logger.error(error) } } + public getFrontend(pluginName: string){ + return this.loadedPlugins[pluginName].frontend.toString() + } + public async uninstallPlugin(pluginName: string) { //TODO check for exists logger.info("Deleting plugin", pluginName) @@ -156,12 +174,18 @@ export default class PluginManager extends ConfigLoader { + return fb.PluginManager.getLoadedPluginNames() + } + +} diff --git a/src/frontend/src/app/dashboard/dashboard/dashboard.component.css b/src/frontend/dashboard/src/app/dashboard/dashboard/dashboard.component.css similarity index 100% rename from src/frontend/src/app/dashboard/dashboard/dashboard.component.css rename to src/frontend/dashboard/src/app/dashboard/dashboard/dashboard.component.css diff --git a/src/frontend/src/app/dashboard/dashboard/dashboard.component.html b/src/frontend/dashboard/src/app/dashboard/dashboard/dashboard.component.html similarity index 100% rename from src/frontend/src/app/dashboard/dashboard/dashboard.component.html rename to src/frontend/dashboard/src/app/dashboard/dashboard/dashboard.component.html diff --git a/src/frontend/src/app/dashboard/dashboard/dashboard.component.ts b/src/frontend/dashboard/src/app/dashboard/dashboard/dashboard.component.ts similarity index 84% rename from src/frontend/src/app/dashboard/dashboard/dashboard.component.ts rename to src/frontend/dashboard/src/app/dashboard/dashboard/dashboard.component.ts index a34ff98..52ff6ad 100644 --- a/src/frontend/src/app/dashboard/dashboard/dashboard.component.ts +++ b/src/frontend/dashboard/src/app/dashboard/dashboard/dashboard.component.ts @@ -27,7 +27,6 @@ SystemJS.config({ meta: { '*': { authorization: true } } }); import { AfterViewInit, Component, Compiler, Injector, OnInit, ViewChild, ViewContainerRef } from '@angular/core'; import { DashboardService } from '../dashboard.service'; -import { WidgetConfig } from '../widget-config.model'; @Component({ selector: 'app-dashboard', @@ -42,29 +41,32 @@ export class DashboardComponent implements AfterViewInit { private injector: Injector) { } ngAfterViewInit() { - this.loadWidgets(); + setTimeout( () => { + this.loadWidgets(); + }, 250) } private async loadWidgets() { - const widgets = await this.dashboardService.getWidgetConfigs().toPromise(); + const widgets = await this.dashboardService.getWidgetConfigs() widgets.forEach((widget) => this.createWidget(widget)); } - private async createWidget(widget: WidgetConfig) { + private async createWidget(pluginName: string) { // import external module bundle - console.log(`Importing module bundle: ${widget.moduleBundlePath}`); - const module = await SystemJS.import(widget.moduleBundlePath); + const module = await SystemJS.import("plugins/"+pluginName+".js"); + + console.log(module) // compile module - const moduleFactory = await this.compiler.compileModuleAsync(module[widget.moduleName]); + const moduleFactory = await this.compiler.compileModuleAsync(module["PluginModule"]); // resolve component factory const moduleRef = moduleFactory.create(this.injector); - const componentProvider = moduleRef.injector.get(widget.name); + const componentProvider = moduleRef.injector.get("provider"); const componentFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(componentProvider); // compile component - console.log(`Creating widget: ${widget.name}`); + console.log(`Creating widget: ${pluginName}`); this.content.createComponent(componentFactory); } diff --git a/src/frontend/src/app/dashboard/widget-config.model.ts b/src/frontend/dashboard/src/app/dashboard/widget-config.model.ts similarity index 100% rename from src/frontend/src/app/dashboard/widget-config.model.ts rename to src/frontend/dashboard/src/app/dashboard/widget-config.model.ts diff --git a/src/frontend/src/assets/.gitkeep b/src/frontend/dashboard/src/assets/.gitkeep similarity index 100% rename from src/frontend/src/assets/.gitkeep rename to src/frontend/dashboard/src/assets/.gitkeep diff --git a/src/frontend/src/environments/environment.prod.ts b/src/frontend/dashboard/src/environments/environment.prod.ts similarity index 100% rename from src/frontend/src/environments/environment.prod.ts rename to src/frontend/dashboard/src/environments/environment.prod.ts diff --git a/src/frontend/src/environments/environment.ts b/src/frontend/dashboard/src/environments/environment.ts similarity index 100% rename from src/frontend/src/environments/environment.ts rename to src/frontend/dashboard/src/environments/environment.ts diff --git a/src/frontend/src/favicon.ico b/src/frontend/dashboard/src/favicon.ico similarity index 100% rename from src/frontend/src/favicon.ico rename to src/frontend/dashboard/src/favicon.ico diff --git a/src/frontend/src/index.html b/src/frontend/dashboard/src/index.html similarity index 100% rename from src/frontend/src/index.html rename to src/frontend/dashboard/src/index.html diff --git a/src/frontend/src/main.ts b/src/frontend/dashboard/src/main.ts similarity index 100% rename from src/frontend/src/main.ts rename to src/frontend/dashboard/src/main.ts diff --git a/src/frontend/src/polyfills.ts b/src/frontend/dashboard/src/polyfills.ts similarity index 100% rename from src/frontend/src/polyfills.ts rename to src/frontend/dashboard/src/polyfills.ts diff --git a/src/frontend/src/styles.css b/src/frontend/dashboard/src/styles.css similarity index 100% rename from src/frontend/src/styles.css rename to src/frontend/dashboard/src/styles.css diff --git a/src/frontend/src/test.ts b/src/frontend/dashboard/src/test.ts similarity index 100% rename from src/frontend/src/test.ts rename to src/frontend/dashboard/src/test.ts diff --git a/src/frontend/src/tsconfig.app.json b/src/frontend/dashboard/src/tsconfig.app.json similarity index 100% rename from src/frontend/src/tsconfig.app.json rename to src/frontend/dashboard/src/tsconfig.app.json diff --git a/src/frontend/src/tsconfig.spec.json b/src/frontend/dashboard/src/tsconfig.spec.json similarity index 100% rename from src/frontend/src/tsconfig.spec.json rename to src/frontend/dashboard/src/tsconfig.spec.json diff --git a/src/frontend/tsconfig.json b/src/frontend/dashboard/tsconfig.json similarity index 100% rename from src/frontend/tsconfig.json rename to src/frontend/dashboard/tsconfig.json diff --git a/src/frontend/tslint.json b/src/frontend/dashboard/tslint.json similarity index 100% rename from src/frontend/tslint.json rename to src/frontend/dashboard/tslint.json diff --git a/src/frontend/yarn.lock b/src/frontend/dashboard/yarn.lock similarity index 100% rename from src/frontend/yarn.lock rename to src/frontend/dashboard/yarn.lock diff --git a/src/frontend/karma.conf.js b/src/frontend/karma.conf.js deleted file mode 100644 index af139fa..0000000 --- a/src/frontend/karma.conf.js +++ /dev/null @@ -1,33 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular/cli'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular/cli/plugins/karma') - ], - client:{ - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - reports: [ 'html', 'lcovonly' ], - fixWebpackSourcePaths: true - }, - angularCli: { - environment: 'dev' - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false - }); -}; diff --git a/src/frontend/protractor.conf.js b/src/frontend/protractor.conf.js deleted file mode 100644 index 7ee3b5e..0000000 --- a/src/frontend/protractor.conf.js +++ /dev/null @@ -1,28 +0,0 @@ -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './e2e/**/*.e2e-spec.ts' - ], - capabilities: { - 'browserName': 'chrome' - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - onPrepare() { - require('ts-node').register({ - project: 'e2e/tsconfig.e2e.json' - }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; diff --git a/src/frontend/src/app/dashboard/dashboard.service.ts b/src/frontend/src/app/dashboard/dashboard.service.ts deleted file mode 100644 index 358f868..0000000 --- a/src/frontend/src/app/dashboard/dashboard.service.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs/Observable'; -import { WidgetConfig } from './widget-config.model'; - -@Injectable() -export class DashboardService { - - constructor(private http: HttpClient) { } - - private readonly url = 'widgets-repo/widgets.config.json'; - - getWidgetConfigs(): Observable { - return this.http.get(this.url); - } - -} diff --git a/src/frontend/src/typings.d.ts b/src/frontend/src/typings.d.ts deleted file mode 100644 index ef5c7bd..0000000 --- a/src/frontend/src/typings.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* SystemJS module definition */ -declare var module: NodeModule; -interface NodeModule { - id: string; -} diff --git a/src/frontend/widget/main.ts b/src/frontend/widget/main.ts new file mode 100644 index 0000000..f8085bd --- /dev/null +++ b/src/frontend/widget/main.ts @@ -0,0 +1 @@ +export { PluginModule } from './widget/module'; \ No newline at end of file diff --git a/src/frontend/widget/widget/a-nested.component.ts b/src/frontend/widget/widget/a-nested.component.ts new file mode 100644 index 0000000..5f4fac6 --- /dev/null +++ b/src/frontend/widget/widget/a-nested.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'exclamations', + template: ` + !!! + ` +}) +export class ANestedComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/src/frontend/widget/widget/component.ts b/src/frontend/widget/widget/component.ts new file mode 100644 index 0000000..007f9d0 --- /dev/null +++ b/src/frontend/widget/widget/component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +declare const fb +@Component({ + selector: 'APICLIENT', //!!!! + template: ` +
+
+
+ APICLIENT ${Object.keys(fb.ApiClient).join("
")} +
+
+ Hello World +
+
+
+ ` +}) +export class PluginComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/src/frontend/widget/widget/module.ts b/src/frontend/widget/widget/module.ts new file mode 100644 index 0000000..0c8194d --- /dev/null +++ b/src/frontend/widget/widget/module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { PluginComponent } from './component'; +import { ANestedComponent } from './a-nested.component'; + +@NgModule({ + imports: [CommonModule], + declarations: [ + PluginComponent, + ANestedComponent + ], + entryComponents: [PluginComponent], + providers: [{ + provide: 'provider', + useValue: PluginComponent + }] +}) +export class PluginModule { } diff --git a/static.webpack.config.prod.js b/static.webpack.config.prod.js deleted file mode 100644 index 8b1e7c8..0000000 --- a/static.webpack.config.prod.js +++ /dev/null @@ -1,185 +0,0 @@ -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const CleanWebpackPlugin = require('clean-webpack-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const TerserPlugin = require('terser-webpack-plugin'); - -const webpack = require('webpack'); -const path = require('path'); -const ROOT_PATH = path.resolve(__dirname); -const APP_PATH = path.resolve(ROOT_PATH, 'src'); -const NODE_MODULES_PATH = path.resolve(ROOT_PATH, 'node_modules'); -const ENTRY_FILE = path.resolve(APP_PATH, 'index'); -const TEMPLATE_FILE = path.resolve(APP_PATH, 'index.html'); - -const BUILD_PATH = path.resolve(ROOT_PATH, './static'); - -const angularPage = { - mode: 'production', - entry: { - app: ENTRY_FILE, - vendor: [ - "angular", - '@uirouter/angularjs' - ] - }, - output: { - path: BUILD_PATH, - filename: 'js/[name].[hash:8].js', - chunkFilename: 'js/[name].[chunkhash:8].js' - }, - module: { - rules: [ - { - test: /\.html$/, - use: { - loader: 'html-loader', - options: { - exportAsEs6Default: true, - minimize: true, - removeComments: true - } - } - }, - { - test: /\.css$/, - exclude: NODE_MODULES_PATH, - use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'], - include: APP_PATH - }, - { - test: /\.less$/, - use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'less-loader'], - }, - { - test: /\.scss$/, - exclude: NODE_MODULES_PATH, - use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader'], - include: APP_PATH - }, - { - test: /\.(eot|woff|ttf|woff2)(\?|$)/, - exclude: NODE_MODULES_PATH, - use: { - loader: 'file-loader', - options: { - name: '[name].[ext]' - } - }, - include: APP_PATH - }, - { - test: /\.(png|jpg|gif|svg)$/, - exclude: NODE_MODULES_PATH, - use: { - loader: 'url-loader', - options: { - limit: 8192, - name: 'images/[name].[hash:8].[ext]' - } - }, - include: APP_PATH - }, - { - test: /\.ts$/, - exclude: NODE_MODULES_PATH, - use: 'ts-loader', - include: APP_PATH - } - ] - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env': { - NODE_ENV: JSON.stringify('production') - } - }), - new HtmlWebpackPlugin({ - filename: path.resolve(BUILD_PATH, 'index.html'), - template: TEMPLATE_FILE, - hash: false, - }), - new CleanWebpackPlugin(['./static'], { - root: path.resolve(__dirname, './'), - verbose: true - }), - new MiniCssExtractPlugin({ - filename: 'css/[name].css?v=[contenthash:8]' - }) - ], - optimization: { - splitChunks: { - cacheGroups: { - common: { - chunks: 'all', - minChunks: 2, - maxInitialRequests: 5, - minSize: 0, - name: 'common' - }, - vendor: { - test: /node_modules/, - chunks: 'all', - name: 'vendor', - priority: 10, - enforce: true, - minChunks: 2 - } - } - } - }, - resolve: { - extensions: ['.js', '.ts', '.less', '.scss', '.css'], - alias: { - '@': APP_PATH, - } - } - } - - const FrontblockLib = { - mode: 'production', - entry: path.resolve(__dirname, 'lib/FrontblockLib.js'), - output: { - path: path.resolve(__dirname, 'static'), - filename: 'FrontblockLib.js', - }, - module: { - rules: [ - { test: /\FrontblockLib.ts/, use: 'ts-loader' } - ] - }, - optimization: { - minimizer: [new TerserPlugin({ - cache: true, - parallel: true, - terserOptions:{ - mangle: false, - keep_classnames: true - } - })], - splitChunks: { - cacheGroups: { - common: { - chunks: 'all', - minChunks: 2, - maxInitialRequests: 5, - minSize: 0, - name: 'common' - }, - vendor: { - test: /node_modules/, - chunks: 'all', - name: 'vendor', - priority: 10, - enforce: true, - minChunks: 2 - } - } - } - } - } - - -module.exports = [ - //Object.assign({}, angularPage), - Object.assign({}, FrontblockLib), -]; \ No newline at end of file diff --git a/tsconfig.frontend.json b/tsconfig.frontend.json new file mode 100644 index 0000000..85d5bd1 --- /dev/null +++ b/tsconfig.frontend.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/frontend/widget"], + "exclude": [ + "src/backend" + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 4ddc662..e15a496 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,8 @@ "module": "commonjs", "declaration": true, "outDir": "./lib", - "strict": true + "strict": true, + "experimentalDecorators": true }, "include": ["src/backend"], "exclude": ["node_modules", "**/__tests__/*"],