From 49171516d7d110abe8cfa1f9f1fe0707262b1999 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Mon, 8 Jun 2020 15:01:55 +0200 Subject: [PATCH 01/91] Unskip embeddables/adding_children suite (#68111) Giving it another chance *cross fingers* Co-authored-by: Elastic Machine --- test/examples/embeddables/adding_children.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/examples/embeddables/adding_children.ts b/test/examples/embeddables/adding_children.ts index 25fe7ee607f72..a26ce4c40e2ea 100644 --- a/test/examples/embeddables/adding_children.ts +++ b/test/examples/embeddables/adding_children.ts @@ -25,8 +25,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { const testSubjects = getService('testSubjects'); const flyout = getService('flyout'); - // FLAKY: https://github.com/elastic/kibana/issues/58692 - describe.skip('creating and adding children', () => { + describe('creating and adding children', () => { before(async () => { await testSubjects.click('embeddablePanelExamplae'); }); From 77ab709976cf068bf5f602c5e7ad27e7c8384a95 Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:19:32 -0400 Subject: [PATCH 02/91] Bump pdfmake package version (#68395) --- x-pack/package.json | 2 +- yarn.lock | 268 +++++++++++++++++--------------------------- 2 files changed, 104 insertions(+), 166 deletions(-) diff --git a/x-pack/package.json b/x-pack/package.json index c46d364e0ac46..227547ce15fd1 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -299,7 +299,7 @@ "oppsy": "^2.0.0", "p-retry": "^4.2.0", "papaparse": "^5.2.0", - "pdfmake": "^0.1.63", + "pdfmake": "^0.1.65", "pluralize": "3.1.0", "pngjs": "3.4.0", "polished": "^1.9.2", diff --git a/yarn.lock b/yarn.lock index 678ddfb052cd3..f4d5409f755ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5629,17 +5629,12 @@ acorn-walk@^6.0.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== -acorn-walk@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.0.0.tgz#c8ba6f0f1aac4b0a9e32d1f0af12be769528f36b" - integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== - -acorn-walk@^7.1.1: +acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== -acorn@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.1.2, acorn@^5.5.0: +acorn@5.X, acorn@^5.0.3, acorn@^5.1.2, acorn@^5.5.0: version "5.7.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== @@ -5659,7 +5654,12 @@ acorn@^6.0.1, acorn@^6.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: +acorn@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" + integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== + +acorn@^7.1.0, acorn@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== @@ -7426,7 +7426,7 @@ babel-preset-react-app@^9.0.0: babel-plugin-macros "2.6.1" babel-plugin-transform-react-remove-prop-types "0.4.24" -babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -7555,12 +7555,12 @@ base64-js@0.0.8: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= -base64-js@^1.0.2, base64-js@^1.1.2: +base64-js@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" integrity sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw== -base64-js@^1.2.1, base64-js@^1.3.1: +base64-js@^1.1.2, base64-js@^1.2.1, base64-js@^1.3.0, base64-js@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== @@ -7973,17 +7973,7 @@ breadth-filter@^2.0.0: dependencies: object.entries "^1.0.4" -brfs@^1.4.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" - integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ== - dependencies: - quote-stream "^1.0.1" - resolve "^1.1.5" - static-module "^2.2.0" - through2 "^2.0.0" - -brfs@^2.0.2: +brfs@^2.0.0, brfs@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/brfs/-/brfs-2.0.2.tgz#44237878fa82aa479ce4f5fe2c1796ec69f07845" integrity sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ== @@ -8023,20 +8013,13 @@ browser-process-hrtime@^0.1.2: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= -browser-resolve@^1.11.3: +browser-resolve@^1.11.3, browser-resolve@^1.8.1: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" -browser-resolve@^1.8.1: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - integrity sha1-j/CbCixCFxihBRwmCzLkj0QpOM4= - dependencies: - resolve "1.1.7" - browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -8072,7 +8055,7 @@ browserify-des@^1.0.0: des.js "^1.0.0" inherits "^2.0.1" -browserify-optional@^1.0.0: +browserify-optional@^1.0.0, browserify-optional@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-optional/-/browserify-optional-1.0.1.tgz#1e13722cfde0d85f121676c2a72ced533a018869" integrity sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk= @@ -9269,7 +9252,7 @@ clone-stats@^1.0.0: resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= -clone@^1.0.0, clone@^1.0.1, clone@^1.0.2: +clone@^1.0.0, clone@^1.0.2, clone@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= @@ -9864,7 +9847,7 @@ contour_plot@^0.0.1: resolved "https://registry.yarnpkg.com/contour_plot/-/contour_plot-0.0.1.tgz#475870f032b8e338412aa5fc507880f0bf495c77" integrity sha1-R1hw8DK44zhBKqX8UHiA8L9JXHc= -convert-source-map@1.7.0, convert-source-map@^1.7.0: +convert-source-map@1.7.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -9881,13 +9864,6 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= -convert-source-map@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - convex-hull@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/convex-hull/-/convex-hull-1.0.3.tgz#20a3aa6ce87f4adea2ff7d17971c9fc1c67e1fff" @@ -10878,6 +10854,11 @@ dargs@^5.1.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" integrity sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk= +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -11085,12 +11066,7 @@ deep-eql@^0.1.3: dependencies: type-detect "0.1.1" -deep-equal@^1.0.0, deep-equal@^1.0.1, deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= - -deep-equal@^1.1.1, deep-equal@~1.1.1: +deep-equal@^1.0.0, deep-equal@^1.1.1, deep-equal@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== @@ -11102,6 +11078,11 @@ deep-equal@^1.1.1, deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-equal@^1.0.1, deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + deep-extend@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" @@ -11462,12 +11443,10 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -dfa@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.1.0.tgz#d30218bd10d030fa421df3ebbc82285463a31781" - integrity sha1-0wIYvRDQMPpCHfPrvIIoVGOjF4E= - dependencies: - babel-runtime "^6.11.6" +dfa@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.2.0.tgz#96ac3204e2d29c49ea5b57af8d92c2ae12790657" + integrity sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q== di@^0.0.1: version "0.0.1" @@ -12502,7 +12481,7 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.11.1, escodegen@^1.8.1: +escodegen@^1.11.1: version "1.12.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== @@ -12549,18 +12528,6 @@ escodegen@~1.2.0: optionalDependencies: source-map "~0.1.30" -escodegen@~1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" - integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - escope@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" @@ -13422,16 +13389,6 @@ faker@1.1.0: resolved "https://registry.yarnpkg.com/faker/-/faker-1.1.0.tgz#230738ebd37edad9de4a421de12922bd8206a872" integrity sha1-Iwc469N+2tneSkId4SkivYIGqHI= -falafel@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c" - integrity sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw= - dependencies: - acorn "^5.0.0" - foreach "^2.0.5" - isarray "0.0.1" - object-keys "^1.0.6" - fancy-log@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" @@ -14066,20 +14023,20 @@ font-awesome@4.7.0: integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= fontkit@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fontkit/-/fontkit-1.8.0.tgz#deb9351619e90ddc91707b6156a9f14c8ab11554" - integrity sha512-EFDRCca7khfQWYu1iFhsqeABpi87f03MBdkT93ZE6YhqCdMzb5Eojb6c4dlJikGv5liuhByyzA7ikpIPTSBWbQ== + version "1.8.1" + resolved "https://registry.yarnpkg.com/fontkit/-/fontkit-1.8.1.tgz#ae77485376f1096b45548bf6ced9a07af62a7846" + integrity sha512-BsNCjDoYRxmNWFdAuK1y9bQt+igIxGtTC9u/jSFjR9MKhmI00rP1fwSvERt+5ddE82544l0XH5mzXozQVUy2Tw== dependencies: - babel-runtime "^6.11.6" - brfs "^1.4.0" + babel-runtime "^6.26.0" + brfs "^2.0.0" brotli "^1.2.0" - browserify-optional "^1.0.0" - clone "^1.0.1" + browserify-optional "^1.0.1" + clone "^1.0.4" deep-equal "^1.0.0" - dfa "^1.0.0" + dfa "^1.2.0" restructure "^0.5.3" tiny-inflate "^1.0.2" - unicode-properties "^1.0.0" + unicode-properties "^1.2.2" unicode-trie "^0.3.0" for-each@^0.3.2: @@ -14120,11 +14077,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - foreachasync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" @@ -16476,6 +16428,13 @@ iconv-lite@^0.5.0: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.1.tgz#b2425d3c7b18f7219f2ca663d103bddb91718d64" + integrity sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q== + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-utils@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.0.0.tgz#d52cf4bcdcfa1c45c2dbefb4ffdf6b00ef608098" @@ -20094,12 +20053,12 @@ madge@3.4.4: rc "^1.2.7" walkdir "^0.0.12" -magic-string@^0.22.4: - version "0.22.5" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" - integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== +magic-string@0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e" + integrity sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg== dependencies: - vlq "^0.2.2" + sourcemap-codec "^1.4.1" majo@^0.4.1: version "0.4.1" @@ -21956,16 +21915,11 @@ object-identity-map@^1.0.2: dependencies: object.entries "^1.1.0" -object-inspect@^1.7.0, object-inspect@~1.7.0: +object-inspect@^1.6.0, object-inspect@^1.7.0, object-inspect@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-inspect@~1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" - integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== - object-inspect@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" @@ -21976,7 +21930,7 @@ object-is@^1.0.1, object-is@^1.0.2: resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -23049,12 +23003,12 @@ pdfkit@>=0.8.1, pdfkit@^0.11.0: linebreak "^1.0.2" png-js "^1.0.0" -pdfmake@^0.1.63: - version "0.1.63" - resolved "https://registry.yarnpkg.com/pdfmake/-/pdfmake-0.1.63.tgz#0001ecffe4ab30843485ce08744393315721e3f1" - integrity sha512-TjchyLVDzaEmtaDNUrceNrm0QvNIFERYOeDwHwMUQ1twGy68Uhjd1MKsb9DGAh8SuB8MCWQXB7m4k7cUevLjoA== +pdfmake@^0.1.65: + version "0.1.65" + resolved "https://registry.yarnpkg.com/pdfmake/-/pdfmake-0.1.65.tgz#09c4cf796809ec5fce789343560a36780ff47e37" + integrity sha512-MgzRyiKSP3IEUH7vm4oj3lpikmk5oCD9kYxiJM6Z2Xf6CP9EcikeSDey2rGd4WVvn79Y0TGqz2+to8FtWP8MrA== dependencies: - iconv-lite "^0.5.0" + iconv-lite "^0.5.1" linebreak "^1.0.2" pdfkit "^0.11.0" svg-to-pdfkit "^0.1.8" @@ -24096,7 +24050,7 @@ quickselect@^2.0.0: resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== -quote-stream@^1.0.1, quote-stream@~1.0.2: +quote-stream@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= @@ -25173,7 +25127,7 @@ read-pkg@^5.1.1, read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2": +"readable-stream@1 || 2", readable-stream@~2.3.3: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -25205,7 +25159,7 @@ readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0": string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -26166,7 +26120,14 @@ resolve@1.8.1, resolve@^1.3.2, resolve@^1.8.1: dependencies: path-parse "^1.0.5" -resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7: +resolve@^1.1.5: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.1.6, resolve@^1.1.7: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== @@ -26743,11 +26704,12 @@ schema-utils@^2.4.1, schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6 ajv-keywords "^3.4.1" scope-analyzer@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/scope-analyzer/-/scope-analyzer-2.0.5.tgz#72c9c6770c3e66984f84c7d3c7045998a1a7db8a" - integrity sha512-+U5H0417mnTEstCD5VwOYO7V4vYuSqwqjFap40ythe67bhMFL5C3UgPwyBv7KDJsqUBIKafOD57xMlh1rN7eaw== + version "2.1.1" + resolved "https://registry.yarnpkg.com/scope-analyzer/-/scope-analyzer-2.1.1.tgz#5156c27de084d74bf75af9e9506aaf95c6e73dd6" + integrity sha512-azEAihtQ9mEyZGhfgTJy3IbOWEzeOrYbg7NcYEshPKnKd+LZmC3TNd5dmDxbLBsTG/JVWmCp+vDJ03vJjeXMHg== dependencies: array-from "^2.1.1" + dash-ast "^1.0.0" es6-map "^0.1.5" es6-set "^0.1.5" es6-symbol "^3.1.1" @@ -27842,20 +27804,13 @@ statehood@6.x.x: iron "5.x.x" joi "13.x.x" -static-eval@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.3.tgz#cb62fc79946bd4d5f623a45ad428233adace4d72" - integrity sha512-zsxDGucfAh8T339sSKgpFbvg15Fms2IVaJGC+jqp0bVsxhcpM+iMeAI8weNo8dmf4OblgifTBUoyk1vGVtYw2w== +static-eval@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.5.tgz#f0782e66999c4b3651cda99d9ce59c507d188f71" + integrity sha512-nNbV6LbGtMBgv7e9LFkt5JV8RVlRsyJrphfAt9tOtBBW/SfnzZDf2KnS72an8e434A+9e/BmJuTxeGPvrAK7KA== dependencies: escodegen "^1.11.1" -static-eval@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" - integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== - dependencies: - escodegen "^1.8.1" - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -27864,44 +27819,24 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -static-module@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf" - integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ== - dependencies: - concat-stream "~1.6.0" - convert-source-map "^1.5.1" - duplexer2 "~0.1.4" - escodegen "~1.9.0" - falafel "^2.1.0" - has "^1.0.1" - magic-string "^0.22.4" - merge-source-map "1.0.4" - object-inspect "~1.4.0" - quote-stream "~1.0.2" - readable-stream "~2.3.3" - shallow-copy "~0.0.1" - static-eval "^2.0.0" - through2 "~2.0.3" - static-module@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/static-module/-/static-module-3.0.3.tgz#cc2301ed3fe353e2d2a2195137013853676f9960" - integrity sha512-RDaMYaI5o/ym0GkCqL/PlD1Pn216omp8fY81okxZ6f6JQxWW5tptOw9reXoZX85yt/scYvbWIt6uoszeyf+/MQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-3.0.4.tgz#bfbd1d1c38dd1fbbf0bb4af0c1b3ae18a93a2b68" + integrity sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw== dependencies: acorn-node "^1.3.0" concat-stream "~1.6.0" convert-source-map "^1.5.1" duplexer2 "~0.1.4" - escodegen "~1.9.0" + escodegen "^1.11.1" has "^1.0.1" - magic-string "^0.22.4" + magic-string "0.25.1" merge-source-map "1.0.4" - object-inspect "~1.4.0" + object-inspect "^1.6.0" readable-stream "~2.3.3" scope-analyzer "^2.0.1" shallow-copy "~0.0.1" - static-eval "^2.0.2" + static-eval "^2.0.5" through2 "~2.0.3" stats-lite@^2.2.0: @@ -29098,9 +29033,9 @@ tiny-emitter@^2.0.0: integrity sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow== tiny-inflate@^1.0.0, tiny-inflate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7" - integrity sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c= + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" + integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== tiny-invariant@^1.0.2: version "1.0.4" @@ -30321,13 +30256,13 @@ unicode-match-property-value-ecmascript@^1.2.0: resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== -unicode-properties@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.1.0.tgz#7a96eef49f75682ea69d2315eec9ac43ffdf00c1" - integrity sha1-epbu9J91aC6mnSMV7smsQ//fAME= +unicode-properties@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.3.1.tgz#cc642b6314bde2c691d65dd94cece09ed84f1282" + integrity sha512-nIV3Tf3LcUEZttY/2g4ZJtGXhWwSkuLL+rCu0DIAMbjyVPj+8j5gNVz4T/sVbnQybIsd5SFGkPKg/756OY6jlA== dependencies: - brfs "^1.4.0" - unicode-trie "^0.3.0" + base64-js "^1.3.0" + unicode-trie "^2.0.0" unicode-property-aliases-ecmascript@^1.0.4: version "1.0.4" @@ -30355,6 +30290,14 @@ unicode-trie@^1.0.0: pako "^0.2.5" tiny-inflate "^1.0.0" +unicode-trie@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" + integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== + dependencies: + pako "^0.2.5" + tiny-inflate "^1.0.0" + unified@^6.1.5: version "6.1.6" resolved "https://registry.yarnpkg.com/unified/-/unified-6.1.6.tgz#5ea7f807a0898f1f8acdeefe5f25faa010cc42b1" @@ -31360,11 +31303,6 @@ vision@^5.3.3: items "2.x.x" joi "13.x.x" -vlq@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== - vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" From de4eaf9ae70cc225db8bb92a43661b8cfbd4ab85 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Mon, 8 Jun 2020 15:31:14 +0200 Subject: [PATCH 03/91] fix #66185 (#66186) --- ...-data-public.indexpattern._constructor_.md | 4 ++-- .../index_patterns/_pattern_cache.ts | 2 +- .../index_patterns/index_pattern.test.ts | 3 +++ .../index_patterns/index_pattern.ts | 19 +++++++++++-------- src/plugins/data/public/public.api.md | 3 ++- .../public/lib/resolve_saved_objects.ts | 5 +++-- .../apps/management/_import_objects.js | 1 - 7 files changed, 22 insertions(+), 15 deletions(-) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern._constructor_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern._constructor_.md index 4159247bb7c32..6256709e2ee36 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern._constructor_.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern._constructor_.md @@ -9,7 +9,7 @@ Constructs a new instance of the `IndexPattern` class Signature: ```typescript -constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, patternCache: any); +constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, patternCache: PatternCache); ``` ## Parameters @@ -20,5 +20,5 @@ constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObj | getConfig | any | | | savedObjectsClient | SavedObjectsClientContract | | | apiClient | IIndexPatternsApiClient | | -| patternCache | any | | +| patternCache | PatternCache | | diff --git a/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts b/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts index eb6c69b414316..a3653bb529fa3 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts @@ -19,7 +19,7 @@ import { IndexPattern } from './index_pattern'; -interface PatternCache { +export interface PatternCache { get: (id: string) => IndexPattern; set: (id: string, value: IndexPattern) => IndexPattern; clear: (id: string) => void; diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts index e4058007e0a57..84135bb5d1e2b 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts @@ -85,6 +85,9 @@ const savedObjectsClient = { const patternCache = { clear: jest.fn(), + get: jest.fn(), + set: jest.fn(), + clearAll: jest.fn(), }; const config = { diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts index 3d54009d0fdca..84ea12a1f684f 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts @@ -44,6 +44,7 @@ import { flattenHitWrapper } from './flatten_hit'; import { IIndexPatternsApiClient } from './index_patterns_api_client'; import { getNotifications, getFieldFormats } from '../../services'; import { TypeMeta } from './types'; +import { PatternCache } from './_pattern_cache'; const MAX_ATTEMPTS_TO_RESOLVE_CONFLICTS = 3; const type = 'index-pattern'; @@ -65,12 +66,13 @@ export class IndexPattern implements IIndexPattern { private version: string | undefined; private savedObjectsClient: SavedObjectsClientContract; - private patternCache: any; + private patternCache: PatternCache; private getConfig: any; private sourceFilters?: []; private originalBody: { [key: string]: any } = {}; public fieldsFetcher: any; // probably want to factor out any direct usage and change to private private shortDotsEnable: boolean = false; + private apiClient: IIndexPatternsApiClient; private mapping: MappingObject = expandShorthand({ title: ES_FIELD_TYPES.TEXT, @@ -99,7 +101,7 @@ export class IndexPattern implements IIndexPattern { getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, - patternCache: any + patternCache: PatternCache ) { this.id = id; this.savedObjectsClient = savedObjectsClient; @@ -117,6 +119,7 @@ export class IndexPattern implements IIndexPattern { }); this.fields = this.createFieldList(this, [], this.shortDotsEnable); + this.apiClient = apiClient; this.fieldsFetcher = createFieldsFetcher( this, apiClient, @@ -396,8 +399,8 @@ export class IndexPattern implements IIndexPattern { duplicateId, this.getConfig, this.savedObjectsClient, - this.patternCache, - this.fieldsFetcher + this.apiClient, + this.patternCache ); await duplicatePattern.destroy(); } @@ -445,8 +448,8 @@ export class IndexPattern implements IIndexPattern { this.id, this.getConfig, this.savedObjectsClient, - this.patternCache, - this.fieldsFetcher + this.apiClient, + this.patternCache ); return samePattern.init().then(() => { // What keys changed from now and what the server returned @@ -489,7 +492,7 @@ export class IndexPattern implements IIndexPattern { this.version = samePattern.version; // Clear cache - this.patternCache.clear(this.id); + this.patternCache.clear(this.id!); // Try the save again return this.save(saveAttempts); @@ -545,8 +548,8 @@ export class IndexPattern implements IIndexPattern { } destroy() { - this.patternCache.clear(this.id); if (this.id) { + this.patternCache.clear(this.id); return this.savedObjectsClient.delete(type, this.id); } } diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index dcdb528ac8b7d..e6f6ba0c1bd12 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -842,7 +842,8 @@ export type IMetricAggType = MetricAggType; // @public (undocumented) export class IndexPattern implements IIndexPattern { // Warning: (ae-forgotten-export) The symbol "IIndexPatternsApiClient" needs to be exported by the entry point index.d.ts - constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, patternCache: any); + // Warning: (ae-forgotten-export) The symbol "PatternCache" needs to be exported by the entry point index.d.ts + constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, patternCache: PatternCache); // (undocumented) [key: string]: any; // (undocumented) diff --git a/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts b/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts index 952e9628d2846..79b8c33b84cfe 100644 --- a/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts @@ -27,6 +27,7 @@ import { IIndexPattern, injectSearchSourceReferences, } from '../../../data/public'; +import { FailedImport } from './process_import_response'; type SavedObjectsRawDoc = Record; @@ -277,7 +278,7 @@ export async function resolveSavedObjects( // Keep track of how many we actually import because the user // can cancel an override let importedObjectCount = 0; - const failedImports: any[] = []; + const failedImports: FailedImport[] = []; // Start with the index patterns since everything is dependent on them await awaitEachItemInParallel(docTypes.indexPatterns, async (indexPatternDoc) => { try { @@ -291,7 +292,7 @@ export async function resolveSavedObjects( importedObjectCount++; } } catch (error) { - failedImports.push({ indexPatternDoc, error }); + failedImports.push({ obj: indexPatternDoc as any, error }); } }); diff --git a/test/functional/apps/management/_import_objects.js b/test/functional/apps/management/_import_objects.js index 6b40837808387..6306d11eadb65 100644 --- a/test/functional/apps/management/_import_objects.js +++ b/test/functional/apps/management/_import_objects.js @@ -356,7 +356,6 @@ export default function ({ getService, getPageObjects }) { await PageObjects.settings.importFile( path.join(__dirname, 'exports', '_import_objects_with_index_patterns.json') ); - await PageObjects.settings.checkImportFailedWarning(); await PageObjects.settings.clickImportDone(); const objects = await PageObjects.settings.getSavedObjectsInTable(); From c29fcbb46bfde68b437df790f011c3d745c8585c Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:45:06 -0400 Subject: [PATCH 04/91] Bump decompress package version (#68386) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f4d5409f755ce..e47af2c6fe284 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11041,9 +11041,9 @@ decompress-unzip@^4.0.1: yauzl "^2.4.2" decompress@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" - integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" + integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== dependencies: decompress-tar "^4.0.0" decompress-tarbz2 "^4.0.0" From f89e911f64a40744b8d88e3221ee8403a72c9e54 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Mon, 8 Jun 2020 09:47:51 -0400 Subject: [PATCH 05/91] Kibana developer examples landing page (#67049) * Kibana developer examples * Batch explorer tests should be run in examples config * Fix tests * add codeowner for new developer examples plugin & readme cleanup * Try to frame embeddable wording based on what a developer's goals are. * Add noopener noreferer, fix bad merge * Remove bfetch.png Co-authored-by: Elastic Machine --- .github/CODEOWNERS | 1 + examples/alerting_example/kibana.json | 2 +- examples/alerting_example/public/plugin.tsx | 22 +++- examples/bfetch_explorer/kibana.json | 2 +- examples/bfetch_explorer/public/plugin.tsx | 25 +++- examples/developer_examples/README.md | 36 ++++++ examples/developer_examples/kibana.json | 9 ++ examples/developer_examples/navigation.png | Bin 0 -> 28522 bytes examples/developer_examples/public/app.tsx | 117 ++++++++++++++++++ .../developer_examples}/public/index.ts | 6 +- examples/developer_examples/public/plugin.ts | 68 ++++++++++ .../developer_examples/public/types.ts | 16 ++- examples/developer_examples/tsconfig.json | 15 +++ examples/embeddable_explorer/kibana.json | 2 +- .../public/embeddables.png | Bin 0 -> 88399 bytes .../embeddable_explorer/public/plugin.tsx | 31 ++++- examples/search_explorer/kibana.json | 2 +- examples/search_explorer/public/plugin.tsx | 31 ++++- .../state_containers_examples/kibana.json | 2 +- .../public/plugin.ts | 68 +++++++++- .../public/with_data_services/application.tsx | 2 +- .../with_data_services/components/app.tsx | 9 +- examples/ui_actions_explorer/kibana.json | 2 +- .../ui_actions_explorer/public/plugin.tsx | 28 ++++- .../ui_actions_explorer/public/ui_actions.png | Bin 0 -> 108883 bytes .../url_generators_examples/public/plugin.tsx | 3 +- examples/url_generators_explorer/kibana.json | 2 +- .../url_generators_explorer/public/plugin.tsx | 35 +++++- .../bfetch_explorer/batched_function.ts | 5 +- .../bfetch_explorer/index.ts | 7 +- test/examples/config.js | 1 + test/examples/embeddables/index.ts | 4 +- test/examples/search/index.ts | 4 +- test/examples/state_sync/index.ts | 2 - test/examples/state_sync/todo_app.ts | 7 +- test/examples/ui_actions/index.ts | 4 +- test/plugin_functional/config.js | 1 - .../kbn_tp_bfetch_explorer/kibana.json | 10 -- .../kbn_tp_bfetch_explorer/package.json | 17 --- .../kbn_tp_bfetch_explorer/tsconfig.json | 21 ---- 40 files changed, 510 insertions(+), 109 deletions(-) create mode 100644 examples/developer_examples/README.md create mode 100644 examples/developer_examples/kibana.json create mode 100644 examples/developer_examples/navigation.png create mode 100644 examples/developer_examples/public/app.tsx rename {test/plugin_functional/plugins/kbn_tp_bfetch_explorer => examples/developer_examples}/public/index.ts (82%) create mode 100644 examples/developer_examples/public/plugin.ts rename test/plugin_functional/plugins/kbn_tp_bfetch_explorer/server/index.ts => examples/developer_examples/public/types.ts (68%) create mode 100644 examples/developer_examples/tsconfig.json create mode 100644 examples/embeddable_explorer/public/embeddables.png create mode 100644 examples/ui_actions_explorer/public/ui_actions.png rename test/{plugin_functional/test_suites => examples}/bfetch_explorer/batched_function.ts (93%) rename test/{plugin_functional/test_suites => examples}/bfetch_explorer/index.ts (83%) delete mode 100644 test/plugin_functional/plugins/kbn_tp_bfetch_explorer/kibana.json delete mode 100644 test/plugin_functional/plugins/kbn_tp_bfetch_explorer/package.json delete mode 100644 test/plugin_functional/plugins/kbn_tp_bfetch_explorer/tsconfig.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 48d70910f9bf1..472d29ed29413 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -34,6 +34,7 @@ /src/legacy/core_plugins/kibana/public/home/np_ready/ @elastic/kibana-core-ui # App Architecture +/examples/developer_examples/ @elastic/kibana-app-arch /examples/url_generators_examples/ @elastic/kibana-app-arch /examples/url_generators_explorer/ @elastic/kibana-app-arch /packages/kbn-interpreter/ @elastic/kibana-app-arch diff --git a/examples/alerting_example/kibana.json b/examples/alerting_example/kibana.json index 2b6389649cef9..6c04218ca45e2 100644 --- a/examples/alerting_example/kibana.json +++ b/examples/alerting_example/kibana.json @@ -4,6 +4,6 @@ "kibanaVersion": "kibana", "server": true, "ui": true, - "requiredPlugins": ["triggers_actions_ui", "charts", "data", "alerts", "actions"], + "requiredPlugins": ["triggers_actions_ui", "charts", "data", "alerts", "actions", "developerExamples"], "optionalPlugins": [] } diff --git a/examples/alerting_example/public/plugin.tsx b/examples/alerting_example/public/plugin.tsx index 524ff18bd434e..f0635a1071f64 100644 --- a/examples/alerting_example/public/plugin.tsx +++ b/examples/alerting_example/public/plugin.tsx @@ -17,7 +17,7 @@ * under the License. */ -import { Plugin, CoreSetup, AppMountParameters } from 'kibana/public'; +import { Plugin, CoreSetup, AppMountParameters, AppNavLinkStatus } from '../../../src/core/public'; import { PluginSetupContract as AlertingSetup } from '../../../x-pack/plugins/alerts/public'; import { ChartsPluginStart } from '../../../src/plugins/charts/public'; import { TriggersAndActionsUIPublicPluginSetup } from '../../../x-pack/plugins/triggers_actions_ui/public'; @@ -25,6 +25,7 @@ import { DataPublicPluginStart } from '../../../src/plugins/data/public'; import { getAlertType as getAlwaysFiringAlertType } from './alert_types/always_firing'; import { getAlertType as getPeopleInSpaceAlertType } from './alert_types/astros'; import { registerNavigation } from './alert_types'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; export type Setup = void; export type Start = void; @@ -32,6 +33,7 @@ export type Start = void; export interface AlertingExamplePublicSetupDeps { alerts: AlertingSetup; triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; + developerExamples: DeveloperExamplesSetup; } export interface AlertingExamplePublicStartDeps { @@ -44,11 +46,12 @@ export interface AlertingExamplePublicStartDeps { export class AlertingExamplePlugin implements Plugin { public setup( core: CoreSetup, - { alerts, triggers_actions_ui }: AlertingExamplePublicSetupDeps + { alerts, triggers_actions_ui, developerExamples }: AlertingExamplePublicSetupDeps ) { core.application.register({ id: 'AlertingExample', title: 'Alerting Example', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const [coreStart, depsStart] = await core.getStartServices(); const { renderApp } = await import('./application'); @@ -60,6 +63,21 @@ export class AlertingExamplePlugin implements Plugin Promise<{ num: number }>; @@ -27,6 +28,7 @@ export interface ExplorerService { export interface BfetchExplorerSetupPlugins { bfetch: BfetchPublicSetup; + developerExamples: DeveloperExamplesSetup; } export interface BfetchExplorerStartPlugins { @@ -36,9 +38,9 @@ export interface BfetchExplorerStartPlugins { export class BfetchExplorerPlugin implements Plugin { public setup( core: CoreSetup, - plugins: BfetchExplorerSetupPlugins + { bfetch, developerExamples }: BfetchExplorerSetupPlugins ) { - const double = plugins.bfetch.batchedFunction<{ num: number }, { num: number }>({ + const double = bfetch.batchedFunction<{ num: number }, { num: number }>({ url: '/bfetch_explorer/double', }); @@ -49,8 +51,25 @@ export class BfetchExplorerPlugin implements Plugin { core.application.register({ id: 'bfetch-explorer', title: 'bfetch explorer', + navLinkStatus: AppNavLinkStatus.hidden, mount: mount(core, explorer), }); + + developerExamples.register({ + appId: 'bfetch-explorer', + title: 'bfetch', + description: + 'bfetch is a service that allows to batch HTTP requests and streams responses back.', + links: [ + { + label: 'README', + href: 'https://github.com/elastic/kibana/blob/master/src/plugins/bfetch/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); } public start() {} diff --git a/examples/developer_examples/README.md b/examples/developer_examples/README.md new file mode 100644 index 0000000000000..1a57838c43d24 --- /dev/null +++ b/examples/developer_examples/README.md @@ -0,0 +1,36 @@ +## Developer examples + +Owner: Kibana application architecture team + +The developer examples app is a landing page where developers go to search for working, tested examples of various developer +services. Add your a link to your example using the developerExamples `register` function offered on the `setup` contract: + +```ts + setup(core, { developerExamples }) { + developerExamples.register({ + appId: 'myFooExampleApp', + title: 'Foo services', + description: `Foo services let you do bar and zed.`, + links: [ + { + label: 'README', + href: 'https://github.com/elastic/kibana/tree/master/src/plugins/foo/README.md', + iconType: 'logoGithub', + target: '_blank', + size: 's', + }, + ], + image: img, + }); + } +``` + +Run Kibana with developer examples via: + +``` +yarn start --run-examples +``` + +Then navigate to "Developer examples": + + diff --git a/examples/developer_examples/kibana.json b/examples/developer_examples/kibana.json new file mode 100644 index 0000000000000..8c9ec2e4dcbfc --- /dev/null +++ b/examples/developer_examples/kibana.json @@ -0,0 +1,9 @@ +{ + "id": "developerExamples", + "version": "0.0.1", + "kibanaVersion": "kibana", + "server": false, + "ui": true, + "requiredPlugins": [], + "optionalPlugins": [] +} diff --git a/examples/developer_examples/navigation.png b/examples/developer_examples/navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..ac72f697e5db08e792b6ab5308e087de037cad47 GIT binary patch literal 28522 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 void; + getUrlForApp: (appId: string) => string; +} + +function DeveloperExamples({ examples, navigateToApp, getUrlForApp }: Props) { + const [search, setSearch] = useState(''); + + const lcSearch = search.toLowerCase(); + const filteredExamples = !lcSearch + ? examples + : examples.filter((def) => { + if (def.description.toLowerCase().indexOf(lcSearch) >= 0) return true; + if (def.title.toLowerCase().indexOf(lcSearch) >= 0) return true; + return false; + }); + + return ( + + + +

Developer examples

+

+ The following examples showcase services and APIs that are available to developers. + setSearch(e.target.value)} + isClearable={true} + aria-label="Search developer examples" + /> +

+
+
+ + {filteredExamples.map((def) => ( + + + {def.description} + + } + title={ + + { + navigateToApp(def.appId); + }} + > + + {def.title} + + + + window.open(getUrlForApp(def.appId), '_blank', 'noopener, noreferrer') + } + > + Open in new tab + + + } + image={def.image} + footer={def.links ? : undefined} + /> + + ))} + +
+ ); +} + +export const renderApp = (props: Props, element: AppMountParameters['element']) => { + ReactDOM.render(, element); + + return () => ReactDOM.unmountComponentAtNode(element); +}; diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/public/index.ts b/examples/developer_examples/public/index.ts similarity index 82% rename from test/plugin_functional/plugins/kbn_tp_bfetch_explorer/public/index.ts rename to examples/developer_examples/public/index.ts index 547dfe2aa38d2..616fb011e3705 100644 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/public/index.ts +++ b/examples/developer_examples/public/index.ts @@ -17,4 +17,8 @@ * under the License. */ -export * from '../../../../../examples/bfetch_explorer/public'; +import { DeveloperExamplesPlugin } from './plugin'; + +export const plugin = () => new DeveloperExamplesPlugin(); + +export { DeveloperExamplesSetup } from './plugin'; diff --git a/examples/developer_examples/public/plugin.ts b/examples/developer_examples/public/plugin.ts new file mode 100644 index 0000000000000..a0aa601660f37 --- /dev/null +++ b/examples/developer_examples/public/plugin.ts @@ -0,0 +1,68 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import { + CoreSetup, + Plugin, + AppMountParameters, + DEFAULT_APP_CATEGORIES, +} from '../../../src/core/public'; + +import { ExampleDefinition } from './types'; + +export interface DeveloperExamplesSetup { + register: (def: ExampleDefinition) => void; +} + +export class DeveloperExamplesPlugin implements Plugin { + private examplesRegistry: ExampleDefinition[] = []; + + public setup(core: CoreSetup) { + const examples = this.examplesRegistry; + core.application.register({ + id: 'developerExamples', + title: 'Developer examples', + order: -2000, + category: DEFAULT_APP_CATEGORIES.kibana, + async mount(params: AppMountParameters) { + const { renderApp } = await import('./app'); + const [coreStart] = await core.getStartServices(); + return renderApp( + { + examples, + navigateToApp: (appId: string) => coreStart.application.navigateToApp(appId), + getUrlForApp: (appId: string) => coreStart.application.getUrlForApp(appId), + }, + params.element + ); + }, + }); + + const api: DeveloperExamplesSetup = { + register: (def) => { + this.examplesRegistry.push(def); + }, + }; + return api; + } + + public start() {} + + public stop() {} +} diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/server/index.ts b/examples/developer_examples/public/types.ts similarity index 68% rename from test/plugin_functional/plugins/kbn_tp_bfetch_explorer/server/index.ts rename to examples/developer_examples/public/types.ts index b4370eb53311e..0ef359ef64a23 100644 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/server/index.ts +++ b/examples/developer_examples/public/types.ts @@ -17,4 +17,18 @@ * under the License. */ -export * from '../../../../../examples/bfetch_explorer/server'; +import { EuiListGroupItemProps } from '@elastic/eui'; + +export interface ExampleDefinition { + /** + * The application id that is the landing page for the example. + */ + appId: string; + title: string; + description: string; + image?: string; + /** + * Any additional links you want to show, for example to the github README. + */ + links?: EuiListGroupItemProps[]; +} diff --git a/examples/developer_examples/tsconfig.json b/examples/developer_examples/tsconfig.json new file mode 100644 index 0000000000000..d508076b33199 --- /dev/null +++ b/examples/developer_examples/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./target", + "skipLibCheck": true + }, + "include": [ + "index.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../typings/**/*", + ], + "exclude": [] +} diff --git a/examples/embeddable_explorer/kibana.json b/examples/embeddable_explorer/kibana.json index 3e4b074fb6b12..aa14549d0460f 100644 --- a/examples/embeddable_explorer/kibana.json +++ b/examples/embeddable_explorer/kibana.json @@ -4,6 +4,6 @@ "kibanaVersion": "kibana", "server": false, "ui": true, - "requiredPlugins": ["uiActions", "inspector", "embeddable", "embeddableExamples"], + "requiredPlugins": ["uiActions", "inspector", "embeddable", "embeddableExamples", "developerExamples"], "optionalPlugins": [] } diff --git a/examples/embeddable_explorer/public/embeddables.png b/examples/embeddable_explorer/public/embeddables.png new file mode 100644 index 0000000000000000000000000000000000000000..90b287962d24823c6717265bee595c9b746ba0e1 GIT binary patch literal 88399 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%0DD=Jqw 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

^U2q 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 literal 0 HcmV?d00001 diff --git a/examples/embeddable_explorer/public/plugin.tsx b/examples/embeddable_explorer/public/plugin.tsx index bba1b1748e207..2a5023d2dd63a 100644 --- a/examples/embeddable_explorer/public/plugin.tsx +++ b/examples/embeddable_explorer/public/plugin.tsx @@ -16,12 +16,13 @@ * specific language governing permissions and limitations * under the License. */ - -import { Plugin, CoreSetup, AppMountParameters } from 'kibana/public'; import { EmbeddableExamplesStart } from 'examples/embeddable_examples/public/plugin'; +import { Plugin, CoreSetup, AppMountParameters, AppNavLinkStatus } from '../../../src/core/public'; import { UiActionsService } from '../../../src/plugins/ui_actions/public'; import { EmbeddableStart } from '../../../src/plugins/embeddable/public'; import { Start as InspectorStart } from '../../../src/plugins/inspector/public'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; +import img from './embeddables.png'; interface StartDeps { uiActions: UiActionsService; @@ -30,11 +31,16 @@ interface StartDeps { embeddableExamples: EmbeddableExamplesStart; } +interface SetupDeps { + developerExamples: DeveloperExamplesSetup; +} + export class EmbeddableExplorerPlugin implements Plugin { - public setup(core: CoreSetup) { + public setup(core: CoreSetup, { developerExamples }: SetupDeps) { core.application.register({ id: 'embeddableExplorer', title: 'Embeddable explorer', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const [coreStart, depsStart] = await core.getStartServices(); const { renderApp } = await import('./app'); @@ -55,6 +61,25 @@ export class EmbeddableExplorerPlugin implements Plugin) { + public setup( + core: CoreSetup, + { developerExamples }: SetupDeps + ) { core.application.register({ id: 'searchExplorer', title: 'Search Explorer', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const [coreStart, depsStart] = await core.getStartServices(); const { renderApp } = await import('./application'); return renderApp(coreStart, depsStart, params); }, }); + + developerExamples.register({ + appId: 'searchExplorer', + title: 'Data search strategy services', + description: `Data search services can be used to query Elasticsearch in away that supports background search + and partial results, when available. It also automatically incorporates settings such as requestTimeout and includeFrozen. + Use the provided ES search strategy, or register your own. + `, + links: [ + { + label: 'README', + href: + 'https://github.com/elastic/kibana/blob/master/src/plugins/data/public/search/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); } public start() {} diff --git a/examples/state_containers_examples/kibana.json b/examples/state_containers_examples/kibana.json index 581b399e3ffba..66da207cb4e77 100644 --- a/examples/state_containers_examples/kibana.json +++ b/examples/state_containers_examples/kibana.json @@ -4,6 +4,6 @@ "kibanaVersion": "kibana", "server": true, "ui": true, - "requiredPlugins": ["navigation", "data"], + "requiredPlugins": ["navigation", "data", "developerExamples"], "optionalPlugins": [] } diff --git a/examples/state_containers_examples/public/plugin.ts b/examples/state_containers_examples/public/plugin.ts index 38ebf315789c0..a4cf7dfd798f3 100644 --- a/examples/state_containers_examples/public/plugin.ts +++ b/examples/state_containers_examples/public/plugin.ts @@ -17,15 +17,21 @@ * under the License. */ -import { AppMountParameters, CoreSetup, Plugin } from 'kibana/public'; +import { AppMountParameters, CoreSetup, Plugin, AppNavLinkStatus } from '../../../src/core/public'; import { AppPluginDependencies } from './with_data_services/types'; import { PLUGIN_ID, PLUGIN_NAME } from '../common'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; + +interface SetupDeps { + developerExamples: DeveloperExamplesSetup; +} export class StateContainersExamplesPlugin implements Plugin { - public setup(core: CoreSetup) { + public setup(core: CoreSetup, { developerExamples }: SetupDeps) { core.application.register({ id: 'stateContainersExampleBrowserHistory', title: 'State containers example - browser history routing', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const { renderApp, History } = await import('./todo/app'); return renderApp(params, { @@ -38,6 +44,7 @@ export class StateContainersExamplesPlugin implements Plugin { core.application.register({ id: 'stateContainersExampleHashHistory', title: 'State containers example - hash history routing', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const { renderApp, History } = await import('./todo/app'); return renderApp(params, { @@ -51,6 +58,7 @@ export class StateContainersExamplesPlugin implements Plugin { core.application.register({ id: PLUGIN_ID, title: PLUGIN_NAME, + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { // Load application bundle const { renderApp } = await import('./with_data_services/application'); @@ -60,6 +68,62 @@ export class StateContainersExamplesPlugin implements Plugin { return renderApp(coreStart, depsStart as AppPluginDependencies, params); }, }); + + developerExamples.register({ + appId: 'stateContainersExampleBrowserHistory', + title: 'State containers using browser history', + description: `An example todo app that uses browser history and state container utilities like createStateContainerReactHelpers, + createStateContainer, createKbnUrlStateStorage, createSessionStorageStateStorage, + syncStates and getStateFromKbnUrl to keep state in sync with the URL. Change some parameters, navigate away and then back, and the + state should be preserved.`, + links: [ + { + label: 'README', + href: + 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); + + developerExamples.register({ + appId: 'stateContainersExampleHashHistory', + title: 'State containers using hash history', + description: `An example todo app that uses hash history and state container utilities like createStateContainerReactHelpers, + createStateContainer, createKbnUrlStateStorage, createSessionStorageStateStorage, + syncStates and getStateFromKbnUrl to keep state in sync with the URL. Change some parameters, navigate away and then back, and the + state should be preserved.`, + links: [ + { + label: 'README', + href: + 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); + + developerExamples.register({ + appId: PLUGIN_ID, + title: 'Sync state from a query bar with the url', + description: `Shows how to use data.syncQueryStateWitUrl in combination with state container utilities from kibana_utils to + show a query bar that stores state in the url and is kept in sync. + `, + links: [ + { + label: 'README', + href: + 'https://github.com/elastic/kibana/blob/master/src/plugins/data/public/query/state_sync/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); } public start() {} diff --git a/examples/state_containers_examples/public/with_data_services/application.tsx b/examples/state_containers_examples/public/with_data_services/application.tsx index 67a2a8b791ae5..d09b77fbf25ee 100644 --- a/examples/state_containers_examples/public/with_data_services/application.tsx +++ b/examples/state_containers_examples/public/with_data_services/application.tsx @@ -27,7 +27,7 @@ import { createKbnUrlStateStorage } from '../../../../src/plugins/kibana_utils/p export const renderApp = ( { notifications, http }: CoreStart, { navigation, data }: AppPluginDependencies, - { appBasePath, element, history }: AppMountParameters + { element, history }: AppMountParameters ) => { const kbnUrlStateStorage = createKbnUrlStateStorage({ useHash: false, history }); diff --git a/examples/state_containers_examples/public/with_data_services/components/app.tsx b/examples/state_containers_examples/public/with_data_services/components/app.tsx index baf627fd62a32..04bdb53efa502 100644 --- a/examples/state_containers_examples/public/with_data_services/components/app.tsx +++ b/examples/state_containers_examples/public/with_data_services/components/app.tsx @@ -78,14 +78,7 @@ const { useContainer: useAppStateContainer, } = createStateContainerReactHelpers>(); -const App = ({ - notifications, - http, - navigation, - data, - history, - kbnUrlStateStorage, -}: StateDemoAppDeps) => { +const App = ({ navigation, data, history, kbnUrlStateStorage }: StateDemoAppDeps) => { const appStateContainer = useAppStateContainer(); const appState = useAppState(); diff --git a/examples/ui_actions_explorer/kibana.json b/examples/ui_actions_explorer/kibana.json index e88739a9e44d6..f57072e89b06d 100644 --- a/examples/ui_actions_explorer/kibana.json +++ b/examples/ui_actions_explorer/kibana.json @@ -4,6 +4,6 @@ "kibanaVersion": "kibana", "server": false, "ui": true, - "requiredPlugins": ["uiActions", "uiActionsExamples"], + "requiredPlugins": ["uiActions", "uiActionsExamples", "developerExamples"], "optionalPlugins": [] } diff --git a/examples/ui_actions_explorer/public/plugin.tsx b/examples/ui_actions_explorer/public/plugin.tsx index de86b51aee3a8..670138b43b9c4 100644 --- a/examples/ui_actions_explorer/public/plugin.tsx +++ b/examples/ui_actions_explorer/public/plugin.tsx @@ -17,8 +17,8 @@ * under the License. */ -import { Plugin, CoreSetup, AppMountParameters } from 'kibana/public'; -import { UiActionsStart, UiActionsSetup } from 'src/plugins/ui_actions/public'; +import { UiActionsStart, UiActionsSetup } from '../../../src/plugins/ui_actions/public'; +import { Plugin, CoreSetup, AppMountParameters, AppNavLinkStatus } from '../../../src/core/public'; import { PHONE_TRIGGER, USER_TRIGGER, @@ -39,6 +39,8 @@ import { ACTION_VIEW_IN_MAPS, ACTION_PHONE_USER, } from './actions/actions'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; +import image from './ui_actions.png'; interface StartDeps { uiActions: UiActionsStart; @@ -46,6 +48,7 @@ interface StartDeps { interface SetupDeps { uiActions: UiActionsSetup; + developerExamples: DeveloperExamplesSetup; } declare module '../../../src/plugins/ui_actions/public' { @@ -66,7 +69,7 @@ declare module '../../../src/plugins/ui_actions/public' { } export class UiActionsExplorerPlugin implements Plugin { - public setup(core: CoreSetup<{ uiActions: UiActionsStart }>, deps: SetupDeps) { + public setup(core: CoreSetup, deps: SetupDeps) { deps.uiActions.registerTrigger({ id: COUNTRY_TRIGGER, }); @@ -98,6 +101,7 @@ export class UiActionsExplorerPlugin implements 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%0A1oI=Hc7h?x?s1Q}vv~W7j#?*+P{x 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 literal 0 HcmV?d00001 diff --git a/examples/url_generators_examples/public/plugin.tsx b/examples/url_generators_examples/public/plugin.tsx index 016494037ec05..77f7d66ccf103 100644 --- a/examples/url_generators_examples/public/plugin.tsx +++ b/examples/url_generators_examples/public/plugin.tsx @@ -18,7 +18,7 @@ */ import { SharePluginStart, SharePluginSetup } from '../../../src/plugins/share/public'; -import { Plugin, CoreSetup, AppMountParameters } from '../../../src/core/public'; +import { Plugin, CoreSetup, AppMountParameters, AppNavLinkStatus } from '../../../src/core/public'; import { HelloLinkGeneratorState, createHelloPageLinkGenerator, @@ -58,6 +58,7 @@ export class AccessLinksExamplesPlugin implements Plugin { - public setup(core: CoreSetup) { +interface SetupDeps { + developerExamples: DeveloperExamplesSetup; +} + +export class AccessLinksExplorerPlugin implements Plugin { + public setup(core: CoreSetup, { developerExamples }: SetupDeps) { core.application.register({ id: 'urlGeneratorsExplorer', title: 'Access links explorer', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const depsStart = (await core.getStartServices())[1]; const { renderApp } = await import('./app'); @@ -40,6 +45,26 @@ export class AccessLinksExplorerPlugin implements Plugin { beforeEach(async () => { - await appsMenu.clickLink('bfetch explorer'); await testSubjects.click('count-until'); await testSubjects.click('double-integers'); }); diff --git a/test/plugin_functional/test_suites/bfetch_explorer/index.ts b/test/examples/bfetch_explorer/index.ts similarity index 83% rename from test/plugin_functional/test_suites/bfetch_explorer/index.ts rename to test/examples/bfetch_explorer/index.ts index a68a5090b9bed..1f039a2ea415c 100644 --- a/test/plugin_functional/test_suites/bfetch_explorer/index.ts +++ b/test/examples/bfetch_explorer/index.ts @@ -17,18 +17,17 @@ * under the License. */ -import { FtrProviderContext } from '../../../functional/ftr_provider_context'; +import { FtrProviderContext } from '../../functional/ftr_provider_context'; +// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects, loadTestFile }: FtrProviderContext) { const browser = getService('browser'); - const appsMenu = getService('appsMenu'); const PageObjects = getPageObjects(['common', 'header']); describe('bfetch explorer', function () { before(async () => { await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); - await appsMenu.clickLink('bfetch explorer'); + await PageObjects.common.navigateToApp('bfetch-explorer', { insertTimestamp: false }); }); loadTestFile(require.resolve('./batched_function')); diff --git a/test/examples/config.js b/test/examples/config.js index aedd06c31d413..228af71a1f5d0 100644 --- a/test/examples/config.js +++ b/test/examples/config.js @@ -27,6 +27,7 @@ export default async function ({ readConfigFile }) { testFiles: [ require.resolve('./search'), require.resolve('./embeddables'), + require.resolve('./bfetch_explorer'), require.resolve('./ui_actions'), require.resolve('./state_sync'), ], diff --git a/test/examples/embeddables/index.ts b/test/examples/embeddables/index.ts index 878b1b9277ba1..d0d7d4a01fbae 100644 --- a/test/examples/embeddables/index.ts +++ b/test/examples/embeddables/index.ts @@ -26,14 +26,12 @@ export default function ({ loadTestFile, }: PluginFunctionalProviderContext) { const browser = getService('browser'); - const appsMenu = getService('appsMenu'); const PageObjects = getPageObjects(['common', 'header']); describe('embeddable explorer', function () { before(async () => { await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); - await appsMenu.clickLink('Embeddable explorer'); + await PageObjects.common.navigateToApp('embeddableExplorer'); }); loadTestFile(require.resolve('./hello_world_embeddable')); diff --git a/test/examples/search/index.ts b/test/examples/search/index.ts index 2fb37afd248e2..706e9659fc010 100644 --- a/test/examples/search/index.ts +++ b/test/examples/search/index.ts @@ -22,7 +22,6 @@ import { FtrProviderContext } from 'test/functional/ftr_provider_context'; // eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects, loadTestFile }: FtrProviderContext) { const browser = getService('browser'); - const appsMenu = getService('appsMenu'); const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const PageObjects = getPageObjects(['common', 'header']); @@ -36,8 +35,7 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid defaultIndex: 'logstash-*', }); await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); - await appsMenu.clickLink('Search Explorer'); + await PageObjects.common.navigateToApp('searchExplorer'); }); after(async function () { diff --git a/test/examples/state_sync/index.ts b/test/examples/state_sync/index.ts index ea1c7692f64fe..297cd8f472b95 100644 --- a/test/examples/state_sync/index.ts +++ b/test/examples/state_sync/index.ts @@ -26,12 +26,10 @@ export default function ({ loadTestFile, }: PluginFunctionalProviderContext) { const browser = getService('browser'); - const PageObjects = getPageObjects(['common']); describe('state sync examples', function () { before(async () => { await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); }); loadTestFile(require.resolve('./todo_app')); diff --git a/test/examples/state_sync/todo_app.ts b/test/examples/state_sync/todo_app.ts index 71b491a05ae2f..1ac5376b9ed8d 100644 --- a/test/examples/state_sync/todo_app.ts +++ b/test/examples/state_sync/todo_app.ts @@ -26,7 +26,6 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide const testSubjects = getService('testSubjects'); const find = getService('find'); const retry = getService('retry'); - const appsMenu = getService('appsMenu'); const browser = getService('browser'); const PageObjects = getPageObjects(['common']); const log = getService('log'); @@ -38,7 +37,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide before(async () => { base = await PageObjects.common.getHostPort(); - await appsMenu.clickLink('State containers example - browser history routing'); + await PageObjects.common.navigateToApp(appId, { insertTimestamp: false }); }); it('links are rendered correctly and state is preserved in links', async () => { @@ -119,7 +118,9 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide describe('TODO app with hash history ', async () => { before(async () => { - await appsMenu.clickLink('State containers example - hash history routing'); + await PageObjects.common.navigateToApp('stateContainersExampleHashHistory', { + insertTimestamp: false, + }); }); it('Links are rendered correctly and state is preserved in links', async () => { diff --git a/test/examples/ui_actions/index.ts b/test/examples/ui_actions/index.ts index 55137e2acc2b7..957cd0c46e1d0 100644 --- a/test/examples/ui_actions/index.ts +++ b/test/examples/ui_actions/index.ts @@ -26,14 +26,12 @@ export default function ({ loadTestFile, }: PluginFunctionalProviderContext) { const browser = getService('browser'); - const appsMenu = getService('appsMenu'); const PageObjects = getPageObjects(['common', 'header']); describe('ui actions explorer', function () { before(async () => { await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); - await appsMenu.clickLink('Ui Actions Explorer'); + await PageObjects.common.navigateToApp('uiActionsExplorer'); }); loadTestFile(require.resolve('./ui_actions')); diff --git a/test/plugin_functional/config.js b/test/plugin_functional/config.js index 9039f7e734a6e..74d52b842662b 100644 --- a/test/plugin_functional/config.js +++ b/test/plugin_functional/config.js @@ -37,7 +37,6 @@ export default async function ({ readConfigFile }) { require.resolve('./test_suites/embeddable_explorer'), require.resolve('./test_suites/core_plugins'), require.resolve('./test_suites/management'), - require.resolve('./test_suites/bfetch_explorer'), require.resolve('./test_suites/doc_views'), ], services: { diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/kibana.json b/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/kibana.json deleted file mode 100644 index 1acc7df871c94..0000000000000 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/kibana.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "kbn_tp_bfetch_explorer", - "version": "0.0.1", - "kibanaVersion": "kibana", - "configPath": ["kbn_tp_bfetch_explorer"], - "server": true, - "ui": true, - "requiredPlugins": ["bfetch"], - "optionalPlugins": [] -} diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/package.json b/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/package.json deleted file mode 100644 index e396489a1ffc4..0000000000000 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "kbn_tp_bfetch_explorer", - "version": "1.0.0", - "main": "target/examples/kbn_tp_bfetch_explorer", - "kibana": { - "version": "kibana", - "templateVersion": "1.0.0" - }, - "license": "Apache-2.0", - "scripts": { - "kbn": "node ../../scripts/kbn.js", - "build": "rm -rf './target' && tsc" - }, - "devDependencies": { - "typescript": "3.7.2" - } -} diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/tsconfig.json b/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/tsconfig.json deleted file mode 100644 index 994f81e396763..0000000000000 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "./target", - "skipLibCheck": true, - "types": [ - "node", - "jest", - "react" - ] - }, - "include": [ - "index.ts", - "public/**/*.ts", - "public/**/*.tsx", - "server/**/*.ts", - "server/**/*.tsx", - "../../../../typings/**/*", - ], - "exclude": [] -} From e66eaf74fd5b02a8466864d3df80a7457a4568c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez?= Date: Mon, 8 Jun 2020 15:49:26 +0200 Subject: [PATCH 06/91] [Logs UI] View in context tweaks (#67777) Co-authored-by: Elastic Machine --- .../log_entry_actions_column.tsx | 56 +++++++++---------- .../logs/stream/page_view_log_in_context.tsx | 54 ++++++++++++------ .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 4 files changed, 64 insertions(+), 48 deletions(-) diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx index 1ac2e00abca70..e27de7fd6b5a8 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx @@ -5,19 +5,11 @@ */ import React, { useCallback } from 'react'; -import { EuiButtonIcon } from '@elastic/eui'; +import { EuiButtonIcon, EuiPopover, EuiContextMenuPanel, EuiContextMenuItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; import { LogEntryColumnContent } from './log_entry_column'; -import { - euiStyled, - ActionMenu, - Section, - SectionTitle, - SectionLinks, - SectionLink, -} from '../../../../../observability/public'; +import { euiStyled } from '../../../../../observability/public'; interface LogEntryActionsColumnProps { isHovered: boolean; @@ -78,29 +70,32 @@ export const LogEntryActionsColumn: React.FC = ({ ); + const items = [ + + {LOG_DETAILS_LABEL} + , + ]; + + if (onViewLogInContext !== undefined) { + items.push( + + {LOG_VIEW_IN_CONTEXT_LABEL} + + ); + } + return ( {isHovered || isMenuOpen ? ( - -

- - - - - - {onViewLogInContext !== undefined ? ( - - ) : null} - -
- + + + ) : null} @@ -115,10 +110,11 @@ const ActionsColumnContent = euiStyled(LogEntryColumnContent)` const ButtonWrapper = euiStyled.div` background: ${(props) => props.theme.eui.euiColorPrimary}; border-radius: 50%; + padding: 4px; + transform: translateY(-6px); `; // this prevents the button from influencing the line height const AbsoluteWrapper = euiStyled.div` - overflow: hidden; position: absolute; `; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx index cf3eae263ed59..3ef32c920e293 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx @@ -8,12 +8,13 @@ import { EuiFlexGroup, EuiFlexItem, EuiModal, - EuiModalBody, EuiOverlayMask, EuiText, EuiTextColor, EuiToolTip, + EuiSpacer, } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import { noop } from 'lodash'; import React, { useCallback, useContext, useMemo } from 'react'; import { LogEntry } from '../../../../common/http_api'; @@ -22,6 +23,7 @@ import { useLogSourceContext } from '../../../containers/logs/log_source'; import { LogViewConfiguration } from '../../../containers/logs/log_view_configuration'; import { ViewLogInContext } from '../../../containers/logs/view_log_in_context'; import { useViewportDimensions } from '../../../utils/use_viewport_dimensions'; +import { euiStyled } from '../../../../../observability/public'; const MODAL_MARGIN = 25; @@ -55,7 +57,7 @@ export const PageViewLogInContext: React.FC = () => { return ( - + { > + { /> - + ); }; +const LogInContextWrapper = euiStyled.div<{ width: number | string; height: number | string }>` + padding: 16px; + width: ${(props) => (typeof props.width === 'number' ? `${props.width}px` : props.width)}; + height: ${(props) => (typeof props.height === 'number' ? `${props.height}px` : props.height)}; +`; + const LogEntryContext: React.FC<{ context: LogEntry['context'] }> = ({ context }) => { + let text; if ('container.id' in context) { - return

Displayed logs are from container {context['container.id']}

; + text = ( + + ); } if ('host.name' in context) { @@ -105,21 +121,27 @@ const LogEntryContext: React.FC<{ context: LogEntry['context'] }> = ({ context } context['log.file.path'].length > 45 ? context['log.file.path'].slice(0, 20) + '...' + context['log.file.path'].slice(-25) : context['log.file.path']; - - return ( - -

- - Displayed logs are from file{' '} + text = ( + {shortenedFilePath} - {' '} - and host {context['host.name']} - -

-
+ + ), + host: context['host.name'], + }} + /> ); } - return null; + return ( + +

+ {text} +

+
+ ); }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 9d3bc008106c6..aa45fd4bcb292 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -7605,7 +7605,6 @@ "xpack.infra.logs.lastUpdate": "前回の更新 {timestamp}", "xpack.infra.logs.loadingNewEntriesText": "新しいエントリーを読み込み中", "xpack.infra.logs.logEntryActionsDetailsButton": "詳細を表示", - "xpack.infra.logs.logEntryActionsMenuTitle": "行詳細のログ", "xpack.infra.logs.logEntryCategories.analyzeCategoryInMlButtonLabel": "ML で分析", "xpack.infra.logs.logEntryCategories.analyzeCategoryInMlTooltipDescription": "ML アプリでこのカテゴリーを分析します。", "xpack.infra.logs.logEntryCategories.categoryColumnTitle": "カテゴリー", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 6992d4004e24e..56d373a6fcd2f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7609,7 +7609,6 @@ "xpack.infra.logs.lastUpdate": "上次更新时间 {timestamp}", "xpack.infra.logs.loadingNewEntriesText": "正在加载新条目", "xpack.infra.logs.logEntryActionsDetailsButton": "查看详情", - "xpack.infra.logs.logEntryActionsMenuTitle": "日志行详情", "xpack.infra.logs.logEntryCategories.analyzeCategoryInMlButtonLabel": "在 ML 中分析", "xpack.infra.logs.logEntryCategories.analyzeCategoryInMlTooltipDescription": "在 ML 应用中分析此类别。", "xpack.infra.logs.logEntryCategories.categoryColumnTitle": "类别", From fcab9745e0691af3878d7538681011b381ae2c71 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Mon, 8 Jun 2020 17:29:20 +0300 Subject: [PATCH 07/91] [Telemetry] collect number of visualization saved in the past 7, 30 and 90 days (#67865) * Update telemetry for visualizations to also count the vis from the past 30 and 90 days * Also add metrics for the saved visualizations for the past 7 days Co-authored-by: Elastic Machine --- .../server/lib/get_past_days.test.ts | 22 +++++ .../oss_telemetry/server/lib/get_past_days.ts | 11 +++ .../tasks/visualizations/task_runner.test.ts | 92 ++++++++++++++++--- .../lib/tasks/visualizations/task_runner.ts | 14 ++- .../oss_telemetry/server/test_utils/index.ts | 2 + 5 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 x-pack/plugins/oss_telemetry/server/lib/get_past_days.test.ts create mode 100644 x-pack/plugins/oss_telemetry/server/lib/get_past_days.ts diff --git a/x-pack/plugins/oss_telemetry/server/lib/get_past_days.test.ts b/x-pack/plugins/oss_telemetry/server/lib/get_past_days.test.ts new file mode 100644 index 0000000000000..28909779343a5 --- /dev/null +++ b/x-pack/plugins/oss_telemetry/server/lib/get_past_days.test.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import moment from 'moment'; +import { getPastDays } from './get_past_days'; + +describe('getPastDays', () => { + test('Returns 2 days that have passed from the current date', () => { + const pastDate = moment().subtract(2, 'days').startOf('day').toString(); + + expect(getPastDays(pastDate)).toEqual(2); + }); + + test('Returns 30 days that have passed from the current date', () => { + const pastDate = moment().subtract(30, 'days').startOf('day').toString(); + + expect(getPastDays(pastDate)).toEqual(30); + }); +}); diff --git a/x-pack/plugins/oss_telemetry/server/lib/get_past_days.ts b/x-pack/plugins/oss_telemetry/server/lib/get_past_days.ts new file mode 100644 index 0000000000000..4f25ef147ad43 --- /dev/null +++ b/x-pack/plugins/oss_telemetry/server/lib/get_past_days.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +export const getPastDays = (dateString: string): number => { + const date = new Date(dateString); + const today = new Date(); + const diff = Math.abs(date.getTime() - today.getTime()); + return Math.trunc(diff / (1000 * 60 * 60 * 24)); +}; diff --git a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts index 6a47983a6f4d9..c064f39f4bc6a 100644 --- a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts @@ -13,6 +13,7 @@ import { import { visualizationsTaskRunner } from './task_runner'; import { TaskInstance } from '../../../../../task_manager/server'; import { getNextMidnight } from '../../get_next_midnight'; +import moment from 'moment'; describe('visualizationsTaskRunner', () => { let mockTaskInstance: TaskInstance; @@ -55,6 +56,9 @@ describe('visualizationsTaskRunner', () => { spaces_max: 1, spaces_min: 1, total: 1, + saved_7_days_total: 1, + saved_30_days_total: 1, + saved_90_days_total: 1, }, }, }, @@ -69,6 +73,7 @@ describe('visualizationsTaskRunner', () => { _source: { type: 'visualization', visualization: { visState: '{"type": "cave_painting"}' }, + updated_at: moment().subtract(7, 'days').startOf('day').toString(), }, }, { @@ -76,11 +81,16 @@ describe('visualizationsTaskRunner', () => { _source: { type: 'visualization', visualization: { visState: '{"type": "printing_press"}' }, + updated_at: moment().subtract(20, 'days').startOf('day').toString(), }, }, { _id: 'meat:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "floppy_disk"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "floppy_disk"}' }, + updated_at: moment().subtract(2, 'months').startOf('day').toString(), + }, }, // meat space { @@ -88,38 +98,99 @@ describe('visualizationsTaskRunner', () => { _source: { type: 'visualization', visualization: { visState: '{"type": "cave_painting"}' }, + updated_at: moment().subtract(89, 'days').startOf('day').toString(), }, }, { _id: 'meat:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "cuneiform"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "cuneiform"}' }, + updated_at: moment().subtract(5, 'months').startOf('day').toString(), + }, }, { _id: 'meat:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "cuneiform"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "cuneiform"}' }, + updated_at: moment().subtract(2, 'days').startOf('day').toString(), + }, }, { _id: 'meat:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "floppy_disk"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "floppy_disk"}' }, + updated_at: moment().subtract(7, 'days').startOf('day').toString(), + }, }, // cyber space { _id: 'cyber:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "floppy_disk"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "floppy_disk"}' }, + updated_at: moment().subtract(7, 'months').startOf('day').toString(), + }, }, { _id: 'cyber:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "floppy_disk"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "floppy_disk"}' }, + updated_at: moment().subtract(3, 'days').startOf('day').toString(), + }, }, { _id: 'cyber:visualization:coolviz-123', _source: { type: 'visualization', visualization: { visState: '{"type": "cave_painting"}' }, + updated_at: moment().subtract(15, 'days').startOf('day').toString(), }, }, ]); + const expectedStats = { + cave_painting: { + total: 3, + spaces_min: 1, + spaces_max: 1, + spaces_avg: 1, + saved_7_days_total: 1, + saved_30_days_total: 2, + saved_90_days_total: 3, + }, + printing_press: { + total: 1, + spaces_min: 1, + spaces_max: 1, + spaces_avg: 1, + saved_7_days_total: 0, + saved_30_days_total: 1, + saved_90_days_total: 1, + }, + cuneiform: { + total: 2, + spaces_min: 2, + spaces_max: 2, + spaces_avg: 2, + saved_7_days_total: 1, + saved_30_days_total: 1, + saved_90_days_total: 1, + }, + floppy_disk: { + total: 4, + spaces_min: 2, + spaces_max: 2, + spaces_avg: 2, + saved_7_days_total: 2, + saved_30_days_total: 2, + saved_90_days_total: 3, + }, + }; + const runner = visualizationsTaskRunner( mockTaskInstance, getMockConfig(), @@ -131,13 +202,10 @@ describe('visualizationsTaskRunner', () => { error: undefined, state: { runs: 1, - stats: { - cave_painting: { total: 3, spaces_min: 1, spaces_max: 1, spaces_avg: 1 }, - printing_press: { total: 1, spaces_min: 1, spaces_max: 1, spaces_avg: 1 }, - cuneiform: { total: 2, spaces_min: 2, spaces_max: 2, spaces_avg: 2 }, - floppy_disk: { total: 4, spaces_min: 2, spaces_max: 2, spaces_avg: 2 }, - }, + stats: expectedStats, }, }); + + expect(result.state.stats).toMatchObject(expectedStats); }); }); diff --git a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts index b15ead36a75f6..5f7f70ee5d62a 100644 --- a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts @@ -10,12 +10,14 @@ import { first } from 'rxjs/operators'; import { APICaller, IClusterClient } from 'src/core/server'; import { getNextMidnight } from '../../get_next_midnight'; +import { getPastDays } from '../../get_past_days'; import { TaskInstance } from '../../../../../task_manager/server'; import { ESSearchHit } from '../../../../../apm/typings/elasticsearch'; interface VisSummary { type: string; space: string; + past_days: number; } /* @@ -26,7 +28,11 @@ async function getStats(callCluster: APICaller, index: string) { size: 10000, // elasticsearch index.max_result_window default value index, ignoreUnavailable: true, - filterPath: ['hits.hits._id', 'hits.hits._source.visualization'], + filterPath: [ + 'hits.hits._id', + 'hits.hits._source.visualization', + 'hits.hits._source.updated_at', + ], body: { query: { bool: { filter: { term: { type: 'visualization' } } }, @@ -43,13 +49,14 @@ async function getStats(callCluster: APICaller, index: string) { const visSummaries: VisSummary[] = esResponse.hits.hits.map( (hit: ESSearchHit<{ visState: string }>) => { const spacePhrases: string[] = hit._id.split(':'); + const lastUpdated: string = _.get(hit, '_source.updated_at'); const space = spacePhrases.length === 3 ? spacePhrases[0] : 'default'; // if in a custom space, the format of a saved object ID is space:type:id const visualization = _.get(hit, '_source.visualization', { visState: '{}' }); const visState: { type?: string } = JSON.parse(visualization.visState); - return { type: visState.type || '_na_', space, + past_days: getPastDays(lastUpdated), }; } ); @@ -68,6 +75,9 @@ async function getStats(callCluster: APICaller, index: string) { spaces_min: _.min(spaceCounts), spaces_max: _.max(spaceCounts), spaces_avg: total / spaceCounts.length, + saved_7_days_total: curr.filter((c) => c.past_days <= 7).length, + saved_30_days_total: curr.filter((c) => c.past_days <= 30).length, + saved_90_days_total: curr.filter((c) => c.past_days <= 90).length, }; }); } diff --git a/x-pack/plugins/oss_telemetry/server/test_utils/index.ts b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts index 428909dc7feed..93bde69629fbd 100644 --- a/x-pack/plugins/oss_telemetry/server/test_utils/index.ts +++ b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts @@ -7,6 +7,7 @@ import { APICaller } from 'kibana/server'; import { of } from 'rxjs'; +import moment from 'moment'; import { elasticsearchServiceMock } from '../../../../../src/core/server/mocks'; import { ConcreteTaskInstance, @@ -38,6 +39,7 @@ const defaultMockSavedObjects = [ _source: { type: 'visualization', visualization: { visState: '{"type": "shell_beads"}' }, + updated_at: moment().subtract(7, 'days').startOf('day').toString(), }, }, ]; From 2bedb59c8e0968eb05d2033d36e9426e556a40be Mon Sep 17 00:00:00 2001 From: Oliver Gupte Date: Mon, 8 Jun 2020 07:30:14 -0700 Subject: [PATCH 08/91] Closes #66867 by adding missing, requried API params (#68465) Co-authored-by: Elastic Machine --- x-pack/plugins/apm/public/services/rest/watcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/public/services/rest/watcher.ts b/x-pack/plugins/apm/public/services/rest/watcher.ts index 3027164e2863e..246ed061eb20e 100644 --- a/x-pack/plugins/apm/public/services/rest/watcher.ts +++ b/x-pack/plugins/apm/public/services/rest/watcher.ts @@ -19,6 +19,6 @@ export async function createWatch({ return callApi(http, { method: 'PUT', pathname: `/api/watcher/watch/${id}`, - body: { type: 'json', id, watch }, + body: { type: 'json', id, watch, isNew: true, isActive: true }, }); } From bc3918671cb9bc7ba33a192fa1ffc7c0ee1af93c Mon Sep 17 00:00:00 2001 From: Robert Austin Date: Mon, 8 Jun 2020 10:43:10 -0400 Subject: [PATCH 09/91] [security_solution] enable react-hooks/exhaustive-deps (#68470) * Enable `react-hooks/exhaustive-deps` rule for security_solution * Disable it anywhere that it would catch an issue --- .eslintrc.js | 4 --- .../alerts_histogram_panel/index.tsx | 6 ++++ .../alerts/components/alerts_table/index.tsx | 7 +++- .../components/rules/add_item_form/index.tsx | 1 + .../alerts/components/rules/mitre/index.tsx | 3 +- .../components/rules/pick_timeline/index.tsx | 2 ++ .../components/rules/query_bar/index.tsx | 8 +++-- .../rules/rule_actions_field/index.tsx | 3 ++ .../rules/rule_actions_overflow/index.tsx | 1 + .../components/rules/rule_switch/index.tsx | 3 ++ .../rules/schedule_item_form/index.tsx | 3 ++ .../rules/step_about_rule/index.tsx | 3 ++ .../rules/step_define_rule/index.tsx | 3 ++ .../rules/step_rule_actions/index.tsx | 4 +++ .../rules/step_schedule_rule/index.tsx | 3 ++ .../rules/throttle_select_field/index.tsx | 1 + .../alerts/components/user_info/index.tsx | 8 +++++ .../alerts/use_privilege_user.tsx | 1 + .../alerts/use_signal_index.tsx | 1 + .../rules/fetch_index_patterns.tsx | 1 + .../detection_engine/rules/persist_rule.tsx | 1 + .../rules/use_pre_packaged_rules.tsx | 1 + .../detection_engine/rules/use_rule.tsx | 1 + .../rules/use_rule_status.tsx | 2 ++ .../detection_engine/rules/use_rules.tsx | 6 ++-- .../detection_engine/rules/use_tags.tsx | 1 + .../detection_engine/rules/all/index.tsx | 2 ++ .../rules_table_filters.tsx | 1 + .../detection_engine/rules/create/index.tsx | 3 ++ .../detection_engine/rules/details/index.tsx | 2 ++ .../detection_engine/rules/edit/index.tsx | 6 ++++ .../cases/components/add_comment/index.tsx | 4 ++- .../cases/components/all_cases/index.tsx | 11 +++++++ .../components/all_cases/table_filters.tsx | 6 ++++ .../cases/components/case_view/actions.tsx | 1 + .../components/configure_cases/connectors.tsx | 1 + .../configure_cases/connectors_dropdown.tsx | 1 + .../configure_cases/field_mapping.tsx | 2 ++ .../components/configure_cases/index.tsx | 7 ++++ .../components/connector_selector/form.tsx | 1 + .../public/cases/components/create/index.tsx | 2 ++ .../components/open_closed_stats/index.tsx | 1 + .../components/use_push_to_service/index.tsx | 2 ++ .../components/user_action_tree/index.tsx | 4 +++ .../user_action_tree/user_action_markdown.tsx | 2 ++ .../cases/components/user_list/index.tsx | 1 + .../containers/configure/use_configure.tsx | 3 ++ .../containers/configure/use_connectors.tsx | 2 ++ .../cases/containers/use_bulk_update_case.tsx | 2 ++ .../cases/containers/use_delete_cases.tsx | 4 +++ .../containers/use_get_action_license.tsx | 2 ++ .../public/cases/containers/use_get_case.tsx | 2 ++ .../containers/use_get_case_user_actions.tsx | 2 ++ .../public/cases/containers/use_get_cases.tsx | 4 +++ .../cases/containers/use_get_cases_status.tsx | 2 ++ .../cases/containers/use_get_reporters.tsx | 2 ++ .../public/cases/containers/use_get_tags.tsx | 1 + .../public/cases/containers/use_post_case.tsx | 1 + .../cases/containers/use_post_comment.tsx | 1 + .../containers/use_post_push_to_service.tsx | 1 + .../cases/containers/use_update_case.tsx | 1 + .../cases/containers/use_update_comment.tsx | 1 + .../components/alerts_viewer/alerts_table.tsx | 1 + .../common/components/alerts_viewer/index.tsx | 1 + .../common/components/charts/common.tsx | 1 + .../drag_drop_context_wrapper.tsx | 1 + .../drag_and_drop/draggable_wrapper.tsx | 1 + .../draggable_wrapper_hover_content.tsx | 2 ++ .../events_viewer/events_viewer.tsx | 2 ++ .../common/components/events_viewer/index.tsx | 1 + .../exceptions/viewer/exception_entries.tsx | 1 + .../components/generic_downloader/index.tsx | 1 + .../components/header_page/editable_title.tsx | 1 + .../common/components/help_menu/index.tsx | 1 + .../components/import_data_modal/index.tsx | 1 + .../public/common/components/links/index.tsx | 1 + .../components/markdown_editor/index.tsx | 1 + .../components/matrix_histogram/index.tsx | 33 ++++++++----------- .../components/matrix_histogram/types.ts | 6 ---- .../ml/anomaly/use_anomalies_table_data.ts | 4 +++ .../permissions/ml_capabilities_provider.tsx | 1 + .../ml_popover/hooks/use_siem_jobs.tsx | 1 + .../filters/groups_filter_popover.tsx | 1 + .../common/components/navigation/index.tsx | 1 + .../common/components/search_bar/index.tsx | 6 ++++ .../common/components/stat_items/index.tsx | 1 + .../components/super_date_picker/index.tsx | 3 ++ .../common/components/toasters/index.test.tsx | 1 + .../public/common/components/top_n/index.tsx | 1 + .../components/url_state/use_url_state.tsx | 3 +- .../anomalies_query_tab_body/index.tsx | 1 + .../events/last_event_time/index.ts | 3 +- .../common/containers/global_time/index.tsx | 1 + .../containers/matrix_histogram/index.ts | 3 +- .../public/common/containers/source/index.tsx | 3 +- .../common/hooks/use_add_to_timeline.tsx | 1 + .../common/hooks/use_index_patterns.tsx | 1 + .../components/connector_flyout/index.tsx | 6 ++++ .../public/common/lib/kibana/hooks.ts | 2 ++ .../public/common/utils/route/spy_routes.tsx | 2 ++ .../utils/timeline/use_show_timeline.tsx | 1 + .../view/details/overview/index.tsx | 1 + .../containers/hosts/first_last_seen/index.ts | 1 + .../components/management_page_view.tsx | 1 + .../view/details/host_details.tsx | 1 + .../components/embeddables/embedded_map.tsx | 4 +++ .../embeddables/map_tool_tip/map_tool_tip.tsx | 4 +-- .../source_destination/country_flag.tsx | 1 + .../network/components/tls_table/index.tsx | 1 + .../network/components/users_table/index.tsx | 1 + .../components/alerts_by_category/index.tsx | 2 ++ .../components/recent_timelines/index.tsx | 1 + .../components/signals_by_category/index.tsx | 1 + .../fields_browser/category_columns.tsx | 1 + .../fields_browser/field_browser.tsx | 1 + .../components/fields_browser/index.tsx | 2 ++ .../components/flyout/pane/index.tsx | 4 ++- .../components/manage_timeline/index.tsx | 1 + .../open_timeline/edit_timeline_actions.tsx | 1 + .../edit_timeline_batch_actions.tsx | 1 + .../components/open_timeline/index.tsx | 5 +++ .../open_timeline/use_timeline_types.tsx | 2 ++ .../timeline/body/column_headers/index.tsx | 3 +- .../body/events/event_column_view.tsx | 2 ++ .../timeline/body/events/stateful_event.tsx | 1 + .../timeline/body/stateful_body.tsx | 9 +++++ .../data_providers/provider_item_badge.tsx | 3 ++ .../timeline/fetch_kql_timeline.tsx | 1 + .../components/timeline/footer/index.tsx | 1 + .../timelines/components/timeline/index.tsx | 7 ++++ .../insert_timeline_popover/index.tsx | 1 + .../use_insert_timeline.tsx | 2 ++ .../timeline/properties/helpers.tsx | 1 + .../components/timeline/properties/index.tsx | 1 + .../components/timeline/query_bar/index.tsx | 6 ++++ .../timeline/search_or_filter/index.tsx | 5 +++ .../timeline/selectable_timeline/index.tsx | 1 + .../components/timeline/timeline.tsx | 3 ++ .../public/timelines/containers/all/index.tsx | 3 +- 139 files changed, 313 insertions(+), 46 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index f0b7d6864bef0..c33f4de15b919 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -758,10 +758,6 @@ module.exports = { 'react/jsx-no-target-blank': 'error', 'react/jsx-fragments': 'error', 'react/jsx-sort-default-props': 'error', - // might be introduced after the other warns are fixed - // 'react/jsx-sort-props': 'error', - // might be introduced after the other warns are fixed - 'react-hooks/exhaustive-deps': 'off', 'require-atomic-updates': 'error', 'symbol-description': 'error', 'vars-on-top': 'error', diff --git a/x-pack/plugins/security_solution/public/alerts/components/alerts_histogram_panel/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/alerts_histogram_panel/index.tsx index 7451ea6ec0ca1..ed98a37775576 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/alerts_histogram_panel/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/alerts_histogram_panel/index.tsx @@ -131,6 +131,7 @@ export const AlertsHistogramPanel = memo( totalAlertsObj.value, totalAlertsObj.relation === 'gte' ? '>' : totalAlertsObj.relation === 'lte' ? '<' : '' ), + // eslint-disable-next-line react-hooks/exhaustive-deps [totalAlertsObj] ); @@ -138,6 +139,7 @@ export const AlertsHistogramPanel = memo( setSelectedStackByOption( stackByOptions?.find((co) => co.value === event.target.value) ?? defaultStackByOption ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const formattedAlertsData = useMemo(() => formatAlertsData(alertsData), [alertsData]); @@ -154,6 +156,7 @@ export const AlertsHistogramPanel = memo( value: bucket.key, })) : NO_LEGEND_DATA, + // eslint-disable-next-line react-hooks/exhaustive-deps [alertsData, selectedStackByOption.value] ); @@ -175,6 +178,7 @@ export const AlertsHistogramPanel = memo( deleteQuery({ id: uniqueQueryId }); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -189,6 +193,7 @@ export const AlertsHistogramPanel = memo( refetch, }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [setQuery, isLoadingAlerts, alertsData, response, request, refetch]); useEffect(() => { @@ -219,6 +224,7 @@ export const AlertsHistogramPanel = memo( !isEmpty(converted) ? [converted] : [] ) ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedStackByOption.value, from, to, query, filters]); const linkButton = useMemo(() => { diff --git a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx index 685e66e73ced2..2be20a9d47f67 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx @@ -117,6 +117,7 @@ export const AlertsTableComponent: React.FC = ({ }); } return null; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [browserFields, globalFilters, globalQuery, indexPatterns, kibana, to, from]); // Callback for creating a new timeline -- utilized by row/batch actions @@ -143,6 +144,7 @@ export const AlertsTableComponent: React.FC = ({ ({ eventIds, isLoading }: SetEventsLoadingProps) => { setEventsLoading!({ id: ALERTS_TABLE_TIMELINE_ID, eventIds, isLoading }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [setEventsLoading, ALERTS_TABLE_TIMELINE_ID] ); @@ -150,6 +152,7 @@ export const AlertsTableComponent: React.FC = ({ ({ eventIds, isDeleted }: SetEventsDeletedProps) => { setEventsDeleted!({ id: ALERTS_TABLE_TIMELINE_ID, eventIds, isDeleted }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [setEventsDeleted, ALERTS_TABLE_TIMELINE_ID] ); @@ -210,7 +213,7 @@ export const AlertsTableComponent: React.FC = ({ }, [setSelectAll, setShowClearSelectionAction]); const updateAlertsStatusCallback: UpdateAlertsStatusCallback = useCallback( - async (refetchQuery: inputsModel.Refetch, { alertIds, status }: UpdateAlertsStatusProps) => { + async (refetchQuery: inputsModel.Refetch, { status }: UpdateAlertsStatusProps) => { await updateAlertStatusAction({ query: showClearSelectionAction ? getGlobalQuery()?.filterQuery : undefined, alertIds: Object.keys(selectedEventIds), @@ -314,6 +317,7 @@ export const AlertsTableComponent: React.FC = ({ title: i18n.ALERTS_TABLE_TITLE, selectAll: canUserCRUD ? selectAll : false, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { setTimelineRowActions({ @@ -321,6 +325,7 @@ export const AlertsTableComponent: React.FC = ({ queryFields: requiredFieldsForActions, timelineRowActions: additionalActions, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [additionalActions]); const headerFilterGroup = useMemo( () => , diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/add_item_form/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/add_item_form/index.tsx index c8eb6f69c95ba..b0098d62cc9e5 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/add_item_form/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/add_item_form/index.tsx @@ -126,6 +126,7 @@ export const AddItem = ({ inputsRef.current[haveBeenKeyboardDeleted].focus(); setHaveBeenKeyboardDeleted(-1); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [haveBeenKeyboardDeleted, inputsRef.current]); const values = field.value as string[]; diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/mitre/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/mitre/index.tsx index 88edd0e795531..e898a362c7771 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/mitre/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/mitre/index.tsx @@ -40,7 +40,7 @@ interface AddItemProps { isDisabled: boolean; } -export const AddMitreThreat = ({ dataTestSubj, field, idAria, isDisabled }: AddItemProps) => { +export const AddMitreThreat = ({ field, idAria, isDisabled }: AddItemProps) => { const [showValidation, setShowValidation] = useState(false); const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage(field); @@ -101,6 +101,7 @@ export const AddMitreThreat = ({ dataTestSubj, field, idAria, isDisabled }: AddI ...values.slice(index + 1), ]); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field] ); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/pick_timeline/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/pick_timeline/index.tsx index 0029e70e4edda..4b27daf3180ec 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/pick_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/pick_timeline/index.tsx @@ -39,6 +39,7 @@ export const PickTimeline = ({ setTimelineId(id); setTimelineTitle(title); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field.value]); const handleOnTimelineChange = useCallback( @@ -49,6 +50,7 @@ export const PickTimeline = ({ field.setValue({ id, title }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field] ); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/query_bar/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/query_bar/index.tsx index 82206b6ba5e3d..c53a9ccc22d8b 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/query_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/query_bar/index.tsx @@ -16,7 +16,6 @@ import { Query, FilterManager, SavedQuery, - SavedQueryTimeFilter, } from '../../../../../../../../src/plugins/data/public'; import { BrowserFields } from '../../../../common/containers/source'; @@ -111,6 +110,7 @@ export const QueryBarDefineRule = ({ isSubscribed = false; subscriptions.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field.value]); useEffect(() => { @@ -143,10 +143,11 @@ export const QueryBarDefineRule = ({ return () => { isSubscribed = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field.value]); const onSubmitQuery = useCallback( - (newQuery: Query, timefilter?: SavedQueryTimeFilter) => { + (newQuery: Query) => { const { query } = field.value as FieldValueQueryBar; if (!deepEqual(query, newQuery)) { field.setValue({ ...(field.value as FieldValueQueryBar), query: newQuery }); @@ -179,6 +180,7 @@ export const QueryBarDefineRule = ({ } } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field.value] ); @@ -214,7 +216,7 @@ export const QueryBarDefineRule = ({ [browserFields, field, indexPattern] ); - const onMutation = (event: unknown, observer: unknown) => { + const onMutation = () => { if (resizeParentContainer != null) { const suggestionContainer = document.getElementById('kbnTypeahead__items'); if (suggestionContainer != null) { diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_field/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_field/index.tsx index b77de683d5f20..c6ff25f311d9c 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_field/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_field/index.tsx @@ -56,6 +56,7 @@ export const RuleActionsField: ThrottleSelectField = ({ field, messageVariables updatedActions[index] = deepMerge(updatedActions[index], { id }); field.setValue(updatedActions); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field.setValue, actions] ); @@ -71,6 +72,7 @@ export const RuleActionsField: ThrottleSelectField = ({ field, messageVariables updatedActions[index].params[key] = value; field.setValue(updatedActions); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field.setValue, actions] ); @@ -82,6 +84,7 @@ export const RuleActionsField: ThrottleSelectField = ({ field, messageVariables ); setSupportedActionTypes(supportedTypes); })(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_overflow/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_overflow/index.tsx index 5a5156fa2b9a3..66f04c9bc6add 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_overflow/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_overflow/index.tsx @@ -101,6 +101,7 @@ const RuleActionsOverflowComponent = ({ , ] : [], + // eslint-disable-next-line react-hooks/exhaustive-deps [rule, userHasNoPermissions] ); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_switch/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_switch/index.tsx index 79a16bfb386ec..c85676ce51052 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_switch/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_switch/index.tsx @@ -94,6 +94,7 @@ export const RuleSwitchComponent = ({ } setMyIsLoading(false); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [dispatch, id] ); @@ -101,12 +102,14 @@ export const RuleSwitchComponent = ({ if (myEnabled !== enabled) { setMyEnabled(enabled); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [enabled]); useEffect(() => { if (myIsLoading !== isLoading) { setMyIsLoading(isLoading ?? false); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isLoading]); return ( diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/schedule_item_form/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/schedule_item_form/index.tsx index 9a4f9b25e01f4..bb33767f4f5d5 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/schedule_item_form/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/schedule_item_form/index.tsx @@ -78,6 +78,7 @@ export const ScheduleItem = ({ setTimeType(e.target.value); field.setValue(`${timeVal}${e.target.value}`); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [timeVal] ); @@ -87,6 +88,7 @@ export const ScheduleItem = ({ setTimeVal(sanitizedValue); field.setValue(`${sanitizedValue}${timeType}`); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [timeType] ); @@ -111,6 +113,7 @@ export const ScheduleItem = ({ setTimeType(filterTimeType[0]); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field.value]); // EUI missing some props diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.tsx index e41416f2a0ccb..f23c51e019f24 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.tsx @@ -101,6 +101,7 @@ const StepAboutRuleComponent: FC = ({ setMyStepData({ ...data, isNew: false } as AboutStepRule); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); useEffect(() => { @@ -113,12 +114,14 @@ const StepAboutRuleComponent: FC = ({ setMyStepData(myDefaultValues); setFieldValue(form, schema, myDefaultValues); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValues]); useEffect(() => { if (setForm != null) { setForm(RuleStep.aboutRule, form); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); return isReadOnlyView && myStepData.name != null ? ( diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/index.tsx index fc875908bd4ef..b56e1794eef63 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/index.tsx @@ -123,6 +123,7 @@ const StepDefineRuleComponent: FC = ({ setMyStepData({ ...data, isNew: false } as DefineStepRule); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); useEffect(() => { @@ -132,12 +133,14 @@ const StepDefineRuleComponent: FC = ({ setMyStepData(newValues); setFieldValue(form, schema, newValues); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValues, setMyStepData, setFieldValue]); useEffect(() => { if (setForm != null) { setForm(RuleStep.defineRule, form); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); const handleResetIndices = useCallback(() => { diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_rule_actions/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_rule_actions/index.tsx index 778c6bd92bc73..9334bd59bebf5 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_rule_actions/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_rule_actions/index.tsx @@ -99,6 +99,7 @@ const StepRuleActionsComponent: FC = ({ } } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [form] ); @@ -112,12 +113,14 @@ const StepRuleActionsComponent: FC = ({ setMyStepData(myDefaultValues); setFieldValue(form, schema, myDefaultValues); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValues]); useEffect(() => { if (setForm != null) { setForm(RuleStep.ruleActions, form); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); const updateThrottle = useCallback((throttle) => setMyStepData({ ...myStepData, throttle }), [ @@ -142,6 +145,7 @@ const StepRuleActionsComponent: FC = ({ options: throttleOptions, }, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [isLoading, updateThrottle] ); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_schedule_rule/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_schedule_rule/index.tsx index fa49637a0c830..60855bc5fa25f 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_schedule_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_schedule_rule/index.tsx @@ -62,6 +62,7 @@ const StepScheduleRuleComponent: FC = ({ setMyStepData({ ...data, isNew: false } as ScheduleStepRule); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); useEffect(() => { @@ -74,12 +75,14 @@ const StepScheduleRuleComponent: FC = ({ setMyStepData(myDefaultValues); setFieldValue(form, schema, myDefaultValues); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValues]); useEffect(() => { if (setForm != null) { setForm(RuleStep.scheduleRule, form); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); return isReadOnlyView && myStepData != null ? ( diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/throttle_select_field/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/throttle_select_field/index.tsx index 133f25ef3a03f..bf3498b28cd45 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/throttle_select_field/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/throttle_select_field/index.tsx @@ -31,6 +31,7 @@ export const ThrottleSelectField: ThrottleSelectField = (props) => { props.field.setValue(throttle); props.handleChange(throttle); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [props.field.setValue, props.handleChange] ); const newEuiFieldProps = { ...props.euiFieldProps, onChange }; diff --git a/x-pack/plugins/security_solution/public/alerts/components/user_info/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/user_info/index.tsx index 8753064751f76..fc3fec7c29c1f 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/user_info/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/user_info/index.tsx @@ -171,18 +171,21 @@ export const useUserInfo = (): State => { if (loading !== privilegeLoading || indexNameLoading) { dispatch({ type: 'updateLoading', loading: privilegeLoading || indexNameLoading }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, privilegeLoading, indexNameLoading]); useEffect(() => { if (!loading && hasIndexManage !== hasApiIndexManage && hasApiIndexManage != null) { dispatch({ type: 'updateHasIndexManage', hasIndexManage: hasApiIndexManage }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, hasIndexManage, hasApiIndexManage]); useEffect(() => { if (!loading && hasIndexWrite !== hasApiIndexWrite && hasApiIndexWrite != null) { dispatch({ type: 'updateHasIndexWrite', hasIndexWrite: hasApiIndexWrite }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, hasIndexWrite, hasApiIndexWrite]); useEffect(() => { @@ -193,30 +196,35 @@ export const useUserInfo = (): State => { ) { dispatch({ type: 'updateIsSignalIndexExists', isSignalIndexExists: isApiSignalIndexExists }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, isSignalIndexExists, isApiSignalIndexExists]); useEffect(() => { if (!loading && isAuthenticated !== isApiAuthenticated && isApiAuthenticated != null) { dispatch({ type: 'updateIsAuthenticated', isAuthenticated: isApiAuthenticated }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, isAuthenticated, isApiAuthenticated]); useEffect(() => { if (!loading && hasEncryptionKey !== isApiEncryptionKey && isApiEncryptionKey != null) { dispatch({ type: 'updateHasEncryptionKey', hasEncryptionKey: isApiEncryptionKey }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, hasEncryptionKey, isApiEncryptionKey]); useEffect(() => { if (!loading && canUserCRUD !== capabilitiesCanUserCRUD && capabilitiesCanUserCRUD != null) { dispatch({ type: 'updateCanUserCRUD', canUserCRUD: capabilitiesCanUserCRUD }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, canUserCRUD, capabilitiesCanUserCRUD]); useEffect(() => { if (!loading && signalIndexName !== apiSignalIndexName && apiSignalIndexName != null) { dispatch({ type: 'updateSignalIndexName', signalIndexName: apiSignalIndexName }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, signalIndexName, apiSignalIndexName]); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_privilege_user.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_privilege_user.tsx index e67afd686a7ca..dda9b50239cde 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_privilege_user.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_privilege_user.tsx @@ -83,6 +83,7 @@ export const usePrivilegeUser = (): ReturnPrivilegeUser => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { loading, ...privilegeUser }; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_signal_index.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_signal_index.tsx index 6c428bd9354ee..65a2721013b5e 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_signal_index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_signal_index.tsx @@ -103,6 +103,7 @@ export const useSignalIndex = (): ReturnSignalIndex => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { loading, ...signalIndex }; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx index 157f1490971f1..640d6f9a17fd1 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx @@ -94,6 +94,7 @@ export const useFetchIndexPatterns = (defaultIndices: string[] = []): Return => isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [indices]); return [{ browserFields, isLoading, indices, indicesExists, indexPatterns }, setIndices]; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/persist_rule.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/persist_rule.tsx index 03080bf68cbf5..fd139d59c0a27 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/persist_rule.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/persist_rule.tsx @@ -53,6 +53,7 @@ export const usePersistRule = (): ReturnPersistRule => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rule]); return [{ isLoading, isSaved }, setRule]; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx index de4037ce7134c..5f5ee53c29caf 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx @@ -185,6 +185,7 @@ export const usePrePackagedRules = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [canUserCRUD, hasIndexWrite, isAuthenticated, hasEncryptionKey, isSignalIndexExists]); return { diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule.tsx index 6ae5da3e56ff6..3256273fb8425 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule.tsx @@ -55,6 +55,7 @@ export const useRule = (id: string | undefined): ReturnRule => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [id]); return [loading, rule]; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule_status.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule_status.tsx index b9f5e1f152c21..ec1da29de4ba8 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule_status.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule_status.tsx @@ -64,6 +64,7 @@ export const useRuleStatus = (id: string | undefined | null): ReturnRuleStatus = isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [id]); return [loading, ruleStatus, fetchRuleStatus.current]; @@ -119,6 +120,7 @@ export const useRulesStatuses = (rules: Rules): ReturnRulesStatuses => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rules]); return { loading, rulesStatuses }; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rules.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rules.tsx index 3a074f2bc3785..1a1dbc6e2b368 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rules.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rules.tsx @@ -46,7 +46,7 @@ export const useRules = ({ let isSubscribed = true; const abortCtrl = new AbortController(); - async function fetchData(forceReload: boolean = false) { + async function fetchData() { try { setLoading(true); const fetchRulesResult = await fetchRules({ @@ -80,7 +80,7 @@ export const useRules = ({ fetchData(); reFetchRules.current = (refreshPrePackagedRule: boolean = false) => { - fetchData(true); + fetchData(); if (refreshPrePackagedRule && refetchPrePackagedRulesStatus != null) { refetchPrePackagedRulesStatus(); } @@ -89,12 +89,14 @@ export const useRules = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ pagination.page, pagination.perPage, filterOptions.filter, filterOptions.sortField, filterOptions.sortOrder, + // eslint-disable-next-line react-hooks/exhaustive-deps filterOptions.tags?.sort().join(), filterOptions.showCustomRules, filterOptions.showElasticRules, diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_tags.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_tags.tsx index ebfe73f2f0863..038f974e1394e 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_tags.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_tags.tsx @@ -53,6 +53,7 @@ export const useTags = (): ReturnTags => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return [loading, tags, reFetchTags.current]; diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/index.tsx index 9e61ec0eb3bcf..80ef5681189c5 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/index.tsx @@ -235,6 +235,7 @@ export const AllRules = React.memo( : [], reFetchRules: reFetchRulesData, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ dispatch, dispatchToaster, @@ -313,6 +314,7 @@ export const AllRules = React.memo( ))} ), + // eslint-disable-next-line react-hooks/exhaustive-deps [allRulesTabs, allRulesTab, setAllRulesTab] ); diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx index 2bc19ae45a078..c65271c3cc014 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx @@ -45,6 +45,7 @@ const RulesTableFiltersComponent = ({ useEffect(() => { reFetchTags(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rulesCustomInstalled, rulesInstalled]); // Propagate filter changes to parent diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/create/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/create/index.tsx index dd290ec1ae582..de7c99acee6e5 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/create/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/create/index.tsx @@ -114,6 +114,7 @@ const CreateRulePageComponent: React.FC = () => { const actionMessageParams = useMemo( () => getActionMessageParams((stepsData.current['define-rule'].data as DefineStepRule).ruleType), + // eslint-disable-next-line react-hooks/exhaustive-deps [stepsData.current['define-rule'].data] ); @@ -155,6 +156,7 @@ const CreateRulePageComponent: React.FC = () => { } } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [isStepRuleInReadOnlyView, openAccordionId, stepsData.current, setRule] ); @@ -171,6 +173,7 @@ const CreateRulePageComponent: React.FC = () => { } return 'passive'; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [openAccordionId, stepsData.current] ); diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx index ebd6ed118f937..43792e8bd19f4 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx @@ -191,6 +191,7 @@ export const RuleDetailsPageComponent: FC = ({ ))} ), + // eslint-disable-next-line react-hooks/exhaustive-deps [ruleDetailTabs, ruleDetailTab, setRuleDetailTab] ); const ruleError = useMemo( @@ -203,6 +204,7 @@ export const RuleDetailsPageComponent: FC = ({ date={rule?.last_failure_at} /> ) : null, + // eslint-disable-next-line react-hooks/exhaustive-deps [rule, ruleDetailTab] ); diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/edit/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/edit/index.tsx index 8fc646c01b17c..73e76165183c5 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/edit/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/edit/index.tsx @@ -104,6 +104,7 @@ const EditRulePageComponent: FC = () => { }); const [{ isLoading, isSaved }, setRule] = usePersistRule(); const [tabHasError, setTabHasError] = useState([]); + // eslint-disable-next-line react-hooks/exhaustive-deps const actionMessageParams = useMemo(() => getActionMessageParams(rule?.type), [rule]); const setStepsForm = useCallback( (step: RuleStep, form: FormHook) => { @@ -113,6 +114,7 @@ const EditRulePageComponent: FC = () => { form.submit(); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [initForm, selectedTab] ); const tabs = useMemo( @@ -206,6 +208,7 @@ const EditRulePageComponent: FC = () => { ), }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [ rule, loading, @@ -265,6 +268,7 @@ const EditRulePageComponent: FC = () => { } else { setTabHasError(invalidForms); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ stepsForm, myAboutRuleForm, @@ -320,6 +324,7 @@ const EditRulePageComponent: FC = () => { setInitForm(true); setSelectedTab(tab); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedTab, stepsForm.current] ); @@ -338,6 +343,7 @@ const EditRulePageComponent: FC = () => { useEffect(() => { const tabIndex = rule?.immutable ? 3 : 0; setSelectedTab(tabs[tabIndex]); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rule]); if (isSaved) { diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx index 277352c39df65..a57fae8081bea 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx @@ -59,6 +59,7 @@ export const AddComment = React.memo( `${comment}${comment.length > 0 ? '\n\n' : ''}${insertQuote}` ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [insertQuote]); const onSubmit = useCallback(async () => { @@ -67,9 +68,10 @@ export const AddComment = React.memo( if (onCommentSaving != null) { onCommentSaving(); } - await postComment(data, onCommentPosted); + postComment(data, onCommentPosted); form.reset(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form, onCommentPosted, onCommentSaving]); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index 12f0d02eb10f6..32a7c4078071e 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -134,6 +134,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { (refetchFilter: () => void) => { filterRefetch.current = refetchFilter; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterRefetch.current] ); const refreshCases = useCallback( @@ -146,6 +147,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { filterRefetch.current(); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterOptions, queryParams, filterRefetch.current] ); @@ -158,6 +160,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { refreshCases(); dispatchResetIsUpdated(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isDeleted, isUpdated]); const confirmDeleteModal = useMemo( () => ( @@ -172,12 +175,14 @@ export const AllCases = React.memo(({ userCanCrud }) => { )} /> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [deleteBulk, deleteThisCase, isDisplayConfirmDeleteModal] ); const toggleDeleteModal = useCallback((deleteCase: Case) => { handleToggleModal(); setDeleteThisCase(deleteCase); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const toggleBulkDeleteModal = useCallback( @@ -192,6 +197,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { const convertToDeleteCases: DeleteCase[] = caseIds.map((id) => ({ id })); setDeleteBulk(convertToDeleteCases); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedCases] ); @@ -199,6 +205,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { (status: string) => { updateBulkStatus(selectedCases, status); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedCases] ); @@ -220,6 +227,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { })} /> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal] ); const handleDispatchUpdate = useCallback( @@ -261,6 +269,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { setQueryParams(newQueryParams); refreshCases(false); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [queryParams] ); @@ -274,6 +283,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { setFilters(newFilterOptions); refreshCases(false); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterOptions, queryParams] ); @@ -296,6 +306,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { }; const euiBasicTableSelectionProps = useMemo>( () => ({ onSelectionChange: setSelectedCases }), + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedCases] ); const isCasesLoading = useMemo( diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx index 42340b455c3af..63172bd6ad6bb 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx @@ -66,12 +66,14 @@ const CasesTableFiltersComponent = ({ const newReporters = selectedReporters.filter((r) => reporters.includes(r)); handleSelectedReporters(newReporters); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [reporters]); useEffect(() => { if (selectedTags.length) { const newTags = selectedTags.filter((t) => tags.includes(t)); handleSelectedTags(newTags); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [tags]); const handleSelectedReporters = useCallback( @@ -84,6 +86,7 @@ const CasesTableFiltersComponent = ({ onFilterChanged({ reporters: reportersObj }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedReporters, respReporters] ); @@ -94,6 +97,7 @@ const CasesTableFiltersComponent = ({ onFilterChanged({ tags: newTags }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedTags] ); const handleOnSearch = useCallback( @@ -104,6 +108,7 @@ const CasesTableFiltersComponent = ({ onFilterChanged({ search: trimSearch }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [search] ); const handleToggleFilter = useCallback( @@ -113,6 +118,7 @@ const CasesTableFiltersComponent = ({ onFilterChanged({ status: showOpen ? 'open' : 'closed' }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [showOpenCases] ); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/actions.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/actions.tsx index cd9318a355e3c..df1082ec48f91 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/actions.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/actions.tsx @@ -44,6 +44,7 @@ const CaseViewActionsComponent: React.FC = ({ onConfirm={handleOnDeleteConfirm.bind(null, [{ id: caseData.id, title: caseData.title }])} /> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [isDisplayConfirmDeleteModal, caseData] ); const propertyActions = useMemo( diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx index 947d68fd04f7b..b8151cb6fe18c 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx @@ -68,6 +68,7 @@ const ConnectorsComponent: React.FC = ({ ), + // eslint-disable-next-line react-hooks/exhaustive-deps [connectorsName, updateConnectorDisabled] ); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx index c5481f592e750..018d3a0fdb4e0 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx @@ -91,6 +91,7 @@ const ConnectorsDropdownComponent: React.FC = ({ } return connectorsFormatted; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [connectors]); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx index 415faa96eeedd..fe5c0c19820a1 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx @@ -95,6 +95,7 @@ const FieldMappingComponent: React.FC = ({ const myMapping = mapping ?? defaultMapping; onChangeMapping(setActionTypeToMapping(caseField, newActionType, myMapping)); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [mapping] ); @@ -103,6 +104,7 @@ const FieldMappingComponent: React.FC = ({ const myMapping = mapping ?? defaultMapping; onChangeMapping(setThirdPartyToMapping(caseField, newThirdPartyField, myMapping)); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [mapping] ); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx index 6e1ef293fd5c4..256c8893be941 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx @@ -77,6 +77,7 @@ const ConfigureCasesComponent: React.FC = ({ userC // ActionsConnectorsContextProvider reloadConnectors prop expects a Promise. // TODO: Fix it if reloadConnectors type change. + // eslint-disable-next-line react-hooks/exhaustive-deps const reloadConnectors = useCallback(async () => refetchConnectors(), []); const isLoadingAny = isLoadingConnectors || persistLoading || loadingCaseConfigure; const updateConnectorDisabled = isLoadingAny || !connectorIsValid || connectorId === 'none'; @@ -89,6 +90,7 @@ const ConfigureCasesComponent: React.FC = ({ userC (isVisible: boolean) => { setAddFlyoutVisibility(isVisible); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [currentConfiguration, connectorId, closureType] ); @@ -96,6 +98,7 @@ const ConfigureCasesComponent: React.FC = ({ userC (isVisible: boolean) => { setEditFlyoutVisibility(isVisible); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [currentConfiguration, connectorId, closureType] ); @@ -113,6 +116,7 @@ const ConfigureCasesComponent: React.FC = ({ userC closureType, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [connectorId, closureType, version] ); @@ -125,6 +129,7 @@ const ConfigureCasesComponent: React.FC = ({ userC closureType: type, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [connectorId, closureType, version] ); @@ -141,6 +146,7 @@ const ConfigureCasesComponent: React.FC = ({ userC ) { setConnectorIsValid(true); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [connectors, connectorId]); useEffect(() => { @@ -149,6 +155,7 @@ const ConfigureCasesComponent: React.FC = ({ userC connectors.find((c) => c.id === connectorId) as ActionConnectorTableItem ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [connectors, connectorId]); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx b/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx index 9e058ee5cf09e..1706fa38bb8a0 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx @@ -33,6 +33,7 @@ export const ConnectorSelector = ({ useEffect(() => { field.setValue(defaultValue); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValue]); const handleContentChange = useCallback( diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index ae0ffe498c391..1b65b2582c760 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -91,8 +91,10 @@ export const Create = React.memo(() => { const onSubmit = useCallback(async () => { const { isValid, data } = await form.submit(); if (isValid) { + // `postCase`'s type is incorrect, it actually returns a promise await postCase(data); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); const handleSetIsCancel = useCallback(() => { diff --git a/x-pack/plugins/security_solution/public/cases/components/open_closed_stats/index.tsx b/x-pack/plugins/security_solution/public/cases/components/open_closed_stats/index.tsx index b9dab13090aca..e7d5299842494 100644 --- a/x-pack/plugins/security_solution/public/cases/components/open_closed_stats/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/open_closed_stats/index.tsx @@ -24,6 +24,7 @@ export const OpenClosedStats = React.memo( description: isLoading ? : caseCount ?? 'N/A', }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [caseCount, caseStatus, isLoading, dataTestSubj] ); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx index 2e9e3cce4306a..f18870787ded1 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx @@ -141,6 +141,7 @@ export const usePushToService = ({ errors = [...errors, getKibanaConfigError()]; } return errors; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [actionLicense, caseStatus, connectors.length, caseConnectorId, loadingLicense, urlSearch]); const pushToServiceButton = useMemo(() => { @@ -160,6 +161,7 @@ export const usePushToService = ({ : i18n.PUSH_THIRD(caseConnectorName)} ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ caseConnectorId, caseConnectorName, diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx index da49014eb0204..52c2779a93fc0 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx @@ -85,6 +85,7 @@ export const UserActionTree = React.memo( updateCase, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [caseData, handleManageMarkdownEditId, patchComment, updateCase] ); @@ -109,6 +110,7 @@ export const UserActionTree = React.memo( window.clearTimeout(handlerTimeoutId.current); }, 2400); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [handlerTimeoutId.current] ); @@ -155,6 +157,7 @@ export const UserActionTree = React.memo( showLoading={false} /> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [caseData.id, handleUpdate, insertQuote, userCanCrud] ); @@ -165,6 +168,7 @@ export const UserActionTree = React.memo( handleOutlineComment(commentId); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [commentId, initLoading, isLoadingUserActions, isLoadingIds]); return ( <> diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx index 03dd599da88e5..b3a5f1e0158d8 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx @@ -74,6 +74,7 @@ export const UserActionMarkdown = ({ updateTimeline: dispatchUpdateTimeline(dispatch), }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [apolloClient] ); @@ -114,6 +115,7 @@ export const UserActionMarkdown = ({ ); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [handleCancelAction, handleSaveAction] ); return isEditable ? ( diff --git a/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx b/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx index 0606da371d16a..86ff42561c409 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx @@ -84,6 +84,7 @@ export const UserList = React.memo(({ email, headline, loading, users }: UserLis window.open(`mailto:${emailAddress}?subject=${email.subject}&body=${email.body}`, '_blank'); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [email.subject] ); return users.filter(({ username }) => username != null && username !== '').length > 0 ? ( diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx index 5a85a3a0633bc..e89212036ec20 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx @@ -253,6 +253,7 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.firstLoad]); const persistCaseConfigure = useCallback( @@ -311,11 +312,13 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [state.version] ); useEffect(() => { refetchCaseConfigure(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx index 9cd755864d37b..812e580ad653f 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx @@ -50,10 +50,12 @@ export const useConnectors = (): ReturnConnectors => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { refetchConnectors(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx index ef68f4f48b1a0..c333ff4207833 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx @@ -108,6 +108,7 @@ export const useUpdateCases = (): UseUpdateCases => { cancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const dispatchResetIsUpdated = useCallback(() => { @@ -121,6 +122,7 @@ export const useUpdateCases = (): UseUpdateCases => { version: theCase.version, })); dispatchUpdateCases(updateCasesStatus); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...state, updateBulkStatus, dispatchResetIsUpdated }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx index 2e8c7dfae2313..f47e9e51f865a 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx @@ -110,6 +110,7 @@ export const useDeleteCases = (): UseDeleteCase => { abortCtrl.abort(); cancel = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const dispatchToggleDeleteModal = useCallback(() => { @@ -118,6 +119,7 @@ export const useDeleteCases = (): UseDeleteCase => { const dispatchResetIsDeleted = useCallback(() => { dispatch({ type: 'RESET_IS_DELETED' }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.isDisplayConfirmDeleteModal]); const handleOnDeleteConfirm = useCallback( @@ -125,10 +127,12 @@ export const useDeleteCases = (): UseDeleteCase => { dispatchDeleteCases(cases); dispatchToggleDeleteModal(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [state.isDisplayConfirmDeleteModal] ); const handleToggleModal = useCallback(() => { dispatchToggleDeleteModal(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.isDisplayConfirmDeleteModal]); return { ...state, dispatchResetIsDeleted, handleOnDeleteConfirm, handleToggleModal }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx index 563e2a4a58c70..e289a1973cf6e 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx @@ -65,10 +65,12 @@ export const useGetActionLicense = (): ActionLicenseState => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [actionLicenseState]); useEffect(() => { fetchActionLicense(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...actionLicenseState }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx index 01ada00ba9b72..ea4da41151993 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx @@ -118,10 +118,12 @@ export const useGetCase = (caseId: string): UseGetCase => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [caseId]); useEffect(() => { callFetch(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [caseId]); return { ...state, fetchCase: callFetch, updateCase }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx index 050b2815dc511..76d939de06a0a 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx @@ -210,6 +210,7 @@ export const useGetCaseUserActions = ( abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [caseUserActionsState, caseConnectorId] ); @@ -217,6 +218,7 @@ export const useGetCaseUserActions = ( if (!isEmpty(caseId)) { fetchCaseUserActions(caseId); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [caseId, caseConnectorId]); return { ...caseUserActionsState, fetchCaseUserActions }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx index 45b571a8fe7e2..fdf526a1e4d88 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx @@ -184,8 +184,10 @@ export const useGetCases = (initialQueryParams?: QueryParams): UseGetCases => { abortCtrl.abort(); didCancel = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(() => fetchCases(state.filterOptions, state.queryParams), [ state.queryParams, state.filterOptions, @@ -224,11 +226,13 @@ export const useGetCases = (initialQueryParams?: QueryParams): UseGetCases => { didCancel = true; }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [state.filterOptions, state.queryParams] ); const refetchCases = useCallback(() => { fetchCases(state.filterOptions, state.queryParams); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.filterOptions, state.queryParams]); return { diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx index 476462b7e4c28..5260b6d5cc283 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx @@ -69,10 +69,12 @@ export const useGetCasesStatus = (): UseGetCasesStatus => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [casesStatusState]); useEffect(() => { fetchCasesStatus(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx index d723b8cc37c23..b4ca775660910 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx @@ -79,10 +79,12 @@ export const useGetReporters = (): UseGetReporters => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [reportersState]); useEffect(() => { fetchReporters(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...reportersState, fetchReporters }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx index 14f5e35bc4976..eded326719e52 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx @@ -89,6 +89,7 @@ export const useGetTags = (): UseGetTags => { }; useEffect(() => { callFetch(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...state, fetchTags: callFetch }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx index 13cfc2738620f..0752fe9b2071c 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx @@ -86,6 +86,7 @@ export const usePostCase = (): UsePostCase => { abortCtrl.abort(); cancel = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...state, postCase: postMyCase }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx index 9a52eaaf0db6b..e6cb8a9c3d150 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx @@ -79,6 +79,7 @@ export const usePostComment = (caseId: string): UsePostComment => { cancel = true; }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [caseId] ); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx index 4d25ac7fbf0db..0d8a4c04ca7cd 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx @@ -146,6 +146,7 @@ export const usePostPushToService = (): UsePostPushToService => { abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx index 77cf53165d914..18dd9f5278503 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx @@ -118,6 +118,7 @@ export const useUpdateCase = ({ caseId }: { caseId: string }): UseUpdateCase => abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx index 821fd5523a751..f896185dbccfb 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx @@ -111,6 +111,7 @@ export const useUpdateComment = (): UseUpdateComment => { abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx b/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx index b19343a9f4a5c..bb6ba01821835 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx +++ b/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx @@ -69,6 +69,7 @@ const AlertsTableComponent: React.FC = ({ endDate, startDate, pageFilters title: i18n.ALERTS_TABLE_TITLE, unit: i18n.UNIT, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( { const isDarkMode = useUiSetting(DEFAULT_DARK_MODE); const defaultTheme = isDarkMode ? DARK_THEME : LIGHT_THEME; + // eslint-disable-next-line react-hooks/exhaustive-deps const themeValue = useMemo(() => mergeWithDefaultTheme(theme, defaultTheme), []); return themeValue; diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx index c33677e41db0e..32f05e7c837a7 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx @@ -126,6 +126,7 @@ export const DragDropContextWrapperComponent = React.memo( () => () => { unRegisterProvider(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx index 998d18291f638..4eeefdbe2fca0 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx @@ -63,6 +63,7 @@ const DraggableWrapperHoverContentComponent: React.FC = ({ onFilterAdded(); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field, value, filterManager, onFilterAdded]); const filterOutValue = useCallback(() => { @@ -77,6 +78,7 @@ const DraggableWrapperHoverContentComponent: React.FC = ({ onFilterAdded(); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field, value, filterManager, onFilterAdded]); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx index d0bd87188e541..6b4baac0ff26c 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx @@ -103,9 +103,11 @@ const EventsViewerComponent: React.FC = ({ } = useManageTimeline(); useEffect(() => { setIsTimelineLoading({ id, isLoading: isQueryLoading }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isQueryLoading]); useEffect(() => { setTimelineFilterManager({ id, filterManager }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterManager]); const { queryFields, title, unit } = useMemo(() => getManageTimelineById(id), [ diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx index ec726cd603579..9f1d71108e2f1 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx @@ -74,6 +74,7 @@ const StatefulEventsViewerComponent: React.FC = ({ return () => { deleteEventQuery({ id, inputId: 'global' }); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const onChangeItemsPerPage: OnChangeItemsPerPage = useCallback( diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.tsx index d0236adc27c6c..fa21d61b06ebe 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.tsx @@ -109,6 +109,7 @@ const ExceptionEntriesComponent = ({ }, }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [entries] ); diff --git a/x-pack/plugins/security_solution/public/common/components/generic_downloader/index.tsx b/x-pack/plugins/security_solution/public/common/components/generic_downloader/index.tsx index 2f68da0c18727..2e8d5f77afc83 100644 --- a/x-pack/plugins/security_solution/public/common/components/generic_downloader/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/generic_downloader/index.tsx @@ -95,6 +95,7 @@ export const GenericDownloaderComponent = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ids]); return ; diff --git a/x-pack/plugins/security_solution/public/common/components/header_page/editable_title.tsx b/x-pack/plugins/security_solution/public/common/components/header_page/editable_title.tsx index 0c6f7258d09dc..6f6c94a0b1124 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_page/editable_title.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_page/editable_title.tsx @@ -57,6 +57,7 @@ const EditableTitleComponent: React.FC = ({ onSubmit(changedTitle); } setEditMode(false); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [changedTitle, title]); const handleOnChange = useCallback( diff --git a/x-pack/plugins/security_solution/public/common/components/help_menu/index.tsx b/x-pack/plugins/security_solution/public/common/components/help_menu/index.tsx index ba9c136445983..56f0c825aa59e 100644 --- a/x-pack/plugins/security_solution/public/common/components/help_menu/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/help_menu/index.tsx @@ -45,6 +45,7 @@ export const HelpMenu = React.memo(() => { }, ], }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return null; diff --git a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx index c4e0a0de5ae81..a42628cecff8e 100644 --- a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx @@ -109,6 +109,7 @@ export const ImportDataModalComponent = ({ errorToToaster({ title: errorMessage, error, dispatchToaster }); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedFiles, overwrite]); const handleCloseModal = useCallback(() => { diff --git a/x-pack/plugins/security_solution/public/common/components/links/index.tsx b/x-pack/plugins/security_solution/public/common/components/links/index.tsx index 8a41d4c36edbb..637f0d8d53057 100644 --- a/x-pack/plugins/security_solution/public/common/components/links/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/links/index.tsx @@ -242,6 +242,7 @@ const ReputationLinkComponent: React.FC<{ name: isDefaultReputationLink(name) ? defaultNameMapping[name] : name, url_template: url_template.replace(`{{ip}}`, encodeURIComponent(domain)), })), + // eslint-disable-next-line react-hooks/exhaustive-deps [ipReputationLinksSetting, domain, defaultNameMapping, allItemsLimit] ); diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx b/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx index b0df2b6b5b60f..d92952992d997 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx @@ -135,6 +135,7 @@ export const MarkdownEditor = React.memo<{ ), }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [content, isDisabled, placeholder] ); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.tsx b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.tsx index 08edae208fefa..3e196c4b7bad4 100644 --- a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.tsx @@ -19,12 +19,7 @@ import { MatrixLoader } from './matrix_loader'; import { Panel } from '../panel'; import { getBarchartConfigs, getCustomChartData } from './utils'; import { useQuery } from '../../containers/matrix_histogram'; -import { - MatrixHistogramProps, - MatrixHistogramOption, - HistogramAggregation, - MatrixHistogramQueryProps, -} from './types'; +import { MatrixHistogramProps, MatrixHistogramOption, MatrixHistogramQueryProps } from './types'; import { InspectButtonContainer } from '../inspect'; import { State, inputsSelectors } from '../../store'; @@ -125,6 +120,7 @@ export const MatrixHistogramComponent: React.FC< yTickFormatter, showLegend, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [ chartHeight, startDate, @@ -145,21 +141,20 @@ export const MatrixHistogramComponent: React.FC< stackByOptions.find((co) => co.value === event.target.value) ?? defaultStackByOption ); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); - const { data, loading, inspect, totalCount, refetch = noop } = useQuery<{}, HistogramAggregation>( - { - endDate, - errorMessage, - filterQuery, - histogramType, - indexToAdd, - startDate, - isInspected, - stackByField: selectedStackByOption.value, - } - ); + const { data, loading, inspect, totalCount, refetch = noop } = useQuery({ + endDate, + errorMessage, + filterQuery, + histogramType, + indexToAdd, + startDate, + isInspected, + stackByField: selectedStackByOption.value, + }); const titleWithStackByField = useMemo( () => (title != null && typeof title === 'function' ? title(selectedStackByOption) : title), @@ -260,7 +255,7 @@ export const MatrixHistogram = React.memo(MatrixHistogramComponent); const makeMapStateToProps = () => { const getQuery = inputsSelectors.globalQueryByIdSelector(); - const mapStateToProps = (state: State, { type, id }: OwnProps) => { + const mapStateToProps = (state: State, { id }: OwnProps) => { const { isInspected } = getQuery(state, id); return { isInspected, diff --git a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/types.ts b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/types.ts index e30f1e9374c26..a9e6cdd19bb20 100644 --- a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/types.ts @@ -99,12 +99,6 @@ export interface GroupBucket { }; } -export interface HistogramAggregation { - histogramAgg: { - buckets: GroupBucket[]; - }; -} - export interface BarchartConfigs { series: { xScaleType: ScaleType; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts index a76c4c850b8d9..8568c7e6b5575 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts @@ -121,13 +121,17 @@ export const useAnomaliesTableData = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ + // eslint-disable-next-line react-hooks/exhaustive-deps influencersOrCriteriaToString(influencers), + // eslint-disable-next-line react-hooks/exhaustive-deps influencersOrCriteriaToString(criteriaFields), startDate, endDate, skip, userPermissions, + // eslint-disable-next-line react-hooks/exhaustive-deps siemJobIds.sort().join(), ]); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx b/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx index 1d5c1b36e22af..c83271a56be5a 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx @@ -60,6 +60,7 @@ export const MlCapabilitiesProvider = React.memo<{ children: JSX.Element }>(({ c isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx index a84d88782926c..7f0a8dea1913e 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx @@ -74,6 +74,7 @@ export const useSiemJobs = (refetchData: boolean): Return => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [refetchData, userPermissions]); return [loading, siemJobs]; diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx index dd6e2d3f47110..de4185c8644a7 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx @@ -46,6 +46,7 @@ export const GroupsFilterPopoverComponent = ({ useEffect(() => { onSelectedGroupsChanged(selectedGroups); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedGroups.sort().join()]); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx index e0a24a5fc083c..0cbff9e70eff7 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx @@ -54,6 +54,7 @@ export const SiemNavigationComponent: React.FC< chrome ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [chrome, pathName, search, navTabs, urlState, state]); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx b/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx index b0b9309b44c68..a182102329f05 100644 --- a/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx @@ -134,6 +134,7 @@ const SearchBarComponent = memo( window.setTimeout(() => updateSearch(updateSearchBar), 0); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id, end, filterQuery, fromStr, queries, start, toStr] ); @@ -153,6 +154,7 @@ const SearchBarComponent = memo( queries.forEach((q) => q.refetch && (q.refetch as inputsModel.Refetch)()); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id, queries, filterManager] ); @@ -160,6 +162,7 @@ const SearchBarComponent = memo( (newSavedQuery: SavedQuery) => { setSavedQuery({ id, savedQuery: newSavedQuery }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -196,6 +199,7 @@ const SearchBarComponent = memo( updateSearch(updateSearchBar); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id, end, fromStr, start, toStr] ); @@ -218,6 +222,7 @@ const SearchBarComponent = memo( filterManager, }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [id, end, filterManager, fromStr, start, toStr, savedQuery]); useEffect(() => { @@ -241,6 +246,7 @@ const SearchBarComponent = memo( isSubscribed = false; subscriptions.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const indexPatterns = useMemo(() => [indexPattern], [indexPattern]); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/stat_items/index.tsx b/x-pack/plugins/security_solution/public/common/components/stat_items/index.tsx index ec9cfc62ebada..dee730059b03a 100644 --- a/x-pack/plugins/security_solution/public/common/components/stat_items/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/stat_items/index.tsx @@ -183,6 +183,7 @@ export const useKpiMatrixStatus = ( }; }) ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [data]); return statItemsProps; diff --git a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx index 6b979df653eb4..84ff1120f6496 100644 --- a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx @@ -117,6 +117,7 @@ export const SuperDatePickerComponent = React.memo( refetchQuery(queries); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [end, id, isQuickSelection, kqlQuery, start, timelineId] ); @@ -136,6 +137,7 @@ export const SuperDatePickerComponent = React.memo( refetchQuery(queries); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id, isQuickSelection, duration, policy, toStr] ); @@ -175,6 +177,7 @@ export const SuperDatePickerComponent = React.memo( setIsQuickSelection(newIsQuickSelection); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [recentlyUsedRanges, kqlQuery] ); diff --git a/x-pack/plugins/security_solution/public/common/components/toasters/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/toasters/index.test.tsx index 944e8f6d1fb39..35036ef4b16b5 100644 --- a/x-pack/plugins/security_solution/public/common/components/toasters/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/toasters/index.test.tsx @@ -69,6 +69,7 @@ describe('Toaster', () => { if (toasts.length === 0) { dispatch({ type: 'addToaster', toast: mockToast }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( <> diff --git a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx index 3e83866c7cf62..c28f5ab8aa44f 100644 --- a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx @@ -109,6 +109,7 @@ const StatefulTopNComponent: React.FC = ({ isManagedTimeline(ACTIVE_TIMELINE_REDUX_ID) ? getManageTimelineById(ACTIVE_TIMELINE_REDUX_ID) : { documentType: null, id: null, indexToAdd: null }, + // eslint-disable-next-line react-hooks/exhaustive-deps [getManageTimelineById] ); diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx b/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx index b3436a7da8297..ef60967e70ac3 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx +++ b/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx @@ -46,7 +46,6 @@ export const useUrlStateHooks = ({ pathName, search, setInitialStateFromUrl, - tabName, updateTimeline, updateTimelineIsLoading, urlState, @@ -206,10 +205,12 @@ export const useUrlStateHooks = ({ } else if (pathName !== prevProps.pathName) { handleInitialize(type, pageName === SiemPageName.detections); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isInitializing, history, pathName, pageName, prevProps, urlState]); useEffect(() => { document.title = `${getTitle(pageName, detailName, navTabs)} - Kibana`; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [pageName]); return null; diff --git a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx index a5574bd2a57c7..0beecc500e722 100644 --- a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx @@ -35,6 +35,7 @@ export const AnomaliesQueryTabBody = ({ deleteQuery({ id: ID }); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const [, siemJobs] = useSiemJobs(true); diff --git a/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts b/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts index 260b13c23f39c..6050dafc0b191 100644 --- a/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts +++ b/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts @@ -33,7 +33,7 @@ export interface OwnProps extends QueryTemplateProps { indexKey: LastEventIndexKey; } -export function useLastEventTimeQuery( +export function useLastEventTimeQuery( indexKey: LastEventIndexKey, details: LastTimeDetails, sourceId: string @@ -84,6 +84,7 @@ export function useLastEventTimeQuery( const signal = abortCtrl.signal; fetchLastEventTime(signal); return () => abortCtrl.abort(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [apolloClient, indexKey, details.hostName, details.ip]); return { lastSeen, loading, errorMessage }; diff --git a/x-pack/plugins/security_solution/public/common/containers/global_time/index.tsx b/x-pack/plugins/security_solution/public/common/containers/global_time/index.tsx index 4632e9aee3fdd..9b9b5c5d815b9 100644 --- a/x-pack/plugins/security_solution/public/common/containers/global_time/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/global_time/index.tsx @@ -59,6 +59,7 @@ export const GlobalTimeComponent: React.FC = ({ return () => { deleteAllQuery({ id: 'global' }); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts b/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts index c675c2745c66a..8c7acfc18ece6 100644 --- a/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts +++ b/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts @@ -17,7 +17,7 @@ import { inputsModel } from '../../store'; import { MatrixHistogramGqlQuery } from './index.gql_query'; import { GetMatrixHistogramQuery, MatrixOverTimeHistogramData } from '../../../graphql/types'; -export const useQuery = ({ +export const useQuery = ({ endDate, errorMessage, filterQuery, @@ -102,6 +102,7 @@ export const useQuery = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ defaultIndex, errorMessage, diff --git a/x-pack/plugins/security_solution/public/common/containers/source/index.tsx b/x-pack/plugins/security_solution/public/common/containers/source/index.tsx index 26fb14c6a9c1e..ad480ad2c496b 100644 --- a/x-pack/plugins/security_solution/public/common/containers/source/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/source/index.tsx @@ -75,7 +75,7 @@ export const getIndexFields = memoizeOne( ); export const getBrowserFields = memoizeOne( - (title: string, fields: IndexField[]): BrowserFields => + (_title: string, fields: IndexField[]): BrowserFields => fields && fields.length > 0 ? fields.reduce( (accumulator: BrowserFields, field: IndexField) => @@ -173,6 +173,7 @@ export const useWithSource = (sourceId: string, indices: string[]) => { const signal = abortCtrl.signal; fetchSource(signal); return () => abortCtrl.abort(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [apolloClient, sourceId, indices]); return { indicesExist, browserFields, indexPattern, loading, errorMessage }; diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_add_to_timeline.tsx b/x-pack/plugins/security_solution/public/common/hooks/use_add_to_timeline.tsx index b73c400bc0460..eba8d14d60538 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/use_add_to_timeline.tsx +++ b/x-pack/plugins/security_solution/public/common/hooks/use_add_to_timeline.tsx @@ -159,6 +159,7 @@ export const useAddToTimeline = ({ document.body.classList.remove(IS_DRAGGING_CLASS_NAME); // it was not possible to perform a drag and drop } }, 0); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [_sensorApiSingleton, draggableId]); return startDragToTimeline; diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_index_patterns.tsx b/x-pack/plugins/security_solution/public/common/hooks/use_index_patterns.tsx index 05b0521e35217..837d6d5f70b5d 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/use_index_patterns.tsx +++ b/x-pack/plugins/security_solution/public/common/hooks/use_index_patterns.tsx @@ -45,6 +45,7 @@ export const useIndexPatterns = (refreshToggle = false): Return => { return () => { isSubscribed = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [refreshToggle]); return [isLoading, indexPatterns]; diff --git a/x-pack/plugins/security_solution/public/common/lib/connectors/components/connector_flyout/index.tsx b/x-pack/plugins/security_solution/public/common/lib/connectors/components/connector_flyout/index.tsx index cb227563b697a..30e2c650a70cc 100644 --- a/x-pack/plugins/security_solution/public/common/lib/connectors/components/connector_flyout/index.tsx +++ b/x-pack/plugins/security_solution/public/common/lib/connectors/components/connector_flyout/index.tsx @@ -53,6 +53,7 @@ export const withConnectorFlyout = ({ if (!isEmpty(apiUrl)) { secretKeys.forEach((key: string) => editActionSecrets(key, '')); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if (isEmpty(mapping)) { @@ -64,6 +65,7 @@ export const withConnectorFlyout = ({ const handleOnChangeActionConfig = useCallback( (key: string, value: string) => editActionConfig(key, value), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -73,11 +75,13 @@ export const withConnectorFlyout = ({ editActionConfig(key, ''); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [action.config] ); const handleOnChangeSecretConfig = useCallback( (key: string, value: string) => editActionSecrets(key, value), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -87,6 +91,7 @@ export const withConnectorFlyout = ({ editActionSecrets(key, ''); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [action.secrets] ); @@ -96,6 +101,7 @@ export const withConnectorFlyout = ({ ...action.config.casesConfiguration, mapping: newMapping, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [action.config] ); diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts index afd57cade5559..bc16e8334e81c 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts @@ -89,10 +89,12 @@ export const useCurrentUser = (): AuthenticatedElasticUser | null => { return () => { didCancel = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [security]); useEffect(() => { fetchUser(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return user; }; diff --git a/x-pack/plugins/security_solution/public/common/utils/route/spy_routes.tsx b/x-pack/plugins/security_solution/public/common/utils/route/spy_routes.tsx index 9030e2713548b..072bbcf31c900 100644 --- a/x-pack/plugins/security_solution/public/common/utils/route/spy_routes.tsx +++ b/x-pack/plugins/security_solution/public/common/utils/route/spy_routes.tsx @@ -32,6 +32,7 @@ export const SpyRouteComponent = memo( }); setIsInitializing(false); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [search]); useEffect(() => { if (pageName && !deepEqual(route.pathName, pathname)) { @@ -81,6 +82,7 @@ export const SpyRouteComponent = memo( }); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [pathname, search, pageName, detailName, tabName, flowTarget, state]); return null; } diff --git a/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.tsx b/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.tsx index 78f22a86c1893..37c6a6583f0fb 100644 --- a/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.tsx +++ b/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.tsx @@ -25,6 +25,7 @@ export const useShowTimeline = () => { } else if (!showTimeline) { setShowTimeline(true); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [currentLocation.pathname]); return [showTimeline]; diff --git a/x-pack/plugins/security_solution/public/endpoint_alerts/view/details/overview/index.tsx b/x-pack/plugins/security_solution/public/endpoint_alerts/view/details/overview/index.tsx index 937e3727ca613..86c8e00c0a56f 100644 --- a/x-pack/plugins/security_solution/public/endpoint_alerts/view/details/overview/index.tsx +++ b/x-pack/plugins/security_solution/public/endpoint_alerts/view/details/overview/index.tsx @@ -90,6 +90,7 @@ const AlertDetailsOverviewComponent = memo(() => { history.push(locationObject); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [alertDetailsTabId] ); diff --git a/x-pack/plugins/security_solution/public/hosts/containers/hosts/first_last_seen/index.ts b/x-pack/plugins/security_solution/public/hosts/containers/hosts/first_last_seen/index.ts index 55a3a4b060dad..a4f8fca23e8aa 100644 --- a/x-pack/plugins/security_solution/public/hosts/containers/hosts/first_last_seen/index.ts +++ b/x-pack/plugins/security_solution/public/hosts/containers/hosts/first_last_seen/index.ts @@ -79,6 +79,7 @@ export function useFirstLastSeenHostQuery( const signal = abortCtrl.signal; fetchFirstLastSeenHost(signal); return () => abortCtrl.abort(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { firstSeen, lastSeen, loading, errorMessage }; diff --git a/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx b/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx index 5b140a53a363b..4fbbcfc8d948a 100644 --- a/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx +++ b/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx @@ -35,6 +35,7 @@ export const ManagementPageView = memo>((options) => href: getManagementUrl({ name: 'policyList' }), }, ]; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [tabName]); return ; }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx index b05cdfb3be840..6c447df618791 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx @@ -137,6 +137,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { description: details.agent.version, }, ]; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ details.agent.version, details.endpoint.policy.id, diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx index 5e0aa76e1d139..39b253439aff0 100644 --- a/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx @@ -149,6 +149,7 @@ export const EmbeddedMapComponent = ({ return () => { isSubscribed = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loadingKibanaIndexPatterns, kibanaIndexPatterns]); // queryExpression updated useEffect @@ -156,12 +157,14 @@ export const EmbeddedMapComponent = ({ if (embeddable != null) { embeddable.updateInput({ query }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [query]); useEffect(() => { if (embeddable != null) { embeddable.updateInput({ filters }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filters]); // DateRange updated useEffect @@ -173,6 +176,7 @@ export const EmbeddedMapComponent = ({ }; embeddable.updateInput({ timeRange }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [startDate, endDate]); return isError ? null : ( diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx index 3472cb629b9fe..d2b8322c8121e 100644 --- a/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx @@ -20,10 +20,8 @@ import * as i18n from '../translations'; import { ITooltipProperty } from '../../../../../../maps/public'; export const MapToolTipComponent = ({ - addFilters, closeTooltip, features = [], - isLocked, getLayerName, loadFeatureProperties, loadFeatureGeometry, @@ -78,8 +76,10 @@ export const MapToolTipComponent = ({ }; fetchFeatureProps(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ featureIndex, + // eslint-disable-next-line react-hooks/exhaustive-deps features .map((f) => `${f.id}-${f.layerId}`) .sort() diff --git a/x-pack/plugins/security_solution/public/network/components/source_destination/country_flag.tsx b/x-pack/plugins/security_solution/public/network/components/source_destination/country_flag.tsx index b9c01826e9e74..cb1af5513c846 100644 --- a/x-pack/plugins/security_solution/public/network/components/source_destination/country_flag.tsx +++ b/x-pack/plugins/security_solution/public/network/components/source_destination/country_flag.tsx @@ -31,6 +31,7 @@ export const CountryFlag = memo<{ if (displayCountryNameOnHover && isEmpty(countries.getNames('en'))) { countries.registerLocale(countryJson); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const flag = getFlag(countryCode); diff --git a/x-pack/plugins/security_solution/public/network/components/tls_table/index.tsx b/x-pack/plugins/security_solution/public/network/components/tls_table/index.tsx index 0fc4629c95470..d0e001466518d 100644 --- a/x-pack/plugins/security_solution/public/network/components/tls_table/index.tsx +++ b/x-pack/plugins/security_solution/public/network/components/tls_table/index.tsx @@ -108,6 +108,7 @@ const TlsTableComponent = React.memo( [sort, type, tableType, updateNetworkTable] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const columns = useMemo(() => getTlsColumns(tlsTableId), [tlsTableId]); return ( diff --git a/x-pack/plugins/security_solution/public/network/components/users_table/index.tsx b/x-pack/plugins/security_solution/public/network/components/users_table/index.tsx index 51634a784d4da..af9d2b0ffefe3 100644 --- a/x-pack/plugins/security_solution/public/network/components/users_table/index.tsx +++ b/x-pack/plugins/security_solution/public/network/components/users_table/index.tsx @@ -114,6 +114,7 @@ const UsersTableComponent = React.memo( [sort, type, updateNetworkTable] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const columns = useMemo(() => getUsersColumns(flowTarget, usersTableId), [ flowTarget, usersTableId, diff --git a/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx b/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx index 574260a819071..fe66ae2624c2a 100644 --- a/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx @@ -71,6 +71,7 @@ const AlertsByCategoryComponent: React.FC = ({ deleteQuery({ id: ID }); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const kibana = useKibana(); @@ -98,6 +99,7 @@ const AlertsByCategoryComponent: React.FC = ({ `${SHOWING}: ${numeral(totalCount).format(defaultNumberFormat)} ${UNIT(totalCount)}`, legendPosition: Position.Right, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx index 75b157a282eeb..ab76219b3cc00 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx @@ -82,6 +82,7 @@ const StatefulRecentTimelinesComponent = React.memo( onlyUserFavorite: filterBy === 'favorites', timelineType: TimelineType.default, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterBy]); return ( diff --git a/x-pack/plugins/security_solution/public/overview/components/signals_by_category/index.tsx b/x-pack/plugins/security_solution/public/overview/components/signals_by_category/index.tsx index f2ad45be93522..5010fd9c06eb7 100644 --- a/x-pack/plugins/security_solution/public/overview/components/signals_by_category/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/signals_by_category/index.tsx @@ -61,6 +61,7 @@ const SignalsByCategoryComponent: React.FC = ({ const [min, max] = x; setAbsoluteRangeDatePicker({ id: setAbsoluteRangeDatePickerTarget, from: min, to: max }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [setAbsoluteRangeDatePicker] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/category_columns.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/category_columns.tsx index b0a8dc311228a..14c17b7262724 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/category_columns.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/category_columns.tsx @@ -50,6 +50,7 @@ interface ToolTipProps { const ToolTip = React.memo( ({ categoryId, browserFields, onUpdateColumns, timelineId }) => { const { getManageTimelineById } = useManageTimeline(); + // eslint-disable-next-line react-hooks/exhaustive-deps const { isLoading } = useMemo(() => getManageTimelineById(timelineId) ?? { isLoading: false }, [ timelineId, ]); diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_browser.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_browser.tsx index c255bd062bb4c..8f538e03835f8 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_browser.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_browser.tsx @@ -180,6 +180,7 @@ const FieldsBrowserComponent: React.FC = ({ useEffect(() => { scrollViews(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedCategoryId, timelineId]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.tsx index 11c44cce89956..a3e93ff3c90eb 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.tsx @@ -108,6 +108,7 @@ export const StatefulFieldsBrowserComponent = React.memo { onUpdateColumns(columns); // show the category columns in the timeline + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); /** Invoked when the field browser should be hidden */ diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx index 33aca80b940fe..fbe3c475c9fe6 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx @@ -50,7 +50,7 @@ const FlyoutPaneComponent: React.FC = ({ const dispatch = useDispatch(); const onResizeStop: ResizeCallback = useCallback( - (e, direction, ref, delta) => { + (_e, _direction, _ref, delta) => { const bodyClientWidthPixels = document.body.clientWidth; if (delta.width) { @@ -65,6 +65,7 @@ const FlyoutPaneComponent: React.FC = ({ ); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [dispatch] ); const resizableDefaultSize = useMemo( @@ -72,6 +73,7 @@ const FlyoutPaneComponent: React.FC = ({ width, height: '100%', }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); const resizableHandleComponent = useMemo( diff --git a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx index c82a8bd18e6f8..8856805e6b660 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx @@ -190,6 +190,7 @@ const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseT initializeTimeline({ id }); return { ...timelineDefaults, id }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [state] ); const isManagedTimeline = useCallback((id: string): boolean => state[id] != null, [state]); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_actions.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_actions.tsx index 112e73a47ce7d..f88690ccd8aef 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_actions.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_actions.tsx @@ -16,6 +16,7 @@ export const useEditTimelineActions = () => { const onCloseDeleteTimelineModal = useCallback(() => { setIsDeleteTimelineModalOpen(false); setActionTimeline(null); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [actionItem]); const onOpenDeleteTimelineModal = useCallback((selectedActionItem?: OpenTimelineResult) => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx index 7fb03b98432d0..4d45b74e9b1b4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx @@ -47,6 +47,7 @@ export const useEditTimelineBatchActions = ({ disableExportTimelineDownloader(); onCloseDeleteTimelineModal(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [disableExportTimelineDownloader, onCloseDeleteTimelineModal, tableRef.current] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx index f9c9d28ad89e1..92a8fc9338877 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx @@ -125,6 +125,7 @@ export const StatefulOpenTimelineComponent = React.memo( onlyUserFavorite: onlyFavorites, timelineType, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [pageIndex, pageSize, search, sortField, sortDirection, timelineType, onlyFavorites]); /** Invoked when the user presses enters to submit the text in the search input */ @@ -177,6 +178,7 @@ export const StatefulOpenTimelineComponent = React.memo( const onDeleteOneTimeline: OnDeleteOneTimeline = useCallback( async (timelineIds: string[]) => { + // The type for `deleteTimelines` is incorrect, it returns a Promise await deleteTimelines(timelineIds); }, [deleteTimelines] @@ -184,6 +186,7 @@ export const StatefulOpenTimelineComponent = React.memo( /** Invoked when the user clicks the action to delete the selected timelines */ const onDeleteSelected: OnDeleteSelected = useCallback(async () => { + // The type for `deleteTimelines` is incorrect, it returns a Promise await deleteTimelines(getSelectedTimelineIds(selectedItems)); // NOTE: we clear the selection state below, but if the server fails to @@ -191,6 +194,7 @@ export const StatefulOpenTimelineComponent = React.memo( resetSelectionState(); // TODO: the query must re-execute to show the results of the deletion + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedItems, deleteTimelines]); /** Invoked when the user selects (or de-selects) timelines */ @@ -244,6 +248,7 @@ export const StatefulOpenTimelineComponent = React.memo( updateTimeline, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [apolloClient, updateIsLoading, updateTimeline] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx index f99d8c566c4a5..afc66e337d7b2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx @@ -79,6 +79,7 @@ export const useTimelineTypes = (): { ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [tabName]); const timelineFilters = useMemo(() => { @@ -95,6 +96,7 @@ export const useTimelineTypes = (): { ))} ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [timelineType]); return { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.tsx index 2d9f907cc7179..2bb78c0dcb0ad 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.tsx @@ -108,7 +108,7 @@ export const ColumnHeadersComponent = ({ ); const renderClone: DraggableChildrenFn = useCallback( - (dragProvided, dragSnapshot, rubric) => { + (dragProvided, _dragSnapshot, rubric) => { // TODO: Remove after github.com/DefinitelyTyped/DefinitelyTyped/pull/43057 is merged // eslint-disable-next-line @typescript-eslint/no-explicit-any const index = (rubric as any).source.index; @@ -151,6 +151,7 @@ export const ColumnHeadersComponent = ({ sort={sort} /> )), + // eslint-disable-next-line react-hooks/exhaustive-deps [ columnHeaders, timelineId, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx index 3808a10e851e6..a9ade7b34344e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx @@ -106,6 +106,7 @@ export const EventColumnView = React.memo( const onClickCb = useCallback((cb: () => void) => { cb(); closePopover(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const additionalActions = useMemo(() => { @@ -175,6 +176,7 @@ export const EventColumnView = React.memo( , ] : grouped.icon; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [button, ecsData, timelineActions, isPopoverOpen]); // , isPopoverOpen, closePopover, onButtonClick]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx index 61c5809518928..cf76cd3ddb8d4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx @@ -174,6 +174,7 @@ const StatefulEventComponent: React.FC = ({ return () => { _isMounted = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // Number of current columns plus one for actions. diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/stateful_body.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/stateful_body.tsx index 351465dd45137..2d5e64fb09ffc 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/stateful_body.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/stateful_body.tsx @@ -94,6 +94,7 @@ const StatefulBodyComponent = React.memo( const onAddNoteToEvent: AddNoteToEvent = useCallback( ({ eventId, noteId }: { eventId: string; noteId: string }) => addNoteToEvent!({ id, eventId, noteId }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -131,27 +132,34 @@ const StatefulBodyComponent = React.memo( (sorted) => { updateSort!({ id, sort: sorted }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); const onColumnRemoved: OnColumnRemoved = useCallback( (columnId) => removeColumn!({ id, columnId }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); const onColumnResized: OnColumnResized = useCallback( ({ columnId, delta }) => applyDeltaToColumnWidth!({ id, columnId, delta }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const onPinEvent: OnPinEvent = useCallback((eventId) => pinEvent!({ id, eventId }), [id]); + // eslint-disable-next-line react-hooks/exhaustive-deps const onUnPinEvent: OnUnPinEvent = useCallback((eventId) => unPinEvent!({ id, eventId }), [id]); + // eslint-disable-next-line react-hooks/exhaustive-deps const onUpdateNote: UpdateNote = useCallback((note: Note) => updateNote!({ note }), []); const onUpdateColumns: OnUpdateColumns = useCallback( (columns) => updateColumns!({ id, columns }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -160,6 +168,7 @@ const StatefulBodyComponent = React.memo( if (selectAll) { onSelectAll({ isSelected: true }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectAll]); // onSelectAll dependency not necessary return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/provider_item_badge.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/provider_item_badge.tsx index aaf73487c4878..1f6fe998a44e9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/provider_item_badge.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/provider_item_badge.tsx @@ -71,11 +71,13 @@ export const ProviderItemBadge = React.memo( const onToggleEnabledProvider = useCallback(() => { toggleEnabledProvider(); closePopover(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [toggleEnabledProvider]); const onToggleExcludedProvider = useCallback(() => { toggleExcludedProvider(); closePopover(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [toggleExcludedProvider]); const [providerRegistered, setProviderRegistered] = useState(false); @@ -100,6 +102,7 @@ export const ProviderItemBadge = React.memo( () => () => { unRegisterProvider(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/fetch_kql_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/fetch_kql_timeline.tsx index 77bd9aeba3ed2..cec889fe6ee34 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/fetch_kql_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/fetch_kql_timeline.tsx @@ -39,6 +39,7 @@ const TimelineKqlFetchComponent = memo( timelineId: id, }), }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [kueryFilterQueryDraft, kueryFilterQuery, id]); return null; }, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx index 607e004a8294e..594bf6d43e285 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx @@ -266,6 +266,7 @@ export const FooterComponent = ({ if (updatedAt === null || !isLoading) { setUpdatedAt(getUpdatedAt()); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isLoading]); if (isLoading && !paginationLoading) { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx index 42fd6422d3a38..b53a34041a689 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx @@ -78,6 +78,7 @@ const StatefulTimelineComponent = React.memo( const onDataProviderRemoved: OnDataProviderRemoved = useCallback( (providerId: string, andProviderId?: string) => removeProvider!({ id, providerId, andProviderId }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -89,6 +90,7 @@ const StatefulTimelineComponent = React.memo( providerId, andProviderId, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -100,6 +102,7 @@ const StatefulTimelineComponent = React.memo( providerId, andProviderId, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -114,11 +117,13 @@ const StatefulTimelineComponent = React.memo( providerId, value, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); const onChangeItemsPerPage: OnChangeItemsPerPage = useCallback( (itemsChangedPerPage) => updateItemsPerPage!({ id, itemsPerPage: itemsChangedPerPage }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -141,6 +146,7 @@ const StatefulTimelineComponent = React.memo( }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [columns, id] ); @@ -148,6 +154,7 @@ const StatefulTimelineComponent = React.memo( if (createTimeline != null) { createTimeline({ id, columns: defaultHeaders, show: false }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx index 2a673427d906c..ed4d742bb8b4d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx @@ -52,6 +52,7 @@ export const InsertTimelinePopoverComponent: React.FC = ({ ); setRouterState(null); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [routerState]); const handleClosePopover = useCallback(() => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx index 1a81c131de015..0f9e64082a603 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx @@ -28,12 +28,14 @@ export const useInsertTimeline = (form: FormHook, fieldNa ].join(''); form.setFieldValue(fieldName, newValue); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [form] ); const handleCursorChange = useCallback( (cp: CursorPosition) => { setCursorPosition(cp); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [cursorPosition] ); return { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx index 3ef10d394bc7b..38a85a7a92631 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx @@ -142,6 +142,7 @@ export const NewCase = React.memo( }, }, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [onClosePopover, history, timelineId, timelineTitle]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx index d8966a58748ed..1532a64e4083e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx @@ -87,6 +87,7 @@ export const Properties = React.memo( const onOpenTimelineModal = useCallback(() => { onClosePopover(); setShowTimelineModal(true); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const datePickerWidth = useMemo( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx index 9852fc7dd300a..80729eda051b1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx @@ -120,6 +120,7 @@ export const QueryBarTimeline = memo( isSubscribed = false; subscriptions.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -129,6 +130,7 @@ export const QueryBarTimeline = memo( if (!deepEqual(filters, filterWithoutDropArea)) { filterManager.setFilters(filters); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filters]); useEffect(() => { @@ -188,6 +190,7 @@ export const QueryBarTimeline = memo( return () => { isSubscribed = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [savedQueryId]); const onChangedQuery = useCallback( @@ -203,6 +206,7 @@ export const QueryBarTimeline = memo( ); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterQueryDraft] ); @@ -232,6 +236,7 @@ export const QueryBarTimeline = memo( }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterQuery, timelineId] ); @@ -274,6 +279,7 @@ export const QueryBarTimeline = memo( setSavedQueryId(null); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [dataProvidersDsl, savedQueryId, savedQueryServices] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx index 22fbaadf2e816..5f35bc5212d37 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx @@ -78,6 +78,7 @@ const StatefulSearchOrFilterComponent = React.memo( serializedQuery: convertKueryToElasticSearchQuery(expression, indexPattern), }, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [indexPattern, timelineId] ); @@ -90,6 +91,7 @@ const StatefulSearchOrFilterComponent = React.memo( expression, }, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [timelineId] ); @@ -99,6 +101,7 @@ const StatefulSearchOrFilterComponent = React.memo( id: timelineId, filters: newFilters, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [timelineId] ); @@ -108,6 +111,7 @@ const StatefulSearchOrFilterComponent = React.memo( id: timelineId, savedQueryId: newSavedQueryId, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [timelineId] ); @@ -117,6 +121,7 @@ const StatefulSearchOrFilterComponent = React.memo( id: timelineId, eventType: newEventType, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [timelineId] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx index 2d215267d8382..2e12ebad2f99d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx @@ -258,6 +258,7 @@ const SelectableTimelineComponent: React.FC = ({ onlyUserFavorite: onlyFavorites, timelineType, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [onlyFavorites, pageSize, searchTimelineValue, timelineType]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx index 340818efa5514..884d693ca6ade 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx @@ -171,12 +171,15 @@ export const TimelineComponent: React.FC = ({ } = useManageTimeline(); useEffect(() => { initializeTimeline({ id, indexToAdd }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { setIsTimelineLoading({ id, isLoading: isQueryLoading || loadingIndexName }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loadingIndexName, isQueryLoading]); useEffect(() => { setTimelineFilterManager({ id, filterManager }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterManager]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx index 3bca7ce5f1c08..19112221cbfd0 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx @@ -48,7 +48,7 @@ export interface AllTimelinesVariables { export const ALL_TIMELINE_QUERY_ID = 'FETCH_ALL_TIMELINES'; export const getAllTimeline = memoizeOne( - (variables: string, timelines: TimelineResult[]): OpenTimelineResult[] => + (_variables: string, timelines: TimelineResult[]): OpenTimelineResult[] => timelines.map((timeline) => ({ created: timeline.created, description: timeline.description, @@ -168,6 +168,7 @@ export const useGetAllTimeline = (): AllTimelinesArgs => { abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [apolloClient, allTimelines] ); From e2f11e9fe93bdf1e5d0ef63f8f4e3ae5fd4ff617 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Mon, 8 Jun 2020 11:19:01 -0400 Subject: [PATCH 10/91] [ML] DFAnalytics results: ensure ml result fields are shown in data grid (#68305) * wip: ensure top classes and influencer result col show up correctly * ensure ml subFields columns are populated --- .../components/data_grid/common.ts | 6 ++++- .../data_frame_analytics/common/analytics.ts | 10 +++++++++ .../data_frame_analytics/common/constants.ts | 1 + .../data_frame_analytics/common/fields.ts | 22 ++++++++++++++++--- .../use_exploration_results.ts | 11 +++++++--- 5 files changed, 43 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/ml/public/application/components/data_grid/common.ts b/x-pack/plugins/ml/public/application/components/data_grid/common.ts index 44a2473f75937..7d0559c215114 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/common.ts +++ b/x-pack/plugins/ml/public/application/components/data_grid/common.ts @@ -29,6 +29,7 @@ import { FEATURE_IMPORTANCE, FEATURE_INFLUENCE, OUTLIER_SCORE, + TOP_CLASSES, } from '../../data_frame_analytics/common/constants'; import { formatHumanReadableDateTimeSeconds } from '../../util/date_utils'; import { getNestedProperty } from '../../util/object_utils'; @@ -110,7 +111,10 @@ export const getDataGridSchemasFromFieldTypes = (fieldTypes: FieldTypes, results schema = 'numeric'; } - if (field.includes(`${resultsField}.${FEATURE_IMPORTANCE}`)) { + if ( + field.includes(`${resultsField}.${FEATURE_IMPORTANCE}`) || + field.includes(`${resultsField}.${TOP_CLASSES}`) + ) { schema = 'json'; } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts index 0b4e6d27b96e5..16d888a9da27b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts @@ -228,6 +228,16 @@ export const getPredictionFieldName = ( return predictionFieldName; }; +export const getNumTopClasses = ( + analysis: AnalysisConfig +): ClassificationAnalysis['classification']['num_top_classes'] => { + let numTopClasses; + if (isClassificationAnalysis(analysis) && analysis.classification.num_top_classes !== undefined) { + numTopClasses = analysis.classification.num_top_classes; + } + return numTopClasses; +}; + export const getNumTopFeatureImportanceValues = ( analysis: AnalysisConfig ): diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/constants.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/constants.ts index 51b2918012c8d..2f14dfdfdfca3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/constants.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/constants.ts @@ -7,4 +7,5 @@ export const DEFAULT_RESULTS_FIELD = 'ml'; export const FEATURE_IMPORTANCE = 'feature_importance'; export const FEATURE_INFLUENCE = 'feature_influence'; +export const TOP_CLASSES = 'top_classes'; export const OUTLIER_SCORE = 'outlier_score'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts index 8db349b395cfc..0a64886c80a63 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts @@ -5,6 +5,7 @@ */ import { + getNumTopClasses, getNumTopFeatureImportanceValues, getPredictedFieldName, getDependentVar, @@ -18,7 +19,7 @@ import { Field } from '../../../../common/types/fields'; import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '../../../../../../../src/plugins/data/public'; import { newJobCapsService } from '../../services/new_job_capabilities_service'; -import { FEATURE_IMPORTANCE, FEATURE_INFLUENCE, OUTLIER_SCORE } from './constants'; +import { FEATURE_IMPORTANCE, FEATURE_INFLUENCE, OUTLIER_SCORE, TOP_CLASSES } from './constants'; export type EsId = string; export type EsDocSource = Record; @@ -177,6 +178,7 @@ export const getDefaultFieldsFromJobCaps = ( const featureImportanceFields = []; const featureInfluenceFields = []; + const topClassesFields = []; const allFields: any = []; let type: ES_FIELD_TYPES | undefined; let predictedField: string | undefined; @@ -207,13 +209,14 @@ export const getDefaultFieldsFromJobCaps = ( type = newJobCapsService.getFieldById(dependentVariable)?.type; const predictionFieldName = getPredictionFieldName(jobConfig.analysis); const numTopFeatureImportanceValues = getNumTopFeatureImportanceValues(jobConfig.analysis); + const numTopClasses = getNumTopClasses(jobConfig.analysis); const defaultPredictionField = `${dependentVariable}_prediction`; predictedField = `${resultsField}.${ predictionFieldName ? predictionFieldName : defaultPredictionField }`; - if ((numTopFeatureImportanceValues ?? 0) > 0 && needsDestIndexFields === true) { + if ((numTopFeatureImportanceValues ?? 0) > 0) { featureImportanceFields.push({ id: `${resultsField}.${FEATURE_IMPORTANCE}`, name: `${resultsField}.${FEATURE_IMPORTANCE}`, @@ -221,6 +224,14 @@ export const getDefaultFieldsFromJobCaps = ( }); } + if ((numTopClasses ?? 0) > 0) { + topClassesFields.push({ + id: `${resultsField}.${TOP_CLASSES}`, + name: `${resultsField}.${TOP_CLASSES}`, + type: KBN_FIELD_TYPES.UNKNOWN, + }); + } + // Only need to add these fields if we didn't use dest index pattern to get the fields if (needsDestIndexFields === true) { allFields.push( @@ -234,7 +245,12 @@ export const getDefaultFieldsFromJobCaps = ( } } - allFields.push(...fields, ...featureImportanceFields, ...featureInfluenceFields); + allFields.push( + ...fields, + ...featureImportanceFields, + ...featureInfluenceFields, + ...topClassesFields + ); allFields.sort(({ name: a }: { name: string }, { name: b }: { name: string }) => sortExplorationResultsFields(a, b, jobConfig) ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts index e391b90e6eb96..b8b5a16c84e85 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts @@ -19,7 +19,11 @@ import { import { SavedSearchQuery } from '../../../../../contexts/ml'; import { getIndexData, getIndexFields, DataFrameAnalyticsConfig } from '../../../../common'; -import { DEFAULT_RESULTS_FIELD, FEATURE_IMPORTANCE } from '../../../../common/constants'; +import { + DEFAULT_RESULTS_FIELD, + FEATURE_IMPORTANCE, + TOP_CLASSES, +} from '../../../../common/constants'; import { sortExplorationResultsFields, ML__ID_COPY } from '../../../../common/fields'; export const useExplorationResults = ( @@ -47,8 +51,9 @@ export const useExplorationResults = ( 25, // reduce default selected rows from 20 to 8 for performance reasons. 8, - // by default, hide feature-importance columns and the doc id copy - (d) => !d.includes(`.${FEATURE_IMPORTANCE}.`) && d !== ML__ID_COPY + // by default, hide feature-importance and top-classes columns and the doc id copy + (d) => + !d.includes(`.${FEATURE_IMPORTANCE}.`) && !d.includes(`.${TOP_CLASSES}.`) && d !== ML__ID_COPY ); useEffect(() => { From 0189ae5c3ff7d3d49a8f182138de743ad748eb78 Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Mon, 8 Jun 2020 11:51:04 -0400 Subject: [PATCH 11/91] [Maps] Enable gridding/clustering/heatmaps for geo_shape fields (#67886) Enables heatmap, clusters, and grid layers for index-patterns with geo_shape field. This feature is only available for Gold+ users. --- .../create_source_editor.js | 4 +- .../es_geo_grid_source/es_geo_grid_source.js | 7 ++ .../es_pew_pew_source/create_source_editor.js | 5 +- .../maps/public/elasticsearch_geo_utils.js | 45 +++++---- .../public/elasticsearch_geo_utils.test.js | 93 +++++++++++++++++++ .../plugins/maps/public/index_pattern_util.js | 13 ++- .../maps/public/index_pattern_util.test.js | 81 +++++++++++++++- .../plugins/maps/public/kibana_services.d.ts | 2 + x-pack/plugins/maps/public/kibana_services.js | 9 ++ x-pack/plugins/maps/public/plugin.ts | 25 +++-- .../apps/maps/es_geo_grid_source.js | 33 +++++++ .../es_archives/maps/kibana/data.json | 33 ++++++- 12 files changed, 308 insertions(+), 42 deletions(-) diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js index 7661ad7020194..91dcb057dd837 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js @@ -14,7 +14,7 @@ import { NoIndexPatternCallout } from '../../../components/no_index_pattern_call import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiSpacer } from '@elastic/eui'; -import { AGGREGATABLE_GEO_FIELD_TYPES, getFieldsWithGeoTileAgg } from '../../../index_pattern_util'; +import { getAggregatableGeoFieldTypes, getFieldsWithGeoTileAgg } from '../../../index_pattern_util'; import { RenderAsSelect } from './render_as_select'; export class CreateSourceEditor extends Component { @@ -176,7 +176,7 @@ export class CreateSourceEditor extends Component { placeholder={i18n.translate('xpack.maps.source.esGeoGrid.indexPatternPlaceholder', { defaultMessage: 'Select index pattern', })} - fieldTypes={AGGREGATABLE_GEO_FIELD_TYPES} + fieldTypes={getAggregatableGeoFieldTypes()} onNoIndexPatterns={this._onNoIndexPatterns} /> diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js index e77fd93872612..c05c1f2dd7c1e 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js @@ -21,6 +21,7 @@ import { getDataSourceLabel } from '../../../../common/i18n_getters'; import { AbstractESAggSource } from '../es_agg_source'; import { DataRequestAbortError } from '../../util/data_request'; import { registerSource } from '../source_registry'; +import { makeESBbox } from '../../../elasticsearch_geo_utils'; export const MAX_GEOTILE_LEVEL = 29; @@ -146,6 +147,7 @@ export class ESGeoGridSource extends AbstractESAggSource { registerCancelCallback, bucketsPerGrid, isRequestStillActive, + bufferedExtent, }) { const gridsPerRequest = Math.floor(DEFAULT_MAX_BUCKETS_LIMIT / bucketsPerGrid); const aggs = { @@ -156,6 +158,7 @@ export class ESGeoGridSource extends AbstractESAggSource { { gridSplit: { geotile_grid: { + bounds: makeESBbox(bufferedExtent), field: this._descriptor.geoField, precision, }, @@ -234,10 +237,12 @@ export class ESGeoGridSource extends AbstractESAggSource { precision, layerName, registerCancelCallback, + bufferedExtent, }) { searchSource.setField('aggs', { gridSplit: { geotile_grid: { + bounds: makeESBbox(bufferedExtent), field: this._descriptor.geoField, precision, }, @@ -282,6 +287,7 @@ export class ESGeoGridSource extends AbstractESAggSource { precision: searchFilters.geogridPrecision, layerName, registerCancelCallback, + bufferedExtent: searchFilters.buffer, }) : await this._compositeAggRequest({ searchSource, @@ -291,6 +297,7 @@ export class ESGeoGridSource extends AbstractESAggSource { registerCancelCallback, bucketsPerGrid, isRequestStillActive, + bufferedExtent: searchFilters.buffer, }); return { diff --git a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js index f599ba93d40d6..38a5850537200 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js +++ b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js @@ -14,7 +14,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiFormRow, EuiCallOut } from '@elastic/eui'; -import { AGGREGATABLE_GEO_FIELD_TYPES, getFieldsWithGeoTileAgg } from '../../../index_pattern_util'; +import { getFieldsWithGeoTileAgg } from '../../../index_pattern_util'; +import { ES_GEO_FIELD_TYPE } from '../../../../common/constants'; export class CreateSourceEditor extends Component { static propTypes = { @@ -177,7 +178,7 @@ export class CreateSourceEditor extends Component { placeholder={i18n.translate('xpack.maps.source.pewPew.indexPatternPlaceholder', { defaultMessage: 'Select index pattern', })} - fieldTypes={AGGREGATABLE_GEO_FIELD_TYPES} + fieldTypes={[ES_GEO_FIELD_TYPE.GEO_POINT]} /> ); diff --git a/x-pack/plugins/maps/public/elasticsearch_geo_utils.js b/x-pack/plugins/maps/public/elasticsearch_geo_utils.js index b89fda29554ee..efd243595db3e 100644 --- a/x-pack/plugins/maps/public/elasticsearch_geo_utils.js +++ b/x-pack/plugins/maps/public/elasticsearch_geo_utils.js @@ -225,39 +225,36 @@ export function geoShapeToGeometry(value, accumulator) { accumulator.push(geoJson); } -function createGeoBoundBoxFilter({ maxLat, maxLon, minLat, minLon }, geoFieldName) { - const top = clampToLatBounds(maxLat); +export function makeESBbox({ maxLat, maxLon, minLat, minLon }) { const bottom = clampToLatBounds(minLat); - - // geo_bounding_box does not support ranges outside of -180 and 180 - // When the area crosses the 180° meridian, - // the value of the lower left longitude will be greater than the value of the upper right longitude. - // http://docs.opengeospatial.org/is/12-063r5/12-063r5.html#30 - let boundingBox; + const top = clampToLatBounds(maxLat); + let esBbox; if (maxLon - minLon >= 360) { - boundingBox = { + esBbox = { top_left: [-180, top], bottom_right: [180, bottom], }; - } else if (maxLon > 180) { - const overflow = maxLon - 180; - boundingBox = { - top_left: [minLon, top], - bottom_right: [-180 + overflow, bottom], - }; - } else if (minLon < -180) { - const overflow = Math.abs(minLon) - 180; - boundingBox = { - top_left: [180 - overflow, top], - bottom_right: [maxLon, bottom], - }; } else { - boundingBox = { - top_left: [minLon, top], - bottom_right: [maxLon, bottom], + // geo_bounding_box does not support ranges outside of -180 and 180 + // When the area crosses the 180° meridian, + // the value of the lower left longitude will be greater than the value of the upper right longitude. + // http://docs.opengeospatial.org/is/12-063r5/12-063r5.html#30 + // + // This ensures bbox goes West->East in the happy case, + // but will be formatted East->West in case it crosses the date-line + const newMinlon = ((minLon + 180 + 360) % 360) - 180; + const newMaxlon = ((maxLon + 180 + 360) % 360) - 180; + esBbox = { + top_left: [newMinlon, top], + bottom_right: [newMaxlon, bottom], }; } + return esBbox; +} + +function createGeoBoundBoxFilter({ maxLat, maxLon, minLat, minLon }, geoFieldName) { + const boundingBox = makeESBbox({ maxLat, maxLon, minLat, minLon }); return { geo_bounding_box: { [geoFieldName]: boundingBox, diff --git a/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js b/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js index 05f6a9eec5bd5..a1e4e43f3ab75 100644 --- a/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js +++ b/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js @@ -19,6 +19,7 @@ import { createExtentFilter, roundCoordinates, extractFeaturesFromFilters, + makeESBbox, } from './elasticsearch_geo_utils'; import { indexPatterns } from '../../../../src/plugins/data/public'; @@ -594,3 +595,95 @@ describe('extractFeaturesFromFilters', () => { expect(extractFeaturesFromFilters([spatialFilter])).toEqual([]); }); }); + +describe('makeESBbox', () => { + it('Should invert Y-axis', () => { + const bbox = makeESBbox({ + minLon: 10, + maxLon: 20, + minLat: 0, + maxLat: 1, + }); + expect(bbox).toEqual({ bottom_right: [20, 0], top_left: [10, 1] }); + }); + + it('Should snap to 360 width', () => { + const bbox = makeESBbox({ + minLon: 10, + maxLon: 400, + minLat: 0, + maxLat: 1, + }); + expect(bbox).toEqual({ bottom_right: [180, 0], top_left: [-180, 1] }); + }); + + it('Should clamp latitudes', () => { + const bbox = makeESBbox({ + minLon: 10, + maxLon: 400, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [180, -89], top_left: [-180, 89] }); + }); + + it('Should swap West->East orientation to East->West orientation when crossing dateline (West extension)', () => { + const bbox = makeESBbox({ + minLon: -190, + maxLon: 20, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [20, -89], top_left: [170, 89] }); + }); + + it('Should swap West->East orientation to East->West orientation when crossing dateline (West extension) (overrated)', () => { + const bbox = makeESBbox({ + minLon: -190 + 360 + 360, + maxLon: 20 + 360 + 360, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [20, -89], top_left: [170, 89] }); + }); + + it('Should swap West->East orientation to East->West orientation when crossing dateline (east extension)', () => { + const bbox = makeESBbox({ + minLon: 175, + maxLon: 190, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [-170, -89], top_left: [175, 89] }); + }); + + it('Should preserve West->East orientation when _not_ crossing dateline', () => { + const bbox = makeESBbox({ + minLon: 20, + maxLon: 170, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [170, -89], top_left: [20, 89] }); + }); + + it('Should preserve West->East orientation when _not_ crossing dateline _and_ snap longitudes (west extension)', () => { + const bbox = makeESBbox({ + minLon: -190, + maxLon: -185, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [175, -89], top_left: [170, 89] }); + }); + + it('Should preserve West->East orientation when _not_ crossing dateline _and_ snap longitudes (east extension)', () => { + const bbox = makeESBbox({ + minLon: 185, + maxLon: 190, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [-170, -89], top_left: [-175, 89] }); + }); +}); diff --git a/x-pack/plugins/maps/public/index_pattern_util.js b/x-pack/plugins/maps/public/index_pattern_util.js index d695d1087a38d..514feeaa22072 100644 --- a/x-pack/plugins/maps/public/index_pattern_util.js +++ b/x-pack/plugins/maps/public/index_pattern_util.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getIndexPatternService } from './kibana_services'; +import { getIndexPatternService, getIsGoldPlus } from './kibana_services'; import { indexPatterns } from '../../../../src/plugins/data/public'; import { ES_GEO_FIELD_TYPE } from '../common/constants'; @@ -30,19 +30,24 @@ export function getTermsFields(fields) { }); } -export const AGGREGATABLE_GEO_FIELD_TYPES = [ES_GEO_FIELD_TYPE.GEO_POINT]; +export function getAggregatableGeoFieldTypes() { + const aggregatableFieldTypes = [ES_GEO_FIELD_TYPE.GEO_POINT]; + if (getIsGoldPlus()) { + aggregatableFieldTypes.push(ES_GEO_FIELD_TYPE.GEO_SHAPE); + } + return aggregatableFieldTypes; +} export function getFieldsWithGeoTileAgg(fields) { return fields.filter(supportsGeoTileAgg); } export function supportsGeoTileAgg(field) { - // TODO add geo_shape support with license check return ( field && field.aggregatable && !indexPatterns.isNestedField(field) && - field.type === ES_GEO_FIELD_TYPE.GEO_POINT + getAggregatableGeoFieldTypes().includes(field.type) ); } diff --git a/x-pack/plugins/maps/public/index_pattern_util.test.js b/x-pack/plugins/maps/public/index_pattern_util.test.js index 7f8f1c175cf15..4fa9eb3cadb49 100644 --- a/x-pack/plugins/maps/public/index_pattern_util.test.js +++ b/x-pack/plugins/maps/public/index_pattern_util.test.js @@ -6,7 +6,12 @@ jest.mock('./kibana_services', () => ({})); -import { getSourceFields } from './index_pattern_util'; +import { + getSourceFields, + getAggregatableGeoFieldTypes, + supportsGeoTileAgg, +} from './index_pattern_util'; +import { ES_GEO_FIELD_TYPE } from '../common/constants'; describe('getSourceFields', () => { test('Should remove multi fields from field list', () => { @@ -27,3 +32,77 @@ describe('getSourceFields', () => { expect(sourceFields).toEqual([{ name: 'agent' }]); }); }); + +describe('Gold+ licensing', () => { + const testStubs = [ + { + field: { + type: 'geo_point', + aggregatable: true, + }, + supportedInBasic: true, + supportedInGold: true, + }, + { + field: { + type: 'geo_shape', + aggregatable: false, + }, + supportedInBasic: false, + supportedInGold: false, + }, + { + field: { + type: 'geo_shape', + aggregatable: true, + }, + supportedInBasic: false, + supportedInGold: true, + }, + ]; + + describe('basic license', () => { + beforeEach(() => { + require('./kibana_services').getIsGoldPlus = () => false; + }); + + describe('getAggregatableGeoFieldTypes', () => { + test('Should only include geo_point fields ', () => { + const aggregatableGeoFieldTypes = getAggregatableGeoFieldTypes(); + expect(aggregatableGeoFieldTypes).toEqual([ES_GEO_FIELD_TYPE.GEO_POINT]); + }); + }); + + describe('supportsGeoTileAgg', () => { + testStubs.forEach((stub, index) => { + test(`stub: ${index}`, () => { + const supported = supportsGeoTileAgg(stub.field); + expect(supported).toEqual(stub.supportedInBasic); + }); + }); + }); + }); + + describe('gold license', () => { + beforeEach(() => { + require('./kibana_services').getIsGoldPlus = () => true; + }); + describe('getAggregatableGeoFieldTypes', () => { + test('Should add geo_shape field', () => { + const aggregatableGeoFieldTypes = getAggregatableGeoFieldTypes(); + expect(aggregatableGeoFieldTypes).toEqual([ + ES_GEO_FIELD_TYPE.GEO_POINT, + ES_GEO_FIELD_TYPE.GEO_SHAPE, + ]); + }); + }); + describe('supportsGeoTileAgg', () => { + testStubs.forEach((stub, index) => { + test(`stub: ${index}`, () => { + const supported = supportsGeoTileAgg(stub.field); + expect(supported).toEqual(stub.supportedInGold); + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/maps/public/kibana_services.d.ts b/x-pack/plugins/maps/public/kibana_services.d.ts index 45a4ace8e27a5..d45d7286ebf68 100644 --- a/x-pack/plugins/maps/public/kibana_services.d.ts +++ b/x-pack/plugins/maps/public/kibana_services.d.ts @@ -48,6 +48,7 @@ export function getShowMapsInspectorAdapter(): boolean; export function getPreserveDrawingBuffer(): boolean; export function getEnableVectorTiles(): boolean; export function getProxyElasticMapsServiceInMaps(): boolean; +export function getIsGoldPlus(): boolean; export function setLicenseId(args: unknown): void; export function setInspector(args: unknown): void; @@ -74,3 +75,4 @@ export function setSearchService(args: DataPublicPluginStart['search']): void; export function setKibanaCommonConfig(config: MapsLegacyConfigType): void; export function setMapAppConfig(config: MapsConfigType): void; export function setKibanaVersion(version: string): void; +export function setIsGoldPlus(isGoldPlus: boolean): void; diff --git a/x-pack/plugins/maps/public/kibana_services.js b/x-pack/plugins/maps/public/kibana_services.js index ba7be7a3b2464..1684acfb0f463 100644 --- a/x-pack/plugins/maps/public/kibana_services.js +++ b/x-pack/plugins/maps/public/kibana_services.js @@ -166,3 +166,12 @@ export const getProxyElasticMapsServiceInMaps = () => getKibanaCommonConfig().proxyElasticMapsServiceInMaps; export const getRegionmapLayers = () => _.get(getKibanaCommonConfig(), 'regionmap.layers', []); export const getTilemap = () => _.get(getKibanaCommonConfig(), 'tilemap', []); + +let isGoldPlus = false; +export const setIsGoldPlus = (igp) => { + isGoldPlus = igp; +}; + +export const getIsGoldPlus = () => { + return isGoldPlus; +}; diff --git a/x-pack/plugins/maps/public/plugin.ts b/x-pack/plugins/maps/public/plugin.ts index 3a20f6738a05a..319be46870ebc 100644 --- a/x-pack/plugins/maps/public/plugin.ts +++ b/x-pack/plugins/maps/public/plugin.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Plugin, CoreSetup, CoreStart, PluginInitializerContext } from 'src/core/public'; +import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; import { Setup as InspectorSetupContract } from 'src/plugins/inspector/public'; // @ts-ignore import { MapView } from './inspector/views/map_view'; @@ -21,29 +21,31 @@ import { setIndexPatternSelect, setIndexPatternService, setInspector, + setIsGoldPlus, + setKibanaCommonConfig, + setKibanaVersion, setLicenseId, + setMapAppConfig, setMapsCapabilities, setNavigation, setSavedObjectsClient, + setSearchService, setTimeFilter, setToasts, setUiActions, setUiSettings, setVisualizations, - setSearchService, - setMapAppConfig, - setKibanaCommonConfig, - setKibanaVersion, } from './kibana_services'; import { featureCatalogueEntry } from './feature_catalogue_entry'; // @ts-ignore import { getMapsVisTypeAlias } from './maps_vis_type_alias'; import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; import { VisualizationsSetup } from '../../../../src/plugins/visualizations/public'; -import { MAP_SAVED_OBJECT_TYPE } from '../common/constants'; +import { APP_ID, MAP_SAVED_OBJECT_TYPE } from '../common/constants'; import { MapEmbeddableFactory } from './embeddable/map_embeddable_factory'; import { EmbeddableSetup } from '../../../../src/plugins/embeddable/public'; -import { MapsXPackConfig, MapsConfigType } from '../config'; +import { MapsConfigType, MapsXPackConfig } from '../config'; +import { ILicense } from '../../licensing/common/types'; export interface MapsPluginSetupDependencies { inspector: InspectorSetupContract; @@ -76,7 +78,14 @@ export const bindSetupCoreAndPlugins = ( }; export const bindStartCoreAndPlugins = (core: CoreStart, plugins: any) => { - const { fileUpload, data, inspector } = plugins; + const { fileUpload, data, inspector, licensing } = plugins; + if (licensing) { + licensing.license$.subscribe((license: ILicense) => { + const gold = license.check(APP_ID, 'gold'); + setIsGoldPlus(gold.state === 'valid'); + }); + } + setInspector(inspector); setFileUpload(fileUpload); setIndexPatternSelect(data.ui.IndexPatternSelect); diff --git a/x-pack/test/functional/apps/maps/es_geo_grid_source.js b/x-pack/test/functional/apps/maps/es_geo_grid_source.js index 7346ab842ff59..f5a603742c89a 100644 --- a/x-pack/test/functional/apps/maps/es_geo_grid_source.js +++ b/x-pack/test/functional/apps/maps/es_geo_grid_source.js @@ -241,5 +241,38 @@ export default function ({ getPageObjects, getService }) { }); }); }); + + describe('vector grid with geo_shape', () => { + before(async () => { + await PageObjects.maps.loadSavedMap('geo grid vector grid example with shape'); + }); + + const LAYER_ID = 'g1xkv'; + it('should get expected number of grid cells', async () => { + const mapboxStyle = await PageObjects.maps.getMapboxStyle(); + expect(mapboxStyle.sources[LAYER_ID].data.features.length).to.equal(13); + }); + + describe('inspector', () => { + afterEach(async () => { + await inspector.close(); + }); + + it('should contain geotile_grid aggregation elasticsearch request', async () => { + await inspector.open(); + await inspector.openInspectorRequestsView(); + const requestStats = await inspector.getTableData(); + const totalHits = PageObjects.maps.getInspectorStatRowHit(requestStats, 'Hits (total)'); + expect(totalHits).to.equal('4'); //4 geometries result in 13 cells due to way they overlap geotile_grid cells + const hits = PageObjects.maps.getInspectorStatRowHit(requestStats, 'Hits'); + expect(hits).to.equal('0'); // aggregation requests do not return any documents + const indexPatternName = PageObjects.maps.getInspectorStatRowHit( + requestStats, + 'Index pattern' + ); + expect(indexPatternName).to.equal('geo_shapes*'); + }); + }); + }); }); } diff --git a/x-pack/test/functional/es_archives/maps/kibana/data.json b/x-pack/test/functional/es_archives/maps/kibana/data.json index d313fd2046c03..c173d75075041 100644 --- a/x-pack/test/functional/es_archives/maps/kibana/data.json +++ b/x-pack/test/functional/es_archives/maps/kibana/data.json @@ -36,7 +36,7 @@ "index": ".kibana", "source": { "index-pattern": { - "fields" : "[{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"geometry\",\"type\":\"geo_shape\",\"esTypes\":[\"geo_shape\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"prop1\",\"type\":\"number\",\"esTypes\":[\"byte\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]", + "fields" : "[{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"geometry\",\"type\":\"geo_shape\",\"esTypes\":[\"geo_shape\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"prop1\",\"type\":\"number\",\"esTypes\":[\"byte\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]", "title": "geo_shapes*" }, "type": "index-pattern" @@ -553,6 +553,37 @@ } } +{ + "type": "doc", + "value": { + "id": "map:0c86d024-a767-11ea-bb37-0242ac130002", + "index": ".kibana", + "source": { + "map": { + "bounds": { + "coordinates": [ + [ + -160, + 60 + ], + [ + 160, + -60 + ] + ], + "type": "envelope" + }, + "description": "", + "layerListJSON": "[{\"id\":\"g1xkv\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"sourceDescriptor\":{\"resolution\": \"COARSE\",\"type\":\"ES_GEO_GRID\",\"id\":\"64ddd934-a767-11ea-bb37-0242ac130002\",\"indexPatternId\":\"561253e0-f731-11e8-8487-11b9dd924f96\",\"geoField\":\"geometry\",\"requestType\":\"grid\",\"metrics\":[{\"type\":\"count\"}]},\"visible\":true,\"temporary\":false,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"label\":\"Count\",\"name\":\"doc_count\",\"origin\":\"source\"},\"color\":\"Blues\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#cccccc\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"label\":\"Count\",\"name\":\"doc_count\",\"origin\":\"source\"},\"minSize\":4,\"maxSize\":32}}},\"temporary\":true,\"previousStyle\":null},\"type\":\"VECTOR\"}]", + "mapStateJSON": "{\"zoom\":3,\"center\":{\"lon\":76,\"lat\":4},\"timeFilters\":{\"from\":\"2015-09-20T00:00:00.000Z\",\"to\":\"2015-09-20T01:00:00.000Z\"},\"refreshConfig\":{\"isPaused\":true,\"interval\":1000}}", + "title": "geo grid vector grid example with shape", + "uiStateJSON": "{\"isDarkMode\":false}" + }, + "type": "map" + } + } +} + { "type": "doc", "value": { From 16fbbf434550645d7386da34c00716f73274f224 Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Mon, 8 Jun 2020 14:11:51 -0400 Subject: [PATCH 12/91] [Canvas] Tear down history instances (#68277) * [Canvas] Tear down history instances * Always create history on Canvas startup Co-authored-by: Poff Poffenberger Co-authored-by: Elastic Machine --- x-pack/plugins/canvas/public/application.tsx | 5 +++- .../canvas/public/lib/history_provider.js | 26 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/canvas/public/application.tsx b/x-pack/plugins/canvas/public/application.tsx index 8751d8102ad37..c799f36a283c1 100644 --- a/x-pack/plugins/canvas/public/application.tsx +++ b/x-pack/plugins/canvas/public/application.tsx @@ -33,7 +33,7 @@ import { CapabilitiesStrings } from '../i18n'; import { startServices, services } from './services'; // @ts-ignore Untyped local -import { destroyHistory } from './lib/history_provider'; +import { createHistory, destroyHistory } from './lib/history_provider'; // @ts-ignore Untyped local import { stopRouter } from './lib/router_provider'; import { initFunctions } from './functions'; @@ -97,6 +97,9 @@ export const initializeCanvas = async ( services.expressions.getService().registerFunction(fn); } + // Re-initialize our history + createHistory(); + // Create Store const canvasStore = await createStore(coreSetup, setupPlugins); diff --git a/x-pack/plugins/canvas/public/lib/history_provider.js b/x-pack/plugins/canvas/public/lib/history_provider.js index 649f101126012..396372eeb85c1 100644 --- a/x-pack/plugins/canvas/public/lib/history_provider.js +++ b/x-pack/plugins/canvas/public/lib/history_provider.js @@ -134,7 +134,7 @@ function wrapHistoryInstance(history) { return wrappedHistory; } -let instances = new WeakMap(); +const instances = new WeakMap(); const getHistoryInstance = (win) => { // if no window object, use memory module @@ -144,6 +144,15 @@ const getHistoryInstance = (win) => { return createHashStateHistory(); }; +export const createHistory = (win = getWindow()) => { + // create and cache wrapped history instance + const historyInstance = getHistoryInstance(win); + const wrappedInstance = wrapHistoryInstance(historyInstance); + instances.set(win, wrappedInstance); + + return wrappedInstance; +}; + export const historyProvider = (win = getWindow()) => { // return cached instance if one exists const instance = instances.get(win); @@ -151,14 +160,13 @@ export const historyProvider = (win = getWindow()) => { return instance; } - // create and cache wrapped history instance - const historyInstance = getHistoryInstance(win); - const wrappedInstance = wrapHistoryInstance(historyInstance); - instances.set(win, wrappedInstance); - - return wrappedInstance; + return createHistory(win); }; -export const destroyHistory = () => { - instances = new WeakMap(); +export const destroyHistory = (win = getWindow()) => { + const instance = instances.get(win); + + if (instance) { + instance.resetOnChange(); + } }; From 8174b5ce29e7a4e24b3b78e0d1b89be17e2efd09 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Mon, 8 Jun 2020 11:22:09 -0700 Subject: [PATCH 13/91] [Search] Refactor service to register search strategies, not providers (#60342) * Add async search strategy * Add async search * Fix async strategy and add tests * Move types to separate file * Revert changes to demo search * Update demo search strategy to use async * Add async es search strategy * Return response as rawResponse * Poll after initial request * Add cancellation to search strategies * Add tests * Simplify async search strategy * Move loadingCount to search strategy * Update abort controller library * Bootstrap * Abort when the request is aborted * Add utility and update value suggestions route * Fix bad merge conflict * Update tests * Move to data_enhanced plugin * Remove bad merge * Revert switching abort controller libraries * Revert package.json in lib * Move to previous abort controller * Add support for frozen indices * Fix test to use fake timers to run debounced handlers * Revert changes to example plugin * Fix loading bar not going away when cancelling * Call getSearchStrategy instead of passing directly * Add async demo search strategy * Fix error with setting state * Update how aborting works * Fix type checks * Add test for loading count * Attempt to fix broken example test * Revert changes to test * Fix test * Update name to camelCase * Fix failing test * Don't require data_enhanced in example plugin * Actually send DELETE request * Use waitForCompletion parameter * Use default search params * Add support for rollups * Only make changes needed for frozen indices/rollups * Only make changes needed for frozen indices/rollups * Add back in async functionality * Fix tests/types * Fix issue with sending empty body in GET * Don't include skipped in loaded/total * Don't wait before polling the next time * Add search interceptor for bulk managing searches * Simplify search logic * Fix merge error * Review feedback * UI to stop async searches * Add service for running beyond timeout * Refactor abort utils * Remove unneeded changes * Add tests * Refactor search service to register strategies directly * Remove accidental change * re-generate docs * Fix merge * types * doc * eslint * Fix async strategy jest test * type fix * Use getStartServices in search strategies * Code review + snapshot * eslint * Type script Co-authored-by: Elastic Machine Co-authored-by: Liza K --- ...plugins-data-public.isearchcontext.core.md | 11 -- ...public.isearchcontext.getsearchstrategy.md | 11 -- ...ugin-plugins-data-public.isearchcontext.md | 19 ---- .../kibana-plugin-plugins-data-public.md | 2 - ...ins-data-public.tsearchstrategyprovider.md | 13 --- .../public/async_demo_search_strategy.ts | 68 ++++------- .../public/demo_search_strategy.ts | 43 +++---- examples/demo_search/public/plugin.ts | 23 ++-- examples/demo_search/public/types.ts | 28 +++++ src/plugins/data/public/index.ts | 2 - src/plugins/data/public/mocks.ts | 12 +- src/plugins/data/public/public.api.md | 43 +++---- .../es_search/es_search_strategy.test.ts | 25 ++-- .../search/es_search/es_search_strategy.ts | 35 +++--- src/plugins/data/public/search/index.ts | 8 +- src/plugins/data/public/search/mocks.ts | 10 +- .../data/public/search/search_service.test.ts | 2 +- .../data/public/search/search_service.ts | 47 ++++---- .../search/sync_search_strategy.test.ts | 33 ++---- .../public/search/sync_search_strategy.ts | 21 ++-- src/plugins/data/public/search/types.ts | 34 +++--- .../saved_objects_table.test.tsx.snap | 1 + x-pack/plugins/data_enhanced/public/plugin.ts | 19 ++-- .../search/async_search_strategy.test.ts | 89 ++++----------- .../public/search/async_search_strategy.ts | 107 +++++++++--------- .../public/search/es_search_strategy.test.ts | 35 ++++++ .../public/search/es_search_strategy.ts | 22 ++-- 27 files changed, 329 insertions(+), 434 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.core.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.tsearchstrategyprovider.md create mode 100644 examples/demo_search/public/types.ts create mode 100644 x-pack/plugins/data_enhanced/public/search/es_search_strategy.test.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.core.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.core.md deleted file mode 100644 index 7a7ea43bd3d40..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.core.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchContext](./kibana-plugin-plugins-data-public.isearchcontext.md) > [core](./kibana-plugin-plugins-data-public.isearchcontext.core.md) - -## ISearchContext.core property - -Signature: - -```typescript -core: CoreStart; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md deleted file mode 100644 index 93ac88d200bb8..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchContext](./kibana-plugin-plugins-data-public.isearchcontext.md) > [getSearchStrategy](./kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md) - -## ISearchContext.getSearchStrategy property - -Signature: - -```typescript -getSearchStrategy: (name: T) => TSearchStrategyProvider; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.md deleted file mode 100644 index 9b89f71434119..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.md +++ /dev/null @@ -1,19 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchContext](./kibana-plugin-plugins-data-public.isearchcontext.md) - -## ISearchContext interface - -Signature: - -```typescript -export interface ISearchContext -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [core](./kibana-plugin-plugins-data-public.isearchcontext.core.md) | CoreStart | | -| [getSearchStrategy](./kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md) | <T extends TStrategyTypes>(name: T) => TSearchStrategyProvider<T> | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index 75d3abefc74b9..e818fb009fb19 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -67,7 +67,6 @@ | [IndexPatternTypeMeta](./kibana-plugin-plugins-data-public.indexpatterntypemeta.md) | | | [IRequestTypesMap](./kibana-plugin-plugins-data-public.irequesttypesmap.md) | | | [IResponseTypesMap](./kibana-plugin-plugins-data-public.iresponsetypesmap.md) | | -| [ISearchContext](./kibana-plugin-plugins-data-public.isearchcontext.md) | | | [ISearchOptions](./kibana-plugin-plugins-data-public.isearchoptions.md) | | | [ISearchStrategy](./kibana-plugin-plugins-data-public.isearchstrategy.md) | Search strategy interface contains a search method that takes in a request and returns a promise that resolves to a response. | | [ISyncSearchRequest](./kibana-plugin-plugins-data-public.isyncsearchrequest.md) | | @@ -157,5 +156,4 @@ | [TabbedAggRow](./kibana-plugin-plugins-data-public.tabbedaggrow.md) | \* | | [TimefilterContract](./kibana-plugin-plugins-data-public.timefiltercontract.md) | | | [TimeHistoryContract](./kibana-plugin-plugins-data-public.timehistorycontract.md) | | -| [TSearchStrategyProvider](./kibana-plugin-plugins-data-public.tsearchstrategyprovider.md) | Search strategy provider creates an instance of a search strategy with the request handler context bound to it. This way every search strategy can use whatever information they require from the request context. | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.tsearchstrategyprovider.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.tsearchstrategyprovider.md deleted file mode 100644 index 3233bb48cea2c..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.tsearchstrategyprovider.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [TSearchStrategyProvider](./kibana-plugin-plugins-data-public.tsearchstrategyprovider.md) - -## TSearchStrategyProvider type - -Search strategy provider creates an instance of a search strategy with the request handler context bound to it. This way every search strategy can use whatever information they require from the request context. - -Signature: - -```typescript -export declare type TSearchStrategyProvider = (context: ISearchContext) => ISearchStrategy; -``` diff --git a/examples/demo_search/public/async_demo_search_strategy.ts b/examples/demo_search/public/async_demo_search_strategy.ts index 7a3f33ce05a75..862324002840c 100644 --- a/examples/demo_search/public/async_demo_search_strategy.ts +++ b/examples/demo_search/public/async_demo_search_strategy.ts @@ -17,53 +17,27 @@ * under the License. */ -import { Observable } from 'rxjs'; -import { - ISearchContext, - TSearchStrategyProvider, - ISearchStrategy, -} from '../../../src/plugins/data/public'; - -import { ASYNC_DEMO_SEARCH_STRATEGY, IAsyncDemoResponse } from '../common'; +import { Observable, from } from 'rxjs'; +import { CoreSetup } from 'kibana/public'; +import { flatMap } from 'rxjs/operators'; +import { ISearch } from '../../../src/plugins/data/public'; import { ASYNC_SEARCH_STRATEGY } from '../../../x-pack/plugins/data_enhanced/public'; +import { ASYNC_DEMO_SEARCH_STRATEGY, IAsyncDemoResponse } from '../common'; +import { DemoDataSearchStartDependencies } from './types'; -/** - * This demo search strategy provider simply provides a shortcut for calling the DEMO_ASYNC_SEARCH_STRATEGY - * on the server side, without users having to pass it in explicitly, and it takes advantage of the - * already registered ASYNC_SEARCH_STRATEGY that exists on the client. - * - * so instead of callers having to do: - * - * ``` - * search( - * { ...request, serverStrategy: DEMO_ASYNC_SEARCH_STRATEGY }, - * options, - * ASYNC_SEARCH_STRATEGY - * ) as Observable, - *``` - - * They can instead just do - * - * ``` - * search(request, options, DEMO_ASYNC_SEARCH_STRATEGY); - * ``` - * - * and are ensured type safety in regard to the request and response objects. - * - * @param context - context supplied by other plugins. - * @param search - a search function to access other strategies that have already been registered. - */ -export const asyncDemoClientSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { - const asyncStrategyProvider = context.getSearchStrategy(ASYNC_SEARCH_STRATEGY); - const { search } = asyncStrategyProvider(context); - return { - search: (request, options) => { - return search( - { ...request, serverStrategy: ASYNC_DEMO_SEARCH_STRATEGY }, - options - ) as Observable; - }, +export function asyncDemoClientSearchStrategyProvider(core: CoreSetup) { + const search: ISearch = (request, options) => { + return from(core.getStartServices()).pipe( + flatMap((startServices) => { + const asyncStrategy = (startServices[1] as DemoDataSearchStartDependencies).data.search.getSearchStrategy( + ASYNC_SEARCH_STRATEGY + ); + return asyncStrategy.search( + { ...request, serverStrategy: ASYNC_DEMO_SEARCH_STRATEGY }, + options + ) as Observable; + }) + ); }; -}; + return { search }; +} diff --git a/examples/demo_search/public/demo_search_strategy.ts b/examples/demo_search/public/demo_search_strategy.ts index 8dc2779a8544c..d56d827a5c0f8 100644 --- a/examples/demo_search/public/demo_search_strategy.ts +++ b/examples/demo_search/public/demo_search_strategy.ts @@ -17,11 +17,12 @@ * under the License. */ -import { Observable } from 'rxjs'; -import { ISearchContext, SYNC_SEARCH_STRATEGY } from '../../../src/plugins/data/public'; -import { TSearchStrategyProvider, ISearchStrategy } from '../../../src/plugins/data/public'; - +import { Observable, from } from 'rxjs'; +import { flatMap } from 'rxjs/operators'; +import { CoreSetup } from 'kibana/public'; +import { ISearch, SYNC_SEARCH_STRATEGY } from '../../../src/plugins/data/public'; import { DEMO_SEARCH_STRATEGY, IDemoResponse } from '../common'; +import { DemoDataSearchStartDependencies } from './types'; /** * This demo search strategy provider simply provides a shortcut for calling the DEMO_SEARCH_STRATEGY @@ -31,7 +32,7 @@ import { DEMO_SEARCH_STRATEGY, IDemoResponse } from '../common'; * so instead of callers having to do: * * ``` - * context.search( + * data.search.search( * { ...request, serverStrategy: DEMO_SEARCH_STRATEGY }, * options, * SYNC_SEARCH_STRATEGY @@ -41,24 +42,24 @@ import { DEMO_SEARCH_STRATEGY, IDemoResponse } from '../common'; * They can instead just do * * ``` - * context.search(request, options, DEMO_SEARCH_STRATEGY); + * data.search.search(request, options, DEMO_SEARCH_STRATEGY); * ``` * * and are ensured type safety in regard to the request and response objects. - * - * @param context - context supplied by other plugins. - * @param search - a search function to access other strategies that have already been registered. */ -export const demoClientSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { - const syncStrategyProvider = context.getSearchStrategy(SYNC_SEARCH_STRATEGY); - const { search } = syncStrategyProvider(context); - return { - search: (request, options) => { - return search({ ...request, serverStrategy: DEMO_SEARCH_STRATEGY }, options) as Observable< - IDemoResponse - >; - }, +export function demoClientSearchStrategyProvider(core: CoreSetup) { + const search: ISearch = (request, options) => { + return from(core.getStartServices()).pipe( + flatMap((startServices) => { + const syncStrategy = (startServices[1] as DemoDataSearchStartDependencies).data.search.getSearchStrategy( + SYNC_SEARCH_STRATEGY + ); + return syncStrategy.search( + { ...request, serverStrategy: DEMO_SEARCH_STRATEGY }, + options + ) as Observable; + }) + ); }; -}; + return { search }; +} diff --git a/examples/demo_search/public/plugin.ts b/examples/demo_search/public/plugin.ts index a2539cc7a21c5..5d074c19903e2 100644 --- a/examples/demo_search/public/plugin.ts +++ b/examples/demo_search/public/plugin.ts @@ -17,7 +17,6 @@ * under the License. */ -import { DataPublicPluginSetup } from '../../../src/plugins/data/public'; import { Plugin, CoreSetup } from '../../../src/core/public'; import { DEMO_SEARCH_STRATEGY, @@ -29,10 +28,7 @@ import { } from '../common'; import { demoClientSearchStrategyProvider } from './demo_search_strategy'; import { asyncDemoClientSearchStrategyProvider } from './async_demo_search_strategy'; - -interface DemoDataSearchSetupDependencies { - data: DataPublicPluginSetup; -} +import { DemoDataSearchSetupDependencies, DemoDataSearchStartDependencies } from './types'; /** * Add the typescript mappings for our search strategy to the request and @@ -55,16 +51,13 @@ declare module '../../../src/plugins/data/public' { } } -export class DemoDataPlugin implements Plugin { - public setup(core: CoreSetup, deps: DemoDataSearchSetupDependencies) { - deps.data.search.registerSearchStrategyProvider( - DEMO_SEARCH_STRATEGY, - demoClientSearchStrategyProvider - ); - deps.data.search.registerSearchStrategyProvider( - ASYNC_DEMO_SEARCH_STRATEGY, - asyncDemoClientSearchStrategyProvider - ); +export class DemoDataPlugin + implements Plugin { + public setup(core: CoreSetup, { data }: DemoDataSearchSetupDependencies) { + const demoClientSearchStrategy = demoClientSearchStrategyProvider(core); + const asyncDemoClientSearchStrategy = asyncDemoClientSearchStrategyProvider(core); + data.search.registerSearchStrategy(DEMO_SEARCH_STRATEGY, demoClientSearchStrategy); + data.search.registerSearchStrategy(ASYNC_DEMO_SEARCH_STRATEGY, asyncDemoClientSearchStrategy); } public start() {} diff --git a/examples/demo_search/public/types.ts b/examples/demo_search/public/types.ts new file mode 100644 index 0000000000000..64725da7df870 --- /dev/null +++ b/examples/demo_search/public/types.ts @@ -0,0 +1,28 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import { DataPublicPluginStart, DataPublicPluginSetup } from '../../../src/plugins/data/public'; + +export interface DemoDataSearchSetupDependencies { + data: DataPublicPluginSetup; +} + +export interface DemoDataSearchStartDependencies { + data: DataPublicPluginStart; +} diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 5540039323756..eb3f937a4168b 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -341,8 +341,6 @@ export { SYNC_SEARCH_STRATEGY, getEsPreference, getSearchErrorType, - ISearchContext, - TSearchStrategyProvider, ISearchStrategy, ISearch, ISearchOptions, diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 7307c93139d59..d544d3c800bbe 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -21,11 +21,17 @@ import { Plugin, IndexPatternsContract } from '.'; import { fieldFormatsServiceMock } from './field_formats/mocks'; import { searchSetupMock, searchStartMock } from './search/mocks'; import { queryServiceMock } from './query/mocks'; +import { AutocompleteStart, AutocompleteSetup } from './autocomplete'; export type Setup = jest.Mocked>; export type Start = jest.Mocked>; -const autocompleteMock: any = { +const automcompleteSetupMock: jest.Mocked = { + addQuerySuggestionProvider: jest.fn(), + getQuerySuggestions: jest.fn(), +}; + +const autocompleteStartMock: jest.Mocked = { getValueSuggestions: jest.fn(), getQuerySuggestions: jest.fn(), hasQuerySuggestions: jest.fn(), @@ -34,7 +40,7 @@ const autocompleteMock: any = { const createSetupContract = (): Setup => { const querySetupMock = queryServiceMock.createSetupContract(); return { - autocomplete: autocompleteMock, + autocomplete: automcompleteSetupMock, search: searchSetupMock, fieldFormats: fieldFormatsServiceMock.createSetupContract(), query: querySetupMock, @@ -48,7 +54,7 @@ const createStartContract = (): Start => { createFiltersFromValueClickAction: jest.fn().mockResolvedValue(['yes']), createFiltersFromRangeSelectAction: jest.fn(), }, - autocomplete: autocompleteMock, + autocomplete: autocompleteStartMock, search: searchStartMock, fieldFormats: fieldFormatsServiceMock.createStartContract(), query: queryStartMock, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index e6f6ba0c1bd12..7054575e8ef9e 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -1116,16 +1116,6 @@ export interface IResponseTypesMap { // @public (undocumented) export type ISearch = (request: IRequestTypesMap[T], options?: ISearchOptions) => Observable; -// Warning: (ae-missing-release-tag) "ISearchContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface ISearchContext { - // (undocumented) - core: CoreStart; - // (undocumented) - getSearchStrategy: (name: T) => TSearchStrategyProvider; -} - // Warning: (ae-missing-release-tag) "ISearchGeneric" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1788,11 +1778,6 @@ export interface TimeRange { to: string; } -// Warning: (ae-missing-release-tag) "TSearchStrategyProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export type TSearchStrategyProvider = (context: ISearchContext) => ISearchStrategy; - // Warning: (ae-missing-release-tag) "UI_SETTINGS" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1866,20 +1851,20 @@ export const UI_SETTINGS: { // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:379:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:380:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:391:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:399:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:400:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:403:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:377:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:378:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:387:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:397:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:401:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/es_search/es_search_strategy.test.ts b/src/plugins/data/public/search/es_search/es_search_strategy.test.ts index de1835f09f3bf..b580c5170aad7 100644 --- a/src/plugins/data/public/search/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/public/search/es_search/es_search_strategy.test.ts @@ -17,40 +17,31 @@ * under the License. */ +import { CoreSetup } from '../../../../../core/public'; import { coreMock } from '../../../../../core/public/mocks'; import { esSearchStrategyProvider } from './es_search_strategy'; -import { CoreStart } from 'kibana/public'; import { ES_SEARCH_STRATEGY } from '../../../common/search/es_search'; describe('ES search strategy', () => { - let mockCoreStart: MockedKeys; - const mockSearch = jest.fn(); + let mockCoreSetup: MockedKeys; + const mockSearch = { search: jest.fn() }; beforeEach(() => { - mockCoreStart = coreMock.createStart(); - mockSearch.mockClear(); + mockCoreSetup = coreMock.createSetup(); + mockSearch.search.mockClear(); }); it('returns a strategy with `search` that calls the sync search `search`', () => { const request = { params: {} }; const options = {}; - const esSearch = esSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const esSearch = esSearchStrategyProvider(mockCoreSetup, mockSearch); esSearch.search(request, options); - expect(mockSearch.mock.calls[0][0]).toEqual({ + expect(mockSearch.search.mock.calls[0][0]).toEqual({ ...request, serverStrategy: ES_SEARCH_STRATEGY, }); - expect(mockSearch.mock.calls[0][1]).toBe(options); + expect(mockSearch.search.mock.calls[0][1]).toBe(options); }); }); diff --git a/src/plugins/data/public/search/es_search/es_search_strategy.ts b/src/plugins/data/public/search/es_search/es_search_strategy.ts index a61428c998157..82f8bf21ee57b 100644 --- a/src/plugins/data/public/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/public/search/es_search/es_search_strategy.ts @@ -18,25 +18,26 @@ */ import { Observable } from 'rxjs'; +import { CoreSetup } from '../../../../../core/public'; import { ES_SEARCH_STRATEGY, IEsSearchResponse } from '../../../common/search'; +import { ISearch } from '../i_search'; +import { ISearchStrategy } from '../types'; import { SYNC_SEARCH_STRATEGY } from '../sync_search_strategy'; import { getEsPreference } from './get_es_preference'; -import { ISearchContext, TSearchStrategyProvider, ISearchStrategy } from '../types'; -export const esSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { - const syncStrategyProvider = context.getSearchStrategy(SYNC_SEARCH_STRATEGY); - const { search } = syncStrategyProvider(context); - return { - search: (request, options) => { - request.params = { - preference: getEsPreference(context.core.uiSettings), - ...request.params, - }; - return search({ ...request, serverStrategy: ES_SEARCH_STRATEGY }, options) as Observable< - IEsSearchResponse - >; - }, +export function esSearchStrategyProvider( + core: CoreSetup, + syncStrategy: ISearchStrategy +) { + const search: ISearch = (request, options) => { + request.params = { + preference: getEsPreference(core.uiSettings), + ...request.params, + }; + return syncStrategy.search( + { ...request, serverStrategy: ES_SEARCH_STRATEGY }, + options + ) as Observable; }; -}; + return { search }; +} diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index 26149432f6117..53686f9be9b4d 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -21,13 +21,7 @@ export * from './aggs'; export * from './expressions'; export * from './tabify'; -export { - ISearchSetup, - ISearchStart, - ISearchContext, - TSearchStrategyProvider, - ISearchStrategy, -} from './types'; +export { ISearchSetup, ISearchStart, ISearchStrategy } from './types'; export { ISearch, diff --git a/src/plugins/data/public/search/mocks.ts b/src/plugins/data/public/search/mocks.ts index 44082040b5b0b..fcdbeb515423d 100644 --- a/src/plugins/data/public/search/mocks.ts +++ b/src/plugins/data/public/search/mocks.ts @@ -18,18 +18,20 @@ */ import { searchAggsSetupMock, searchAggsStartMock } from './aggs/mocks'; -import { ISearchStart } from './types'; +import { ISearchSetup, ISearchStart } from './types'; import { searchSourceMock, createSearchSourceMock } from './search_source/mocks'; -const searchSetupMock = { +export * from './search_source/mocks'; + +const searchSetupMock: jest.Mocked = { aggs: searchAggsSetupMock(), - registerSearchStrategyContext: jest.fn(), - registerSearchStrategyProvider: jest.fn(), + registerSearchStrategy: jest.fn(), }; const searchStartMock: jest.Mocked = { aggs: searchAggsStartMock(), setInterceptor: jest.fn(), + getSearchStrategy: jest.fn(), search: jest.fn(), searchSource: searchSourceMock, __LEGACY: { diff --git a/src/plugins/data/public/search/search_service.test.ts b/src/plugins/data/public/search/search_service.test.ts index b1f7925bec4bb..fa138cef1a4a0 100644 --- a/src/plugins/data/public/search/search_service.test.ts +++ b/src/plugins/data/public/search/search_service.test.ts @@ -38,7 +38,7 @@ describe('Search service', () => { packageInfo: { version: '8' }, expressions: expressionsPluginMock.createSetupContract(), } as any); - expect(setup).toHaveProperty('registerSearchStrategyProvider'); + expect(setup).toHaveProperty('registerSearchStrategy'); }); }); }); diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 1615aac9e7b7d..d5997c15817f6 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -18,11 +18,11 @@ */ import { Plugin, CoreSetup, CoreStart, PackageInfo } from '../../../../core/public'; +import { SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider } from './sync_search_strategy'; +import { ISearchSetup, ISearchStart, TSearchStrategiesMap, ISearchStrategy } from './types'; import { ExpressionsSetup } from '../../../../plugins/expressions/public'; -import { SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider } from './sync_search_strategy'; import { createSearchSource, SearchSource, SearchSourceDependencies } from './search_source'; -import { ISearchSetup, ISearchStart, TSearchStrategyProvider, TSearchStrategiesMap } from './types'; import { TStrategyTypes } from './strategy_types'; import { getEsClient, LegacyApiCaller } from './legacy'; import { ES_SEARCH_STRATEGY, DEFAULT_SEARCH_STRATEGY } from '../../common/search'; @@ -54,11 +54,8 @@ interface SearchServiceStartDependencies { } /** - * The search plugin exposes two registration methods for other plugins: - * - registerSearchStrategyProvider for plugins to add their own custom - * search strategies - * - registerSearchStrategyContext for plugins to expose information - * and/or functionality for other search strategies to use + * The search plugin exposes a method `registerSearchStrategy` for other plugins + * to add their own custom search strategies. * * It also comes with two search strategy implementations - SYNC_SEARCH_STRATEGY and ES_SEARCH_STRATEGY. */ @@ -73,17 +70,19 @@ export class SearchService implements Plugin { private readonly aggTypesRegistry = new AggTypesRegistry(); private searchInterceptor!: SearchInterceptor; - private registerSearchStrategyProvider = ( + private registerSearchStrategy = ( name: T, - strategyProvider: TSearchStrategyProvider + strategy: ISearchStrategy ) => { - this.searchStrategies[name] = strategyProvider; + this.searchStrategies[name] = strategy; }; - private getSearchStrategy = (name: T): TSearchStrategyProvider => { - const strategyProvider = this.searchStrategies[name]; - if (!strategyProvider) throw new Error(`Search strategy ${name} not found`); - return strategyProvider; + private getSearchStrategy = (name: T): ISearchStrategy => { + const strategy = this.searchStrategies[name]; + if (!strategy) { + throw new Error(`Search strategy ${name} not found`); + } + return strategy; }; public setup( @@ -91,8 +90,11 @@ export class SearchService implements Plugin { { expressions, packageInfo, query, getInternalStartServices }: SearchServiceSetupDependencies ): ISearchSetup { this.esClient = getEsClient(core.injectedMetadata, core.http, packageInfo); - this.registerSearchStrategyProvider(SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider); - this.registerSearchStrategyProvider(ES_SEARCH_STRATEGY, esSearchStrategyProvider); + + const syncSearchStrategy = syncSearchStrategyProvider(core); + const esSearchStrategy = esSearchStrategyProvider(core, syncSearchStrategy); + this.registerSearchStrategy(SYNC_SEARCH_STRATEGY, syncSearchStrategy); + this.registerSearchStrategy(ES_SEARCH_STRATEGY, esSearchStrategy); const aggTypesSetup = this.aggTypesRegistry.setup(); @@ -114,7 +116,7 @@ export class SearchService implements Plugin { calculateAutoTimeExpression: getCalculateAutoTimeExpression(core.uiSettings), types: aggTypesSetup, }, - registerSearchStrategyProvider: this.registerSearchStrategyProvider, + registerSearchStrategy: this.registerSearchStrategy, }; } @@ -134,12 +136,10 @@ export class SearchService implements Plugin { const aggTypesStart = this.aggTypesRegistry.start(); const search: ISearchGeneric = (request, options, strategyName) => { - const strategyProvider = this.getSearchStrategy(strategyName || DEFAULT_SEARCH_STRATEGY); - const searchStrategy = strategyProvider({ - core, - getSearchStrategy: this.getSearchStrategy, - }); - return this.searchInterceptor.search(searchStrategy.search as any, request, options); + const { search: defaultSearch } = this.getSearchStrategy( + strategyName || DEFAULT_SEARCH_STRATEGY + ); + return this.searchInterceptor.search(defaultSearch as any, request, options); }; const legacySearch = { @@ -164,6 +164,7 @@ export class SearchService implements Plugin { }, types: aggTypesStart, }, + getSearchStrategy: this.getSearchStrategy, search, searchSource: { create: createSearchSource(dependencies.indexPatterns, searchSourceDependencies), diff --git a/src/plugins/data/public/search/sync_search_strategy.test.ts b/src/plugins/data/public/search/sync_search_strategy.test.ts index 6197980314b86..383a312fffad9 100644 --- a/src/plugins/data/public/search/sync_search_strategy.test.ts +++ b/src/plugins/data/public/search/sync_search_strategy.test.ts @@ -19,26 +19,23 @@ import { coreMock } from '../../../../core/public/mocks'; import { SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider } from './sync_search_strategy'; -import { CoreStart } from 'kibana/public'; +import { CoreSetup } from 'kibana/public'; describe('Sync search strategy', () => { - let mockCoreStart: MockedKeys; + let mockCoreSetup: MockedKeys; beforeEach(() => { - mockCoreStart = coreMock.createStart(); + mockCoreSetup = coreMock.createSetup(); }); it('returns a strategy with `search` that calls the backend API', () => { - mockCoreStart.http.fetch.mockImplementationOnce(() => Promise.resolve()); + mockCoreSetup.http.fetch.mockImplementationOnce(() => Promise.resolve()); - const syncSearch = syncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn(), - }); + const syncSearch = syncSearchStrategyProvider(mockCoreSetup); const request = { serverStrategy: SYNC_SEARCH_STRATEGY }; syncSearch.search(request, {}); - expect(mockCoreStart.http.fetch.mock.calls[0][0]).toEqual({ + expect(mockCoreSetup.http.fetch.mock.calls[0][0]).toEqual({ path: `/internal/search/${SYNC_SEARCH_STRATEGY}`, body: JSON.stringify({ serverStrategy: 'SYNC_SEARCH_STRATEGY', @@ -52,15 +49,12 @@ describe('Sync search strategy', () => { const expectedLoadingCountValues = [0, 1, 0]; const receivedLoadingCountValues: number[] = []; - mockCoreStart.http.fetch.mockResolvedValueOnce('response'); + mockCoreSetup.http.fetch.mockResolvedValueOnce('response'); - const syncSearch = syncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn(), - }); + const syncSearch = syncSearchStrategyProvider(mockCoreSetup); const request = { serverStrategy: SYNC_SEARCH_STRATEGY }; - const loadingCount$ = mockCoreStart.http.addLoadingCountSource.mock.calls[0][0]; + const loadingCount$ = mockCoreSetup.http.addLoadingCountSource.mock.calls[0][0]; loadingCount$.subscribe((value) => receivedLoadingCountValues.push(value)); await syncSearch.search(request, {}).toPromise(); @@ -73,15 +67,12 @@ describe('Sync search strategy', () => { const expectedLoadingCountValues = [0, 1, 0]; const receivedLoadingCountValues: number[] = []; - mockCoreStart.http.fetch.mockRejectedValueOnce('error'); + mockCoreSetup.http.fetch.mockRejectedValueOnce('error'); - const syncSearch = syncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn(), - }); + const syncSearch = syncSearchStrategyProvider(mockCoreSetup); const request = { serverStrategy: SYNC_SEARCH_STRATEGY }; - const loadingCount$ = mockCoreStart.http.addLoadingCountSource.mock.calls[0][0]; + const loadingCount$ = mockCoreSetup.http.addLoadingCountSource.mock.calls[0][0]; loadingCount$.subscribe((value) => receivedLoadingCountValues.push(value)); try { diff --git a/src/plugins/data/public/search/sync_search_strategy.ts b/src/plugins/data/public/search/sync_search_strategy.ts index 860ce593ae217..25d2731df7d5c 100644 --- a/src/plugins/data/public/search/sync_search_strategy.ts +++ b/src/plugins/data/public/search/sync_search_strategy.ts @@ -19,9 +19,9 @@ import { BehaviorSubject, from } from 'rxjs'; import { finalize } from 'rxjs/operators'; +import { CoreSetup } from '../../../../core/public'; import { IKibanaSearchRequest } from '../../common/search'; -import { ISearch, ISearchOptions } from './i_search'; -import { TSearchStrategyProvider, ISearchStrategy, ISearchContext } from './types'; +import { ISearch } from './i_search'; export const SYNC_SEARCH_STRATEGY = 'SYNC_SEARCH_STRATEGY'; @@ -29,27 +29,22 @@ export interface ISyncSearchRequest extends IKibanaSearchRequest { serverStrategy: string; } -export const syncSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { +export function syncSearchStrategyProvider(core: CoreSetup) { const loadingCount$ = new BehaviorSubject(0); - context.core.http.addLoadingCountSource(loadingCount$); + core.http.addLoadingCountSource(loadingCount$); - const search: ISearch = ( - request: ISyncSearchRequest, - options: ISearchOptions = {} - ) => { + const search: ISearch = (request, options) => { loadingCount$.next(loadingCount$.getValue() + 1); return from( - context.core.http.fetch({ + core.http.fetch({ path: `/internal/search/${request.serverStrategy}`, method: 'POST', body: JSON.stringify(request), - signal: options.signal, + signal: options?.signal, }) ).pipe(finalize(() => loadingCount$.next(loadingCount$.getValue() - 1))); }; return { search }; -}; +} diff --git a/src/plugins/data/public/search/types.ts b/src/plugins/data/public/search/types.ts index 64b4f1c5c2983..135974b697739 100644 --- a/src/plugins/data/public/search/types.ts +++ b/src/plugins/data/public/search/types.ts @@ -17,7 +17,6 @@ * under the License. */ -import { CoreStart } from 'kibana/public'; import { SearchAggsSetup, SearchAggsStart } from './aggs'; import { ISearch, ISearchGeneric } from './i_search'; import { TStrategyTypes } from './strategy_types'; @@ -25,11 +24,6 @@ import { LegacyApiCaller } from './legacy/es_client'; import { SearchInterceptor } from './search_interceptor'; import { ISearchSource, SearchSourceFields } from './search_source'; -export interface ISearchContext { - core: CoreStart; - getSearchStrategy: (name: T) => TSearchStrategyProvider; -} - /** * Search strategy interface contains a search method that takes in * a request and returns a promise that resolves to a response. @@ -39,27 +33,23 @@ export interface ISearchStrategy { } export type TSearchStrategiesMap = { - [K in TStrategyTypes]?: TSearchStrategyProvider; + [K in TStrategyTypes]?: ISearchStrategy; }; -/** - * Search strategy provider creates an instance of a search strategy with the request - * handler context bound to it. This way every search strategy can use - * whatever information they require from the request context. - */ -export type TSearchStrategyProvider = ( - context: ISearchContext -) => ISearchStrategy; - /** * Extension point exposed for other plugins to register their own search * strategies. */ -export type TRegisterSearchStrategyProvider = ( +export type TRegisterSearchStrategy = ( name: T, - searchStrategyProvider: TSearchStrategyProvider + searchStrategy: ISearchStrategy ) => void; +/** + * Used if a plugin needs access to an already registered search strategy. + */ +export type TGetSearchStrategy = (name: T) => ISearchStrategy; + export interface ISearchStartLegacy { esClient: LegacyApiCaller; } @@ -74,12 +64,18 @@ export interface ISearchSetup { * Extension point exposed for other plugins to register their own search * strategies. */ - registerSearchStrategyProvider: TRegisterSearchStrategyProvider; + registerSearchStrategy: TRegisterSearchStrategy; } export interface ISearchStart { aggs: SearchAggsStart; setInterceptor: (searchInterceptor: SearchInterceptor) => void; + + /** + * Used if a plugin needs access to an already registered search strategy. + */ + getSearchStrategy: TGetSearchStrategy; + search: ISearchGeneric; searchSource: { create: (fields?: SearchSourceFields) => Promise; diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap b/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap index 26ddb0809d24b..707e65d60870c 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap @@ -277,6 +277,7 @@ exports[`SavedObjectsTable import should show the flyout 1`] = ` "getMetrics": [Function], }, }, + "getSearchStrategy": [MockFunction], "search": [MockFunction], "searchSource": Object { "create": [MockFunction], diff --git a/x-pack/plugins/data_enhanced/public/plugin.ts b/x-pack/plugins/data_enhanced/public/plugin.ts index 72e0817eea8df..879c73587ed96 100644 --- a/x-pack/plugins/data_enhanced/public/plugin.ts +++ b/x-pack/plugins/data_enhanced/public/plugin.ts @@ -29,19 +29,20 @@ export interface DataEnhancedStartDependencies { export type DataEnhancedSetup = ReturnType; export type DataEnhancedStart = ReturnType; -export class DataEnhancedPlugin implements Plugin { - constructor() {} - - public setup(core: CoreSetup, { data }: DataEnhancedSetupDependencies) { +export class DataEnhancedPlugin + implements Plugin { + public setup( + core: CoreSetup, + { data }: DataEnhancedSetupDependencies + ) { data.autocomplete.addQuerySuggestionProvider( KUERY_LANGUAGE_NAME, setupKqlQuerySuggestionProvider(core) ); - data.search.registerSearchStrategyProvider(ASYNC_SEARCH_STRATEGY, asyncSearchStrategyProvider); - data.search.registerSearchStrategyProvider( - ES_SEARCH_STRATEGY, - enhancedEsSearchStrategyProvider - ); + const asyncSearchStrategy = asyncSearchStrategyProvider(core); + const esSearchStrategy = enhancedEsSearchStrategyProvider(core, asyncSearchStrategy); + data.search.registerSearchStrategy(ASYNC_SEARCH_STRATEGY, asyncSearchStrategy); + data.search.registerSearchStrategy(ES_SEARCH_STRATEGY, esSearchStrategy); } public start(core: CoreStart, plugins: DataEnhancedStartDependencies) { diff --git a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts index 6c635cc5b4489..3013f9966f068 100644 --- a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts +++ b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts @@ -6,35 +6,37 @@ import { of } from 'rxjs'; import { AbortController } from 'abort-controller'; +import { CoreSetup } from '../../../../../src/core/public'; import { coreMock } from '../../../../../src/core/public/mocks'; +import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; +import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; import { asyncSearchStrategyProvider } from './async_search_strategy'; -import { IAsyncSearchOptions } from './types'; -import { CoreStart } from 'kibana/public'; +import { IAsyncSearchOptions } from '.'; +import { DataEnhancedStartDependencies } from '../plugin'; describe('Async search strategy', () => { - let mockCoreStart: MockedKeys; + let mockCoreSetup: jest.Mocked>; + let mockDataStart: jest.Mocked; const mockSearch = jest.fn(); const mockRequest = { params: {}, serverStrategy: 'foo' }; const mockOptions: IAsyncSearchOptions = { pollInterval: 0 }; beforeEach(() => { - mockCoreStart = coreMock.createStart(); + mockCoreSetup = coreMock.createSetup(); + mockDataStart = dataPluginMock.createStartContract(); + (mockDataStart.search.getSearchStrategy as jest.Mock).mockReturnValue({ search: mockSearch }); + mockCoreSetup.getStartServices.mockResolvedValue([ + undefined as any, + { data: mockDataStart }, + undefined, + ]); mockSearch.mockReset(); }); it('only sends one request if the first response is complete', async () => { mockSearch.mockReturnValueOnce(of({ id: 1, total: 1, loaded: 1 })); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); await asyncSearch.search(mockRequest, mockOptions).toPromise(); @@ -51,17 +53,7 @@ describe('Async search strategy', () => { of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: false }) ); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); - + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); expect(mockSearch).toBeCalledTimes(0); await asyncSearch.search(mockRequest, mockOptions).toPromise(); @@ -75,17 +67,7 @@ describe('Async search strategy', () => { .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: true })) .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: true })); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); - + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); expect(mockSearch).toBeCalledTimes(0); await asyncSearch @@ -104,16 +86,7 @@ describe('Async search strategy', () => { of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: false }) ); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); expect(mockSearch).toBeCalledTimes(0); @@ -131,16 +104,7 @@ describe('Async search strategy', () => { of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: false }) ); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); expect(mockSearch).toBeCalledTimes(0); @@ -157,16 +121,7 @@ describe('Async search strategy', () => { .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2 })) .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2 })); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); const abortController = new AbortController(); const options = { ...mockOptions, signal: abortController.signal }; @@ -178,7 +133,7 @@ describe('Async search strategy', () => { } catch (e) { expect(e.name).toBe('AbortError'); expect(mockSearch).toBeCalledTimes(1); - expect(mockCoreStart.http.delete).toBeCalled(); + expect(mockCoreSetup.http.delete).toBeCalled(); } }); }); diff --git a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts index 18b5b976b3c1b..7de4dd28ad3d7 100644 --- a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts @@ -4,17 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EMPTY, fromEvent, NEVER, Observable, throwError, timer } from 'rxjs'; -import { mergeMap, expand, takeUntil } from 'rxjs/operators'; +import { EMPTY, fromEvent, NEVER, throwError, timer, Observable, from } from 'rxjs'; +import { mergeMap, expand, takeUntil, share, flatMap } from 'rxjs/operators'; +import { CoreSetup } from '../../../../../src/core/public'; import { AbortError } from '../../../../../src/plugins/data/common'; import { - IKibanaSearchResponse, - ISearchContext, + ISearch, ISearchStrategy, + ISyncSearchRequest, SYNC_SEARCH_STRATEGY, - TSearchStrategyProvider, } from '../../../../../src/plugins/data/public'; -import { IAsyncSearchRequest, IAsyncSearchOptions, IAsyncSearchResponse } from './types'; +import { IAsyncSearchOptions, IAsyncSearchResponse, IAsyncSearchRequest } from './types'; +import { DataEnhancedStartDependencies } from '../plugin'; export const ASYNC_SEARCH_STRATEGY = 'ASYNC_SEARCH_STRATEGY'; @@ -24,55 +25,59 @@ declare module '../../../../../src/plugins/data/public' { } } -export const asyncSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { - const syncStrategyProvider = context.getSearchStrategy(SYNC_SEARCH_STRATEGY); - const { search } = syncStrategyProvider(context); - return { - search: ( - request: IAsyncSearchRequest, - { pollInterval = 1000, ...options }: IAsyncSearchOptions = {} - ): Observable => { - const { serverStrategy } = request; - let id: string | undefined = request.id; +export function asyncSearchStrategyProvider( + core: CoreSetup +): ISearchStrategy { + const startServices$ = from(core.getStartServices()).pipe(share()); - const aborted$ = options.signal - ? fromEvent(options.signal, 'abort').pipe( - mergeMap(() => { - // If we haven't received the response to the initial request, including the ID, then - // we don't need to send a follow-up request to delete this search. Otherwise, we - // send the follow-up request to delete this search, then throw an abort error. - if (id !== undefined) { - context.core.http.delete(`/internal/search/${request.serverStrategy}/${id}`); - } - return throwError(new AbortError()); - }) - ) - : NEVER; + const search: ISearch = ( + request: ISyncSearchRequest, + { pollInterval = 1000, ...options }: IAsyncSearchOptions = {} + ) => { + const { serverStrategy } = request; + let { id } = request; - return search(request, options).pipe( - expand((response: IAsyncSearchResponse) => { - // If the response indicates of an error, stop polling and complete the observable - if (!response || (response.is_partial && !response.is_running)) { + const aborted$ = options.signal + ? fromEvent(options.signal, 'abort').pipe( + mergeMap(() => { + // If we haven't received the response to the initial request, including the ID, then + // we don't need to send a follow-up request to delete this search. Otherwise, we + // send the follow-up request to delete this search, then throw an abort error. + if (id !== undefined) { + core.http.delete(`/internal/search/${request.serverStrategy}/${id}`); + } return throwError(new AbortError()); - } + }) + ) + : NEVER; + + return startServices$.pipe( + flatMap((startServices) => { + const syncSearch = startServices[1].data.search.getSearchStrategy(SYNC_SEARCH_STRATEGY); + return (syncSearch.search(request, options) as Observable).pipe( + expand((response) => { + // If the response indicates of an error, stop polling and complete the observable + if (!response || (response.is_partial && !response.is_running)) { + return throwError(new AbortError()); + } - // If the response indicates it is complete, stop polling and complete the observable - if (!response.is_running) return EMPTY; + // If the response indicates it is complete, stop polling and complete the observable + if (!response.is_running) return EMPTY; - id = response.id; + id = response.id; - // Delay by the given poll interval - return timer(pollInterval).pipe( - // Send future requests using just the ID from the response - mergeMap(() => { - return search({ id, serverStrategy }, options); - }) - ); - }), - takeUntil(aborted$) - ); - }, + // Delay by the given poll interval + return timer(pollInterval).pipe( + // Send future requests using just the ID from the response + mergeMap(() => { + return search({ id, serverStrategy }, options); + }) + ); + }), + takeUntil(aborted$) + ); + }) + ); }; -}; + return { search }; +} diff --git a/x-pack/plugins/data_enhanced/public/search/es_search_strategy.test.ts b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.test.ts new file mode 100644 index 0000000000000..5d6bd53e2c945 --- /dev/null +++ b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.test.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CoreSetup } from '../../../../../src/core/public'; +import { coreMock } from '../../../../../src/core/public/mocks'; +import { ES_SEARCH_STRATEGY } from '../../../../../src/plugins/data/common'; +import { enhancedEsSearchStrategyProvider } from './es_search_strategy'; +import { IAsyncSearchOptions } from '.'; + +describe('Enhanced ES search strategy', () => { + let mockCoreSetup: jest.Mocked; + const mockSearch = { search: jest.fn() }; + + beforeEach(() => { + mockCoreSetup = coreMock.createSetup(); + mockSearch.search.mockClear(); + }); + + it('returns a strategy with `search` that calls the async search `search`', () => { + const request = { params: {} }; + const options: IAsyncSearchOptions = { pollInterval: 0 }; + + const esSearch = enhancedEsSearchStrategyProvider(mockCoreSetup, mockSearch); + esSearch.search(request, options); + + expect(mockSearch.search.mock.calls[0][0]).toEqual({ + ...request, + serverStrategy: ES_SEARCH_STRATEGY, + }); + expect(mockSearch.search.mock.calls[0][1]).toEqual(options); + }); +}); diff --git a/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts index 3a511c7b5a176..c4b293a52a104 100644 --- a/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts @@ -5,42 +5,40 @@ */ import { Observable } from 'rxjs'; +import { CoreSetup } from '../../../../../src/core/public'; import { ES_SEARCH_STRATEGY, IEsSearchResponse } from '../../../../../src/plugins/data/common'; import { - TSearchStrategyProvider, - ISearchContext, ISearch, getEsPreference, + ISearchStrategy, UI_SETTINGS, } from '../../../../../src/plugins/data/public'; import { IEnhancedEsSearchRequest, EnhancedSearchParams } from '../../common'; import { ASYNC_SEARCH_STRATEGY } from './async_search_strategy'; import { IAsyncSearchOptions } from './types'; -export const enhancedEsSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -) => { - const asyncStrategyProvider = context.getSearchStrategy(ASYNC_SEARCH_STRATEGY); - const { search: asyncSearch } = asyncStrategyProvider(context); - +export function enhancedEsSearchStrategyProvider( + core: CoreSetup, + asyncStrategy: ISearchStrategy +) { const search: ISearch = ( request: IEnhancedEsSearchRequest, options ) => { const params: EnhancedSearchParams = { - ignoreThrottled: !context.core.uiSettings.get(UI_SETTINGS.SEARCH_INCLUDE_FROZEN), - preference: getEsPreference(context.core.uiSettings), + ignoreThrottled: !core.uiSettings.get(UI_SETTINGS.SEARCH_INCLUDE_FROZEN), + preference: getEsPreference(core.uiSettings), ...request.params, }; request.params = params; const asyncOptions: IAsyncSearchOptions = { pollInterval: 0, ...options }; - return asyncSearch( + return asyncStrategy.search( { ...request, serverStrategy: ES_SEARCH_STRATEGY }, asyncOptions ) as Observable; }; return { search }; -}; +} From 23be466c977e9f0b6367de7f5693a4ea1f6387f7 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Mon, 8 Jun 2020 20:24:54 +0200 Subject: [PATCH 14/91] [Discover] Replace EuiTooltip by native title for better performance (#68280) --- .../components/sidebar/discover_field.tsx | 18 ++++++++---------- .../components/sidebar/discover_sidebar.scss | 1 + 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/plugins/discover/public/application/components/sidebar/discover_field.tsx b/src/plugins/discover/public/application/components/sidebar/discover_field.tsx index 9e5429882e3c3..5f40c55e30e7e 100644 --- a/src/plugins/discover/public/application/components/sidebar/discover_field.tsx +++ b/src/plugins/discover/public/application/components/sidebar/discover_field.tsx @@ -17,7 +17,7 @@ * under the License. */ import React from 'react'; -import { EuiButton, EuiToolTip, EuiText } from '@elastic/eui'; +import { EuiButton, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { DiscoverFieldDetails } from './discover_field_details'; import { FieldIcon } from '../../../../../kibana_react/public'; @@ -125,16 +125,14 @@ export function DiscoverField({ /> - - - {useShortDots ? shortenDottedString(field.name) : field.displayName} - - + {useShortDots ? shortenDottedString(field.name) : field.displayName} + {field.name !== '_source' && !selected && ( diff --git a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss index fe04d42d614ff..9f7700c7f395c 100644 --- a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss +++ b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss @@ -107,6 +107,7 @@ */ .dscSidebarItem__action { opacity: 0; /* 1 */ + transition: none; &:focus { opacity: 1; /* 2 */ From 25e71c10963f8cc959b63bfc83da9e4b3a09fd5e Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 8 Jun 2020 11:29:09 -0700 Subject: [PATCH 15/91] upgrade npm-run-path (#68539) Co-authored-by: spalger --- package.json | 2 +- packages/kbn-dev-utils/package.json | 2 +- packages/kbn-es/package.json | 2 +- packages/kbn-plugin-generator/package.json | 2 +- packages/kbn-plugin-helpers/package.json | 2 +- packages/kbn-pm/dist/index.js | 2 +- packages/kbn-pm/package.json | 2 +- x-pack/package.json | 2 +- yarn.lock | 8 ++++---- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 0873ab8c158e1..9423ee31c8bbe 100644 --- a/package.json +++ b/package.json @@ -179,7 +179,7 @@ "elastic-apm-node": "^3.6.0", "elasticsearch": "^16.7.0", "elasticsearch-browser": "^16.7.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "expiry-js": "0.1.7", "fast-deep-equal": "^3.1.1", "file-loader": "4.2.0", diff --git a/packages/kbn-dev-utils/package.json b/packages/kbn-dev-utils/package.json index 08b2e5b226967..5000d8b7490be 100644 --- a/packages/kbn-dev-utils/package.json +++ b/packages/kbn-dev-utils/package.json @@ -13,7 +13,7 @@ "axios": "^0.19.0", "chalk": "^2.4.2", "dedent": "^0.7.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "exit-hook": "^2.2.0", "getopts": "^2.2.5", "load-json-file": "^6.2.0", diff --git a/packages/kbn-es/package.json b/packages/kbn-es/package.json index 8b964d8399904..271b4a3dc661b 100644 --- a/packages/kbn-es/package.json +++ b/packages/kbn-es/package.json @@ -11,7 +11,7 @@ "chalk": "^2.4.2", "dedent": "^0.7.0", "del": "^5.1.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "getopts": "^2.2.4", "glob": "^7.1.2", "node-fetch": "^2.6.0", diff --git a/packages/kbn-plugin-generator/package.json b/packages/kbn-plugin-generator/package.json index b3b1eff41e4b5..b9df67b32e5d3 100644 --- a/packages/kbn-plugin-generator/package.json +++ b/packages/kbn-plugin-generator/package.json @@ -6,7 +6,7 @@ "dependencies": { "chalk": "^2.4.2", "dedent": "^0.7.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "getopts": "^2.2.4", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", diff --git a/packages/kbn-plugin-helpers/package.json b/packages/kbn-plugin-helpers/package.json index 040b779a69951..362e8302c3bec 100644 --- a/packages/kbn-plugin-helpers/package.json +++ b/packages/kbn-plugin-helpers/package.json @@ -16,7 +16,7 @@ "argv-split": "^2.0.1", "commander": "^3.0.0", "del": "^5.1.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "globby": "^8.0.1", "gulp-babel": "^8.0.0", "gulp-rename": "1.4.0", diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 21fff4d85ece6..7b233ef010653 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -34655,7 +34655,7 @@ const npmRunPath = options => { // Ensure the running `node` binary is used const execPathDir = path.resolve(options.cwd, options.execPath, '..'); - result.unshift(execPathDir); + result.push(execPathDir); return result.concat(options.path).join(path.delimiter); }; diff --git a/packages/kbn-pm/package.json b/packages/kbn-pm/package.json index 234877e9ae626..5938d15573d63 100644 --- a/packages/kbn-pm/package.json +++ b/packages/kbn-pm/package.json @@ -42,7 +42,7 @@ "cpy": "^8.0.0", "dedent": "^0.7.0", "del": "^5.1.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "getopts": "^2.2.4", "glob": "^7.1.2", "globby": "^8.0.1", diff --git a/x-pack/package.json b/x-pack/package.json index 227547ce15fd1..b3dcde2194d3f 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -134,7 +134,7 @@ "enzyme-adapter-react-16": "^1.15.2", "enzyme-adapter-utils": "^1.13.0", "enzyme-to-json": "^3.4.4", - "execa": "^4.0.0", + "execa": "^4.0.2", "fancy-log": "^1.3.2", "fetch-mock": "^7.3.9", "graphql-code-generator": "^0.18.2", diff --git a/yarn.lock b/yarn.lock index e47af2c6fe284..df478e79d2bf6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13078,7 +13078,7 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.0, execa@^4.0.2: +execa@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240" integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q== @@ -21741,9 +21741,9 @@ npm-run-path@^2.0.0: path-key "^2.0.0" npm-run-path@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438" - integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" From 891342a76fce54192785f89e548c5144983e5ee5 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 8 Jun 2020 13:05:00 -0600 Subject: [PATCH 16/91] [Maps] fix regression in adding TMS layer (#68471) * [Maps] fix regression in adding TMS layer * simplify endDataLoad signature * rename * review feedback Co-authored-by: Elastic Machine --- .../maps/public/actions/data_request_actions.ts | 17 ++++------------- .../classes/layers/tile_layer/tile_layer.js | 9 +++++---- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/maps/public/actions/data_request_actions.ts b/x-pack/plugins/maps/public/actions/data_request_actions.ts index 13b658af6a0f3..a0c484a82e530 100644 --- a/x-pack/plugins/maps/public/actions/data_request_actions.ts +++ b/x-pack/plugins/maps/public/actions/data_request_actions.ts @@ -42,12 +42,7 @@ import { DataRequestAbortError } from '../classes/util/data_request'; export type DataRequestContext = { startLoading(dataId: string, requestToken: symbol, meta: DataMeta): void; - stopLoading( - dataId: string, - requestToken: symbol, - data: FeatureCollection | object, - meta: DataMeta - ): void; + stopLoading(dataId: string, requestToken: symbol, data: object, meta: DataMeta): void; onLoadError(dataId: string, requestToken: symbol, errorMessage: string): void; updateSourceData(newData: unknown): void; isRequestStillActive(dataId: string, requestToken: symbol): boolean; @@ -106,12 +101,8 @@ function getDataRequestContext( dataFilters: getDataFilters(getState()), startLoading: (dataId: string, requestToken: symbol, meta: DataMeta) => dispatch(startDataLoad(layerId, dataId, requestToken, meta)), - stopLoading: ( - dataId: string, - requestToken: symbol, - data: FeatureCollection | object, - meta: DataMeta - ) => dispatch(endDataLoad(layerId, dataId, requestToken, data, meta)), + stopLoading: (dataId: string, requestToken: symbol, data: object, meta: DataMeta) => + dispatch(endDataLoad(layerId, dataId, requestToken, data, meta)), onLoadError: (dataId: string, requestToken: symbol, errorMessage: string) => dispatch(onDataLoadError(layerId, dataId, requestToken, errorMessage)), updateSourceData: (newData: unknown) => { @@ -197,7 +188,7 @@ function endDataLoad( layerId: string, dataId: string, requestToken: symbol, - data: FeatureCollection | object, + data: object, meta: DataMeta ) { return async (dispatch: Dispatch, getState: () => MapStoreState) => { diff --git a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js index cd8ca44d4478b..02df8acbfffad 100644 --- a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js +++ b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js @@ -34,7 +34,7 @@ export class TileLayer extends AbstractLayer { startLoading(SOURCE_DATA_REQUEST_ID, requestToken, dataFilters); try { const url = await this.getSource().getUrlTemplate(); - stopLoading(SOURCE_DATA_REQUEST_ID, requestToken, url, {}); + stopLoading(SOURCE_DATA_REQUEST_ID, requestToken, { url }, {}); } catch (error) { onLoadError(SOURCE_DATA_REQUEST_ID, requestToken, error.message); } @@ -68,15 +68,16 @@ export class TileLayer extends AbstractLayer { //when turning the layer back into visible, it's possible the url has not been resovled yet. return; } - const url = sourceDataRequest.getData(); - if (!url) { + + const tmsSourceData = sourceDataRequest.getData(); + if (!tmsSourceData || !tmsSourceData.url) { return; } const sourceId = this.getId(); mbMap.addSource(sourceId, { type: 'raster', - tiles: [url], + tiles: [tmsSourceData.url], tileSize: 256, scheme: 'xyz', }); From 858523eac6fd801a7b1a2227306e70ec9bdd27d3 Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Mon, 8 Jun 2020 15:15:47 -0400 Subject: [PATCH 17/91] [Uptime] Edit uptime alerts (#68005) * Extract store creation to plugin start, add redux providers to alert registration. * Update unit test. * Move alert registration to `setup` function. * Allow external editing of uptime client alert types. * Move alert initialization back to `start`. * Clean up interfaces for alert types. * Add code that will work for settings link even outside uptime app. * Create new atomic params type for status alerts. * Update executor params typing to support both alert params types. * Update snapshot for alert factory function. * Fix broken types and refresh snapshots. * Allow edits of filters for monitor alerts. * Support default parameter value for numTimes. * Support default parameter values for timerange. * Modify kuery bar to work for alert edits, fix some filter issues. * Clean up tests and fix types. * Fix types and add a test. * Add callout and validation handling for old alerts while editing. * Add a test for updated validation function. * Define window for overview filters fetch action. * Revert store initialization. * Make monitor counter function while editing alerts. * Refresh snapshot. * Move snapshot count in monitor status alert to callout. * Add new state for selected filters. * Add basic functional tests for uptime alert flyouts. * Fix broken types. * Update unit tests with mock provider. * Remove unneeded params from hook. * Add more unit tests. * Reducing functional test flakiness. * Alert flyout controls update url only within Uptime app. * Extract context interaction to container component, update snapshots. * Add missing parameter to test file. * Remove flaky functional test. Co-authored-by: Elastic Machine Co-authored-by: Shahzad --- x-pack/plugins/uptime/public/apps/plugin.ts | 32 ++- .../__tests__/uptime_date_picker.test.tsx | 8 +- .../__tests__/monitor_bar_series.test.tsx | 8 +- .../charts/__tests__/ping_histogram.test.tsx | 9 +- .../alerts/__tests__/add_filter_btn.test.tsx | 180 +++++++++++++ .../__tests__/alert_field_number.test.tsx | 145 +++++++++++ .../__tests__/alert_monitor_status.test.tsx | 241 ++++++++---------- .../__tests__/old_alert_callout.test.tsx | 36 +++ .../overview/alerts/add_filter_btn.tsx | 8 +- .../overview/alerts/alert_monitor_status.tsx | 76 +++++- .../alert_monitor_status.tsx | 99 ++++++- .../__tests__/down_number_select.test.tsx | 8 +- .../filters_expression_select.test.tsx | 176 +++++++++++++ .../down_number_select.tsx | 13 +- .../filters_expression_select.tsx | 74 +++--- .../filters_expression_select_container.tsx | 38 +++ .../alerts/monitor_expressions/index.ts | 1 + .../time_expression_select.tsx | 19 +- .../overview/alerts/old_alert_call_out.tsx | 33 +++ .../settings_message_expression_popover.tsx | 11 +- .../overview/kuery_bar/kuery_bar.tsx | 18 +- .../__tests__/filter_status_button.test.tsx | 8 +- .../__tests__/status_filter.test.tsx | 20 +- .../use_url_params.test.tsx.snap | 210 ++++++++++++--- .../hooks/__tests__/use_breadcrumbs.test.tsx | 14 +- .../hooks/__tests__/use_url_params.test.tsx | 46 ++-- .../uptime/public/hooks/use_filter_update.ts | 8 +- .../uptime/public/hooks/use_url_params.ts | 36 +++ .../framework/new_platform_adapter.tsx | 13 - .../__tests__/monitor_status.test.ts | 51 +++- .../uptime/public/lib/alert_types/index.ts | 7 +- .../public/lib/alert_types/monitor_status.tsx | 42 ++- .../lib/alert_types/monitor_status_title.tsx | 25 +- .../uptime/public/lib/alert_types/tls.tsx | 19 +- .../public/lib/helper/helper_with_redux.tsx | 21 ++ .../plugins/uptime/public/lib/helper/index.ts | 1 + x-pack/plugins/uptime/public/lib/index.ts | 1 + .../pages/__tests__/page_header.test.tsx | 28 +- .../public/state/actions/overview_filters.ts | 14 +- .../public/state/actions/selected_filters.ts | 21 ++ x-pack/plugins/uptime/public/state/index.ts | 4 +- .../state/reducers/__tests__/ui.test.ts | 31 ++- .../uptime/public/state/reducers/index.ts | 2 + .../public/state/reducers/overview_filters.ts | 6 + .../public/state/reducers/selected_filters.ts | 32 +++ .../state/selectors/__tests__/index.test.ts | 1 + .../uptime/public/state/selectors/index.ts | 2 + x-pack/plugins/uptime/public/uptime_app.tsx | 5 +- 48 files changed, 1518 insertions(+), 383 deletions(-) create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/__tests__/add_filter_btn.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_field_number.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/__tests__/old_alert_callout.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/filters_expression_select.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select_container.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/old_alert_call_out.tsx create mode 100644 x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx create mode 100644 x-pack/plugins/uptime/public/state/actions/selected_filters.ts create mode 100644 x-pack/plugins/uptime/public/state/reducers/selected_filters.ts diff --git a/x-pack/plugins/uptime/public/apps/plugin.ts b/x-pack/plugins/uptime/public/apps/plugin.ts index d3a67f81004da..26810a9b1cda3 100644 --- a/x-pack/plugins/uptime/public/apps/plugin.ts +++ b/x-pack/plugins/uptime/public/apps/plugin.ts @@ -3,6 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + import { CoreSetup, CoreStart, @@ -16,8 +17,16 @@ import { PLUGIN } from '../../common/constants'; import { FeatureCatalogueCategory } from '../../../../../src/plugins/home/public'; import { HomePublicPluginSetup } from '../../../../../src/plugins/home/public'; import { EmbeddableStart } from '../../../../../src/plugins/embeddable/public'; -import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public'; -import { DataPublicPluginSetup } from '../../../../../src/plugins/data/public'; +import { + TriggersAndActionsUIPublicPluginSetup, + TriggersAndActionsUIPublicPluginStart, +} from '../../../triggers_actions_ui/public'; +import { + DataPublicPluginSetup, + DataPublicPluginStart, +} from '../../../../../src/plugins/data/public'; +import { alertTypeInitializers } from '../lib/alert_types'; +import { kibanaService } from '../state/kibana_service'; export interface ClientPluginsSetup { data: DataPublicPluginSetup; @@ -27,6 +36,8 @@ export interface ClientPluginsSetup { export interface ClientPluginsStart { embeddable: EmbeddableStart; + data: DataPublicPluginStart; + triggers_actions_ui: TriggersAndActionsUIPublicPluginStart; } export type ClientSetup = void; @@ -66,6 +77,7 @@ export class UptimePlugin ); const { element } = params; + const libs: UMFrontendLibs = { framework: getKibanaFrameworkAdapter(coreStart, plugins, corePlugins), }; @@ -74,7 +86,21 @@ export class UptimePlugin }); } - public start(_start: CoreStart, _plugins: {}): void {} + public start(start: CoreStart, plugins: ClientPluginsStart): void { + kibanaService.core = start; + alertTypeInitializers.forEach((init) => { + const alertInitializer = init({ + core: start, + plugins, + }); + if ( + plugins.triggers_actions_ui && + !plugins.triggers_actions_ui.alertTypeRegistry.has(alertInitializer.id) + ) { + plugins.triggers_actions_ui.alertTypeRegistry.register(alertInitializer); + } + }); + } public stop(): void {} } diff --git a/x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx b/x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx index 445d9302e3a9d..16853211433ca 100644 --- a/x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { UptimeDatePicker } from '../uptime_date_picker'; -import { renderWithRouter, shallowWithRouter } from '../../../lib'; +import { renderWithRouter, shallowWithRouter, MountWithReduxProvider } from '../../../lib'; describe('UptimeDatePicker component', () => { it('validates props with shallow render', () => { @@ -15,7 +15,11 @@ describe('UptimeDatePicker component', () => { }); it('renders properly with mock data', () => { - const component = renderWithRouter(); + const component = renderWithRouter( + + + + ); expect(component).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx index 4522f8d633fa6..5e49d303c5c66 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { MonitorBarSeries, MonitorBarSeriesProps } from '../monitor_bar_series'; -import { renderWithRouter, shallowWithRouter } from '../../../../lib'; +import { renderWithRouter, shallowWithRouter, MountWithReduxProvider } from '../../../../lib'; import { HistogramPoint } from '../../../../../common/runtime_types'; describe('MonitorBarSeries component', () => { @@ -197,7 +197,11 @@ describe('MonitorBarSeries component', () => { }); it('renders if the data series is present', () => { - const component = renderWithRouter(); + const component = renderWithRouter( + + + + ); expect(component).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx index 21c1fa86eeee4..57a38f2a949e7 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { PingHistogramComponent, PingHistogramComponentProps } from '../ping_histogram'; -import { renderWithRouter, shallowWithRouter } from '../../../../lib'; +import { renderWithRouter, shallowWithRouter, MountWithReduxProvider } from '../../../../lib'; describe('PingHistogram component', () => { const props: PingHistogramComponentProps = { @@ -49,7 +49,12 @@ describe('PingHistogram component', () => { }); it('renders the component without errors', () => { - const component = renderWithRouter(); + const component = renderWithRouter( + + + + ); + expect(component).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/add_filter_btn.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/add_filter_btn.test.tsx new file mode 100644 index 0000000000000..ac465eca4c5e5 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/add_filter_btn.test.tsx @@ -0,0 +1,180 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallowWithIntl, mountWithIntl } from 'test_utils/enzyme_helpers'; +import { AddFilterButton } from '../add_filter_btn'; +import { EuiButtonEmpty, EuiContextMenuItem } from '@elastic/eui'; + +describe('AddFilterButton component', () => { + it('provides all filter choices', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + Add filter + + } + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + id="singlePanel" + isOpen={false} + ownFocus={false} + panelPaddingSize="none" + > + + Location + , + + Tag + , + + Port + , + + Type + , + ] + } + /> + + `); + }); + + it('excludes filters that already have selected values', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + Add filter + + } + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + id="singlePanel" + isOpen={false} + ownFocus={false} + panelPaddingSize="none" + > + + Type + , + ] + } + /> + + `); + }); + + it('popover is disabled if no values are available', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + Add filter + + } + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + id="singlePanel" + isOpen={false} + ownFocus={false} + panelPaddingSize="none" + > + + + `); + }); + + it('filter select', () => { + const mockOnNewFilter = jest.fn(); + const component = mountWithIntl( + + ); + component.find(EuiButtonEmpty).simulate('click', { target: { value: '0' } }); + component + .find(EuiContextMenuItem) + .first() + .simulate('click', { target: { value: '0' } }); + expect(mockOnNewFilter).toHaveBeenCalled(); + expect(mockOnNewFilter.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + "observer.geo.name", + ], + ] + `); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_field_number.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_field_number.test.tsx new file mode 100644 index 0000000000000..e2564992c76d2 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_field_number.test.tsx @@ -0,0 +1,145 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { AlertFieldNumber, handleAlertFieldNumberChange } from '../alert_field_number'; + +describe('AlertFieldNumber', () => { + describe('handleAlertFieldNumberChange', () => { + let mockSetIsInvalid: jest.Mock; + let mockSetFieldValue: jest.Mock; + + beforeEach(() => { + mockSetIsInvalid = jest.fn(); + mockSetFieldValue = jest.fn(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('sets a valid number', () => { + handleAlertFieldNumberChange( + // @ts-ignore no need to implement this entire type here + { target: { value: '23' } }, + false, + mockSetIsInvalid, + mockSetFieldValue + ); + expect(mockSetIsInvalid).not.toHaveBeenCalled(); + expect(mockSetFieldValue).toHaveBeenCalledTimes(1); + expect(mockSetFieldValue.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + 23, + ], + ] + `); + }); + + it('sets invalid for NaN value', () => { + handleAlertFieldNumberChange( + // @ts-ignore no need to implement this entire type here + { target: { value: 'foo' } }, + false, + mockSetIsInvalid, + mockSetFieldValue + ); + expect(mockSetIsInvalid).toHaveBeenCalledTimes(1); + expect(mockSetIsInvalid.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + true, + ], + ] + `); + expect(mockSetFieldValue).not.toHaveBeenCalled(); + }); + + it('sets invalid to false when a valid value is received and invalid is true', () => { + handleAlertFieldNumberChange( + // @ts-ignore no need to implement this entire type here + { target: { value: '23' } }, + true, + mockSetIsInvalid, + mockSetFieldValue + ); + expect(mockSetIsInvalid).toHaveBeenCalledTimes(1); + expect(mockSetIsInvalid.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + false, + ], + ] + `); + expect(mockSetFieldValue).toHaveBeenCalledTimes(1); + expect(mockSetFieldValue.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + 23, + ], + ] + `); + }); + }); + + describe('AlertFieldNumber', () => { + it('responds with correct number value when a valid number is specified', () => { + const mockValueHandler = jest.fn(); + const component = mountWithIntl( + + ); + component.find('input').simulate('change', { target: { value: '45' } }); + expect(mockValueHandler).toHaveBeenCalled(); + expect(mockValueHandler.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + 45, + ], + ] + `); + }); + + it('does not set an invalid number value', () => { + const mockValueHandler = jest.fn(); + const component = mountWithIntl( + + ); + component.find('input').simulate('change', { target: { value: 'not a number' } }); + expect(mockValueHandler).not.toHaveBeenCalled(); + expect(mockValueHandler.mock.calls).toEqual([]); + }); + + it('does not set a number value less than 1', () => { + const mockValueHandler = jest.fn(); + const component = mountWithIntl( + + ); + component.find('input').simulate('change', { target: { value: '0' } }); + expect(mockValueHandler).not.toHaveBeenCalled(); + expect(mockValueHandler.mock.calls).toEqual([]); + }); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx index aa17086f49034..b955667ea7400 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx @@ -5,141 +5,120 @@ */ import React from 'react'; -import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { AlertFieldNumber, handleAlertFieldNumberChange } from '../alert_field_number'; +import { shallowWithIntl } from 'test_utils/enzyme_helpers'; +import { AlertMonitorStatusComponent, AlertMonitorStatusProps } from '../alert_monitor_status'; describe('alert monitor status component', () => { - describe('handleAlertFieldNumberChange', () => { - let mockSetIsInvalid: jest.Mock; - let mockSetFieldValue: jest.Mock; + describe('AlertMonitorStatus', () => { + const defaultProps: AlertMonitorStatusProps = { + alertParams: { + numTimes: 3, + search: 'monitor.id: foo', + timerangeUnit: 'h', + timerangeCount: 21, + }, + autocomplete: { + addQuerySuggestionProvider: jest.fn(), + getQuerySuggestions: jest.fn(), + }, + enabled: true, + hasFilters: false, + isOldAlert: true, + locations: [], + shouldUpdateUrl: false, + snapshotCount: 0, + snapshotLoading: false, + numTimes: 14, + setAlertParams: jest.fn(), + timerange: { from: 'now-12h', to: 'now' }, + }; - beforeEach(() => { - mockSetIsInvalid = jest.fn(); - mockSetFieldValue = jest.fn(); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - it('sets a valid number', () => { - handleAlertFieldNumberChange( - // @ts-ignore no need to implement this entire type here - { target: { value: '23' } }, - false, - mockSetIsInvalid, - mockSetFieldValue - ); - expect(mockSetIsInvalid).not.toHaveBeenCalled(); - expect(mockSetFieldValue).toHaveBeenCalledTimes(1); - expect(mockSetFieldValue.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - 23, - ], - ] - `); - }); - - it('sets invalid for NaN value', () => { - handleAlertFieldNumberChange( - // @ts-ignore no need to implement this entire type here - { target: { value: 'foo' } }, - false, - mockSetIsInvalid, - mockSetFieldValue - ); - expect(mockSetIsInvalid).toHaveBeenCalledTimes(1); - expect(mockSetIsInvalid.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - true, - ], - ] - `); - expect(mockSetFieldValue).not.toHaveBeenCalled(); - }); - - it('sets invalid to false when a valid value is received and invalid is true', () => { - handleAlertFieldNumberChange( - // @ts-ignore no need to implement this entire type here - { target: { value: '23' } }, - true, - mockSetIsInvalid, - mockSetFieldValue - ); - expect(mockSetIsInvalid).toHaveBeenCalledTimes(1); - expect(mockSetIsInvalid.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - false, - ], - ] + it('passes default props to children', () => { + const component = shallowWithIntl(); + expect(component).toMatchInlineSnapshot(` + + + + + + + + + + + + + + + } + /> + + `); - expect(mockSetFieldValue).toHaveBeenCalledTimes(1); - expect(mockSetFieldValue.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - 23, - ], - ] - `); - }); - }); - - describe('AlertFieldNumber', () => { - it('responds with correct number value when a valid number is specified', () => { - const mockValueHandler = jest.fn(); - const component = mountWithIntl( - - ); - component.find('input').simulate('change', { target: { value: '45' } }); - expect(mockValueHandler).toHaveBeenCalled(); - expect(mockValueHandler.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - 45, - ], - ] - `); - }); - - it('does not set an invalid number value', () => { - const mockValueHandler = jest.fn(); - const component = mountWithIntl( - - ); - component.find('input').simulate('change', { target: { value: 'not a number' } }); - expect(mockValueHandler).not.toHaveBeenCalled(); - expect(mockValueHandler.mock.calls).toEqual([]); - }); - - it('does not set a number value less than 1', () => { - const mockValueHandler = jest.fn(); - const component = mountWithIntl( - - ); - component.find('input').simulate('change', { target: { value: '0' } }); - expect(mockValueHandler).not.toHaveBeenCalled(); - expect(mockValueHandler.mock.calls).toEqual([]); }); }); }); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/old_alert_callout.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/old_alert_callout.test.tsx new file mode 100644 index 0000000000000..e324b213548d8 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/old_alert_callout.test.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallowWithIntl } from 'test_utils/enzyme_helpers'; +import { OldAlertCallOut } from '../old_alert_call_out'; + +describe('OldAlertCallOut', () => { + it('returns null for new alert type', () => { + expect(shallowWithIntl()).toEqual({}); + }); + + it('renders the call out for old alerts', () => { + expect(shallowWithIntl()).toMatchInlineSnapshot(` + + + + } + /> + + `); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx index f633727a0af37..d9011c896ffdc 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx @@ -6,20 +6,18 @@ import React, { useState } from 'react'; import { EuiButtonEmpty, EuiContextMenuItem, EuiContextMenuPanel, EuiPopover } from '@elastic/eui'; -import { useFilterUpdate } from '../../../hooks/use_filter_update'; import * as labels from './translations'; interface Props { newFilters: string[]; onNewFilter: (val: string) => void; + alertFilters: { [key: string]: string[] }; } -export const AddFilterButton: React.FC = ({ newFilters, onNewFilter }) => { +export const AddFilterButton: React.FC = ({ newFilters, onNewFilter, alertFilters }) => { const [isPopoverOpen, setPopover] = useState(false); - const { selectedFilters } = useFilterUpdate(); - - const getSelectedItems = (fieldName: string) => selectedFilters.get(fieldName) || []; + const getSelectedItems = (fieldName: string) => alertFilters?.[fieldName] ?? []; const onButtonClick = () => { setPopover(!isPopoverOpen); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx index e2e44124ec659..a1b4762627e7c 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx @@ -5,25 +5,31 @@ */ import React, { useState } from 'react'; -import { EuiSpacer } from '@elastic/eui'; +import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import { DataPublicPluginSetup } from 'src/plugins/data/public'; import * as labels from './translations'; import { DownNoExpressionSelect, TimeExpressionSelect, - FiltersExpressionsSelect, + FiltersExpressionSelectContainer, } from './monitor_expressions'; - import { AddFilterButton } from './add_filter_btn'; +import { OldAlertCallOut } from './old_alert_call_out'; import { KueryBar } from '..'; -interface AlertMonitorStatusProps { +export interface AlertMonitorStatusProps { + alertParams: { [key: string]: any }; autocomplete: DataPublicPluginSetup['autocomplete']; enabled: boolean; - filters: string; + hasFilters: boolean; + isOldAlert: boolean; locations: string[]; + snapshotCount: number; + snapshotLoading: boolean; numTimes: number; setAlertParams: (key: string, value: any) => void; + shouldUpdateUrl: boolean; timerange: { from: string; to: string; @@ -31,42 +37,70 @@ interface AlertMonitorStatusProps { } export const AlertMonitorStatusComponent: React.FC = (props) => { - const { filters, setAlertParams } = props; + const { + alertParams, + hasFilters, + isOldAlert, + setAlertParams, + shouldUpdateUrl, + snapshotCount, + snapshotLoading, + } = props; - const [newFilters, setNewFilters] = useState([]); + const alertFilters = alertParams?.filters ?? {}; + const [newFilters, setNewFilters] = useState( + Object.keys(alertFilters).filter((f) => alertFilters[f].length) + ); return ( <> + + + setAlertParams('search', value)} data-test-subj="xpack.uptime.alerts.monitorStatus.filterBar" /> - + - + - { - if (newFilters.includes(removeFiler)) { - setNewFilters(newFilters.filter((item) => item !== removeFiler)); + onRemoveFilter={(removeFilter: string) => { + if (newFilters.includes(removeFilter)) { + setNewFilters(newFilters.filter((item) => item !== removeFilter)); } }} + setAlertParams={setAlertParams} + shouldUpdateUrl={shouldUpdateUrl} /> { setNewFilters([...newFilters, newFilter]); @@ -74,6 +108,20 @@ export const AlertMonitorStatusComponent: React.FC = (p /> + + + } + iconType="iInCircle" + /> + + ); }; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx index 973a3e1d477b6..ac87dbfcd13aa 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx @@ -4,13 +4,31 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useEffect } from 'react'; -import { useSelector } from 'react-redux'; +import React, { useMemo, useEffect } from 'react'; +import { useLocation } from 'react-router-dom'; +import { useSelector, useDispatch } from 'react-redux'; import { DataPublicPluginSetup } from 'src/plugins/data/public'; -import { selectMonitorStatusAlert, searchTextSelector } from '../../../../state/selectors'; +import { isRight } from 'fp-ts/lib/Either'; +import { + selectMonitorStatusAlert, + overviewFiltersSelector, + snapshotDataSelector, + esKuerySelector, + selectedFiltersSelector, +} from '../../../../state/selectors'; import { AlertMonitorStatusComponent } from '../index'; +import { + fetchOverviewFilters, + setSearchTextAction, + setEsKueryString, + getSnapshotCountAction, +} from '../../../../state/actions'; +import { AtomicStatusCheckParamsType } from '../../../../../common/runtime_types'; +import { useIndexPattern } from '../../kuery_bar/use_index_pattern'; +import { useUpdateKueryString } from '../../../../hooks'; interface Props { + alertParams: { [key: string]: any }; autocomplete: DataPublicPluginSetup['autocomplete']; enabled: boolean; numTimes: number; @@ -27,22 +45,87 @@ export const AlertMonitorStatus: React.FC = ({ numTimes, setAlertParams, timerange, + alertParams, }) => { - const { filters, locations } = useSelector(selectMonitorStatusAlert); - const searchText = useSelector(searchTextSelector); + const dispatch = useDispatch(); + useEffect(() => { + dispatch( + fetchOverviewFilters({ + dateRangeStart: 'now-24h', + dateRangeEnd: 'now', + locations: alertParams.filters?.['observer.geo.name'] ?? [], + ports: alertParams.filters?.['url.port'] ?? [], + tags: alertParams.filters?.tags ?? [], + schemes: alertParams.filters?.['monitor.type'] ?? [], + }) + ); + }, [alertParams, dispatch]); + + const overviewFilters = useSelector(overviewFiltersSelector); + const { locations } = useSelector(selectMonitorStatusAlert); + useEffect(() => { + if (alertParams.search) { + dispatch(setSearchTextAction(alertParams.search)); + } + }, [alertParams, dispatch]); + const { index_pattern: indexPattern } = useIndexPattern(); + + const { count, loading } = useSelector(snapshotDataSelector); + const esKuery = useSelector(esKuerySelector); + const [esFilters] = useUpdateKueryString( + indexPattern, + alertParams.search, + alertParams.filters === undefined || typeof alertParams.filters === 'string' + ? '' + : JSON.stringify(Array.from(Object.entries(alertParams.filters))) + ); useEffect(() => { - setAlertParams('search', searchText); - }, [setAlertParams, searchText]); + dispatch(setEsKueryString(esFilters ?? '')); + }, [dispatch, esFilters]); + + const isOldAlert = React.useMemo( + () => !isRight(AtomicStatusCheckParamsType.decode(alertParams)), + [alertParams] + ); + useEffect(() => { + dispatch( + getSnapshotCountAction({ dateRangeStart: 'now-24h', dateRangeEnd: 'now', filters: esKuery }) + ); + }, [dispatch, esKuery]); + + const selectedFilters = useSelector(selectedFiltersSelector); + useEffect(() => { + if (!alertParams.filters && selectedFilters !== null) { + setAlertParams('filters', { + // @ts-ignore + 'url.port': selectedFilters?.ports ?? [], + // @ts-ignore + 'observer.geo.name': selectedFilters?.locations ?? [], + // @ts-ignore + 'monitor.type': selectedFilters?.schemes ?? [], + // @ts-ignore + tags: selectedFilters?.tags ?? [], + }); + } + }, [alertParams, setAlertParams, selectedFilters]); + + const { pathname } = useLocation(); + const shouldUpdateUrl = useMemo(() => pathname.indexOf('app/uptime') !== -1, [pathname]); return ( ); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/down_number_select.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/down_number_select.test.tsx index ff3f4e5a20417..31503252a8990 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/down_number_select.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/down_number_select.test.tsx @@ -9,20 +9,16 @@ import { renderWithIntl, shallowWithIntl } from 'test_utils/enzyme_helpers'; import { DownNoExpressionSelect } from '../down_number_select'; describe('DownNoExpressionSelect component', () => { - const filters = - '"{"bool":{"filter":[{"bool":{"should":[{"match":{"observer.geo.name":"US-West"}}],"minimum_should_match":1}},' + - '{"bool":{"should":[{"match":{"url.port":443}}],"minimum_should_match":1}}]}}"'; - it('should shallow renders against props', function () { const component = shallowWithIntl( - + ); expect(component).toMatchSnapshot(); }); it('should renders against props', function () { const component = renderWithIntl( - + ); expect(component).toMatchSnapshot(); }); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/filters_expression_select.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/filters_expression_select.test.tsx new file mode 100644 index 0000000000000..e41dfea82c2fb --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/filters_expression_select.test.tsx @@ -0,0 +1,176 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallowWithIntl } from 'test_utils/enzyme_helpers'; +import { FiltersExpressionsSelect } from '../filters_expression_select'; + +describe('filters expression select component', () => { + it('is empty when no filters available', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + + + `); + }); + + it('contains provided new filter values', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + + + + } + disabled={true} + fieldName="observer.geo.name" + forceOpen={false} + id="filter_location" + items={Array []} + loading={false} + onFilterFieldChange={[Function]} + selectedItems={Array []} + setForceOpen={[Function]} + title="Scheme" + /> + + + + + + + + + `); + }); + + it('contains provided selected filter values', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + + + + } + disabled={false} + fieldName="tags" + forceOpen={false} + id="filter_tags" + items={ + Array [ + "foo", + "bar", + ] + } + loading={false} + onFilterFieldChange={[Function]} + selectedItems={Array []} + setForceOpen={[Function]} + title="Tags" + /> + + + + + + + + + `); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx index 7f68aef8e179c..0eb53eb044bc5 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx @@ -10,12 +10,17 @@ import * as labels from '../translations'; import { AlertFieldNumber } from '../alert_field_number'; interface Props { + defaultNumTimes?: number; + hasFilters: boolean; setAlertParams: (key: string, value: any) => void; - filters: string; } -export const DownNoExpressionSelect: React.FC = ({ filters, setAlertParams }) => { - const [numTimes, setNumTimes] = useState(5); +export const DownNoExpressionSelect: React.FC = ({ + defaultNumTimes, + hasFilters, + setAlertParams, +}) => { + const [numTimes, setNumTimes] = useState(defaultNumTimes ?? 5); useEffect(() => { setAlertParams('numTimes', numTimes); @@ -34,7 +39,7 @@ export const DownNoExpressionSelect: React.FC = ({ filters, setAlertParam /> } data-test-subj="xpack.uptime.alerts.monitorStatus.numTimesExpression" - description={filters ? labels.MATCHING_MONITORS_DOWN : labels.ANY_MONITOR_DOWN} + description={hasFilters ? labels.MATCHING_MONITORS_DOWN : labels.ANY_MONITOR_DOWN} id="ping-count" value={`${numTimes} times`} /> diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx index bc742343d5dd9..64862a8b748d8 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx @@ -4,57 +4,55 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useEffect, useState } from 'react'; -import { useSelector } from 'react-redux'; +import React, { useState } from 'react'; import { EuiButtonIcon, EuiExpression, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { FilterPopover } from '../../filter_group/filter_popover'; -import { overviewFiltersSelector } from '../../../../state/selectors'; -import { useFilterUpdate } from '../../../../hooks/use_filter_update'; import { filterLabels } from '../../filter_group/translations'; import { alertFilterLabels } from './translations'; -import { StatusCheckFilters } from '../../../../../common/runtime_types'; +import { FilterExpressionsSelectProps } from './filters_expression_select_container'; +import { OverviewFiltersState } from '../../../../state/reducers/overview_filters'; -interface Props { - newFilters: string[]; - onRemoveFilter: (val: string) => void; - setAlertParams: (key: string, value: any) => void; +type FilterFieldUpdate = (updateTarget: { fieldName: string; values: string[] }) => void; + +interface OwnProps { + setUpdatedFieldValues: FilterFieldUpdate; } +type Props = FilterExpressionsSelectProps & Pick & OwnProps; + export const FiltersExpressionsSelect: React.FC = ({ - setAlertParams, + alertParams, + filters: overviewFilters, newFilters, onRemoveFilter, + setAlertParams, + setUpdatedFieldValues, }) => { - const { - filters: { tags, ports, schemes, locations }, - } = useSelector(overviewFiltersSelector); - - const [updatedFieldValues, setUpdatedFieldValues] = useState<{ - fieldName: string; - values: string[]; - }>({ fieldName: '', values: [] }); - - const { selectedLocations, selectedPorts, selectedSchemes, selectedTags } = useFilterUpdate( - updatedFieldValues.fieldName, - updatedFieldValues.values - ); - - const [filters, setFilters] = useState({ - 'observer.geo.name': selectedLocations, - 'url.port': selectedPorts, - tags: selectedTags, - 'monitor.type': selectedSchemes, - }); - - useEffect(() => { - setAlertParams('filters', filters); - }, [filters, setAlertParams]); + const { tags, ports, schemes, locations } = overviewFilters; + const selectedPorts = alertParams?.filters?.['url.port'] ?? []; + const selectedLocations = alertParams?.filters?.['observer.geo.name'] ?? []; + const selectedSchemes = alertParams?.filters?.['monitor.type'] ?? []; + const selectedTags = alertParams?.filters?.tags ?? []; const onFilterFieldChange = (fieldName: string, values: string[]) => { - setFilters({ - ...filters, - [fieldName]: values, - }); + // the `filters` field is no longer a string + if (alertParams.filters && typeof alertParams.filters !== 'string') { + setAlertParams('filters', { ...alertParams.filters, [fieldName]: values }); + } else { + setAlertParams( + 'filters', + Object.assign( + {}, + { + tags: [], + 'url.port': [], + 'observer.geo.name': [], + 'monitor.type': [], + }, + { [fieldName]: values } + ) + ); + } setUpdatedFieldValues({ fieldName, values }); }; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select_container.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select_container.tsx new file mode 100644 index 0000000000000..6605f653d7f5c --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select_container.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; +import { useSelector } from 'react-redux'; +import { FiltersExpressionsSelect } from './filters_expression_select'; +import { overviewFiltersSelector } from '../../../../state/selectors'; +import { useFilterUpdate } from '../../../../hooks/use_filter_update'; + +export interface FilterExpressionsSelectProps { + alertParams: { [key: string]: any }; + newFilters: string[]; + onRemoveFilter: (val: string) => void; + setAlertParams: (key: string, value: any) => void; + shouldUpdateUrl: boolean; +} + +export const FiltersExpressionSelectContainer: React.FC = (props) => { + const [updatedFieldValues, setUpdatedFieldValues] = useState<{ + fieldName: string; + values: string[]; + }>({ fieldName: '', values: [] }); + + useFilterUpdate(updatedFieldValues.fieldName, updatedFieldValues.values, props.shouldUpdateUrl); + + const overviewFilters = useSelector(overviewFiltersSelector); + + return ( + + ); +}; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts index acc19dfbc8f8b..e6f47e744f5ea 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts @@ -6,4 +6,5 @@ export { DownNoExpressionSelect } from './down_number_select'; export { FiltersExpressionsSelect } from './filters_expression_select'; +export { FiltersExpressionSelectContainer } from './filters_expression_select_container'; export { TimeExpressionSelect } from './time_expression_select'; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx index e3893845862fb..44bfbff6817c4 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx @@ -13,9 +13,13 @@ import { AlertFieldNumber } from '../alert_field_number'; import { timeExpLabels } from './translations'; interface Props { + defaultTimerangeCount?: number; + defaultTimerangeUnit?: string; setAlertParams: (key: string, value: any) => void; } +const DEFAULT_TIMERANGE_UNIT = 'm'; + const TimeRangeOptions = [ { 'aria-label': labels.SECONDS_TIME_RANGE, @@ -26,7 +30,6 @@ const TimeRangeOptions = [ { 'aria-label': labels.MINUTES_TIME_RANGE, 'data-test-subj': 'xpack.uptime.alerts.monitorStatus.timerangeUnitSelectable.minutesOption', - checked: 'on', key: 'm', label: labels.MINUTES, }, @@ -44,10 +47,18 @@ const TimeRangeOptions = [ }, ]; -export const TimeExpressionSelect: React.FC = ({ setAlertParams }) => { - const [numUnits, setNumUnits] = useState(15); +export const TimeExpressionSelect: React.FC = ({ + defaultTimerangeCount, + defaultTimerangeUnit, + setAlertParams, +}) => { + const [numUnits, setNumUnits] = useState(defaultTimerangeCount ?? 15); - const [timerangeUnitOptions, setTimerangeUnitOptions] = useState(TimeRangeOptions); + const [timerangeUnitOptions, setTimerangeUnitOptions] = useState( + TimeRangeOptions.map((opt) => + opt.key === (defaultTimerangeUnit ?? DEFAULT_TIMERANGE_UNIT) ? { ...opt, checked: 'on' } : opt + ) + ); useEffect(() => { const timerangeUnit = timerangeUnitOptions.find(({ checked }) => checked === 'on')?.key ?? 'm'; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/old_alert_call_out.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/old_alert_call_out.tsx new file mode 100644 index 0000000000000..eba66f7bfd570 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/old_alert_call_out.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiSpacer, EuiCallOut } from '@elastic/eui'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +interface Props { + isOldAlert: boolean; +} + +export const OldAlertCallOut: React.FC = ({ isOldAlert }) => { + if (!isOldAlert) return null; + return ( + <> + + + + } + iconType="alert" + /> + + ); +}; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx index 8fd4586830684..cf6d2547d9c0c 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ +import { EuiLink } from '@elastic/eui'; import { EuiExpression, EuiPopover } from '@elastic/eui'; -import { Link } from 'react-router-dom'; import React, { useState } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { SETTINGS_ROUTE } from '../../../../common/constants'; +import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; interface SettingsMessageExpressionPopoverProps { 'aria-label': string; @@ -25,9 +25,12 @@ export const SettingsMessageExpressionPopover: React.FC { + const kibana = useKibana(); + const path = kibana.services?.application?.getUrlForApp('uptime', { path: 'settings' }); const [isOpen, setIsOpen] = useState(false); return ( + { setAlertFlyoutVisible(false); @@ -63,7 +66,7 @@ export const SettingsMessageExpressionPopover: React.FC settings page - + ), }} /> diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx index 5c0ee632a2bda..03c8e919ebbf1 100644 --- a/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx @@ -36,13 +36,19 @@ function convertKueryToEsQuery(kuery: string, indexPattern: IIndexPattern) { interface Props { 'aria-label': string; autocomplete: DataPublicPluginSetup['autocomplete']; + defaultKuery?: string; 'data-test-subj': string; + shouldUpdateUrl?: boolean; + updateDefaultKuery?: (value: string) => void; } export function KueryBar({ 'aria-label': ariaLabel, autocomplete: autocompleteService, + defaultKuery, 'data-test-subj': dataTestSubj, + shouldUpdateUrl, + updateDefaultKuery, }: Props) { const { loading, index_pattern: indexPattern } = useIndexPattern(); const { updateSearchText } = useSearchText(); @@ -68,8 +74,6 @@ export function KueryBar({ return; } - updateSearchText(inputValue); - setIsLoadingSuggestions(true); setState({ ...state, suggestions: [] }); @@ -112,7 +116,13 @@ export function KueryBar({ return; } - updateUrlParams({ search: inputValue.trim() }); + if (shouldUpdateUrl !== false) { + updateUrlParams({ search: inputValue.trim() }); + } + updateSearchText(inputValue); + if (updateDefaultKuery) { + updateDefaultKuery(inputValue); + } } catch (e) { console.log('Invalid kuery syntax'); // eslint-disable-line no-console } @@ -125,7 +135,7 @@ export function KueryBar({ data-test-subj={dataTestSubj} disabled={indexPatternMissing} isLoading={isLoadingSuggestions || loading} - initialValue={kuery} + initialValue={defaultKuery || kuery} onChange={onChange} onSubmit={onSubmit} suggestions={state.suggestions} diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/filter_status_button.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/filter_status_button.test.tsx index 58c305f0d15a0..612ede2c556e7 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/filter_status_button.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/filter_status_button.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { FilterStatusButton, FilterStatusButtonProps } from '../filter_status_button'; -import { renderWithRouter, shallowWithRouter } from '../../../../lib'; +import { renderWithRouter, shallowWithRouter, MountWithReduxProvider } from '../../../../lib'; describe('FilterStatusButton', () => { let props: FilterStatusButtonProps; @@ -26,7 +26,11 @@ describe('FilterStatusButton', () => { }); it('renders without errors for valid props', () => { - const wrapper = renderWithRouter(); + const wrapper = renderWithRouter( + + + + ); expect(wrapper).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/status_filter.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/status_filter.test.tsx index a1288513eb785..d09bbad5cb9e0 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/status_filter.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/status_filter.test.tsx @@ -5,7 +5,12 @@ */ import React from 'react'; -import { mountWithRouter, renderWithRouter, shallowWithRouter } from '../../../../lib'; +import { + mountWithRouter, + renderWithRouter, + shallowWithRouter, + MountWithReduxProvider, +} from '../../../../lib'; import { createMemoryHistory } from 'history'; import { StatusFilter } from '../status_filter'; import { FilterStatusButton } from '../filter_status_button'; @@ -18,7 +23,12 @@ describe('StatusFilterComponent', () => { initialEntries: [`/?g=%22%22&statusFilter=${status}`], }); - const wrapper = mountWithRouter(, history); + const wrapper = mountWithRouter( + + + , + history + ); const filterBtns = wrapper.find(FilterStatusButton); const allBtn = filterBtns.at(0); @@ -34,7 +44,11 @@ describe('StatusFilterComponent', () => { }); it('renders without errors for valid props', () => { - const wrapper = renderWithRouter(); + const wrapper = renderWithRouter( + + + + ); expect(wrapper).toMatchSnapshot(); }); diff --git a/x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap b/x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap index 827c9257893ad..5d2565b7210da 100644 --- a/x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap +++ b/x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap @@ -137,30 +137,95 @@ exports[`useUrlParams deletes keys that do not have truthy values 1`] = ` } } > - + -
- {"absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":60000,"autorefreshIsPaused":false,"dateRangeStart":"now-12","dateRangeEnd":"now","filters":"","search":"","selectedPingStatus":"","statusFilter":"","pagination":"foo"} -
- - -
+ +
+ {"absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":60000,"autorefreshIsPaused":false,"dateRangeStart":"now-12","dateRangeEnd":"now","filters":"","search":"","selectedPingStatus":"","statusFilter":"","pagination":"foo"} +
+ + +
+ + `; @@ -301,24 +366,89 @@ exports[`useUrlParams gets the expected values using the context 1`] = ` } } > - -
- {"absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":60000,"autorefreshIsPaused":false,"dateRangeStart":"now-15m","dateRangeEnd":"now","filters":"","search":"","selectedPingStatus":"","statusFilter":""} -
- - -
+ +
+ {"absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":60000,"autorefreshIsPaused":false,"dateRangeStart":"now-15m","dateRangeEnd":"now","filters":"","search":"","selectedPingStatus":"","statusFilter":""} +
+ + +
+ + `; diff --git a/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx b/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx index 306919015fcb1..d688660f564ca 100644 --- a/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx +++ b/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx @@ -10,7 +10,7 @@ import { Route } from 'react-router-dom'; import { mountWithRouter } from '../../lib'; import { OVERVIEW_ROUTE } from '../../../common/constants'; import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; -import { UptimeUrlParams, getSupportedUrlParams } from '../../lib/helper'; +import { UptimeUrlParams, getSupportedUrlParams, MountWithReduxProvider } from '../../lib/helper'; import { makeBaseBreadcrumb, useBreadcrumbs } from '../use_breadcrumbs'; describe('useBreadcrumbs', () => { @@ -34,11 +34,13 @@ describe('useBreadcrumbs', () => { }; mountWithRouter( - - - - - + + + + + + + ); const urlParams: UptimeUrlParams = getSupportedUrlParams({}); diff --git a/x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx b/x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx index deb1f163c1326..af5c113a02834 100644 --- a/x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx +++ b/x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx @@ -8,7 +8,7 @@ import DateMath from '@elastic/datemath'; import React, { useState, Fragment } from 'react'; import { useUrlParams, UptimeUrlParamsHook } from '../use_url_params'; import { UptimeRefreshContext } from '../../contexts'; -import { mountWithRouter } from '../../lib'; +import { mountWithRouter, MountWithReduxProvider } from '../../lib'; import { createMemoryHistory } from 'history'; interface MockUrlParamsComponentProps { @@ -52,9 +52,11 @@ describe('useUrlParams', () => { jest.spyOn(history, 'push'); const component = mountWithRouter( - - - , + + + + + , history ); @@ -68,14 +70,16 @@ describe('useUrlParams', () => { it('gets the expected values using the context', () => { const component = mountWithRouter( - - - + + + + + ); const getUrlParamsButton = component.find('#getUrlParams'); @@ -92,14 +96,16 @@ describe('useUrlParams', () => { jest.spyOn(history, 'push'); const component = mountWithRouter( - - - , + + + + + , history ); diff --git a/x-pack/plugins/uptime/public/hooks/use_filter_update.ts b/x-pack/plugins/uptime/public/hooks/use_filter_update.ts index 550de134c49bc..fefb676e6e2b5 100644 --- a/x-pack/plugins/uptime/public/hooks/use_filter_update.ts +++ b/x-pack/plugins/uptime/public/hooks/use_filter_update.ts @@ -20,14 +20,18 @@ interface SelectedFilters { selectedFilters: Map; } -export const useFilterUpdate = (fieldName?: string, values?: string[]): SelectedFilters => { +export const useFilterUpdate = ( + fieldName?: string, + values?: string[], + shouldUpdateUrl: boolean = true +): SelectedFilters => { const [getUrlParams, updateUrl] = useUrlParams(); const { filters: currentFilters } = getUrlParams(); // update filters in the URL from filter group const onFilterUpdate = (filtersKuery: string) => { - if (currentFilters !== filtersKuery) { + if (currentFilters !== filtersKuery && shouldUpdateUrl) { updateUrl({ filters: filtersKuery, pagination: '' }); } }; diff --git a/x-pack/plugins/uptime/public/hooks/use_url_params.ts b/x-pack/plugins/uptime/public/hooks/use_url_params.ts index c706b92ff3616..0981da20a7a07 100644 --- a/x-pack/plugins/uptime/public/hooks/use_url_params.ts +++ b/x-pack/plugins/uptime/public/hooks/use_url_params.ts @@ -4,9 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ +import { useEffect } from 'react'; import { parse, stringify } from 'query-string'; import { useLocation, useHistory } from 'react-router-dom'; +import { useDispatch, useSelector } from 'react-redux'; import { UptimeUrlParams, getSupportedUrlParams } from '../lib/helper'; +import { selectedFiltersSelector } from '../state/selectors'; +import { setSelectedFilters } from '../state/actions/selected_filters'; export type GetUrlParams = () => UptimeUrlParams; export type UpdateUrlParams = (updatedParams: { @@ -27,9 +31,35 @@ export const useGetUrlParams: GetUrlParams = () => { return getSupportedUrlParams(params); }; +const getMapFromFilters = (value: any): Map | undefined => { + try { + return new Map(JSON.parse(value)); + } catch { + return undefined; + } +}; + +const mapMapToObject = (map: Map) => ({ + locations: map.get('observer.geo.name') ?? [], + ports: map.get('url.port') ?? [], + schemes: map.get('monitor.type') ?? [], + tags: map.get('tags') ?? [], +}); + export const useUrlParams: UptimeUrlParamsHook = () => { const location = useLocation(); const history = useHistory(); + const dispatch = useDispatch(); + const selectedFilters = useSelector(selectedFiltersSelector); + const { filters } = useGetUrlParams(); + useEffect(() => { + if (selectedFilters === null) { + const filterMap = getMapFromFilters(filters); + if (filterMap) { + dispatch(setSelectedFilters(mapMapToObject(filterMap))); + } + } + }, [dispatch, filters, selectedFilters]); const updateUrlParams: UpdateUrlParams = (updatedParams) => { if (!history || !location) return; @@ -57,6 +87,12 @@ export const useUrlParams: UptimeUrlParamsHook = () => { { sort: false } ), }); + const filterMap = getMapFromFilters(mergedParams.filters); + if (!filterMap) { + dispatch(setSelectedFilters(null)); + } else { + dispatch(setSelectedFilters(mapMapToObject(filterMap))); + } }; return [useGetUrlParams, updateUrlParams]; diff --git a/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx b/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx index c83a04e4e9939..3a940b4655b19 100644 --- a/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx +++ b/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx @@ -9,7 +9,6 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { get } from 'lodash'; import { i18n as i18nFormatter } from '@kbn/i18n'; -import { alertTypeInitializers } from '../../alert_types'; import { UptimeApp, UptimeAppProps } from '../../../uptime_app'; import { getIntegratedAppAvailability } from './capabilities_adapter'; import { @@ -34,18 +33,6 @@ export const getKibanaFrameworkAdapter = ( i18n, } = core; - const { - data: { autocomplete }, - triggers_actions_ui, - } = plugins; - - alertTypeInitializers.forEach((init) => { - const alertInitializer = init({ autocomplete }); - if (!triggers_actions_ui.alertTypeRegistry.has(alertInitializer.id)) { - triggers_actions_ui.alertTypeRegistry.register(init({ autocomplete })); - } - }); - const { apm, infrastructure, logs } = getIntegratedAppAvailability( capabilities, INTEGRATED_SOLUTIONS diff --git a/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts b/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts index 098a999b0d89c..7ca5e7438d28a 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts +++ b/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts @@ -33,6 +33,24 @@ describe('monitor status alert type', () => { `); }); + it('accepts original alert params', () => { + expect( + validate({ + locations: ['fairbanks'], + numTimes: 3, + timerange: { + from: 'now-15m', + to: 'now', + }, + filters: '{foo: "bar"}', + }) + ).toMatchInlineSnapshot(` + Object { + "errors": Object {}, + } + `); + }); + describe('timerange', () => { it('has invalid timerangeCount value', () => { expect(validate({ ...params, timerangeCount: 0 })).toMatchInlineSnapshot(` @@ -96,7 +114,22 @@ describe('monitor status alert type', () => { }); describe('initMonitorStatusAlertType', () => { - expect(initMonitorStatusAlertType({ autocomplete: {} })).toMatchInlineSnapshot(` + expect( + initMonitorStatusAlertType({ + store: { + dispatch: jest.fn(), + getState: jest.fn(), + replaceReducer: jest.fn(), + subscribe: jest.fn(), + [Symbol.observable]: jest.fn(), + }, + // @ts-ignore we don't need to test this functionality here because + // it's not used by the code this file tests + core: {}, + // @ts-ignore + plugins: {}, + }) + ).toMatchInlineSnapshot(` Object { "alertParamsExpression": [Function], "defaultActionMessage": "{{context.message}} @@ -104,8 +137,20 @@ describe('monitor status alert type', () => { {{context.downMonitorsWithGeo}}", "iconClass": "uptimeApp", "id": "xpack.uptime.alerts.monitorStatus", - "name": , - "requiresAppContext": true, + "name": + + , + "requiresAppContext": false, "validate": [Function], } `); diff --git a/x-pack/plugins/uptime/public/lib/alert_types/index.ts b/x-pack/plugins/uptime/public/lib/alert_types/index.ts index 9a0151e95748c..f2f72311d2262 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/index.ts +++ b/x-pack/plugins/uptime/public/lib/alert_types/index.ts @@ -4,11 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ +import { CoreStart } from 'kibana/public'; import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; import { initMonitorStatusAlertType } from './monitor_status'; import { initTlsAlertType } from './tls'; +import { ClientPluginsStart } from '../../apps/plugin'; -export type AlertTypeInitializer = (dependenies: { autocomplete: any }) => AlertTypeModel; +export type AlertTypeInitializer = (dependenies: { + core: CoreStart; + plugins: ClientPluginsStart; +}) => AlertTypeModel; export const alertTypeInitializers: AlertTypeInitializer[] = [ initMonitorStatusAlertType, diff --git a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx index a39317f8db1ed..9906519865bdc 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx @@ -4,24 +4,33 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Provider as ReduxProvider } from 'react-redux'; import React from 'react'; import { isRight } from 'fp-ts/lib/Either'; import { PathReporter } from 'io-ts/lib/PathReporter'; import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; import { AlertTypeInitializer } from '.'; -import { AtomicStatusCheckParamsType } from '../../../common/runtime_types'; +import { AtomicStatusCheckParamsType, StatusCheckParamsType } from '../../../common/runtime_types'; import { MonitorStatusTitle } from './monitor_status_title'; import { CLIENT_ALERT_TYPES } from '../../../common/constants'; import { MonitorStatusTranslations } from './translations'; +import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; +import { store } from '../../state'; export const validate = (alertParams: unknown) => { const errors: Record = {}; const decoded = AtomicStatusCheckParamsType.decode(alertParams); + const oldDecoded = StatusCheckParamsType.decode(alertParams); - if (!isRight(decoded)) { - errors.typeCheckFailure = 'Provided parameters do not conform to the expected type.'; - errors.typeCheckParsingMessage = PathReporter.report(decoded); - } else { + if (!isRight(decoded) && !isRight(oldDecoded)) { + return { + errors: { + typeCheckFailure: 'Provided parameters do not conform to the expected type.', + typeCheckParsingMessage: PathReporter.report(decoded), + }, + }; + } + if (isRight(decoded)) { const { numTimes, timerangeCount } = decoded.right; if (numTimes < 1) { errors.invalidNumTimes = 'Number of alert check down times must be an integer greater than 0'; @@ -44,15 +53,26 @@ const AlertMonitorStatus = React.lazy(() => ); export const initMonitorStatusAlertType: AlertTypeInitializer = ({ - autocomplete, + core, + plugins, }): AlertTypeModel => ({ id: CLIENT_ALERT_TYPES.MONITOR_STATUS, - name: , - iconClass: 'uptimeApp', - alertParamsExpression: (params: any) => ( - + name: ( + + + ), + iconClass: 'uptimeApp', + alertParamsExpression: (params: any) => { + return ( + + + + + + ); + }, validate, defaultActionMessage, - requiresAppContext: true, + requiresAppContext: false, }); diff --git a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx index 3fe497f9e88bc..1e2751a4ac388 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx @@ -5,30 +5,13 @@ */ import React from 'react'; -import { useSelector } from 'react-redux'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner, EuiText } from '@elastic/eui'; -import { snapshotDataSelector } from '../../state/selectors'; export const MonitorStatusTitle = () => { - const { count, loading } = useSelector(snapshotDataSelector); return ( - - - {' '} - - - {!loading ? ( - - {count.total} monitors - - ) : ( - - )} - - + ); }; diff --git a/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx b/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx index 15ac849fe871d..c541ea4ae1331 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx @@ -5,21 +5,30 @@ */ import React from 'react'; +import { Provider as ReduxProvider } from 'react-redux'; import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; import { CLIENT_ALERT_TYPES } from '../../../common/constants'; import { TlsTranslations } from './translations'; import { AlertTypeInitializer } from '.'; +import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; +import { store } from '../../state'; const { name, defaultActionMessage } = TlsTranslations; - -export const initTlsAlertType: AlertTypeInitializer = (): AlertTypeModel => ({ +const TlsAlertExpression = React.lazy(() => + import('../../components/overview/alerts/alerts_containers/alert_tls') +); +export const initTlsAlertType: AlertTypeInitializer = ({ core, plugins }): AlertTypeModel => ({ id: CLIENT_ALERT_TYPES.TLS, iconClass: 'uptimeApp', - alertParamsExpression: React.lazy(() => - import('../../components/overview/alerts/alerts_containers/alert_tls') + alertParamsExpression: (_params: any) => ( + + + + + ), name, validate: () => ({ errors: {} }), defaultActionMessage, - requiresAppContext: true, + requiresAppContext: false, }); diff --git a/x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx b/x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx new file mode 100644 index 0000000000000..a68184dbdff97 --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Provider as ReduxProvider } from 'react-redux'; + +export const MountWithReduxProvider: React.FC = ({ children }) => ( + + {children} + +); diff --git a/x-pack/plugins/uptime/public/lib/helper/index.ts b/x-pack/plugins/uptime/public/lib/helper/index.ts index cf49328141b83..10663163e8fda 100644 --- a/x-pack/plugins/uptime/public/lib/helper/index.ts +++ b/x-pack/plugins/uptime/public/lib/helper/index.ts @@ -9,3 +9,4 @@ export * from './observability_integration'; export { getChartDateLabel } from './charts'; export { seriesHasDownValues } from './series_has_down_values'; export { UptimeUrlParams, getSupportedUrlParams } from './url_params'; +export { MountWithReduxProvider } from './helper_with_redux'; diff --git a/x-pack/plugins/uptime/public/lib/index.ts b/x-pack/plugins/uptime/public/lib/index.ts index 06ac06e647adc..92787737d579f 100644 --- a/x-pack/plugins/uptime/public/lib/index.ts +++ b/x-pack/plugins/uptime/public/lib/index.ts @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ +export { MountWithReduxProvider } from './helper'; export { renderWithRouter, shallowWithRouter, mountWithRouter } from './helper/helper_with_router'; diff --git a/x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx b/x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx index c9e4eef386764..63d4c24f965d9 100644 --- a/x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx +++ b/x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx @@ -6,47 +6,33 @@ import React from 'react'; import { PageHeader } from '../page_header'; -import { renderWithRouter } from '../../lib'; -import { Provider } from 'react-redux'; +import { renderWithRouter, MountWithReduxProvider } from '../../lib'; describe('PageHeader', () => { it('shallow renders with the date picker', () => { const component = renderWithRouter( - + - + ); expect(component).toMatchSnapshot('page_header_with_date_picker'); }); it('shallow renders without the date picker', () => { const component = renderWithRouter( - + - + ); expect(component).toMatchSnapshot('page_header_no_date_picker'); }); it('shallow renders extra links', () => { const component = renderWithRouter( - + - + ); expect(component).toMatchSnapshot('page_header_with_extra_links'); }); }); - -const MockReduxProvider = ({ children }: { children: React.ReactElement }) => ( - - {children} - -); diff --git a/x-pack/plugins/uptime/public/state/actions/overview_filters.ts b/x-pack/plugins/uptime/public/state/actions/overview_filters.ts index dbbd01e34b4d4..8eefa701a240a 100644 --- a/x-pack/plugins/uptime/public/state/actions/overview_filters.ts +++ b/x-pack/plugins/uptime/public/state/actions/overview_filters.ts @@ -9,6 +9,7 @@ import { OverviewFilters } from '../../../common/runtime_types'; export const FETCH_OVERVIEW_FILTERS = 'FETCH_OVERVIEW_FILTERS'; export const FETCH_OVERVIEW_FILTERS_FAIL = 'FETCH_OVERVIEW_FILTERS_FAIL'; export const FETCH_OVERVIEW_FILTERS_SUCCESS = 'FETCH_OVERVIEW_FILTERS_SUCCESS'; +export const SET_OVERVIEW_FILTERS = 'SET_OVERVIEW_FILTERS'; export interface GetOverviewFiltersPayload { dateRangeStart: string; @@ -36,10 +37,16 @@ interface GetOverviewFiltersFailAction { payload: Error; } +interface SetOverviewFiltersAction { + type: typeof SET_OVERVIEW_FILTERS; + payload: OverviewFilters; +} + export type OverviewFiltersAction = | GetOverviewFiltersFetchAction | GetOverviewFiltersSuccessAction - | GetOverviewFiltersFailAction; + | GetOverviewFiltersFailAction + | SetOverviewFiltersAction; export const fetchOverviewFilters = ( payload: GetOverviewFiltersPayload @@ -59,3 +66,8 @@ export const fetchOverviewFiltersSuccess = ( type: FETCH_OVERVIEW_FILTERS_SUCCESS, payload: filters, }); + +export const setOverviewFilters = (filters: OverviewFilters): SetOverviewFiltersAction => ({ + type: SET_OVERVIEW_FILTERS, + payload: filters, +}); diff --git a/x-pack/plugins/uptime/public/state/actions/selected_filters.ts b/x-pack/plugins/uptime/public/state/actions/selected_filters.ts new file mode 100644 index 0000000000000..11c159b09a157 --- /dev/null +++ b/x-pack/plugins/uptime/public/state/actions/selected_filters.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { createAction } from 'redux-actions'; + +export interface SelectedFilters { + locations: string[]; + ports: number[]; + schemes: string[]; + tags: string[]; +} + +export type SelectedFiltersPayload = SelectedFilters; + +export const getSelectedFilters = createAction('GET SELECTED FILTERS'); +export const setSelectedFilters = createAction( + 'SET_SELECTED_FILTERS' +); diff --git a/x-pack/plugins/uptime/public/state/index.ts b/x-pack/plugins/uptime/public/state/index.ts index e3563c74294d2..1f4ce7103afbc 100644 --- a/x-pack/plugins/uptime/public/state/index.ts +++ b/x-pack/plugins/uptime/public/state/index.ts @@ -9,12 +9,12 @@ import createSagaMiddleware from 'redux-saga'; import { rootEffect } from './effects'; import { rootReducer } from './reducers'; +export type AppState = ReturnType; + const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; const sagaMW = createSagaMiddleware(); export const store = createStore(rootReducer, composeEnhancers(applyMiddleware(sagaMW))); -export type AppState = ReturnType; - sagaMW.run(rootEffect); diff --git a/x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts b/x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts index 3b8447ec2d713..4683c654270db 100644 --- a/x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts +++ b/x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts @@ -4,7 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { setBasePath, toggleIntegrationsPopover, setAlertFlyoutVisible } from '../../actions'; +import { + setBasePath, + toggleIntegrationsPopover, + setAlertFlyoutVisible, + setSearchTextAction, +} from '../../actions'; import { uiReducer } from '../ui'; import { Action } from 'redux-actions'; @@ -67,4 +72,28 @@ describe('ui reducer', () => { } `); }); + + it('sets the search text', () => { + const action = setSearchTextAction('lorem ipsum') as Action; + expect( + uiReducer( + { + alertFlyoutVisible: false, + basePath: '', + esKuery: '', + integrationsPopoverOpen: null, + searchText: '', + }, + action + ) + ).toMatchInlineSnapshot(` + Object { + "alertFlyoutVisible": false, + "basePath": "", + "esKuery": "", + "integrationsPopoverOpen": null, + "searchText": "lorem ipsum", + } + `); + }); }); diff --git a/x-pack/plugins/uptime/public/state/reducers/index.ts b/x-pack/plugins/uptime/public/state/reducers/index.ts index ead7f5b46431b..c05c740ab8ebf 100644 --- a/x-pack/plugins/uptime/public/state/reducers/index.ts +++ b/x-pack/plugins/uptime/public/state/reducers/index.ts @@ -19,6 +19,7 @@ import { monitorDurationReducer } from './monitor_duration'; import { indexStatusReducer } from './index_status'; import { mlJobsReducer } from './ml_anomaly'; import { certificatesReducer } from '../certificates/certificates'; +import { selectedFiltersReducer } from './selected_filters'; export const rootReducer = combineReducers({ monitor: monitorReducer, @@ -35,4 +36,5 @@ export const rootReducer = combineReducers({ monitorDuration: monitorDurationReducer, indexStatus: indexStatusReducer, certificates: certificatesReducer, + selectedFilters: selectedFiltersReducer, }); diff --git a/x-pack/plugins/uptime/public/state/reducers/overview_filters.ts b/x-pack/plugins/uptime/public/state/reducers/overview_filters.ts index 0b67d8b0e7689..4548627d9dcb8 100644 --- a/x-pack/plugins/uptime/public/state/reducers/overview_filters.ts +++ b/x-pack/plugins/uptime/public/state/reducers/overview_filters.ts @@ -10,6 +10,7 @@ import { FETCH_OVERVIEW_FILTERS_FAIL, FETCH_OVERVIEW_FILTERS_SUCCESS, OverviewFiltersAction, + SET_OVERVIEW_FILTERS, } from '../actions'; export interface OverviewFiltersState { @@ -51,6 +52,11 @@ export function overviewFiltersReducer( errors: [...state.errors, action.payload], loading: false, }; + case SET_OVERVIEW_FILTERS: + return { + ...state, + filters: action.payload, + }; default: return state; } diff --git a/x-pack/plugins/uptime/public/state/reducers/selected_filters.ts b/x-pack/plugins/uptime/public/state/reducers/selected_filters.ts new file mode 100644 index 0000000000000..921754c93078a --- /dev/null +++ b/x-pack/plugins/uptime/public/state/reducers/selected_filters.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Action } from 'redux-actions'; +import { + getSelectedFilters, + setSelectedFilters, + SelectedFilters, +} from '../actions/selected_filters'; + +const initialState: SelectedFilters | null = null; + +export function selectedFiltersReducer( + state = initialState, + action: Action +): SelectedFilters | null { + switch (action.type) { + case String(getSelectedFilters): + return state; + case String(setSelectedFilters): + if (state === null) return { ...action.payload }; + return { + ...(state || {}), + ...action.payload, + }; + default: + return state; + } +} diff --git a/x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts b/x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts index 2eb0f1e8cb0ee..b1885ddeeba3f 100644 --- a/x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts +++ b/x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts @@ -107,6 +107,7 @@ describe('state selectors', () => { loading: false, }, }, + selectedFilters: null, }; it('selects base path from state', () => { diff --git a/x-pack/plugins/uptime/public/state/selectors/index.ts b/x-pack/plugins/uptime/public/state/selectors/index.ts index b088c346ad811..d08db2ccf5f2d 100644 --- a/x-pack/plugins/uptime/public/state/selectors/index.ts +++ b/x-pack/plugins/uptime/public/state/selectors/index.ts @@ -86,3 +86,5 @@ export const overviewFiltersSelector = ({ overviewFilters }: AppState) => overvi export const esKuerySelector = ({ ui: { esKuery } }: AppState) => esKuery; export const searchTextSelector = ({ ui: { searchText } }: AppState) => searchText; + +export const selectedFiltersSelector = ({ selectedFilters }: AppState) => selectedFilters; diff --git a/x-pack/plugins/uptime/public/uptime_app.tsx b/x-pack/plugins/uptime/public/uptime_app.tsx index cc6475d6c9d90..4208d79e761ed 100644 --- a/x-pack/plugins/uptime/public/uptime_app.tsx +++ b/x-pack/plugins/uptime/public/uptime_app.tsx @@ -20,14 +20,13 @@ import { UptimeStartupPluginsContextProvider, } from './contexts'; import { CommonlyUsedRange } from './components/common/uptime_date_picker'; -import { store } from './state'; import { setBasePath } from './state/actions'; import { PageRouter } from './routes'; import { UptimeAlertsContextProvider, UptimeAlertsFlyoutWrapper, } from './components/overview/alerts'; -import { kibanaService } from './state/kibana_service'; +import { store } from './state'; export interface UptimeAppColors { danger: string; @@ -87,8 +86,6 @@ const Application = (props: UptimeAppProps) => { ); }, [canSave, renderGlobalHelpControls, setBadge]); - kibanaService.core = core; - store.dispatch(setBasePath(basePath)); return ( From 1e45e988e84ce4b3a944c52366ce436306c82a1f Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Mon, 8 Jun 2020 14:25:27 -0500 Subject: [PATCH 18/91] [deb/rpm] manage pid folder (#68262) * [deb/rpm] manage pid folder This adds a tmpfiles.d configuration file for systemd users, and changes the path for both systemd and sysv to /var/run/kibana/kibana.pid. pid file generation is left unmodified for a future pr. * cleanup Co-authored-by: Elastic Machine --- src/dev/build/tasks/os_packages/run_fpm.js | 6 +++--- .../systemd/usr/lib/tmpfiles.d/kibana.conf | 1 + .../service_templates/sysv/etc/init.d/kibana | 12 ++++-------- 3 files changed, 8 insertions(+), 11 deletions(-) create mode 100644 src/dev/build/tasks/os_packages/service_templates/systemd/usr/lib/tmpfiles.d/kibana.conf diff --git a/src/dev/build/tasks/os_packages/run_fpm.js b/src/dev/build/tasks/os_packages/run_fpm.js index c49ff01b24086..0496bcf08fb91 100644 --- a/src/dev/build/tasks/os_packages/run_fpm.js +++ b/src/dev/build/tasks/os_packages/run_fpm.js @@ -123,9 +123,9 @@ export async function runFpm(config, log, build, type, pkgSpecificFlags) { // copy the data directory at /var/lib/kibana `${resolveWithTrailingSlash(fromBuild('data'))}=/var/lib/kibana/`, - // copy the generated pleaserun services for systemd and sysv into /etc/ - `${resolveWithTrailingSlash(__dirname, 'service_templates/sysv/etc')}=/etc/`, - `${resolveWithTrailingSlash(__dirname, 'service_templates/systemd/etc')}=/etc/`, + // copy package configurations + `${resolveWithTrailingSlash(__dirname, 'service_templates/sysv/')}=/`, + `${resolveWithTrailingSlash(__dirname, 'service_templates/systemd/')}=/`, ]; log.debug('calling fpm with args:', args); diff --git a/src/dev/build/tasks/os_packages/service_templates/systemd/usr/lib/tmpfiles.d/kibana.conf b/src/dev/build/tasks/os_packages/service_templates/systemd/usr/lib/tmpfiles.d/kibana.conf new file mode 100644 index 0000000000000..b5422df52fe11 --- /dev/null +++ b/src/dev/build/tasks/os_packages/service_templates/systemd/usr/lib/tmpfiles.d/kibana.conf @@ -0,0 +1 @@ +d /var/run/kibana 0755 kibana kibana - - \ No newline at end of file diff --git a/src/dev/build/tasks/os_packages/service_templates/sysv/etc/init.d/kibana b/src/dev/build/tasks/os_packages/service_templates/sysv/etc/init.d/kibana index ce29fd12b8e3c..d935dc6e31f80 100755 --- a/src/dev/build/tasks/os_packages/service_templates/sysv/etc/init.d/kibana +++ b/src/dev/build/tasks/os_packages/service_templates/sysv/etc/init.d/kibana @@ -17,7 +17,7 @@ name=kibana program=/usr/share/kibana/bin/kibana -pidfile="/var/run/$name.pid" +pidfile="/var/run/kibana/$name.pid" [ -r /etc/default/$name ] && . /etc/default/$name [ -r /etc/sysconfig/$name ] && . /etc/sysconfig/$name @@ -37,17 +37,13 @@ emit() { } start() { - - # Ensure the log directory is setup correctly. [ ! -d "/var/log/kibana/" ] && mkdir "/var/log/kibana/" chown "$user":"$group" "/var/log/kibana/" chmod 755 "/var/log/kibana/" - - # Setup any environmental stuff beforehand - - - # Run the program! + [ ! -d "/var/run/kibana/" ] && mkdir "/var/run/kibana/" + chown "$user":"$group" "/var/run/kibana/" + chmod 755 "/var/run/kibana/" chroot --userspec "$user":"$group" "$chroot" sh -c " From f090775280a2afd1340033ab870d4c881f1d4499 Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Mon, 8 Jun 2020 15:03:41 -0600 Subject: [PATCH 19/91] Add url overflow handling to KP (#67899) --- .../core/public/kibana-plugin-core-public.md | 6 + ...ibana-plugin-core-public.url_max_length.md | 13 ++ .../application/application_service.mock.ts | 24 ++++ .../application/application_service.tsx | 1 + src/core/public/application/index.ts | 1 + src/core/public/application/types.ts | 7 + .../header/__snapshots__/header.test.tsx.snap | 76 +++++++++++ src/core/public/core_app/core_app.mock.ts | 31 +++++ src/core/public/core_app/core_app.ts | 83 ++++++++++++ .../core_app/errors/error_application.test.ts | 61 +++++++++ .../core_app/errors/error_application.tsx | 102 ++++++++++++++ src/core/public/core_app/errors/index.ts | 21 +++ .../core_app/errors/url_overflow.test.ts | 127 ++++++++++++++++++ .../public/core_app/errors/url_overflow.tsx | 96 +++++++++++++ .../core_app/errors/url_overflow_ui.tsx | 73 ++++++++++ .../public/core_app/index.ts} | 4 +- src/core/public/core_system.test.mocks.ts | 7 + src/core/public/core_system.test.ts | 23 +++- src/core/public/core_system.ts | 7 + src/core/public/index.ts | 2 + src/core/public/public.api.md | 3 + src/legacy/ui/public/_index.scss | 1 - .../error_url_overflow/__tests__/ie_regex.js | 81 ----------- .../_error_url_overflow.scss | 3 - .../ui/public/error_url_overflow/_index.scss | 1 - .../error_url_overflow.html | 55 -------- .../error_url_overflow/error_url_overflow.js | 58 -------- .../public/angular/angular_config.tsx | 77 +---------- .../kibana_legacy/public/utils/index.ts | 1 - .../public/utils/url_overflow_service.ts | 86 ------------ .../feature_geometry_filter_form.js | 6 +- .../translations/translations/ja-JP.json | 16 +-- .../translations/translations/zh-CN.json | 16 +-- 33 files changed, 774 insertions(+), 395 deletions(-) create mode 100644 docs/development/core/public/kibana-plugin-core-public.url_max_length.md create mode 100644 src/core/public/core_app/core_app.mock.ts create mode 100644 src/core/public/core_app/core_app.ts create mode 100644 src/core/public/core_app/errors/error_application.test.ts create mode 100644 src/core/public/core_app/errors/error_application.tsx create mode 100644 src/core/public/core_app/errors/index.ts create mode 100644 src/core/public/core_app/errors/url_overflow.test.ts create mode 100644 src/core/public/core_app/errors/url_overflow.tsx create mode 100644 src/core/public/core_app/errors/url_overflow_ui.tsx rename src/{legacy/ui/public/error_url_overflow/index.js => core/public/core_app/index.ts} (87%) delete mode 100644 src/legacy/ui/public/error_url_overflow/__tests__/ie_regex.js delete mode 100644 src/legacy/ui/public/error_url_overflow/_error_url_overflow.scss delete mode 100644 src/legacy/ui/public/error_url_overflow/_index.scss delete mode 100644 src/legacy/ui/public/error_url_overflow/error_url_overflow.html delete mode 100644 src/legacy/ui/public/error_url_overflow/error_url_overflow.js delete mode 100644 src/plugins/kibana_legacy/public/utils/url_overflow_service.ts diff --git a/docs/development/core/public/kibana-plugin-core-public.md b/docs/development/core/public/kibana-plugin-core-public.md index 9e4afe0f5133c..7c7c9729504de 100644 --- a/docs/development/core/public/kibana-plugin-core-public.md +++ b/docs/development/core/public/kibana-plugin-core-public.md @@ -132,6 +132,12 @@ The plugin integrates with the core system via lifecycle events: `setup` | [URLMeaningfulParts](./kibana-plugin-core-public.urlmeaningfulparts.md) | We define our own typings because the current version of @types/node declares properties to be optional "hostname?: string". Although, parse call returns "hostname: null \| string". | | [UserProvidedValues](./kibana-plugin-core-public.userprovidedvalues.md) | Describes the values explicitly set by user. | +## Variables + +| Variable | Description | +| --- | --- | +| [URL\_MAX\_LENGTH](./kibana-plugin-core-public.url_max_length.md) | The max URL length allowed by the current browser. Should be used to display warnings to users when query parameters cause URL to exceed this limit. | + ## Type Aliases | Type Alias | Description | diff --git a/docs/development/core/public/kibana-plugin-core-public.url_max_length.md b/docs/development/core/public/kibana-plugin-core-public.url_max_length.md new file mode 100644 index 0000000000000..993320d51909a --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.url_max_length.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [URL\_MAX\_LENGTH](./kibana-plugin-core-public.url_max_length.md) + +## URL\_MAX\_LENGTH variable + +The max URL length allowed by the current browser. Should be used to display warnings to users when query parameters cause URL to exceed this limit. + +Signature: + +```typescript +URL_MAX_LENGTH: number +``` diff --git a/src/core/public/application/application_service.mock.ts b/src/core/public/application/application_service.mock.ts index 300b09e17d15d..47a8a01d917eb 100644 --- a/src/core/public/application/application_service.mock.ts +++ b/src/core/public/application/application_service.mock.ts @@ -17,6 +17,7 @@ * under the License. */ +import { History } from 'history'; import { BehaviorSubject, Subject } from 'rxjs'; import { capabilitiesServiceMock } from './capabilities/capabilities_service.mock'; @@ -57,6 +58,28 @@ const createStartContractMock = (): jest.Mocked => { }; }; +const createHistoryMock = (): jest.Mocked => { + return { + block: jest.fn(), + createHref: jest.fn(), + go: jest.fn(), + goBack: jest.fn(), + goForward: jest.fn(), + listen: jest.fn(), + push: jest.fn(), + replace: jest.fn(), + action: 'PUSH', + length: 1, + location: { + pathname: '/', + search: '', + hash: '', + key: '', + state: undefined, + }, + }; +}; + const createInternalStartContractMock = (): jest.Mocked => { const currentAppId$ = new Subject(); @@ -69,6 +92,7 @@ const createInternalStartContractMock = (): jest.Mocked currentAppId$.next(appId)), navigateToUrl: jest.fn(), registerMountContext: jest.fn(), + history: createHistoryMock(), }; }; diff --git a/src/core/public/application/application_service.tsx b/src/core/public/application/application_service.tsx index 2224f72e2bd91..850422a61bde7 100644 --- a/src/core/public/application/application_service.tsx +++ b/src/core/public/application/application_service.tsx @@ -301,6 +301,7 @@ export class ApplicationService { distinctUntilChanged(), takeUntil(this.stop$) ), + history: this.history, registerMountContext: this.mountContext.registerContext, getUrlForApp: ( appId, diff --git a/src/core/public/application/index.ts b/src/core/public/application/index.ts index d51a4c0d69d42..74356cbd88b34 100644 --- a/src/core/public/application/index.ts +++ b/src/core/public/application/index.ts @@ -43,5 +43,6 @@ export { PublicAppInfo, PublicLegacyAppInfo, // Internal types + InternalApplicationSetup, InternalApplicationStart, } from './types'; diff --git a/src/core/public/application/types.ts b/src/core/public/application/types.ts index 8006ec846138f..7c83c684ac73d 100644 --- a/src/core/public/application/types.ts +++ b/src/core/public/application/types.ts @@ -18,6 +18,7 @@ */ import { Observable } from 'rxjs'; +import { History } from 'history'; import { Capabilities } from './capabilities'; import { ChromeStart } from '../chrome'; @@ -766,6 +767,12 @@ export interface InternalApplicationStart extends Omit | undefined; } /** @internal */ diff --git a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap index b563c6d2a4ec4..305a4b2ed5b30 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap @@ -42,6 +42,25 @@ exports[`Header renders 1`] = ` }, "getComponent": [MockFunction], "getUrlForApp": [MockFunction], + "history": Object { + "action": "PUSH", + "block": [MockFunction], + "createHref": [MockFunction], + "go": [MockFunction], + "goBack": [MockFunction], + "goForward": [MockFunction], + "length": 1, + "listen": [MockFunction], + "location": Object { + "hash": "", + "key": "", + "pathname": "/", + "search": "", + "state": undefined, + }, + "push": [MockFunction], + "replace": [MockFunction], + }, "navigateToApp": [MockFunction], "navigateToUrl": [MockFunction], "registerMountContext": [MockFunction], @@ -657,6 +676,25 @@ exports[`Header renders 2`] = ` }, "getComponent": [MockFunction], "getUrlForApp": [MockFunction], + "history": Object { + "action": "PUSH", + "block": [MockFunction], + "createHref": [MockFunction], + "go": [MockFunction], + "goBack": [MockFunction], + "goForward": [MockFunction], + "length": 1, + "listen": [MockFunction], + "location": Object { + "hash": "", + "key": "", + "pathname": "/", + "search": "", + "state": undefined, + }, + "push": [MockFunction], + "replace": [MockFunction], + }, "navigateToApp": [MockFunction], "navigateToUrl": [MockFunction], "registerMountContext": [MockFunction], @@ -4741,6 +4779,25 @@ exports[`Header renders 3`] = ` }, "getComponent": [MockFunction], "getUrlForApp": [MockFunction], + "history": Object { + "action": "PUSH", + "block": [MockFunction], + "createHref": [MockFunction], + "go": [MockFunction], + "goBack": [MockFunction], + "goForward": [MockFunction], + "length": 1, + "listen": [MockFunction], + "location": Object { + "hash": "", + "key": "", + "pathname": "/", + "search": "", + "state": undefined, + }, + "push": [MockFunction], + "replace": [MockFunction], + }, "navigateToApp": [MockFunction], "navigateToUrl": [MockFunction], "registerMountContext": [MockFunction], @@ -9897,6 +9954,25 @@ exports[`Header renders 4`] = ` }, "getComponent": [MockFunction], "getUrlForApp": [MockFunction], + "history": Object { + "action": "PUSH", + "block": [MockFunction], + "createHref": [MockFunction], + "go": [MockFunction], + "goBack": [MockFunction], + "goForward": [MockFunction], + "length": 1, + "listen": [MockFunction], + "location": Object { + "hash": "", + "key": "", + "pathname": "/", + "search": "", + "state": undefined, + }, + "push": [MockFunction], + "replace": [MockFunction], + }, "navigateToApp": [MockFunction], "navigateToUrl": [MockFunction], "registerMountContext": [MockFunction], diff --git a/src/core/public/core_app/core_app.mock.ts b/src/core/public/core_app/core_app.mock.ts new file mode 100644 index 0000000000000..b0e3871a40bf5 --- /dev/null +++ b/src/core/public/core_app/core_app.mock.ts @@ -0,0 +1,31 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import { CoreApp } from './core_app'; + +type CoreAppContract = PublicMethodsOf; +const createMock = (): jest.Mocked => ({ + setup: jest.fn(), + start: jest.fn(), + stop: jest.fn(), +}); + +export const coreAppMock = { + create: createMock, +}; diff --git a/src/core/public/core_app/core_app.ts b/src/core/public/core_app/core_app.ts new file mode 100644 index 0000000000000..04d58b7c3c65c --- /dev/null +++ b/src/core/public/core_app/core_app.ts @@ -0,0 +1,83 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import { UnregisterCallback } from 'history'; +import { + InternalApplicationSetup, + InternalApplicationStart, + AppNavLinkStatus, + AppMountParameters, +} from '../application'; +import { HttpSetup, HttpStart } from '../http'; +import { CoreContext } from '../core_system'; +import { renderApp, setupUrlOverflowDetection } from './errors'; +import { NotificationsStart } from '../notifications'; +import { IUiSettingsClient } from '../ui_settings'; + +interface SetupDeps { + application: InternalApplicationSetup; + http: HttpSetup; +} + +interface StartDeps { + application: InternalApplicationStart; + http: HttpStart; + notifications: NotificationsStart; + uiSettings: IUiSettingsClient; +} + +export class CoreApp { + private stopHistoryListening?: UnregisterCallback; + + constructor(private readonly coreContext: CoreContext) {} + + public setup({ http, application }: SetupDeps) { + application.register(this.coreContext.coreId, { + id: 'error', + title: 'App Error', + navLinkStatus: AppNavLinkStatus.hidden, + mount(params: AppMountParameters) { + // Do not use an async import here in order to ensure that network failures + // cannot prevent the error UI from displaying. This UI is tiny so an async + // import here is probably not useful anyways. + return renderApp(params, { basePath: http.basePath }); + }, + }); + } + + public start({ application, http, notifications, uiSettings }: StartDeps) { + if (!application.history) { + return; + } + + this.stopHistoryListening = setupUrlOverflowDetection({ + basePath: http.basePath, + history: application.history, + toasts: notifications.toasts, + uiSettings, + }); + } + + public stop() { + if (this.stopHistoryListening) { + this.stopHistoryListening(); + this.stopHistoryListening = undefined; + } + } +} diff --git a/src/core/public/core_app/errors/error_application.test.ts b/src/core/public/core_app/errors/error_application.test.ts new file mode 100644 index 0000000000000..ec3992330008f --- /dev/null +++ b/src/core/public/core_app/errors/error_application.test.ts @@ -0,0 +1,61 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import { act } from 'react-dom/test-utils'; +import { History, createMemoryHistory } from 'history'; +import { IBasePath } from '../../http'; +import { BasePath } from '../../http/base_path'; + +import { renderApp } from './error_application'; + +describe('renderApp', () => { + let basePath: IBasePath; + let element: HTMLDivElement; + let history: History; + let unmount: any; + + beforeEach(() => { + basePath = new BasePath(); + element = document.createElement('div'); + history = createMemoryHistory(); + unmount = renderApp({ element, history } as any, { basePath }); + }); + + afterEach(() => unmount()); + + it('renders generic errors', () => { + act(() => { + history.push('/app/error'); + }); + // innerText not working in jsdom, so use innerHTML + expect(element.querySelector('.euiTitle')!.innerHTML).toMatchInlineSnapshot( + `"Application error"` + ); + }); + + it('renders urlOverflow errors', () => { + act(() => { + history.push('/app/error?errorType=urlOverflow'); + }); + expect(element.querySelector('.euiTitle')!.innerHTML).toMatchInlineSnapshot( + `"The URL for this object is too long, and we can't display it"` + ); + expect(element.innerHTML).toMatch('Things to try'); + }); +}); diff --git a/src/core/public/core_app/errors/error_application.tsx b/src/core/public/core_app/errors/error_application.tsx new file mode 100644 index 0000000000000..7124776d7086a --- /dev/null +++ b/src/core/public/core_app/errors/error_application.tsx @@ -0,0 +1,102 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import React, { ReactChild, useState, useLayoutEffect } from 'react'; +import ReactDOM from 'react-dom'; +import { History } from 'history'; +import { i18n } from '@kbn/i18n'; +import { I18nProvider } from '@kbn/i18n/react'; + +import { EuiEmptyPrompt, EuiPage, EuiPageBody, EuiPageContent } from '@elastic/eui'; +import { UrlOverflowUi } from './url_overflow_ui'; +import { IBasePath } from '../../http'; +import { AppMountParameters } from '../../application'; + +interface Props { + title?: string; + children?: ReactChild; +} + +const ErrorPage: React.FC = ({ title, children }) => { + title = + title ?? + i18n.translate('core.application.appRenderError.defaultTitle', { + defaultMessage: 'Application error', + }); + + return ( + + + + {title}
} + body={children} + /> + + + + ); +}; + +const ErrorApp: React.FC<{ basePath: IBasePath; history: History }> = ({ basePath, history }) => { + const [currentLocation, setCurrentLocation] = useState(history.location); + useLayoutEffect(() => { + return history.listen((location) => setCurrentLocation(location)); + }, [history]); + + const searchParams = new URLSearchParams(currentLocation.search); + const errorType = searchParams.get('errorType'); + + if (errorType === 'urlOverflow') { + return ( + + + + ); + } + + return ; +}; + +interface Deps { + basePath: IBasePath; +} + +/** + * Renders UI for displaying error messages. + * @internal + */ +export const renderApp = ({ element, history }: AppMountParameters, { basePath }: Deps) => { + ReactDOM.render( + + + , + element + ); + + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +}; diff --git a/src/core/public/core_app/errors/index.ts b/src/core/public/core_app/errors/index.ts new file mode 100644 index 0000000000000..a8da0d98b3962 --- /dev/null +++ b/src/core/public/core_app/errors/index.ts @@ -0,0 +1,21 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +export { renderApp } from './error_application'; +export { setupUrlOverflowDetection, URL_MAX_LENGTH } from './url_overflow'; diff --git a/src/core/public/core_app/errors/url_overflow.test.ts b/src/core/public/core_app/errors/url_overflow.test.ts new file mode 100644 index 0000000000000..115bf53aa2a84 --- /dev/null +++ b/src/core/public/core_app/errors/url_overflow.test.ts @@ -0,0 +1,127 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import { createMemoryHistory, History } from 'history'; + +import { BasePath } from '../../http/base_path'; +import { notificationServiceMock } from '../../notifications/notifications_service.mock'; +import { uiSettingsServiceMock } from '../../ui_settings/ui_settings_service.mock'; +import { IBasePath } from '../../http'; +import { IToasts } from '../../notifications'; +import { IUiSettingsClient } from '../../ui_settings'; + +import { setupUrlOverflowDetection, URL_MAX_LENGTH, URL_WARNING_LENGTH } from './url_overflow'; + +const longUrl = '/' + 'a'.repeat(URL_MAX_LENGTH); + +describe('url overflow detection', () => { + let basePath: IBasePath; + let history: History; + let toasts: jest.Mocked; + let uiSettings: jest.Mocked; + let assignSpy: jest.SpyInstance; + let unlisten: any; + + beforeEach(() => { + basePath = new BasePath('/test-123'); + history = createMemoryHistory(); + toasts = notificationServiceMock.createStartContract().toasts; + uiSettings = uiSettingsServiceMock.createStartContract(); + + // No-op mock impl to avoid jsdom warning about navigation not being implemented + assignSpy = jest.spyOn(window.location, 'assign').mockImplementation(() => {}); + + unlisten = setupUrlOverflowDetection({ + basePath, + history, + toasts, + uiSettings, + }); + }); + + afterEach(() => { + unlisten(); + assignSpy.mockRestore(); + }); + + it('redirects to error page when URL is too long', () => { + history.push(longUrl); + expect(assignSpy).toHaveBeenCalledWith('/app/error?errorType=urlOverflow'); + }); + + it('displays a toast if URL exceeds warning threshold', () => { + const warningUrl = '/' + 'a'.repeat(URL_WARNING_LENGTH); + history.push(warningUrl); + expect(history.location.pathname).toEqual(warningUrl); + expect(assignSpy).not.toHaveBeenCalled(); + expect(toasts.addWarning).toHaveBeenCalledWith( + expect.objectContaining({ + title: 'The URL is big and Kibana might stop working', + text: expect.any(Function), + }) + ); + + // Verify toast can be rendered correctly + const { text: mountToast } = toasts.addWarning.mock.calls[0][0] as any; + const element = document.createElement('div'); + const unmount = mountToast(element); + expect(element).toMatchInlineSnapshot(` +
+ Either enable the + + state:storeInSessionStorage + + option in + + advanced settings + + or simplify the onscreen visuals. +
+ `); + unmount(); + }); + + it('does not redirect or show warning if URL is not too long', () => { + history.push('/regular-length-url'); + expect(history.location.pathname).toEqual('/regular-length-url'); + expect(assignSpy).not.toHaveBeenCalled(); + expect(toasts.addWarning).not.toHaveBeenCalled(); + }); + + it('does not redirect or show warning if state:storeInSessionStorage is set', () => { + uiSettings.get.mockReturnValue(true); + history.push(longUrl); + expect(history.location.pathname).toEqual(longUrl); + expect(assignSpy).not.toHaveBeenCalled(); + expect(toasts.addWarning).not.toHaveBeenCalled(); + }); + + it('does not redirect or show warning if already on the error page', () => { + history.push('/app/error'); + const longQueryParam = 'a'.repeat(URL_MAX_LENGTH); + const longErrorUrl = `/app/error?q=${longQueryParam}`; + history.push(longErrorUrl); + expect(history.location.pathname).toEqual('/app/error'); + expect(history.location.search).toEqual(`?q=${longQueryParam}`); + expect(assignSpy).not.toHaveBeenCalled(); + expect(toasts.addWarning).not.toHaveBeenCalled(); + }); +}); diff --git a/src/core/public/core_app/errors/url_overflow.tsx b/src/core/public/core_app/errors/url_overflow.tsx new file mode 100644 index 0000000000000..da287a74d09ae --- /dev/null +++ b/src/core/public/core_app/errors/url_overflow.tsx @@ -0,0 +1,96 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import React from 'react'; +import { History, Location } from 'history'; + +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { mountReactNode } from '../../utils'; +import { IToasts } from '../../notifications'; +import { IBasePath } from '../../http'; +import { IUiSettingsClient } from '../../ui_settings'; + +const IE_REGEX = /(; ?MSIE |Edge\/\d|Trident\/[\d+\.]+;.*rv:*11\.\d+)/; +export const IS_IE = IE_REGEX.test(window.navigator.userAgent); +/** + * The max URL length allowed by the current browser. Should be used to display warnings to users when query parameters + * cause URL to exceed this limit. + * @public + */ +export const URL_MAX_LENGTH = IS_IE ? 2000 : 25000; +export const URL_WARNING_LENGTH = IS_IE ? 1000 : 24000; +const ERROR_ROUTE = '/app/error'; + +interface Deps { + basePath: IBasePath; + history: History; + toasts: IToasts; + uiSettings: IUiSettingsClient; +} + +export const setupUrlOverflowDetection = ({ basePath, history, toasts, uiSettings }: Deps) => + history.listen((location: Location) => { + // Bail if storeInSessionStorage is set or we're already on the error page + if ( + uiSettings.get('state:storeInSessionStorage') || + history.location.pathname.startsWith(ERROR_ROUTE) + ) { + return; + } + + const absUrl = history.createHref(location); + const absUrlLength = absUrl.length; + + if (absUrlLength > URL_MAX_LENGTH) { + const href = history.createHref({ + pathname: ERROR_ROUTE, + search: `errorType=urlOverflow`, + }); + // Force the browser to reload so that any potentially unstable state is unloaded + window.location.assign(href); + // window.location.href = href; + // window.location.reload(); + } else if (absUrlLength >= URL_WARNING_LENGTH) { + toasts.addWarning({ + title: i18n.translate('core.ui.errorUrlOverflow.bigUrlWarningNotificationTitle', { + defaultMessage: 'The URL is big and Kibana might stop working', + }), + text: mountReactNode( + state:storeInSessionStorage, + advancedSettingsLink: ( + + + + ), + }} + /> + ), + }); + } + }); diff --git a/src/core/public/core_app/errors/url_overflow_ui.tsx b/src/core/public/core_app/errors/url_overflow_ui.tsx new file mode 100644 index 0000000000000..30ee0f4ac41e5 --- /dev/null +++ b/src/core/public/core_app/errors/url_overflow_ui.tsx @@ -0,0 +1,73 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import React from 'react'; + +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiText } from '@elastic/eui'; + +import { IBasePath } from '../../http'; +import { IS_IE } from './url_overflow'; + +export const UrlOverflowUi: React.FC<{ basePath: IBasePath }> = ({ basePath }) => { + return ( + +

+ +

+ +
    +
  • + state:storeInSessionStorage, + kibanaSettingsLink: ( + + + + ), + }} + /> +
  • +
  • + +
  • + {IS_IE && ( +
  • + +
  • + )} +
+
+ ); +}; diff --git a/src/legacy/ui/public/error_url_overflow/index.js b/src/core/public/core_app/index.ts similarity index 87% rename from src/legacy/ui/public/error_url_overflow/index.js rename to src/core/public/core_app/index.ts index 06a98789349f8..9876be1575ffd 100644 --- a/src/legacy/ui/public/error_url_overflow/index.js +++ b/src/core/public/core_app/index.ts @@ -17,5 +17,5 @@ * under the License. */ -import './error_url_overflow'; -export { UrlOverflowService } from '../../../../plugins/kibana_legacy/public'; +export { CoreApp } from './core_app'; +export { URL_MAX_LENGTH } from './errors'; diff --git a/src/core/public/core_system.test.mocks.ts b/src/core/public/core_system.test.mocks.ts index 75ab6cdb628f7..b5b99418b44b4 100644 --- a/src/core/public/core_system.test.mocks.ts +++ b/src/core/public/core_system.test.mocks.ts @@ -32,6 +32,7 @@ import { docLinksServiceMock } from './doc_links/doc_links_service.mock'; import { renderingServiceMock } from './rendering/rendering_service.mock'; import { contextServiceMock } from './context/context_service.mock'; import { integrationsServiceMock } from './integrations/integrations_service.mock'; +import { coreAppMock } from './core_app/core_app.mock'; export const MockLegacyPlatformService = legacyPlatformServiceMock.create(); export const LegacyPlatformServiceConstructor = jest @@ -136,3 +137,9 @@ export const IntegrationsServiceConstructor = jest jest.doMock('./integrations', () => ({ IntegrationsService: IntegrationsServiceConstructor, })); + +export const MockCoreApp = coreAppMock.create(); +export const CoreAppConstructor = jest.fn().mockImplementation(() => MockCoreApp); +jest.doMock('./core_app', () => ({ + CoreApp: CoreAppConstructor, +})); diff --git a/src/core/public/core_system.test.ts b/src/core/public/core_system.test.ts index 2979dd7661e59..4c1993c90a2e1 100644 --- a/src/core/public/core_system.test.ts +++ b/src/core/public/core_system.test.ts @@ -44,6 +44,8 @@ import { MockContextService, IntegrationsServiceConstructor, MockIntegrationsService, + CoreAppConstructor, + MockCoreApp, } from './core_system.test.mocks'; import { CoreSystem } from './core_system'; @@ -88,6 +90,7 @@ describe('constructor', () => { expect(OverlayServiceConstructor).toHaveBeenCalledTimes(1); expect(RenderingServiceConstructor).toHaveBeenCalledTimes(1); expect(IntegrationsServiceConstructor).toHaveBeenCalledTimes(1); + expect(CoreAppConstructor).toHaveBeenCalledTimes(1); }); it('passes injectedMetadata param to InjectedMetadataService', () => { @@ -231,6 +234,11 @@ describe('#setup()', () => { await setupCore(); expect(MockIntegrationsService.setup).toHaveBeenCalledTimes(1); }); + + it('calls coreApp#setup()', async () => { + await setupCore(); + expect(MockCoreApp.setup).toHaveBeenCalledTimes(1); + }); }); describe('#start()', () => { @@ -315,10 +323,15 @@ describe('#start()', () => { }); }); - it('calls start#setup()', async () => { + it('calls integrations#start()', async () => { await startCore(); expect(MockIntegrationsService.start).toHaveBeenCalledTimes(1); }); + + it('calls coreApp#start()', async () => { + await startCore(); + expect(MockCoreApp.start).toHaveBeenCalledTimes(1); + }); }); describe('#stop()', () => { @@ -377,6 +390,14 @@ describe('#stop()', () => { expect(MockIntegrationsService.stop).toHaveBeenCalled(); }); + it('calls coreApp.stop()', () => { + const coreSystem = createCoreSystem(); + + expect(MockCoreApp.stop).not.toHaveBeenCalled(); + coreSystem.stop(); + expect(MockCoreApp.stop).toHaveBeenCalled(); + }); + it('clears the rootDomElement', async () => { const rootDomElement = document.createElement('div'); const coreSystem = createCoreSystem({ diff --git a/src/core/public/core_system.ts b/src/core/public/core_system.ts index 46e1ecb83e9e4..aa52212344f4d 100644 --- a/src/core/public/core_system.ts +++ b/src/core/public/core_system.ts @@ -43,6 +43,7 @@ import { SavedObjectsService } from './saved_objects'; import { ContextService } from './context'; import { IntegrationsService } from './integrations'; import { InternalApplicationSetup, InternalApplicationStart } from './application/types'; +import { CoreApp } from './core_app'; interface Params { rootDomElement: HTMLElement; @@ -99,6 +100,7 @@ export class CoreSystem { private readonly rendering: RenderingService; private readonly context: ContextService; private readonly integrations: IntegrationsService; + private readonly coreApp: CoreApp; private readonly rootDomElement: HTMLElement; private readonly coreContext: CoreContext; @@ -142,6 +144,7 @@ export class CoreSystem { this.context = new ContextService(this.coreContext); this.plugins = new PluginsService(this.coreContext, injectedMetadata.uiPlugins); + this.coreApp = new CoreApp(this.coreContext); this.legacy = new LegacyPlatformService({ requireLegacyFiles, @@ -177,6 +180,7 @@ export class CoreSystem { ]), }); const application = this.application.setup({ context, http, injectedMetadata }); + this.coreApp.setup({ application, http }); const core: InternalCoreSetup = { application, @@ -245,6 +249,8 @@ export class CoreSystem { uiSettings, }); + this.coreApp.start({ application, http, notifications, uiSettings }); + application.registerMountContext(this.coreContext.coreId, 'core', () => ({ application: pick(application, ['capabilities', 'navigateToApp']), chrome, @@ -308,6 +314,7 @@ export class CoreSystem { public stop() { this.legacy.stop(); this.plugins.stop(); + this.coreApp.stop(); this.notifications.stop(); this.http.stop(); this.integrations.stop(); diff --git a/src/core/public/index.ts b/src/core/public/index.ts index bd275ca1d4565..40f614ebc3bea 100644 --- a/src/core/public/index.ts +++ b/src/core/public/index.ts @@ -191,6 +191,8 @@ export { export { MountPoint, UnmountCallback, PublicUiSettingsParams } from './types'; +export { URL_MAX_LENGTH } from './core_app'; + /** * Core services exposed to the `Plugin` setup lifecycle * diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index 74c41d010ca8d..b44eb48b9ffa9 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -1424,6 +1424,9 @@ export type UiSettingsType = 'undefined' | 'json' | 'markdown' | 'number' | 'sel // @public export type UnmountCallback = () => void; +// @public +export const URL_MAX_LENGTH: number; + // @public export interface URLMeaningfulParts { // (undocumented) diff --git a/src/legacy/ui/public/_index.scss b/src/legacy/ui/public/_index.scss index d258ef190a100..323de2ea7d263 100644 --- a/src/legacy/ui/public/_index.scss +++ b/src/legacy/ui/public/_index.scss @@ -10,4 +10,3 @@ @import './accessibility/index'; @import './directives/index'; -@import './error_url_overflow/index'; diff --git a/src/legacy/ui/public/error_url_overflow/__tests__/ie_regex.js b/src/legacy/ui/public/error_url_overflow/__tests__/ie_regex.js deleted file mode 100644 index 3d770c13a81aa..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/__tests__/ie_regex.js +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ - -import expect from '@kbn/expect'; -import { IE_REGEX } from '../../../../../plugins/kibana_legacy/public'; - -describe('IE_REGEX', () => { - it('should detect IE 9', () => { - const userAgent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'; - expect(IE_REGEX.test(userAgent)).to.be(true); - }); - - it('should detect IE 10', () => { - const userAgent = - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)'; - expect(IE_REGEX.test(userAgent)).to.be(true); - }); - - it('should detect IE 11', () => { - const userAgent = - 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; ' + - '.NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; rv:11.0) like Gecko'; - expect(IE_REGEX.test(userAgent)).to.be(true); - }); - - it('should detect Edge', () => { - const userAgent = - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + - '(KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/13.10586'; - expect(IE_REGEX.test(userAgent)).to.be(true); - }); - - it('should not detect Chrome on MacOS', () => { - const userAgent = - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 ' + - '(KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); - - it('should not detect Chrome on Windows', () => { - const userAgent = - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + - '(KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); - - it('should not detect Safari on MacOS', () => { - const userAgent = - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 ' + - '(KHTML, like Gecko) Version/10.1.1 Safari/603.2.4'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); - - it('should not detect Firefox on MacOS', () => { - const userAgent = - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:46.0) Gecko/20100101 Firefox/46.0'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); - - it('should not detect Firefox on Windows', () => { - const userAgent = - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); -}); diff --git a/src/legacy/ui/public/error_url_overflow/_error_url_overflow.scss b/src/legacy/ui/public/error_url_overflow/_error_url_overflow.scss deleted file mode 100644 index df96d72521a5a..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/_error_url_overflow.scss +++ /dev/null @@ -1,3 +0,0 @@ -.kbnError--url-overflow-app { - padding: $euiSizeL; -} diff --git a/src/legacy/ui/public/error_url_overflow/_index.scss b/src/legacy/ui/public/error_url_overflow/_index.scss deleted file mode 100644 index 15e2f77798268..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './error_url_overflow'; diff --git a/src/legacy/ui/public/error_url_overflow/error_url_overflow.html b/src/legacy/ui/public/error_url_overflow/error_url_overflow.html deleted file mode 100644 index 643c39ffed08d..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/error_url_overflow.html +++ /dev/null @@ -1,55 +0,0 @@ -
-

- - - -

- -

- -

-

- -
    -
  1. -
  2. -
  3. -
-
-
-

- -

-
diff --git a/src/legacy/ui/public/error_url_overflow/error_url_overflow.js b/src/legacy/ui/public/error_url_overflow/error_url_overflow.js deleted file mode 100644 index 223b81fa36fde..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/error_url_overflow.js +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ - -import { i18n } from '@kbn/i18n'; -import uiRoutes from '../routes'; -import { KbnUrlProvider } from '../url'; - -import template from './error_url_overflow.html'; -import { UrlOverflowService } from '../../../../plugins/kibana_legacy/public'; - -export { UrlOverflowService }; - -uiRoutes.when('/error/url-overflow', { - template, - k7Breadcrumbs: () => [ - { - text: i18n.translate('common.ui.errorUrlOverflow.breadcrumbs.errorText', { - defaultMessage: 'Error', - }), - }, - ], - controllerAs: 'controller', - controller: class OverflowController { - constructor(Private, $scope) { - const kbnUrl = Private(KbnUrlProvider); - const urlOverflow = new UrlOverflowService(); - - if (!urlOverflow.get()) { - kbnUrl.redirectPath('/'); - return; - } - - this.url = urlOverflow.get(); - this.limit = urlOverflow.failLength(); - this.advancedSettingsLabel = i18n.translate( - 'common.ui.errorUrlOverflow.howTofixError.enableOptionText.advancedSettingsLinkText', - { defaultMessage: 'advanced settings' } - ); - $scope.$on('$destroy', () => urlOverflow.clear()); - } - }, -}); diff --git a/src/plugins/kibana_legacy/public/angular/angular_config.tsx b/src/plugins/kibana_legacy/public/angular/angular_config.tsx index fcfe2bc7f86a2..25cbb0631a652 100644 --- a/src/plugins/kibana_legacy/public/angular/angular_config.tsx +++ b/src/plugins/kibana_legacy/public/angular/angular_config.tsx @@ -18,32 +18,23 @@ */ import { - auto, ICompileProvider, IHttpProvider, IHttpService, ILocationProvider, - ILocationService, IModule, IRootScopeService, } from 'angular'; import $ from 'jquery'; import { cloneDeep, forOwn, get, set } from 'lodash'; -import React, { Fragment } from 'react'; import * as Rx from 'rxjs'; import { ChromeBreadcrumb, EnvironmentMode, PackageInfo } from 'kibana/public'; import { History } from 'history'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; import { CoreStart, LegacyCoreStart } from 'kibana/public'; -import { modifyUrl } from '../../../../core/public'; -import { toMountPoint } from '../../../kibana_react/public'; -import { isSystemApiRequest, UrlOverflowService } from '../utils'; +import { isSystemApiRequest } from '../utils'; import { formatAngularHttpError, isAngularHttpError } from '../notify/lib'; -const URL_LIMIT_WARN_WITHIN = 1000; - export interface RouteConfiguration { controller?: string | ((...args: any[]) => void); redirectTo?: string; @@ -127,7 +118,6 @@ export const configureAppAngularModule = ( .run($setupBreadcrumbsAutoClear(core, isLocalAngular)) .run($setupBadgeAutoClear(core, isLocalAngular)) .run($setupHelpExtensionAutoClear(core, isLocalAngular)) - .run($setupUrlOverflowHandling(core, isLocalAngular)) .run($setupUICapabilityRedirect(core)); }; @@ -390,68 +380,3 @@ const $setupHelpExtensionAutoClear = (newPlatform: CoreStart, isLocalAngular: bo newPlatform.chrome.setHelpExtension(current.helpExtension); }); }; - -const $setupUrlOverflowHandling = (newPlatform: CoreStart, isLocalAngular: boolean) => ( - $location: ILocationService, - $rootScope: IRootScopeService, - $injector: auto.IInjectorService -) => { - const $route = $injector.has('$route') ? $injector.get('$route') : {}; - const urlOverflow = new UrlOverflowService(); - const check = () => { - if (isDummyRoute($route, isLocalAngular)) { - return; - } - // disable long url checks when storing state in session storage - if (newPlatform.uiSettings.get('state:storeInSessionStorage')) { - return; - } - - if ($location.path() === '/error/url-overflow') { - return; - } - - try { - if (urlOverflow.check($location.absUrl()) <= URL_LIMIT_WARN_WITHIN) { - newPlatform.notifications.toasts.addWarning({ - title: i18n.translate('kibana_legacy.bigUrlWarningNotificationTitle', { - defaultMessage: 'The URL is big and Kibana might stop working', - }), - text: toMountPoint( - - state:storeInSessionStorage, - advancedSettingsLink: ( - - - - ), - }} - /> - - ), - }); - } - } catch (e) { - window.location.href = modifyUrl(window.location.href, (parts: any) => { - parts.hash = '#/error/url-overflow'; - }); - // force the browser to reload to that Kibana's potentially unstable state is unloaded - window.location.reload(); - } - }; - - $rootScope.$on('$routeUpdate', check); - $rootScope.$on('$routeChangeStart', check); -}; diff --git a/src/plugins/kibana_legacy/public/utils/index.ts b/src/plugins/kibana_legacy/public/utils/index.ts index 886ae0e877c38..339079d3ac352 100644 --- a/src/plugins/kibana_legacy/public/utils/index.ts +++ b/src/plugins/kibana_legacy/public/utils/index.ts @@ -19,7 +19,6 @@ export * from './migrate_legacy_query'; export * from './system_api'; -export * from './url_overflow_service'; // @ts-ignore export { KbnAccessibleClickProvider } from './kbn_accessible_click'; // @ts-ignore diff --git a/src/plugins/kibana_legacy/public/utils/url_overflow_service.ts b/src/plugins/kibana_legacy/public/utils/url_overflow_service.ts deleted file mode 100644 index e0c0f93bf36cd..0000000000000 --- a/src/plugins/kibana_legacy/public/utils/url_overflow_service.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ - -const URL_MAX_IE = 2000; -const URL_MAX_OTHERS = 25000; -export const IE_REGEX = /(; ?MSIE |Edge\/\d|Trident\/[\d+\.]+;.*rv:*11\.\d+)/; - -export class UrlOverflowService { - private readonly _ieLike: boolean; - private _val?: string | null; - private readonly _sync: () => void; - constructor() { - const key = 'error/url-overflow/url'; - const store = window.sessionStorage || { - getItem() {}, - setItem() {}, - removeItem() {}, - }; - - // FIXME: Couldn't find a way to test for browser compatibility without - // complex redirect and cookie based "feature-detection" page, so going - // with user-agent detection for now. - this._ieLike = IE_REGEX.test(window.navigator.userAgent); - - this._val = store.getItem(key); - this._sync = () => { - if (typeof this._val === 'string') { - store.setItem(key, this._val); - } else { - store.removeItem(key); - } - }; - } - - failLength() { - return this._ieLike ? URL_MAX_IE : URL_MAX_OTHERS; - } - - set(v: string) { - this._val = v; - this._sync(); - } - - get() { - return this._val; - } - - check(absUrl: string) { - if (!this.get()) { - const urlLength = absUrl.length; - const remaining = this.failLength() - urlLength; - - if (remaining > 0) { - return remaining; - } - - this.set(absUrl); - } - - throw new Error(` - The URL has gotten too big and kibana can no longer - continue. Please refresh to return to your previous state. - `); - } - - clear() { - this._val = undefined; - this._sync(); - } -} diff --git a/x-pack/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js b/x-pack/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js index b103fb43af97c..e1779c1afbf47 100644 --- a/x-pack/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js +++ b/x-pack/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js @@ -9,18 +9,16 @@ import { EuiIcon } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; +import { URL_MAX_LENGTH } from '../../../../../../../src/core/public'; import { createSpatialFilterWithGeometry } from '../../../elasticsearch_geo_utils'; import { GEO_JSON_TYPE } from '../../../../common/constants'; import { GeometryFilterForm } from '../../../components/geometry_filter_form'; -import { UrlOverflowService } from '../../../../../../../src/plugins/kibana_legacy/public'; import rison from 'rison-node'; // over estimated and imprecise value to ensure filter has additional room for any meta keys added when filter is mapped. const META_OVERHEAD = 100; -const urlOverflow = new UrlOverflowService(); - export class FeatureGeometryFilterForm extends Component { state = { isLoading: false, @@ -82,7 +80,7 @@ export class FeatureGeometryFilterForm extends Component { // No elasticsearch support for pre-indexed shapes and geo_point spatial queries. if ( window.location.href.length + rison.encode(filter).length + META_OVERHEAD > - urlOverflow.failLength() + URL_MAX_LENGTH ) { this.setState({ errorMsg: i18n.translate('xpack.maps.tooltip.geometryFilterForm.filterTooLargeMessage', { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index aa45fd4bcb292..ba0e0ca532d90 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -138,16 +138,6 @@ "charts.controls.rangeErrorMessage": "値は{min}と{max}の間でなければなりません", "charts.controls.vislibBasicOptions.legendPositionLabel": "凡例位置", "charts.controls.vislibBasicOptions.showTooltipLabel": "ツールヒントを表示", - "common.ui.errorUrlOverflow.breadcrumbs.errorText": "エラー", - "common.ui.errorUrlOverflow.errorDescription": "とても長い URL ですね。残念なお知らせがあります。ご使用のブラウザは Kibana の超巨大 URL に対応していません。問題を避けるため、Kibana はご使用のブラウザでの URL を {urlCharacterLimit} 文字に制限します。", - "common.ui.errorUrlOverflow.errorTitle": "おっと!", - "common.ui.errorUrlOverflow.footnoteText": "脚注:パーティーサイズのキャンディバーはほんのちょこっと。パーティーサイズのロールサンドイッチは巨大。不思議なものですね。", - "common.ui.errorUrlOverflow.howTofixError.doNotUseIEText": "IE は避けましょう。他の対応ブラウザにはこの制限がありません。", - "common.ui.errorUrlOverflow.howTofixError.enableOptionText": "{kibanaSettingsLink} の {storeInSessionStorageConfig} オプションを有効にしてください。これにより URL が長くなるのを避けられますが、若干ポータビリティが損なわれます。", - "common.ui.errorUrlOverflow.howTofixError.enableOptionText.advancedSettingsLinkText": "高度な設定", - "common.ui.errorUrlOverflow.howTofixError.removeStuffFromDashboardText": "ダッシュボードからいくつか項目を取り除きましょう。これにより URL が短くなり、IE の動作が改善されます。", - "common.ui.errorUrlOverflow.howTofixErrorDescription": "これは大抵大規模で複雑なダッシュボードで起こるため、いくつかのオプションがあります。", - "common.ui.errorUrlOverflow.howTofixErrorTitle": "どうすれば良いのでしょう?", "common.ui.flotCharts.aprLabel": "4 月", "common.ui.flotCharts.augLabel": "8 月", "common.ui.flotCharts.decLabel": "12 月", @@ -2177,9 +2167,9 @@ "kbn.advancedSettings.visualization.tileMap.wmsDefaultsTitle": "デフォルトの WMS プロパティ", "visualizations.advancedSettings.visualizeEnableLabsText": "ユーザーが実験的なビジュアライゼーションを作成、表示、編集できるようになります。無効の場合、\n ユーザーは本番準備が整ったビジュアライゼーションのみを利用できます。", "visualizations.advancedSettings.visualizeEnableLabsTitle": "実験的なビジュアライゼーションを有効にする", - "kibana_legacy.bigUrlWarningNotificationMessage": "{advancedSettingsLink}で{storeInSessionStorageParam}オプションを有効にするか、オンスクリーンビジュアルを簡素化してください。", - "kibana_legacy.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高度な設定", - "kibana_legacy.bigUrlWarningNotificationTitle": "URLが大きく、Kibanaの動作が停止する可能性があります", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage": "{advancedSettingsLink}で{storeInSessionStorageParam}オプションを有効にするか、オンスクリーンビジュアルを簡素化してください。", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高度な設定", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationTitle": "URLが大きく、Kibanaの動作が停止する可能性があります", "kibana_legacy.notify.fatalError.errorStatusMessage": "エラー {errStatus} {errStatusText}: {errMessage}", "kibana_legacy.notify.fatalError.unavailableServerErrorMessage": "HTTP リクエストで接続に失敗しました。Kibana サーバーが実行されていて、ご使用のブラウザの接続が正常に動作していることを確認するか、システム管理者にお問い合わせください。", "kibana_legacy.notify.toaster.errorMessage": "エラー: {errorMessage}\n {errorStack}", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 56d373a6fcd2f..6aaf592a87e78 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -138,16 +138,6 @@ "charts.controls.rangeErrorMessage": "值必须是在 {min} 到 {max} 的范围内", "charts.controls.vislibBasicOptions.legendPositionLabel": "图例位置", "charts.controls.vislibBasicOptions.showTooltipLabel": "显示工具提示", - "common.ui.errorUrlOverflow.breadcrumbs.errorText": "错误", - "common.ui.errorUrlOverflow.errorDescription": "您的 URL 真不小。我有一些不幸的消息:您的浏览器与 Kibana 的超长 URL 不太兼容。为了避免您遇到问题,Kibana 在您的浏览器中将 URL 长度限制在 {urlCharacterLimit} 个字符。", - "common.ui.errorUrlOverflow.errorTitle": "喔哦!", - "common.ui.errorUrlOverflow.footnoteText": "脚注:聚会供应的糖果真够小的。聚会供应的小三明治真够大的。确实得让您好好想一想。", - "common.ui.errorUrlOverflow.howTofixError.doNotUseIEText": "切勿使用 IE。我们了解的所有其他受支持浏览器都没有这个限制。", - "common.ui.errorUrlOverflow.howTofixError.enableOptionText": "在 {kibanaSettingsLink} 中启用 {storeInSessionStorageConfig} 选项。这会阻止 URL 变长,但会使它们的可移植性差点。", - "common.ui.errorUrlOverflow.howTofixError.enableOptionText.advancedSettingsLinkText": "高级设置", - "common.ui.errorUrlOverflow.howTofixError.removeStuffFromDashboardText": "从您的仪表板中删除一些内容。这回减小 URL 的长度,使 IE 能够处理它。", - "common.ui.errorUrlOverflow.howTofixErrorDescription": "通常只有较大的、复杂的仪表板会发生此问题,因此您会有一些选项:", - "common.ui.errorUrlOverflow.howTofixErrorTitle": "那么,我如何解决此问题?", "common.ui.flotCharts.aprLabel": "四月", "common.ui.flotCharts.augLabel": "八月", "common.ui.flotCharts.decLabel": "十二月", @@ -2180,9 +2170,9 @@ "kbn.advancedSettings.visualization.tileMap.wmsDefaultsTitle": "默认 WMS 属性", "visualizations.advancedSettings.visualizeEnableLabsText": "允许用户创建、查看和编辑实验性可视化。如果禁用,\n 仅被视为生产就绪的可视化可供用户使用。", "visualizations.advancedSettings.visualizeEnableLabsTitle": "启用实验性可视化", - "kibana_legacy.bigUrlWarningNotificationMessage": "在{advancedSettingsLink}中启用“{storeInSessionStorageParam}”选项或简化屏幕视觉效果。", - "kibana_legacy.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高级设置", - "kibana_legacy.bigUrlWarningNotificationTitle": "URL 过长,Kibana 可能无法工作", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage": "在{advancedSettingsLink}中启用“{storeInSessionStorageParam}”选项或简化屏幕视觉效果。", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高级设置", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationTitle": "URL 过长,Kibana 可能无法工作", "kibana_legacy.notify.fatalError.errorStatusMessage": "错误 {errStatus} {errStatusText}:{errMessage}", "kibana_legacy.notify.fatalError.unavailableServerErrorMessage": "HTTP 请求无法连接。请检查 Kibana 服务器是否正在运行以及您的浏览器是否具有有效的连接,或请联系您的系统管理员。", "kibana_legacy.notify.toaster.errorMessage": "错误:{errorMessage}\n {errorStack}", From de62abbd4e16d42875b27a0653f72a9d065136f4 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Mon, 8 Jun 2020 14:45:55 -0700 Subject: [PATCH 20/91] [DOCS] Fixes typo in Console docs (#68536) --- docs/dev-tools/console/console.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev-tools/console/console.asciidoc b/docs/dev-tools/console/console.asciidoc index caffef7995fbf..9f225986d5df0 100644 --- a/docs/dev-tools/console/console.asciidoc +++ b/docs/dev-tools/console/console.asciidoc @@ -44,7 +44,7 @@ curl -XGET "http://localhost:9200/_search" -d' ---------------------------------- When you paste the command into Console, {kib} automatically converts it -to Console syntax. Alternatively, if you want to want to see Console syntax in cURL, +to Console syntax. Alternatively, if you want to see Console syntax in cURL, click the action icon (image:dev-tools/console/images/wrench.png[]) and select *Copy as cURL*. [float] From 56ed61e303352f28fc4cb9a625b7ab6393cbe162 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Mon, 8 Jun 2020 14:46:26 -0700 Subject: [PATCH 21/91] [DOCS] Edits titles in Setup section for consistency (#68451) * [DOCS] Fixes titles in Setup section for consistency * [DOCS] Fixes to titles and orders of docs in Set up --- docs/settings/alert-action-settings.asciidoc | 2 +- docs/settings/apm-settings.asciidoc | 2 +- docs/settings/dev-settings.asciidoc | 4 +- docs/settings/graph-settings.asciidoc | 2 +- docs/settings/i18n-settings.asciidoc | 7 +- .../infrastructure-ui-settings.asciidoc | 4 +- docs/settings/logs-ui-settings.asciidoc | 2 +- docs/settings/ml-settings.asciidoc | 6 +- docs/settings/monitoring-settings.asciidoc | 2 +- docs/settings/reporting-settings.asciidoc | 2 +- docs/settings/security-settings.asciidoc | 2 +- docs/settings/settings-xkb.asciidoc | 4 +- docs/settings/telemetry-settings.asciidoc | 2 +- docs/setup/access.asciidoc | 4 +- docs/setup/connect-to-elasticsearch.asciidoc | 2 +- docs/setup/docker.asciidoc | 8 +- docs/setup/install.asciidoc | 10 +- docs/setup/install/brew-running.asciidoc | 4 +- docs/setup/install/deb-init.asciidoc | 3 +- docs/setup/install/deb.asciidoc | 26 ++--- docs/setup/install/rpm-init.asciidoc | 2 +- docs/setup/install/rpm.asciidoc | 22 ++--- docs/setup/install/systemd.asciidoc | 2 +- docs/setup/install/targz-running.asciidoc | 2 +- docs/setup/install/targz.asciidoc | 4 +- docs/setup/install/windows-running.asciidoc | 2 +- docs/setup/install/windows.asciidoc | 18 ++-- docs/setup/production.asciidoc | 10 +- docs/setup/secure-settings.asciidoc | 8 +- docs/setup/settings.asciidoc | 2 +- docs/setup/start-stop.asciidoc | 14 +-- docs/setup/upgrade.asciidoc | 47 +++++---- .../setup/upgrade/upgrade-migrations.asciidoc | 14 ++- docs/setup/upgrade/upgrade-standard.asciidoc | 8 +- .../configuring-monitoring.asciidoc | 10 +- .../monitoring/monitoring-kibana.asciidoc | 56 +++++------ .../monitoring/monitoring-metricbeat.asciidoc | 96 +++++++++---------- docs/user/monitoring/viewing-metrics.asciidoc | 78 +++++++-------- .../securing-communications/index.asciidoc | 8 +- docs/user/security/securing-kibana.asciidoc | 4 +- docs/user/setup.asciidoc | 6 +- 41 files changed, 255 insertions(+), 256 deletions(-) diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index 547b4fdedcec6..e02c7f212277e 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[alert-action-settings-kb]] -=== Alerting and action settings in Kibana +=== Alerting and action settings in {kib} ++++ Alerting and action settings ++++ diff --git a/docs/settings/apm-settings.asciidoc b/docs/settings/apm-settings.asciidoc index b781930485243..f78b0642f7fa3 100644 --- a/docs/settings/apm-settings.asciidoc +++ b/docs/settings/apm-settings.asciidoc @@ -12,7 +12,7 @@ It is enabled by default. [float] [[apm-indices-settings-kb]] -==== APM Indices +==== APM indices // This content is reused in the APM app documentation. // Any changes made in this file will be seen there as well. diff --git a/docs/settings/dev-settings.asciidoc b/docs/settings/dev-settings.asciidoc index c43b96a8668e0..e92e9c2928793 100644 --- a/docs/settings/dev-settings.asciidoc +++ b/docs/settings/dev-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[dev-settings-kb]] -=== Development tools settings in Kibana +=== Development tools settings in {kib} ++++ Development tools settings ++++ @@ -21,7 +21,7 @@ They are enabled by default. [float] [[profiler-settings]] -==== {searchprofiler} Settings +==== {searchprofiler} settings [cols="2*<"] |=== diff --git a/docs/settings/graph-settings.asciidoc b/docs/settings/graph-settings.asciidoc index 8ccff21a26f74..a66785242c19a 100644 --- a/docs/settings/graph-settings.asciidoc +++ b/docs/settings/graph-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[graph-settings-kb]] -=== Graph settings in Kibana +=== Graph settings in {kib} ++++ Graph settings ++++ diff --git a/docs/settings/i18n-settings.asciidoc b/docs/settings/i18n-settings.asciidoc index 6d92e74f17cb2..8f498c507a8c2 100644 --- a/docs/settings/i18n-settings.asciidoc +++ b/docs/settings/i18n-settings.asciidoc @@ -1,12 +1,15 @@ [role="xpack"] [[i18n-settings-kb]] -=== i18n settings in Kibana +=== i18n settings in {kib} +++++ +i18n settings +++++ You do not need to configure any settings to run Kibana in English. [float] [[general-i18n-settings-kb]] -==== General i18n Settings +==== General i18n settings `i18n.locale`:: {kib} supports the following locales: diff --git a/docs/settings/infrastructure-ui-settings.asciidoc b/docs/settings/infrastructure-ui-settings.asciidoc index ed69c27feab72..c29ed567531d5 100644 --- a/docs/settings/infrastructure-ui-settings.asciidoc +++ b/docs/settings/infrastructure-ui-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[infrastructure-ui-settings-kb]] -=== Metrics settings in Kibana +=== Metrics settings in {kib} ++++ Metrics settings ++++ @@ -11,4 +11,4 @@ You do not need to configure any settings to use the Metrics app in {kib}. It is [[general-infra-ui-settings-kb]] ==== General Metrics settings -include::general-infra-logs-ui-settings.asciidoc[] \ No newline at end of file +include::general-infra-logs-ui-settings.asciidoc[] diff --git a/docs/settings/logs-ui-settings.asciidoc b/docs/settings/logs-ui-settings.asciidoc index 5b6dd902091ae..e7321b7f0768c 100644 --- a/docs/settings/logs-ui-settings.asciidoc +++ b/docs/settings/logs-ui-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[logs-ui-settings-kb]] -=== Logs app settings in Kibana +=== Logs settings in {kib} ++++ Logs settings ++++ diff --git a/docs/settings/ml-settings.asciidoc b/docs/settings/ml-settings.asciidoc index 83443636fa633..92d0c0b491ce7 100644 --- a/docs/settings/ml-settings.asciidoc +++ b/docs/settings/ml-settings.asciidoc @@ -1,12 +1,12 @@ [role="xpack"] [[ml-settings-kb]] -=== Machine learning settings in Kibana +=== Machine learning settings in {kib} ++++ Machine learning settings ++++ You do not need to configure any settings to use {kib} {ml-features}. They are -enabled by default. +enabled by default. [[general-ml-settings-kb]] ==== General {ml} settings @@ -26,4 +26,4 @@ enabled by default. [[advanced-ml-settings-kb]] ==== Advanced {ml} settings -Refer to <>. \ No newline at end of file +Refer to <>. diff --git a/docs/settings/monitoring-settings.asciidoc b/docs/settings/monitoring-settings.asciidoc index f180f2c3ecc97..48b5b5eb5d0c0 100644 --- a/docs/settings/monitoring-settings.asciidoc +++ b/docs/settings/monitoring-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[monitoring-settings-kb]] -=== Monitoring settings in Kibana +=== Monitoring settings in {kib} ++++ Monitoring settings ++++ diff --git a/docs/settings/reporting-settings.asciidoc b/docs/settings/reporting-settings.asciidoc index da109331ae0fb..928878fdcdb03 100644 --- a/docs/settings/reporting-settings.asciidoc +++ b/docs/settings/reporting-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[reporting-settings-kb]] -=== Reporting settings in Kibana +=== Reporting settings in {kib} ++++ Reporting settings ++++ diff --git a/docs/settings/security-settings.asciidoc b/docs/settings/security-settings.asciidoc index 8f6905d643139..4eaa4dfa55c4d 100644 --- a/docs/settings/security-settings.asciidoc +++ b/docs/settings/security-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[security-settings-kb]] -=== Security settings in Kibana +=== Security settings in {kib} ++++ Security settings ++++ diff --git a/docs/settings/settings-xkb.asciidoc b/docs/settings/settings-xkb.asciidoc index f9727db838d55..4d594b4113e69 100644 --- a/docs/settings/settings-xkb.asciidoc +++ b/docs/settings/settings-xkb.asciidoc @@ -1,9 +1,9 @@ [role="xpack"] [[settings-xpack-kb]] -== {xpack} Settings in {kib} +== {xpack} settings in {kib} [subs="attributes"] ++++ -{xpack} Settings +{xpack} settings ++++ include::{asciidoc-dir}/../../shared/settings.asciidoc[] diff --git a/docs/settings/telemetry-settings.asciidoc b/docs/settings/telemetry-settings.asciidoc index 33f167b13b310..a5f5d1c44ffac 100644 --- a/docs/settings/telemetry-settings.asciidoc +++ b/docs/settings/telemetry-settings.asciidoc @@ -1,5 +1,5 @@ [[telemetry-settings-kbn]] -=== Telemetry settings in Kibana +=== Telemetry settings in {kib} ++++ Telemetry settings ++++ diff --git a/docs/setup/access.asciidoc b/docs/setup/access.asciidoc index a7374a37ddaec..49aa411e91512 100644 --- a/docs/setup/access.asciidoc +++ b/docs/setup/access.asciidoc @@ -1,5 +1,5 @@ [[access]] -== Accessing Kibana +== Access {kib} Kibana is a web application that you access through port 5601. All you need to do is point your web browser at the machine where Kibana is running and specify the port number. For example, `localhost:5601` or `http://YOURDOMAIN.com:5601`. @@ -13,7 +13,7 @@ If you still don't see any results, it's possible that you don't *have* any docu [float] [[status]] -=== Checking Kibana Status +=== Check {kib} status You can reach the Kibana server's status page by navigating to the status endpoint, for example, `localhost:5601/status`. The status page displays information about the server's resource usage and lists the installed plugins. diff --git a/docs/setup/connect-to-elasticsearch.asciidoc b/docs/setup/connect-to-elasticsearch.asciidoc index 6137e028db3fd..6d6996c2094c6 100644 --- a/docs/setup/connect-to-elasticsearch.asciidoc +++ b/docs/setup/connect-to-elasticsearch.asciidoc @@ -1,5 +1,5 @@ [[connect-to-elasticsearch]] -== Adding data +== Add data to {kib} To start working with your data in {kib}, you can: diff --git a/docs/setup/docker.asciidoc b/docs/setup/docker.asciidoc index e8029ed1bbe9b..fb4cbbada9a33 100644 --- a/docs/setup/docker.asciidoc +++ b/docs/setup/docker.asciidoc @@ -1,5 +1,5 @@ [[docker]] -== Running Kibana on Docker +=== Install Kibana with Docker Docker images for Kibana are available from the Elastic Docker registry. The base image is https://hub.docker.com/_/centos/[centos:7]. @@ -16,7 +16,7 @@ Elastic license levels. [float] [[pull-image]] -=== Pulling the image +=== Pull the image Obtaining Kibana for Docker is as simple as issuing a +docker pull+ command against the Elastic Docker registry. @@ -40,7 +40,7 @@ available under the Apache 2.0 license. To download the images, go to https://www.docker.elastic.co[www.docker.elastic.co]. [float] -=== Running Kibana on Docker for development +=== Run Kibana on Docker for development Kibana can be quickly started and connected to a local Elasticsearch container for development or testing use with the following command: -------------------------------------------- @@ -50,7 +50,7 @@ endif::[] [float] [[configuring-kibana-docker]] -=== Configuring Kibana on Docker +=== Configure Kibana on Docker The Docker images provide several methods for configuring Kibana. The conventional approach is to provide a `kibana.yml` file as described in diff --git a/docs/setup/install.asciidoc b/docs/setup/install.asciidoc index f557dd2280e4c..73036da8f1390 100644 --- a/docs/setup/install.asciidoc +++ b/docs/setup/install.asciidoc @@ -1,13 +1,13 @@ [[install]] -== Installing Kibana +== Install {kib} [float] -=== Hosted Kibana +=== Hosted {kib} If you are running our hosted Elasticsearch Service on Elastic Cloud, you access Kibana with a single click. (You can {ess-trial}[sign up for a free trial] and start exploring data in minutes.) [float] -=== Installing Kibana Yourself +=== Install {kib} yourself NOTE: Starting with version 6.0.0, Kibana only supports 64 bit operating systems. @@ -59,10 +59,12 @@ additional setup instructions. include::install/targz.asciidoc[] +include::install/windows.asciidoc[] + include::install/deb.asciidoc[] include::install/rpm.asciidoc[] -include::install/windows.asciidoc[] +include::{kib-repo-dir}/setup/docker.asciidoc[] include::install/brew.asciidoc[] diff --git a/docs/setup/install/brew-running.asciidoc b/docs/setup/install/brew-running.asciidoc index ba78dd1659d04..d73102b098ec1 100644 --- a/docs/setup/install/brew-running.asciidoc +++ b/docs/setup/install/brew-running.asciidoc @@ -1,6 +1,6 @@ -==== Running Kibana with `brew services` +==== Run {kib} with `brew services` -With Homebrew, Kibana can be started and stopped as follows: +With Homebrew, Kibana can be started and stopped as follows: [source,sh] -------------------------------------------------- diff --git a/docs/setup/install/deb-init.asciidoc b/docs/setup/install/deb-init.asciidoc index 1b92eeadd2efb..6e21b8f97cf7e 100644 --- a/docs/setup/install/deb-init.asciidoc +++ b/docs/setup/install/deb-init.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana with SysV `init` +==== Run {kib} with SysV `init` Use the `update-rc.d` command to configure Kibana to start automatically when the system boots up: @@ -18,4 +18,3 @@ sudo -i service kibana stop If Kibana fails to start for any reason, it will print the reason for failure to `STDOUT`. Log files can be found in `/var/log/kibana/`. - diff --git a/docs/setup/install/deb.asciidoc b/docs/setup/install/deb.asciidoc index 62ab661d9a66c..8193a088c8b7e 100644 --- a/docs/setup/install/deb.asciidoc +++ b/docs/setup/install/deb.asciidoc @@ -1,15 +1,15 @@ [[deb]] -=== Install Kibana with Debian Package +=== Install {kib} with Debian package The Debian package for Kibana can be <> or from our <>. It can be used to install Kibana on any Debian-based system such as Debian and Ubuntu. -This package is free to use under the Elastic license. It contains open source -and free commercial features and access to paid commercial features. -{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the -paid commercial features. See the -https://www.elastic.co/subscriptions[Subscriptions] page for information about +This package is free to use under the Elastic license. It contains open source +and free commercial features and access to paid commercial features. +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the +paid commercial features. See the +https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. The latest stable version of Kibana can be found on the @@ -17,7 +17,7 @@ link:/downloads/kibana[Download Kibana] page. Other versions can be found on the link:/downloads/past-releases[Past Releases page]. [[deb-key]] -==== Import the Elastic PGP Key +==== Import the Elastic PGP key include::key.asciidoc[] @@ -27,7 +27,7 @@ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add ------------------------- [[deb-repo]] -==== Installing from the APT repository +==== Install from the APT repository ifeval::["{release-state}"=="unreleased"] @@ -151,9 +151,9 @@ sudo dpkg -i kibana-{version}-amd64.deb <1> Compare the SHA produced by `shasum` with the https://artifacts.elastic.co/downloads/kibana/kibana-{version}-amd64.deb.sha512[published SHA]. -Alternatively, you can download the following package, which contains only -features that are available under the Apache 2.0 license: -https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-amd64.deb +Alternatively, you can download the following package, which contains only +features that are available under the Apache 2.0 license: +https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-amd64.deb endif::[] @@ -169,7 +169,7 @@ include::deb-init.asciidoc[] include::systemd.asciidoc[] [[deb-configuring]] -==== Configuring Kibana via config file +==== Configure {kib} via the config file Kibana loads its configuration from the `/etc/kibana/kibana.yml` file by default. The format of this config file is explained in @@ -205,7 +205,7 @@ locations for a Debian-based system: | The location of the data files written to disk by Kibana and its plugins | /var/lib/kibana | path.data - + | logs | Logs files location | /var/log/kibana diff --git a/docs/setup/install/rpm-init.asciidoc b/docs/setup/install/rpm-init.asciidoc index 6b3d6d49a4ead..08282635a014f 100644 --- a/docs/setup/install/rpm-init.asciidoc +++ b/docs/setup/install/rpm-init.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana with SysV `init` +==== Run {kib} with SysV `init` Use the `chkconfig` command to configure Kibana to start automatically when the system boots up: diff --git a/docs/setup/install/rpm.asciidoc b/docs/setup/install/rpm.asciidoc index 77a16e67cf2a4..c3922ffba1efa 100644 --- a/docs/setup/install/rpm.asciidoc +++ b/docs/setup/install/rpm.asciidoc @@ -1,5 +1,5 @@ [[rpm]] -=== Install Kibana with RPM +=== Install {kib} with RPM The RPM for Kibana can be <> or from our <>. It can be used to install @@ -9,11 +9,11 @@ and Oracle Enterprise. NOTE: RPM install is not supported on distributions with old versions of RPM, such as SLES 11 and CentOS 5. Please see <> instead. -This package is free to use under the Elastic license. It contains open source -and free commercial features and access to paid commercial features. -{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the -paid commercial features. See the -https://www.elastic.co/subscriptions[Subscriptions] page for information about +This package is free to use under the Elastic license. It contains open source +and free commercial features and access to paid commercial features. +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the +paid commercial features. See the +https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. The latest stable version of Kibana can be found on the @@ -21,7 +21,7 @@ link:/downloads/kibana[Download Kibana] page. Other versions can be found on the link:/downloads/past-releases[Past Releases page]. [[rpm-key]] -==== Import the Elastic PGP Key +==== Import the Elastic PGP key include::key.asciidoc[] @@ -143,9 +143,9 @@ sudo rpm --install kibana-{version}-x86_64.rpm <1> Compare the SHA produced by `shasum` with the https://artifacts.elastic.co/downloads/kibana/kibana-{version}-x86_64.rpm.sha512[published SHA]. -Alternatively, you can download the following package, which contains only +Alternatively, you can download the following package, which contains only features that are available under the Apache 2.0 license: -https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-x86_64.rpm +https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-x86_64.rpm endif::[] @@ -160,7 +160,7 @@ include::rpm-init.asciidoc[] include::systemd.asciidoc[] [[rpm-configuring]] -==== Configuring Kibana via config file +==== Configure {kib} via the config file Kibana loads its configuration from the `/etc/kibana/kibana.yml` file by default. The format of this config file is explained in @@ -196,7 +196,7 @@ locations for an RPM-based system: | The location of the data files written to disk by Kibana and its plugins | /var/lib/kibana | path.data - + | logs | Logs files location | /var/log/kibana diff --git a/docs/setup/install/systemd.asciidoc b/docs/setup/install/systemd.asciidoc index 3053972f9e384..6fcb82217affc 100644 --- a/docs/setup/install/systemd.asciidoc +++ b/docs/setup/install/systemd.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana with `systemd` +==== Run {kib} with `systemd` To configure Kibana to start automatically when the system boots up, run the following commands: diff --git a/docs/setup/install/targz-running.asciidoc b/docs/setup/install/targz-running.asciidoc index dd4fd722e127e..d3813d9811b13 100644 --- a/docs/setup/install/targz-running.asciidoc +++ b/docs/setup/install/targz-running.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana from the command line +==== Run {kib} from the command line Kibana can be started from the command line as follows: diff --git a/docs/setup/install/targz.asciidoc b/docs/setup/install/targz.asciidoc index 31970888a976b..a53360900657e 100644 --- a/docs/setup/install/targz.asciidoc +++ b/docs/setup/install/targz.asciidoc @@ -1,5 +1,5 @@ [[targz]] -=== Install {kib} from archive on Linux or MacOS +=== Install {kib} from archive on Linux or macOS Kibana is provided for Linux and Darwin as a `.tar.gz` package. These packages are the easiest formats to use when trying out Kibana. @@ -101,7 +101,7 @@ include::targz-running.asciidoc[] [[targz-configuring]] -==== Configuring Kibana via config file +==== Configure {kib} via the config file Kibana loads its configuration from the `$KIBANA_HOME/config/kibana.yml` file by default. The format of this config file is explained in diff --git a/docs/setup/install/windows-running.asciidoc b/docs/setup/install/windows-running.asciidoc index 57d756a07c13d..832284edc8f39 100644 --- a/docs/setup/install/windows-running.asciidoc +++ b/docs/setup/install/windows-running.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana from the command line +==== Run {kib} from the command line Kibana can be started from the command line as follows: diff --git a/docs/setup/install/windows.asciidoc b/docs/setup/install/windows.asciidoc index db55451f01aae..1cfbaaa0eda2f 100644 --- a/docs/setup/install/windows.asciidoc +++ b/docs/setup/install/windows.asciidoc @@ -1,13 +1,13 @@ [[windows]] -=== Install Kibana on Windows +=== Install {kib} on Windows Kibana can be installed on Windows using the `.zip` package. -This package is free to use under the Elastic license. It contains open source -and free commercial features and access to paid commercial features. -{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the -paid commercial features. See the -https://www.elastic.co/subscriptions[Subscriptions] page for information about +This package is free to use under the Elastic license. It contains open source +and free commercial features and access to paid commercial features. +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the +paid commercial features. See the +https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. The latest stable version of Kibana can be found on the @@ -39,9 +39,9 @@ terminal window, `CD` to the `$KIBANA_HOME` directory, for instance: CD c:\kibana-{version}-windows-x86_64 ---------------------------- -Alternatively, you can download the following package, which contains only +Alternatively, you can download the following package, which contains only features that are available under the Apache 2.0 license: -https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-windows-x86_64.zip +https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-windows-x86_64.zip endif::[] @@ -49,7 +49,7 @@ endif::[] include::windows-running.asciidoc[] [[windows-configuring]] -==== Configuring Kibana via config file +==== Configure {kib} via the config file Kibana loads its configuration from the `$KIBANA_HOME/config/kibana.yml` file by default. The format of this config file is explained in diff --git a/docs/setup/production.asciidoc b/docs/setup/production.asciidoc index 19f9d64d13623..72f275e237490 100644 --- a/docs/setup/production.asciidoc +++ b/docs/setup/production.asciidoc @@ -1,5 +1,5 @@ [[production]] -== Using Kibana in a production environment +== Use {kib} in a production environment * <> * <> @@ -23,7 +23,7 @@ and an Elasticsearch client node on the same machine. For more information, see [float] [[configuring-kibana-shield]] -=== Using {stack} {security-features} +=== Use {stack} {security-features} You can use {stack} {security-features} to control what {es} data users can access through Kibana. @@ -59,13 +59,13 @@ csp.strict: true [float] [[enabling-ssl]] -=== Enabling SSL +=== Enable SSL See <>. [float] [[load-balancing-es]] -=== Load Balancing Across Multiple Elasticsearch Nodes +=== Load Balancing across multiple {es} nodes If you have multiple nodes in your Elasticsearch cluster, the easiest way to distribute Kibana requests across the nodes is to run an Elasticsearch _Coordinating only_ node on the same machine as Kibana. Elasticsearch Coordinating only nodes are essentially smart load balancers that are part of the cluster. They @@ -145,7 +145,7 @@ bin/kibana -c config/instance2.yml [float] [[high-availability]] -=== High availability across multiple Elasticsearch nodes +=== High availability across multiple {es} nodes Kibana can be configured to connect to multiple Elasticsearch nodes in the same cluster. In situations where a node becomes unavailable, Kibana will transparently connect to an available node and continue operating. Requests to available hosts will be routed in a round robin fashion. diff --git a/docs/setup/secure-settings.asciidoc b/docs/setup/secure-settings.asciidoc index a7ccd3f77405e..10380eb5d8fa4 100644 --- a/docs/setup/secure-settings.asciidoc +++ b/docs/setup/secure-settings.asciidoc @@ -9,7 +9,7 @@ NOTE: All commands here should be run as the user which will run Kibana. [float] [[creating-keystore]] -=== Creating the keystore +=== Create the keystore To create the `kibana.keystore`, use the `create` command: @@ -23,7 +23,7 @@ The file `kibana.keystore` will be created in the directory defined by the [float] [[list-settings]] -=== Listing settings in the keystore +=== List settings in the keystore A list of the settings in the keystore is available with the `list` command: @@ -34,7 +34,7 @@ bin/kibana-keystore list [float] [[add-string-to-keystore]] -=== Adding string settings +=== Add string settings Sensitive string settings, like authentication credentials for Elasticsearch can be added using the `add` command: @@ -65,7 +65,7 @@ cat /file/containing/setting/value | bin/kibana-keystore add the.setting.name.to [float] [[remove-settings]] -=== Removing settings +=== Remove settings To remove a setting from the keystore, use the `remove` command: diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index 1be9d5b1ef35b..c4f5439e25489 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -1,5 +1,5 @@ [[settings]] -== Configuring {kib} +== Configure {kib} The {kib} server reads properties from the `kibana.yml` file on startup. The location of this file differs depending on how you installed {kib}. For example, diff --git a/docs/setup/start-stop.asciidoc b/docs/setup/start-stop.asciidoc index 2fcc440680f12..198bc76bbb400 100644 --- a/docs/setup/start-stop.asciidoc +++ b/docs/setup/start-stop.asciidoc @@ -1,15 +1,15 @@ [[start-stop]] -== Starting and stopping Kibana +== Start and stop {kib} -The method for starting and stopping {kib} varies depending on how you installed -it. +The method for starting and stopping {kib} varies depending on how you installed +it. [float] [[start-start-targz]] === Archive packages (`.tar.gz`) -If you installed {kib} on Linux or Darwin with a `.tar.gz` package, you can -start and stop {kib} from the command line. +If you installed {kib} on Linux or Darwin with a `.tar.gz` package, you can +start and stop {kib} from the command line. [float] include::install/targz-running.asciidoc[] @@ -18,8 +18,8 @@ include::install/targz-running.asciidoc[] [[start-stop-zip]] === Archive packages (`.zip`) -If you installed {kib} on Windows with a `.zip` package, you can -stop and start {kib} from the command line. +If you installed {kib} on Windows with a `.zip` package, you can +stop and start {kib} from the command line. [float] include::install/windows-running.asciidoc[] diff --git a/docs/setup/upgrade.asciidoc b/docs/setup/upgrade.asciidoc index 982f1167f3871..6d69b6921b612 100644 --- a/docs/setup/upgrade.asciidoc +++ b/docs/setup/upgrade.asciidoc @@ -1,15 +1,15 @@ [[upgrade]] -== Upgrading {kib} +== Upgrade {kib} Depending on the {kib} version you're upgrading from, the upgrade process to 7.0 -varies. +varies. -NOTE: {kib} upgrades automatically when starting a new version, as described in +NOTE: {kib} upgrades automatically when starting a new version, as described in <>. Although you do not need to manually back up {kib} before upgrading, we recommend -that you have a backup on hand. You can use +that you have a backup on hand. You can use <> to back up {kib} -data by targeting `.kibana*` indices. If you are using the Reporting plugin, +data by targeting `.kibana*` indices. If you are using the Reporting plugin, you can also target `.reporting*` indices. [float] @@ -23,44 +23,44 @@ Before you upgrade {kib}: * Back up your data with {es} {ref}/modules-snapshots.html[snapshots]. To roll back to an earlier version, you **must** have a backup of your data. * If you are using custom plugins, check that a compatible version is - available. -* Shut down all {kib} nodes. Running more than one {kib} version against the - same Elasticseach index is unsupported. If you upgrade while older {kib} nodes are + available. +* Shut down all {kib} nodes. Running more than one {kib} version against the + same Elasticseach index is unsupported. If you upgrade while older {kib} nodes are running, the upgrade can fail. -To identify the changes you need to make to upgrade, and to enable you to -perform an Elasticsearch rolling upgrade with no downtime, you must upgrade to +To identify the changes you need to make to upgrade, and to enable you to +perform an Elasticsearch rolling upgrade with no downtime, you must upgrade to 6.7 before you upgrade to 7.0. -For a comprehensive overview of the upgrade process, refer to +For a comprehensive overview of the upgrade process, refer to *{stack-ref}/upgrading-elastic-stack.html[Upgrading the Elastic Stack]*. [float] [[upgrade-5x-earlier]] -=== Upgrading from 5.x or earlier -{es} can read indices created in the previous major version. Before you upgrade -to 7.0.0, you must reindex or delete any indices created in 5.x or earlier. -For more information, refer to +=== Upgrade from 5.x or earlier +{es} can read indices created in the previous major version. Before you upgrade +to 7.0.0, you must reindex or delete any indices created in 5.x or earlier. +For more information, refer to {stack-ref}/upgrading-elastic-stack.html#oss-stack-upgrade[Upgrading the Elastic Stack]. -When your reindex is complete, follow the <> -instructions. +When your reindex is complete, follow the <> +instructions. [float] [[upgrade-6x]] -=== Upgrading from 6.x +=== Upgrade from 6.x -The recommended path is to upgrade to 6.8 before upgrading to 7.0. This makes it -easier to identify the required changes, and enables you to use the Upgrade +The recommended path is to upgrade to 6.8 before upgrading to 7.0. This makes it +easier to identify the required changes, and enables you to use the Upgrade Assistant to prepare for your upgrade to 7.0. -TIP: The ability to import {kib} 6.x saved searches, visualizations, and +TIP: The ability to import {kib} 6.x saved searches, visualizations, and dashboards is supported. [float] [[upgrade-67]] -=== Upgrading from 6.8 -To help you prepare for your upgrade to 7.0, 6.8 includes an https://www.elastic.co/guide/en/kibana/6.8/upgrade-assistant.html[Upgrade Assistant] +=== Upgrade from 6.8 +To help you prepare for your upgrade to 7.0, 6.8 includes an https://www.elastic.co/guide/en/kibana/6.8/upgrade-assistant.html[Upgrade Assistant] To access the assistant, go to *Management > 7.0 Upgrade Assistant*. After you have addressed any issues that were identified by the Upgrade @@ -70,4 +70,3 @@ Assistant, <>. include::upgrade/upgrade-standard.asciidoc[] include::upgrade/upgrade-migrations.asciidoc[] - diff --git a/docs/setup/upgrade/upgrade-migrations.asciidoc b/docs/setup/upgrade/upgrade-migrations.asciidoc index 81ff8344c4c5f..cbe56b9e65894 100644 --- a/docs/setup/upgrade/upgrade-migrations.asciidoc +++ b/docs/setup/upgrade/upgrade-migrations.asciidoc @@ -1,10 +1,10 @@ [[upgrade-migrations]] -=== Troubleshooting saved object migrations +=== Migrate saved objects Every time {kib} is upgraded it checks to see if all saved objects, such as dashboards, visualizations, and index patterns, are compatible with the new version. If any objects need to be updated, then the automatic saved object migration process is kicked off. -NOTE: 6.7 includes an https://www.elastic.co/guide/en/kibana/6.7/upgrade-assistant.html[Upgrade Assistant] -to help you prepare for your upgrade to 7.0. To access the assistant, go to *Management > 7.0 Upgrade Assistant*. +NOTE: 6.7 includes an https://www.elastic.co/guide/en/kibana/6.7/upgrade-assistant.html[Upgrade Assistant] +to help you prepare for your upgrade to 7.0. To access the assistant, go to *Management > 7.0 Upgrade Assistant*. [float] [[upgrade-migrations-process]] @@ -46,11 +46,9 @@ The first instance that triggers saved object migrations will run the entire pro [[upgrade-migrations-rolling-back]] ==== Rolling back to a previous version of {kib} -When rolling {kib} back to a previous version, point the `.kibana` alias to -the appropriate {kib} index. When you have the previous version running again, -delete the more recent `.kibana_N` index or indices so that future upgrades are +When rolling {kib} back to a previous version, point the `.kibana` alias to +the appropriate {kib} index. When you have the previous version running again, +delete the more recent `.kibana_N` index or indices so that future upgrades are based on the current {kib} index. You must restart {kib} to re-trigger the migration. WARNING: Rolling back to a previous {kib} version can result in saved object data loss if you had successfully upgraded and made changes to saved objects before rolling back. - - diff --git a/docs/setup/upgrade/upgrade-standard.asciidoc b/docs/setup/upgrade/upgrade-standard.asciidoc index 683383525a3bb..df38427881d65 100644 --- a/docs/setup/upgrade/upgrade-standard.asciidoc +++ b/docs/setup/upgrade/upgrade-standard.asciidoc @@ -1,8 +1,8 @@ [[upgrade-standard]] === Standard upgrade -NOTE: 6.7 includes an https://www.elastic.co/guide/en/kibana/6.7/upgrade-assistant.html[Upgrade Assistant] -to help you prepare for your upgrade to 7.0. To access the assistant, go to *Management > 7.0 Upgrade Assistant*. +NOTE: 6.7 includes an https://www.elastic.co/guide/en/kibana/6.7/upgrade-assistant.html[Upgrade Assistant] +to help you prepare for your upgrade to 7.0. To access the assistant, go to *Management > 7.0 Upgrade Assistant*. [IMPORTANT] =========================================== @@ -13,7 +13,7 @@ necessary remediation steps as per those instructions. =========================================== [float] -==== Upgrading using a `deb` or `rpm` package +==== Upgrade using a `deb` or `rpm` package . Stop the existing {kib} process using the appropriate command for your system. @@ -37,7 +37,7 @@ otherwise {kib} will fail to start. . Start the new {kib} process using the appropriate command for your system. [float] -==== Upgrading using a `zip` or `tar.gz` archive +==== Upgrade using a `zip` or `tar.gz` archive . Extract the `zip` or `tar.gz` archive to a new directory to be sure that you don't overwrite the `config` or `data` directories. + diff --git a/docs/user/monitoring/configuring-monitoring.asciidoc b/docs/user/monitoring/configuring-monitoring.asciidoc index 776a76b24c4ec..7bcddcac923b2 100644 --- a/docs/user/monitoring/configuring-monitoring.asciidoc +++ b/docs/user/monitoring/configuring-monitoring.asciidoc @@ -1,20 +1,20 @@ [role="xpack"] [[configuring-monitoring]] -== Configuring monitoring in {kib} +== Configure monitoring in {kib} ++++ -Configuring monitoring +Configure monitoring ++++ -If you enable the {monitor-features} in your cluster, there are two methods to +If you enable the {monitor-features} in your cluster, there are two methods to collect metrics about {kib}: * <> * <> -You can also use {kib} to +You can also use {kib} to <>. -To learn about monitoring in general, see +To learn about monitoring in general, see {ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. include::monitoring-metricbeat.asciidoc[] diff --git a/docs/user/monitoring/monitoring-kibana.asciidoc b/docs/user/monitoring/monitoring-kibana.asciidoc index bb619ac79e143..ba55e2d16c150 100644 --- a/docs/user/monitoring/monitoring-kibana.asciidoc +++ b/docs/user/monitoring/monitoring-kibana.asciidoc @@ -1,45 +1,45 @@ [role="xpack"] [[monitoring-kibana]] -=== Collecting monitoring data using legacy collectors +=== Collect monitoring data using legacy collectors ++++ Legacy collection methods ++++ -If you enable the Elastic {monitor-features} in your cluster, you can -optionally collect metrics about {kib}. +If you enable the Elastic {monitor-features} in your cluster, you can +optionally collect metrics about {kib}. -The following method involves sending the metrics to the production cluster, -which ultimately routes them to the monitoring cluster. For the recommended -method, see <>. +The following method involves sending the metrics to the production cluster, +which ultimately routes them to the monitoring cluster. For the recommended +method, see <>. -To learn about monitoring in general, see -{ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. +To learn about monitoring in general, see +{ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. . Set the `xpack.monitoring.collection.enabled` setting to `true` on each -node in the production cluster. By default, it is is disabled (`false`). -+ +node in the production cluster. By default, it is is disabled (`false`). ++ -- -NOTE: You can specify this setting in either the `elasticsearch.yml` on each -node or across the cluster as a dynamic cluster setting. If {es} -{security-features} are enabled, you must have `monitor` cluster privileges to +NOTE: You can specify this setting in either the `elasticsearch.yml` on each +node or across the cluster as a dynamic cluster setting. If {es} +{security-features} are enabled, you must have `monitor` cluster privileges to view the cluster settings and `manage` cluster privileges to change them. -- ** To update the cluster settings in {kib}: -... Open {kib} in your web browser. +... Open {kib} in your web browser. + -- -By default, if you are running {kib} locally, go to `http://localhost:5601/`. +By default, if you are running {kib} locally, go to `http://localhost:5601/`. -If {es} {security-features} are enabled, log in. +If {es} {security-features} are enabled, log in. -- ... In the side navigation, click *Stack Monitoring*. If data collection is -disabled, you are prompted to turn it on. +disabled, you are prompted to turn it on. -** From the Console or command line, set `xpack.monitoring.collection.enabled` +** From the Console or command line, set `xpack.monitoring.collection.enabled` to `true` on the production cluster. + + -- @@ -57,13 +57,13 @@ PUT _cluster/settings } ---------------------------------- -For more information, see {ref}/monitoring-settings.html[Monitoring settings in {es}] +For more information, see {ref}/monitoring-settings.html[Monitoring settings in {es}] and {ref}/cluster-update-settings.html[Cluster update settings]. -- . Verify that `monitoring.enabled` and -`monitoring.kibana.collection.enabled` are set to `true` in the -`kibana.yml` file. These are the default values. For +`monitoring.kibana.collection.enabled` are set to `true` in the +`kibana.yml` file. These are the default values. For more information, see <>. . Identify where to send monitoring data. {kib} automatically @@ -72,13 +72,13 @@ in the `kibana.yml` file. This property has a default value of `http://localhost:9200`. + + -- -[TIP] +[TIP] =============================== -In production environments, we strongly recommend using a separate cluster -(referred to as the _monitoring cluster_) to store the data. Using a separate -monitoring cluster prevents production cluster outages from impacting your -ability to access your monitoring data. It also prevents monitoring activities -from impacting the performance of your production cluster. +In production environments, we strongly recommend using a separate cluster +(referred to as the _monitoring cluster_) to store the data. Using a separate +monitoring cluster prevents production cluster outages from impacting your +ability to access your monitoring data. It also prevents monitoring activities +from impacting the performance of your production cluster. If {security} is enabled on the production cluster, use an HTTPS URL such as `https://:9200` in this setting. @@ -97,4 +97,4 @@ used when {kib} sends monitoring data to the production cluster. . <>. -. <>. +. <>. diff --git a/docs/user/monitoring/monitoring-metricbeat.asciidoc b/docs/user/monitoring/monitoring-metricbeat.asciidoc index 61aeaf21d3a4b..f2b32ba1de5dd 100644 --- a/docs/user/monitoring/monitoring-metricbeat.asciidoc +++ b/docs/user/monitoring/monitoring-metricbeat.asciidoc @@ -1,19 +1,19 @@ [role="xpack"] [[monitoring-metricbeat]] -=== Collecting {kib} monitoring data with {metricbeat} +=== Collect {kib} monitoring data with {metricbeat} [subs="attributes"] ++++ -Collecting monitoring data with {metricbeat} +Collect monitoring data with {metricbeat} ++++ -In 6.4 and later, you can use {metricbeat} to collect data about {kib} -and ship it to the monitoring cluster, rather than routing it through the -production cluster as described in <>. +In 6.4 and later, you can use {metricbeat} to collect data about {kib} +and ship it to the monitoring cluster, rather than routing it through the +production cluster as described in <>. image::user/monitoring/images/metricbeat.png[Example monitoring architecture] -To learn about monitoring in general, see -{ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. +To learn about monitoring in general, see +{ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. //NOTE: The tagged regions are re-used in the Stack Overview. @@ -21,46 +21,46 @@ To learn about monitoring in general, see + -- // tag::disable-kibana-collection[] -Add the following setting in the {kib} configuration file (`kibana.yml`): +Add the following setting in the {kib} configuration file (`kibana.yml`): [source,yaml] ---------------------------------- monitoring.kibana.collection.enabled: false ---------------------------------- -Leave the `monitoring.enabled` set to its default value (`true`). +Leave the `monitoring.enabled` set to its default value (`true`). // end::disable-kibana-collection[] -For more information, see +For more information, see <>. -- . <>. -. Set the `xpack.monitoring.collection.enabled` setting to `true` on +. Set the `xpack.monitoring.collection.enabled` setting to `true` on each node in the production cluster. By default, it is disabled (`false`). + -- -NOTE: You can specify this setting in either the `elasticsearch.yml` on each -node or across the cluster as a dynamic cluster setting. If {es} -{security-features} are enabled, you must have `monitor` cluster privileges to +NOTE: You can specify this setting in either the `elasticsearch.yml` on each +node or across the cluster as a dynamic cluster setting. If {es} +{security-features} are enabled, you must have `monitor` cluster privileges to view the cluster settings and `manage` cluster privileges to change them. -- ** In {kib}: -... Open {kib} in your web browser. +... Open {kib} in your web browser. + -- -If you are running {kib} locally, go to `http://localhost:5601/`. +If you are running {kib} locally, go to `http://localhost:5601/`. -If the Elastic {security-features} are enabled, log in. +If the Elastic {security-features} are enabled, log in. -- ... In the side navigation, click *Stack Monitoring*. If data collection is -disabled, you are prompted to turn it on. +disabled, you are prompted to turn it on. -** From the Console or command line, set `xpack.monitoring.collection.enabled` +** From the Console or command line, set `xpack.monitoring.collection.enabled` to `true` on the production cluster. + + -- @@ -78,7 +78,7 @@ PUT _cluster/settings } ---------------------------------- -For more information, see {ref}/monitoring-settings.html[Monitoring settings in {es}] +For more information, see {ref}/monitoring-settings.html[Monitoring settings in {es}] and {ref}/cluster-update-settings.html[Cluster update settings]. -- @@ -89,7 +89,7 @@ same server as {kib}. + -- // tag::enable-kibana-module[] -For example, to enable the default configuration in the `modules.d` directory, +For example, to enable the default configuration in the `modules.d` directory, run the following command: ["source","sh",subs="attributes,callouts"] @@ -97,9 +97,9 @@ run the following command: metricbeat modules enable kibana-xpack ---------------------------------------------------------------------- -For more information, see -{metricbeat-ref}/configuration-metricbeat.html[Specify which modules to run] and -{metricbeat-ref}/metricbeat-module-kibana.html[{kib} module]. +For more information, see +{metricbeat-ref}/configuration-metricbeat.html[Specify which modules to run] and +{metricbeat-ref}/metricbeat-module-kibana.html[{kib} module]. // end::enable-kibana-module[] -- @@ -130,15 +130,15 @@ access it via HTTPS. For example, use a `hosts` setting like // end::configure-kibana-module[] // tag::remote-monitoring-user[] -If the Elastic {security-features} are enabled, you must also provide a user -ID and password so that {metricbeat} can collect metrics successfully: +If the Elastic {security-features} are enabled, you must also provide a user +ID and password so that {metricbeat} can collect metrics successfully: -.. Create a user on the production cluster that has the -`remote_monitoring_collector` {ref}/built-in-roles.html[built-in role]. -Alternatively, use the `remote_monitoring_user` +.. Create a user on the production cluster that has the +`remote_monitoring_collector` {ref}/built-in-roles.html[built-in role]. +Alternatively, use the `remote_monitoring_user` {ref}/built-in-users.html[built-in user]. -.. Add the `username` and `password` settings to the {kib} module configuration +.. Add the `username` and `password` settings to the {kib} module configuration file. // end::remote-monitoring-user[] -- @@ -156,19 +156,19 @@ the following command: ---------------------------------------------------------------------- metricbeat modules disable system ---------------------------------------------------------------------- -// end::disable-system-module[] +// end::disable-system-module[] -- . Identify where to send the monitoring data. + + -- -TIP: In production environments, we strongly recommend using a separate cluster -(referred to as the _monitoring cluster_) to store the data. Using a separate -monitoring cluster prevents production cluster outages from impacting your -ability to access your monitoring data. It also prevents monitoring activities +TIP: In production environments, we strongly recommend using a separate cluster +(referred to as the _monitoring cluster_) to store the data. Using a separate +monitoring cluster prevents production cluster outages from impacting your +ability to access your monitoring data. It also prevents monitoring activities from impacting the performance of your production cluster. -For example, specify the {es} output information in the {metricbeat} +For example, specify the {es} output information in the {metricbeat} configuration file (`metricbeat.yml`): [source,yaml] @@ -176,13 +176,13 @@ configuration file (`metricbeat.yml`): output.elasticsearch: # Array of hosts to connect to. hosts: ["http://es-mon-1:9200", "http://es-mon2:9200"] <1> - + # Optional protocol and basic auth credentials. #protocol: "https" #username: "elastic" #password: "changeme" ---------------------------------- -<1> In this example, the data is stored on a monitoring cluster with nodes +<1> In this example, the data is stored on a monitoring cluster with nodes `es-mon-1` and `es-mon-2`. If you configured the monitoring cluster to use encrypted communications, you @@ -192,22 +192,22 @@ must access it via HTTPS. For example, use a `hosts` setting like IMPORTANT: The {es} {monitor-features} use ingest pipelines, therefore the cluster that stores the monitoring data must have at least one ingest node. -If the {es} {security-features} are enabled on the monitoring cluster, you -must provide a valid user ID and password so that {metricbeat} can send metrics -successfully: +If the {es} {security-features} are enabled on the monitoring cluster, you +must provide a valid user ID and password so that {metricbeat} can send metrics +successfully: -.. Create a user on the monitoring cluster that has the -`remote_monitoring_agent` {ref}/built-in-roles.html[built-in role]. -Alternatively, use the `remote_monitoring_user` +.. Create a user on the monitoring cluster that has the +`remote_monitoring_agent` {ref}/built-in-roles.html[built-in role]. +Alternatively, use the `remote_monitoring_user` {ref}/built-in-users.html[built-in user]. -.. Add the `username` and `password` settings to the {es} output information in +.. Add the `username` and `password` settings to the {es} output information in the {metricbeat} configuration file. -For more information about these configuration options, see +For more information about these configuration options, see {metricbeat-ref}/elasticsearch-output.html[Configure the {es} output]. -- -. {metricbeat-ref}/metricbeat-starting.html[Start {metricbeat}]. +. {metricbeat-ref}/metricbeat-starting.html[Start {metricbeat}]. -. <>. +. <>. diff --git a/docs/user/monitoring/viewing-metrics.asciidoc b/docs/user/monitoring/viewing-metrics.asciidoc index 0a5535e6e1a91..48dd2be9ee6a2 100644 --- a/docs/user/monitoring/viewing-metrics.asciidoc +++ b/docs/user/monitoring/viewing-metrics.asciidoc @@ -1,96 +1,96 @@ [role="xpack"] [[monitoring-data]] -=== Viewing monitoring data in {kib} +=== View monitoring data in {kib} ++++ -Viewing monitoring data +View monitoring data ++++ -After you collect monitoring data for one or more products in the {stack}, you -can configure {kib} to retrieve that information and display it in on the +After you collect monitoring data for one or more products in the {stack}, you +can configure {kib} to retrieve that information and display it in on the *Stack Monitoring* page. At a minimum, you must have monitoring data for the {es} production cluster. Once that data exists, {kib} can display monitoring data for other products in the cluster. -. Identify where to retrieve monitoring data from. +. Identify where to retrieve monitoring data from. + -- -The cluster that contains the monitoring data is referred to -as the _monitoring cluster_. +The cluster that contains the monitoring data is referred to +as the _monitoring cluster_. -TIP: If the monitoring data is stored on a *dedicated* monitoring cluster, it is -accessible even when the cluster you're monitoring is not. If you have at least -a gold license, you can send data from multiple clusters to the same monitoring -cluster and view them all through the same instance of {kib}. +TIP: If the monitoring data is stored on a *dedicated* monitoring cluster, it is +accessible even when the cluster you're monitoring is not. If you have at least +a gold license, you can send data from multiple clusters to the same monitoring +cluster and view them all through the same instance of {kib}. -By default, data is retrieved from the cluster specified in the +By default, data is retrieved from the cluster specified in the `elasticsearch.hosts` value in the `kibana.yml` file. If you want to retrieve it from a different cluster, set `monitoring.ui.elasticsearch.hosts`. -To learn more about typical monitoring architectures, -see {ref}/how-monitoring-works.html[How monitoring works] and +To learn more about typical monitoring architectures, +see {ref}/how-monitoring-works.html[How monitoring works] and {ref}/monitoring-production.html[Monitoring in a production environment]. -- . Verify that `monitoring.ui.enabled` is set to `true`, which is the -default value, in the `kibana.yml` file. For more information, see +default value, in the `kibana.yml` file. For more information, see <>. -. If the Elastic {security-features} are enabled on the monitoring cluster, you -must provide a user ID and password so {kib} can retrieve the data. +. If the Elastic {security-features} are enabled on the monitoring cluster, you +must provide a user ID and password so {kib} can retrieve the data. -.. Create a user that has the `monitoring_user` +.. Create a user that has the `monitoring_user` {ref}/built-in-roles.html[built-in role] on the monitoring cluster. -.. Add the `monitoring.ui.elasticsearch.username` and +.. Add the `monitoring.ui.elasticsearch.username` and `monitoring.ui.elasticsearch.password` settings in the `kibana.yml` file. If these settings are omitted, {kib} uses the `elasticsearch.username` and -`elasticsearch.password` setting values. For more +`elasticsearch.password` setting values. For more information, see {kibana-ref}/using-kibana-with-security.html[Configuring security in {kib}]. -. (Optional) Configure {kib} to encrypt communications between the {kib} server -and the monitoring cluster. See <>. +. (Optional) Configure {kib} to encrypt communications between the {kib} server +and the monitoring cluster. See <>. -. If the Elastic {security-features} are enabled on the {kib} server, only users -that have the authority to access {kib} indices and to read the monitoring indices -can use the monitoring dashboards. +. If the Elastic {security-features} are enabled on the {kib} server, only users +that have the authority to access {kib} indices and to read the monitoring indices +can use the monitoring dashboards. + -- -NOTE: These users must exist on the monitoring cluster. If you are accessing a -remote monitoring cluster, you must use credentials that are valid on both the +NOTE: These users must exist on the monitoring cluster. If you are accessing a +remote monitoring cluster, you must use credentials that are valid on both the {kib} server and the monitoring cluster. -- -.. Create users that have the `monitoring_user` and `kibana_admin` +.. Create users that have the `monitoring_user` and `kibana_admin` {ref}/built-in-roles.html[built-in roles]. -. Open {kib} in your web browser. +. Open {kib} in your web browser. + -- -By default, if you are running {kib} locally, go to `http://localhost:5601/`. +By default, if you are running {kib} locally, go to `http://localhost:5601/`. -If the Elastic {security-features} are enabled, log in. +If the Elastic {security-features} are enabled, log in. -- -. In the side navigation, click *Stack Monitoring*. +. In the side navigation, click *Stack Monitoring*. + -- -If data collection is disabled, you are prompted to turn on data collection. -If {es} {security-features} are enabled, you must have `manage` cluster -privileges to turn on data collection. +If data collection is disabled, you are prompted to turn on data collection. +If {es} {security-features} are enabled, you must have `manage` cluster +privileges to turn on data collection. -NOTE: If you are using a separate monitoring cluster, you do not need to turn on -data collection. The dashboards appear when there is data in the monitoring -cluster. +NOTE: If you are using a separate monitoring cluster, you do not need to turn on +data collection. The dashboards appear when there is data in the monitoring +cluster. -- You'll see cluster alerts that require your attention and a summary of the available monitoring metrics for {es}, Logstash, {kib}, and Beats. To view additional information, click the -Overview, Nodes, Indices, or Instances links. See <>. +Overview, Nodes, Indices, or Instances links. See <>. [role="screenshot"] image::images/monitoring-dashboard.png[Monitoring dashboard] diff --git a/docs/user/security/securing-communications/index.asciidoc b/docs/user/security/securing-communications/index.asciidoc index 3bdc59b90b3fd..0509c6b13d54a 100644 --- a/docs/user/security/securing-communications/index.asciidoc +++ b/docs/user/security/securing-communications/index.asciidoc @@ -1,7 +1,7 @@ [[configuring-tls]] -=== Encrypting communications in {kib} +=== Encrypt communications in {kib} ++++ -Encrypting communications +Encrypt communications ++++ Secure Sockets Layer (SSL) and Transport Layer Security (TLS) provide encryption for data-in-transit. While these terms are often used @@ -14,7 +14,7 @@ contains a public key and has an associated -- but separate -- private key; thes supports certificates and private keys in PEM or PKCS#12 format. [[configuring-tls-browser-kib]] -==== Encrypting traffic between the browser and {kib} +==== Encrypt traffic between the browser and {kib} NOTE: You do not need to enable the {es} {security-features} for this type of encryption. @@ -106,7 +106,7 @@ server.ssl.enabled: true After making these changes, you must always access {kib} via HTTPS. For example, https://.com. [[configuring-tls-kib-es]] -==== Encrypting traffic between {kib} and {es} +==== Encrypt traffic between {kib} and {es} NOTE: To perform this step, you must {ref}/configuring-security.html[enable the {es} {security-features}] or you must have a proxy that provides an HTTPS endpoint for {es}. diff --git a/docs/user/security/securing-kibana.asciidoc b/docs/user/security/securing-kibana.asciidoc index f4178bacb111e..33c81961fcd7b 100644 --- a/docs/user/security/securing-kibana.asciidoc +++ b/docs/user/security/securing-kibana.asciidoc @@ -1,8 +1,8 @@ [role="xpack"] [[using-kibana-with-security]] -== Configuring security in {kib} +== Configure security in {kib} ++++ -Configuring security +Configure security ++++ {kib} users have to log in when {security} is enabled on your cluster. You diff --git a/docs/user/setup.asciidoc b/docs/user/setup.asciidoc index 53e2de66c5287..31e7d157d1bc7 100644 --- a/docs/user/setup.asciidoc +++ b/docs/user/setup.asciidoc @@ -1,5 +1,5 @@ [[setup]] -= Set Up Kibana += Set up Kibana [partintro] -- @@ -48,11 +48,9 @@ the patch version. include::{kib-repo-dir}/setup/install.asciidoc[] -include::{kib-repo-dir}/setup/start-stop.asciidoc[] - include::{kib-repo-dir}/setup/settings.asciidoc[] -include::{kib-repo-dir}/setup/docker.asciidoc[] +include::{kib-repo-dir}/setup/start-stop.asciidoc[] include::{kib-repo-dir}/setup/access.asciidoc[] From e591aa99d3b581cfee11d4151816a9c79ec278c1 Mon Sep 17 00:00:00 2001 From: Phillip Burch Date: Mon, 8 Jun 2020 17:16:01 -0500 Subject: [PATCH 22/91] Add timestamp context variable (#67482) Co-authored-by: Elastic Machine --- .../metric_threshold/metric_threshold_executor.ts | 2 ++ .../register_metric_threshold_alert_type.ts | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts index a282a742d614c..00a1d97dec811 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts @@ -5,6 +5,7 @@ */ import { mapValues, first } from 'lodash'; import { i18n } from '@kbn/i18n'; +import moment from 'moment'; import { InfraDatabaseSearchResponse } from '../../adapters/framework/adapter_types'; import { createAfterKeyHandler } from '../../../utils/create_afterkey_handler'; import { getAllCompositeData } from '../../../utils/get_all_composite_data'; @@ -336,6 +337,7 @@ export const createMetricThresholdExecutor = (libs: InfraBackendLibs, alertId: s group, alertState: stateToAlertMessage[nextState], reason, + timestamp: moment().toISOString(), value: mapToConditionsLookup(alertResults, (result) => result[group].currentValue), threshold: mapToConditionsLookup(criteria, (c) => c.threshold), metric: mapToConditionsLookup(criteria, (c) => c.metric), diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts index 2c98a568d16de..02d9ca3e5f0c9 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts @@ -55,6 +55,13 @@ export function registerMetricThresholdAlertType(libs: InfraBackendLibs) { } ); + const timestampActionVariableDescription = i18n.translate( + 'xpack.infra.metrics.alerting.threshold.alerting.timestampDescription', + { + defaultMessage: 'A timestamp of when the alert was detected.', + } + ); + const valueActionVariableDescription = i18n.translate( 'xpack.infra.metrics.alerting.threshold.alerting.valueActionVariableDescription', { @@ -106,6 +113,7 @@ export function registerMetricThresholdAlertType(libs: InfraBackendLibs) { { name: 'group', description: groupActionVariableDescription }, { name: 'alertState', description: alertStateActionVariableDescription }, { name: 'reason', description: reasonActionVariableDescription }, + { name: 'timestamp', description: timestampActionVariableDescription }, { name: 'value', description: valueActionVariableDescription }, { name: 'metric', description: metricActionVariableDescription }, { name: 'threshold', description: thresholdActionVariableDescription }, From b39234ce808696113d374d60bcace6a5ef281e23 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 8 Jun 2020 15:20:36 -0700 Subject: [PATCH 23/91] #68163 Make footer messaging sticky to bottom of page (#68327) Co-authored-by: Elastic Machine --- .../components/alpha_messaging.tsx | 1 + .../ingest_manager/layouts/default.tsx | 146 +++++++++--------- 2 files changed, 76 insertions(+), 71 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/alpha_messaging.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/alpha_messaging.tsx index 2b80ab9f0068e..f43419fc52ef0 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/alpha_messaging.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/alpha_messaging.tsx @@ -15,6 +15,7 @@ const Message = styled(EuiText).attrs((props) => ({ size: 's', }))` padding: ${(props) => props.theme.eui.paddingSizes.m}; + margin-top: auto; `; export const AlphaMessaging: React.FC<{}> = () => { diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx index 72b12260a1a12..978c74f72d7aa 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx @@ -20,6 +20,8 @@ interface Props { const Container = styled.div` min-height: calc(100vh - ${(props) => props.theme.eui.euiHeaderChildSize}); background: ${(props) => props.theme.eui.euiColorEmptyShade}; + display: flex; + flex-direction: column; `; const Nav = styled.nav` @@ -52,85 +54,87 @@ export const DefaultLayout: React.FunctionComponent = ({ /> )} - + {children} + From ab226f02ae12f0f8a2ec1ff5ba604569cd8d4b68 Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 8 Jun 2020 15:53:16 -0700 Subject: [PATCH 24/91] [kbn/pm] log levels (#68203) Co-authored-by: spalger --- .../kbn-dev-utils/src/tooling_log/index.ts | 2 +- .../tooling_log_collecting_writer.ts | 5 +- .../tooling_log/tooling_log_text_writer.ts | 2 +- packages/kbn-pm/dist/index.js | 100216 +++++++-------- packages/kbn-pm/package.json | 4 - packages/kbn-pm/src/cli.ts | 62 +- .../__snapshots__/bootstrap.test.ts.snap | 111 +- .../kbn-pm/src/commands/bootstrap.test.ts | 44 +- packages/kbn-pm/src/commands/bootstrap.ts | 48 +- packages/kbn-pm/src/commands/clean.ts | 11 +- packages/kbn-pm/src/commands/run.ts | 20 +- packages/kbn-pm/src/commands/watch.ts | 23 +- .../production/build_production_projects.ts | 2 +- packages/kbn-pm/src/run.test.ts | 9 +- packages/kbn-pm/src/run.ts | 47 +- .../link_project_executables.test.ts.snap | 11 - packages/kbn-pm/src/utils/child_process.ts | 47 +- .../utils/link_project_executables.test.ts | 20 +- .../src/utils/link_project_executables.ts | 5 +- packages/kbn-pm/src/utils/log.ts | 37 +- packages/kbn-pm/src/utils/project.ts | 27 +- .../kbn-pm/src/utils/project_checksums.ts | 10 +- packages/kbn-pm/src/utils/scripts.ts | 13 +- renovate.json5 | 16 - yarn.lock | 10 - 25 files changed, 50209 insertions(+), 50593 deletions(-) diff --git a/packages/kbn-dev-utils/src/tooling_log/index.ts b/packages/kbn-dev-utils/src/tooling_log/index.ts index f8009a255f010..acf944f23a816 100644 --- a/packages/kbn-dev-utils/src/tooling_log/index.ts +++ b/packages/kbn-dev-utils/src/tooling_log/index.ts @@ -19,5 +19,5 @@ export { ToolingLog } from './tooling_log'; export { ToolingLogTextWriter, ToolingLogTextWriterConfig } from './tooling_log_text_writer'; -export { pickLevelFromFlags, parseLogLevel, LogLevel } from './log_levels'; +export { pickLevelFromFlags, parseLogLevel, LogLevel, ParsedLogLevel } from './log_levels'; export { ToolingLogCollectingWriter } from './tooling_log_collecting_writer'; diff --git a/packages/kbn-dev-utils/src/tooling_log/tooling_log_collecting_writer.ts b/packages/kbn-dev-utils/src/tooling_log/tooling_log_collecting_writer.ts index 7e79077032156..fd59ebe5c46dc 100644 --- a/packages/kbn-dev-utils/src/tooling_log/tooling_log_collecting_writer.ts +++ b/packages/kbn-dev-utils/src/tooling_log/tooling_log_collecting_writer.ts @@ -18,13 +18,14 @@ */ import { ToolingLogTextWriter } from './tooling_log_text_writer'; +import { LogLevel } from './log_levels'; export class ToolingLogCollectingWriter extends ToolingLogTextWriter { messages: string[] = []; - constructor() { + constructor(level: LogLevel = 'verbose') { super({ - level: 'verbose', + level, writeTo: { write: (msg) => { // trim trailing new line diff --git a/packages/kbn-dev-utils/src/tooling_log/tooling_log_text_writer.ts b/packages/kbn-dev-utils/src/tooling_log/tooling_log_text_writer.ts index b8c12433a0ebb..28ccc60428ae3 100644 --- a/packages/kbn-dev-utils/src/tooling_log/tooling_log_text_writer.ts +++ b/packages/kbn-dev-utils/src/tooling_log/tooling_log_text_writer.ts @@ -47,7 +47,7 @@ export interface ToolingLogTextWriterConfig { function shouldWriteType(level: ParsedLogLevel, type: MessageTypes) { if (type === 'write') { - return true; + return level.name !== 'silent'; } return Boolean(level.flags[type === 'success' ? 'info' : type]); diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 7b233ef010653..93152ef1b71dc 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -94,7 +94,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _cli__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "run", function() { return _cli__WEBPACK_IMPORTED_MODULE_0__["run"]; }); -/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(705); +/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(697); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["buildProductionProjects"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); @@ -105,10 +105,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(517); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return _utils_project__WEBPACK_IMPORTED_MODULE_3__["Project"]; }); -/* harmony import */ var _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(578); +/* harmony import */ var _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(573); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "copyWorkspacePackages", function() { return _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__["copyWorkspacePackages"]; }); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(579); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(574); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getProjectPaths", function() { return _config__WEBPACK_IMPORTED_MODULE_5__["getProjectPaths"]; }); /* @@ -143,17 +143,17 @@ __webpack_require__.r(__webpack_exports__); "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "run", function() { return run; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14); -/* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dedent__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var getopts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(15); -/* harmony import */ var getopts__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(getopts__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17); +/* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dedent__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var getopts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3); +/* harmony import */ var getopts__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(getopts__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5); +/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(488); /* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(689); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(34); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(500); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -181,37 +181,43 @@ __webpack_require__.r(__webpack_exports__); function help() { - const availableCommands = Object.keys(_commands__WEBPACK_IMPORTED_MODULE_4__["commands"]).map(commandName => _commands__WEBPACK_IMPORTED_MODULE_4__["commands"][commandName]).map(command => `${command.name} - ${command.description}`); - _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].write(dedent__WEBPACK_IMPORTED_MODULE_1___default.a` - usage: kbn [] + _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].info(dedent__WEBPACK_IMPORTED_MODULE_0___default.a` + usage: kbn [] - By default commands are run for Kibana itself, all packages in the 'packages/' - folder and for all plugins in './plugins' and '../kibana-extra'. + By default commands are run for Kibana itself, all packages in the 'packages/' + folder and for all plugins in './plugins' and '../kibana-extra'. - Available commands: + Available commands: - ${availableCommands.join('\n ')} + ${Object.values(_commands__WEBPACK_IMPORTED_MODULE_4__["commands"]).map(command => `${command.name} - ${command.description}`).join('\n ')} - Global options: + Global options: - -e, --exclude Exclude specified project. Can be specified multiple times to exclude multiple projects, e.g. '-e kibana -e @kbn/pm'. - -i, --include Include only specified projects. If left unspecified, it defaults to including all projects. - --oss Do not include the x-pack when running command. - --skip-kibana-plugins Filter all plugins in ./plugins and ../kibana-extra when running command. - --no-cache Disable the bootstrap cache - `); + -e, --exclude Exclude specified project. Can be specified multiple times to exclude multiple projects, e.g. '-e kibana -e @kbn/pm'. + -i, --include Include only specified projects. If left unspecified, it defaults to including all projects. + --oss Do not include the x-pack when running command. + --skip-kibana-plugins Filter all plugins in ./plugins and ../kibana-extra when running command. + --no-cache Disable the bootstrap cache + --verbose Set log level to verbose + --debug Set log level to debug + --quiet Set log level to error + --silent Disable log output + ` + '\n'); } async function run(argv) { - // We can simplify this setup (and remove this extra handling) once Yarn + _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].setLogLevel(Object(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_3__["pickLevelFromFlags"])(getopts__WEBPACK_IMPORTED_MODULE_1___default()(argv, { + boolean: ['verbose', 'debug', 'quiet', 'silent'] + }))); // We can simplify this setup (and remove this extra handling) once Yarn // starts forwarding the `--` directly to this script, see // https://github.com/yarnpkg/yarn/blob/b2d3e1a8fe45ef376b716d597cc79b38702a9320/src/cli/index.js#L174-L182 + if (argv.includes('--')) { - _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`Using "--" is not allowed, as it doesn't work with 'yarn kbn'.`)); + _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].error(`Using "--" is not allowed, as it doesn't work with 'yarn kbn'.`); process.exit(1); } - const options = getopts__WEBPACK_IMPORTED_MODULE_2___default()(argv, { + const options = getopts__WEBPACK_IMPORTED_MODULE_1___default()(argv, { alias: { e: 'exclude', h: 'help', @@ -231,7 +237,7 @@ async function run(argv) { // built version of this tool. - const rootPath = Object(path__WEBPACK_IMPORTED_MODULE_3__["resolve"])(__dirname, '../../../'); + const rootPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["resolve"])(__dirname, '../../../'); const commandName = args[0]; const extraArgs = args.slice(1); const commandOptions = { @@ -242,7 +248,7 @@ async function run(argv) { const command = _commands__WEBPACK_IMPORTED_MODULE_4__["commands"][commandName]; if (command === undefined) { - _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`[${commandName}] is not a valid command, see 'kbn --help'`)); + _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].error(`[${commandName}] is not a valid command, see 'kbn --help'`); process.exit(1); } @@ -255,9872 +261,11181 @@ async function run(argv) { "use strict"; -const escapeStringRegexp = __webpack_require__(3); -const ansiStyles = __webpack_require__(4); -const stdoutColor = __webpack_require__(10).stdout; - -const template = __webpack_require__(13); - -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); - -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); -const styles = Object.create(null); +function dedent(strings) { -function applyOptions(obj, options) { - options = options || {}; + var raw = void 0; + if (typeof strings === "string") { + // dedent can be used as a plain function + raw = [strings]; + } else { + raw = strings.raw; + } - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} + // first, perform interpolation + var result = ""; + for (var i = 0; i < raw.length; i++) { + result += raw[i]. + // join lines when there is a suppressed newline + replace(/\\\n[ \t]*/g, ""). -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); + // handle escaped backticks + replace(/\\`/g, "`"); - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; + if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) { + result += arguments.length <= i + 1 ? undefined : arguments[i + 1]; + } + } - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + // now strip indentation + var lines = result.split("\n"); + var mindent = null; + lines.forEach(function (l) { + var m = l.match(/^(\s+)\S+/); + if (m) { + var indent = m[1].length; + if (!mindent) { + // this is the first indented line + mindent = indent; + } else { + mindent = Math.min(mindent, indent); + } + } + }); - chalk.template.constructor = Chalk; + if (mindent !== null) { + result = lines.map(function (l) { + return l[0] === " " ? l.slice(mindent) : l; + }).join("\n"); + } - return chalk.template; - } + // dedent eats leading and trailing whitespace too + result = result.trim(); - applyOptions(this, options); + // handle escaped newlines at the end to ensure they don't get stripped too + return result.replace(/\\n/g, "\n"); } -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; +if (true) { + module.exports = dedent; } -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); - } - }; -} -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); - } -}; +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } +"use strict"; - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } +const EMPTYARR = [] +const SHORTSPLIT = /$|[!-@[-`{-~][\s\S]*/g +const isArray = Array.isArray - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; +const parseValue = function(any) { + if (any === "") return "" + if (any === "false") return false + const maybe = Number(any) + return maybe * 0 === 0 ? maybe : any } -const proto = Object.defineProperties(() => {}, styles); - -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; - - builder._styles = _styles; - builder._empty = _empty; - - const self = this; - - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); +const parseAlias = function(aliases) { + let out = {}, + key, + alias, + prev, + len, + any, + i, + k - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); + for (key in aliases) { + any = aliases[key] + alias = out[key] = isArray(any) ? any : [any] - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + for (i = 0, len = alias.length; i < len; i++) { + prev = out[alias[i]] = [key] - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto + for (k = 0; k < len; k++) { + if (i !== k) prev.push(alias[k]) + } + } + } - return builder; + return out } -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); +const parseDefault = function(aliases, defaults) { + let out = {}, + key, + alias, + value, + len, + i - if (argsLen === 0) { - return ''; - } + for (key in defaults) { + value = defaults[key] + alias = aliases[key] - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } + out[key] = value - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + if (alias === undefined) { + aliases[key] = EMPTYARR + } else { + for (i = 0, len = alias.length; i < len; i++) { + out[alias[i]] = value + } + } + } - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + return out +} - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; +const parseOptions = function(aliases, options, value) { + let out = {}, + key, + alias, + len, + end, + i, + k - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); - } + if (options !== undefined) { + for (i = 0, len = options.length; i < len; i++) { + key = options[i] + alias = aliases[key] - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + out[key] = value - return str; + if (alias === undefined) { + aliases[key] = EMPTYARR + } else { + for (k = 0, end = alias.length; k < end; k++) { + out[alias[k]] = value + } + } + } + } + + return out } -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } +const write = function(out, key, value, aliases, unknown) { + let i, + prev, + alias = aliases[key], + len = alias === undefined ? -1 : alias.length - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + if (len >= 0 || unknown === undefined || unknown(key)) { + prev = out[key] - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } + if (prev === undefined) { + out[key] = value + } else { + if (isArray(prev)) { + prev.push(value) + } else { + out[key] = [prev, value] + } + } - return template(chalk, parts.join('')); + for (i = 0; i < len; i++) { + out[alias[i]] = out[key] + } + } } -Object.defineProperties(Chalk.prototype, styles); +const getopts = function(argv, opts) { + let unknown = (opts = opts || {}).unknown, + aliases = parseAlias(opts.alias), + strings = parseOptions(aliases, opts.string, ""), + values = parseDefault(aliases, opts.default), + bools = parseOptions(aliases, opts.boolean, false), + stopEarly = opts.stopEarly, + _ = [], + out = { _ }, + i = 0, + k = 0, + len = argv.length, + key, + arg, + end, + match, + value -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript + for (; i < len; i++) { + arg = argv[i] + if (arg[0] !== "-" || arg === "-") { + if (stopEarly) while (i < len) _.push(argv[i++]) + else _.push(arg) + } else if (arg === "--") { + while (++i < len) _.push(argv[i]) + } else if (arg[1] === "-") { + end = arg.indexOf("=", 2) + if (arg[2] === "n" && arg[3] === "o" && arg[4] === "-") { + key = arg.slice(5, end >= 0 ? end : undefined) + value = false + } else if (end >= 0) { + key = arg.slice(2, end) + value = + bools[key] !== undefined || + (strings[key] === undefined + ? parseValue(arg.slice(end + 1)) + : arg.slice(end + 1)) + } else { + key = arg.slice(2) + value = + bools[key] !== undefined || + (len === i + 1 || argv[i + 1][0] === "-" + ? strings[key] === undefined + ? true + : "" + : strings[key] === undefined + ? parseValue(argv[++i]) + : argv[++i]) + } + write(out, key, value, aliases, unknown) + } else { + SHORTSPLIT.lastIndex = 2 + match = SHORTSPLIT.exec(arg) + end = match.index + value = match[0] -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { + for (k = 1; k < end; k++) { + write( + out, + (key = arg[k]), + k + 1 < end + ? strings[key] === undefined || + arg.substring(k + 1, (k = end)) + value + : value === "" + ? len === i + 1 || argv[i + 1][0] === "-" + ? strings[key] === undefined || "" + : bools[key] !== undefined || + (strings[key] === undefined ? parseValue(argv[++i]) : argv[++i]) + : bools[key] !== undefined || + (strings[key] === undefined ? parseValue(value) : value), + aliases, + unknown + ) + } + } + } -"use strict"; + for (key in values) if (out[key] === undefined) out[key] = values[key] + for (key in bools) if (out[key] === undefined) out[key] = false + for (key in strings) if (out[key] === undefined) out[key] = "" + return out +} -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +module.exports = getopts -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } - return str.replace(matchOperatorsRe, '\\$&'); -}; +/***/ }), +/* 4 */ +/***/ (function(module, exports) { +module.exports = require("path"); /***/ }), -/* 4 */ +/* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(6); - -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; -}; -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +var proc_runner_1 = __webpack_require__(7); +exports.withProcRunner = proc_runner_1.withProcRunner; +exports.ProcRunner = proc_runner_1.ProcRunner; +tslib_1.__exportStar(__webpack_require__(400), exports); +var serializers_1 = __webpack_require__(405); +exports.createAbsolutePathSerializer = serializers_1.createAbsolutePathSerializer; +var certs_1 = __webpack_require__(430); +exports.CA_CERT_PATH = certs_1.CA_CERT_PATH; +exports.ES_KEY_PATH = certs_1.ES_KEY_PATH; +exports.ES_CERT_PATH = certs_1.ES_CERT_PATH; +exports.ES_P12_PATH = certs_1.ES_P12_PATH; +exports.ES_P12_PASSWORD = certs_1.ES_P12_PASSWORD; +exports.ES_EMPTYPASSWORD_P12_PATH = certs_1.ES_EMPTYPASSWORD_P12_PATH; +exports.ES_NOPASSWORD_P12_PATH = certs_1.ES_NOPASSWORD_P12_PATH; +exports.KBN_KEY_PATH = certs_1.KBN_KEY_PATH; +exports.KBN_CERT_PATH = certs_1.KBN_CERT_PATH; +exports.KBN_P12_PATH = certs_1.KBN_P12_PATH; +exports.KBN_P12_PASSWORD = certs_1.KBN_P12_PASSWORD; +var run_1 = __webpack_require__(431); +exports.run = run_1.run; +exports.createFailError = run_1.createFailError; +exports.createFlagError = run_1.createFlagError; +exports.combineErrors = run_1.combineErrors; +exports.isFailError = run_1.isFailError; +var repo_root_1 = __webpack_require__(407); +exports.REPO_ROOT = repo_root_1.REPO_ROOT; +var kbn_client_1 = __webpack_require__(436); +exports.KbnClient = kbn_client_1.KbnClient; +tslib_1.__exportStar(__webpack_require__(479), exports); +tslib_1.__exportStar(__webpack_require__(486), exports); -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; -}; -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], +/***/ }), +/* 6 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; - - // Fix humans - styles.color.grey = styles.color.gray; - - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; - - for (const styleName of Object.keys(group)) { - const style = group[styleName]; - - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; - - group[styleName] = styles[styleName]; - - codes.set(style[0], style[1]); - } - - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); - - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - } - - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; - - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; - - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; - - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; - - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } - - const suite = colorConvert[key]; - - if (key === 'ansi16') { - key = 'ansi'; - } - - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } - - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } - - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } - } - - return styles; -} - -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) - -/***/ }), -/* 5 */ -/***/ (function(module, exports) { - -module.exports = function(module) { - if (!module.webpackPolyfill) { - module.deprecate = function() {}; - module.paths = []; - // module.parent = undefined by default - if (!module.children) module.children = []; - Object.defineProperty(module, "loaded", { - enumerable: true, - get: function() { - return module.l; - } - }); - Object.defineProperty(module, "id", { - enumerable: true, - get: function() { - return module.i; - } - }); - module.webpackPolyfill = 1; - } - return module; -}; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __extends; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __assign; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__rest", function() { return __rest; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __decorate; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__param", function() { return __param; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__metadata", function() { return __metadata; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__awaiter", function() { return __awaiter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__generator", function() { return __generator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__exportStar", function() { return __exportStar; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__values", function() { return __values; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__read", function() { return __read; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spread", function() { return __spread; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__await", function() { return __await; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncGenerator", function() { return __asyncGenerator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncDelegator", function() { return __asyncDelegator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncValues", function() { return __asyncValues; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__makeTemplateObject", function() { return __makeTemplateObject; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importStar", function() { return __importStar; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importDefault", function() { return __importDefault; }); +/*! ***************************************************************************** +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 __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +} + +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); +} + +function __awaiter(thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __exportStar(m, exports) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} + +function __values(o) { + var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; + if (m) return m.call(o); + return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; +} + +function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } +} + +function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result.default = mod; + return result; +} + +function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} /***/ }), -/* 6 */ +/* 7 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(7); -var route = __webpack_require__(9); - -var convert = {}; - -var models = Object.keys(conversions); - -function wrapRaw(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; - } - - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); - } - - return fn(args); - }; - - // preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } - - return wrappedFn; -} - -function wrapRounded(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; - } - - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); - } +"use strict"; - var result = fn(args); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var with_proc_runner_1 = __webpack_require__(8); +exports.withProcRunner = with_proc_runner_1.withProcRunner; +var proc_runner_1 = __webpack_require__(9); +exports.ProcRunner = proc_runner_1.ProcRunner; - // we're assuming the result is an array here. - // see notice in conversions.js; don't use box types - // in conversion functions. - if (typeof result === 'object') { - for (var len = result.length, i = 0; i < len; i++) { - result[i] = Math.round(result[i]); - } - } - return result; - }; +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { - // preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } +"use strict"; - return wrappedFn; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const proc_runner_1 = __webpack_require__(9); +/** + * Create a ProcRunner and pass it to an async function. When + * the async function finishes the ProcRunner is torn-down + * automatically + * + * @param {ToolingLog} log + * @param {async Function} fn + * @return {Promise} + */ +async function withProcRunner(log, fn) { + const procs = new proc_runner_1.ProcRunner(log); + try { + await fn(procs); + } + finally { + await procs.teardown(); + } } - -models.forEach(function (fromModel) { - convert[fromModel] = {}; - - Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); - Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); - - var routes = route(fromModel); - var routeModels = Object.keys(routes); - - routeModels.forEach(function (toModel) { - var fn = routes[toModel]; - - convert[fromModel][toModel] = wrapRounded(fn); - convert[fromModel][toModel].raw = wrapRaw(fn); - }); -}); - -module.exports = convert; +exports.withProcRunner = withProcRunner; /***/ }), -/* 7 */ +/* 9 */ /***/ (function(module, exports, __webpack_require__) { -/* MIT license */ -var cssKeywords = __webpack_require__(8); - -// NOTE: conversions should only return primitive values (i.e. arrays, or -// values that give correct `typeof` results). -// do not use box values types (i.e. Number(), String(), etc.) - -var reverseKeywords = {}; -for (var key in cssKeywords) { - if (cssKeywords.hasOwnProperty(key)) { - reverseKeywords[cssKeywords[key]] = key; - } -} +"use strict"; -var convert = module.exports = { - rgb: {channels: 3, labels: 'rgb'}, - hsl: {channels: 3, labels: 'hsl'}, - hsv: {channels: 3, labels: 'hsv'}, - hwb: {channels: 3, labels: 'hwb'}, - cmyk: {channels: 4, labels: 'cmyk'}, - xyz: {channels: 3, labels: 'xyz'}, - lab: {channels: 3, labels: 'lab'}, - lch: {channels: 3, labels: 'lch'}, - hex: {channels: 1, labels: ['hex']}, - keyword: {channels: 1, labels: ['keyword']}, - ansi16: {channels: 1, labels: ['ansi16']}, - ansi256: {channels: 1, labels: ['ansi256']}, - hcg: {channels: 3, labels: ['h', 'c', 'g']}, - apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, - gray: {channels: 1, labels: ['gray']} -}; - -// hide .channels and .labels properties -for (var model in convert) { - if (convert.hasOwnProperty(model)) { - if (!('channels' in convert[model])) { - throw new Error('missing channels property: ' + model); - } - - if (!('labels' in convert[model])) { - throw new Error('missing channel labels property: ' + model); - } - - if (convert[model].labels.length !== convert[model].channels) { - throw new Error('channel and label counts mismatch: ' + model); - } - - var channels = convert[model].channels; - var labels = convert[model].labels; - delete convert[model].channels; - delete convert[model].labels; - Object.defineProperty(convert[model], 'channels', {value: channels}); - Object.defineProperty(convert[model], 'labels', {value: labels}); - } +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const moment_1 = tslib_1.__importDefault(__webpack_require__(10)); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const operators_1 = __webpack_require__(241); +const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(339)); +const errors_1 = __webpack_require__(340); +const proc_1 = __webpack_require__(341); +const SECOND = 1000; +const MINUTE = 60 * SECOND; +const noop = () => { }; +/** + * Helper for starting and managing processes. In many ways it resembles the + * API from `grunt_run`, processes are named and can be started, waited for, + * backgrounded once they log something matching a RegExp... + * + * @class ProcRunner + */ +class ProcRunner { + constructor(log) { + this.log = log; + this.closing = false; + this.procs = []; + this.signalUnsubscribe = exit_hook_1.default(() => { + this.teardown().catch((error) => { + log.error(`ProcRunner teardown error: ${error.stack}`); + }); + }); + } + /** + * Start a process, tracking it by `name` + * @param {String} name + * @param {Object} options + * @property {String} options.cmd executable to run + * @property {Array?} options.args arguments to provide the executable + * @property {String?} options.cwd current working directory for the process + * @property {RegExp|Boolean} options.wait Should start() wait for some time? Use + * `true` will wait until the proc exits, + * a `RegExp` will wait until that log line + * is found + * @return {Promise} + */ + async run(name, options) { + const { cmd, args = [], cwd = process.cwd(), stdin = undefined, wait = false, waitTimeout = 15 * MINUTE, env = process.env, } = options; + if (this.closing) { + throw new Error('ProcRunner is closing'); + } + if (wait && !(wait instanceof RegExp) && wait !== true) { + throw new TypeError('wait param should either be a RegExp or `true`'); + } + if (!!this.getProc(name)) { + throw new Error(`Process with name "${name}" already running`); + } + const proc = this.startProc(name, { + cmd, + args, + cwd, + env, + stdin, + }); + try { + if (wait instanceof RegExp) { + // wait for process to log matching line + await Rx.race(proc.lines$.pipe(operators_1.filter((line) => wait.test(line)), operators_1.first(), operators_1.catchError((err) => { + if (err.name !== 'EmptyError') { + throw errors_1.createCliError(`[${name}] exited without matching pattern: ${wait}`); + } + else { + throw err; + } + })), waitTimeout === false + ? Rx.NEVER + : Rx.timer(waitTimeout).pipe(operators_1.map(() => { + const sec = waitTimeout / SECOND; + throw errors_1.createCliError(`[${name}] failed to match pattern within ${sec} seconds [pattern=${wait}]`); + }))).toPromise(); + } + if (wait === true) { + // wait for process to complete + await proc.outcomePromise; + } + } + finally { + // while the procRunner closes promises will resolve/reject because + // processes and stopping, but consumers of run() shouldn't have to + // prepare for that, so just return a never-resolving promise + if (this.closing) { + await new Promise(noop); + } + } + } + /** + * Stop a named proc + */ + async stop(name, signal = 'SIGTERM') { + const proc = this.getProc(name); + if (proc) { + await proc.stop(signal); + } + else { + this.log.warning('[%s] already stopped', name); + } + } + /** + * Wait for all running processes to stop naturally + * @return {Promise} + */ + async waitForAllToStop() { + await Promise.all(this.procs.map((proc) => proc.outcomePromise)); + } + /** + * Close the ProcRunner and stop all running + * processes with `signal` + * + * @param {String} [signal=undefined] + * @return {Promise} + */ + async teardown(signal = 'exit') { + if (this.closing) { + return; + } + this.closing = true; + this.signalUnsubscribe(); + if (!signal && this.procs.length > 0) { + this.log.warning('%d processes left running, stop them with procs.stop(name):', this.procs.length, this.procs.map((proc) => proc.name)); + } + await Promise.all(this.procs.map(async (proc) => { + await proc.stop(signal === 'exit' ? 'SIGKILL' : signal); + })); + } + getProc(name) { + return this.procs.find((proc) => { + return proc.name === name; + }); + } + startProc(name, options) { + const startMs = Date.now(); + const proc = proc_1.startProc(name, options, this.log); + this.procs.push(proc); + const remove = () => { + this.procs.splice(this.procs.indexOf(proc), 1); + }; + // tie into proc outcome$, remove from _procs on compete + proc.outcome$.subscribe({ + next: (code) => { + const duration = moment_1.default.duration(Date.now() - startMs); + this.log.info('[%s] exited with %s after %s', name, code, duration.humanize()); + }, + complete: () => { + remove(); + }, + error: (error) => { + if (this.closing) { + this.log.error(error); + } + remove(); + }, + }); + return proc; + } } +exports.ProcRunner = ProcRunner; -convert.rgb.hsl = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var l; - - if (max === min) { - h = 0; - } else if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else if (b === max) { - h = 4 + (r - g) / delta; - } - - h = Math.min(h * 60, 360); - - if (h < 0) { - h += 360; - } - l = (min + max) / 2; +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { - if (max === min) { - s = 0; - } else if (l <= 0.5) { - s = delta / (max + min); - } else { - s = delta / (2 - max - min); - } +/* WEBPACK VAR INJECTION */(function(module) {var require;//! moment.js - return [h, s * 100, l * 100]; -}; +;(function (global, factory) { + true ? module.exports = factory() : + undefined +}(this, (function () { 'use strict'; -convert.rgb.hsv = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var v; + var hookCallback; - if (max === 0) { - s = 0; - } else { - s = (delta / max * 1000) / 10; - } + function hooks () { + return hookCallback.apply(null, arguments); + } - if (max === min) { - h = 0; - } else if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else if (b === max) { - h = 4 + (r - g) / delta; - } + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } - h = Math.min(h * 60, 360); + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } - if (h < 0) { - h += 360; - } + function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; + } - v = ((max / 255) * 1000) / 10; + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } + } - return [h, s, v]; -}; + function isUndefined(input) { + return input === void 0; + } -convert.rgb.hwb = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var h = convert.rgb.hsl(rgb)[0]; - var w = 1 / 255 * Math.min(r, Math.min(g, b)); + function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; + } - b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } - return [h, w * 100, b * 100]; -}; + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } -convert.rgb.cmyk = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var c; - var m; - var y; - var k; + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } - k = Math.min(1 - r, 1 - g, 1 - b); - c = (1 - r - k) / (1 - k) || 0; - m = (1 - g - k) / (1 - k) || 0; - y = (1 - b - k) / (1 - k) || 0; + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } - return [c * 100, m * 100, y * 100, k * 100]; -}; + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } -/** - * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance - * */ -function comparativeDistance(x, y) { - return ( - Math.pow(x[0] - y[0], 2) + - Math.pow(x[1] - y[1], 2) + - Math.pow(x[2] - y[2], 2) - ); -} + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } -convert.rgb.keyword = function (rgb) { - var reversed = reverseKeywords[rgb]; - if (reversed) { - return reversed; - } + return a; + } - var currentClosestDistance = Infinity; - var currentClosestKeyword; + function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } - for (var keyword in cssKeywords) { - if (cssKeywords.hasOwnProperty(keyword)) { - var value = cssKeywords[keyword]; + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; + } - // Compute comparative distance - var distance = comparativeDistance(rgb, value); + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } - // Check if its less, if so set as closest - if (distance < currentClosestDistance) { - currentClosestDistance = distance; - currentClosestKeyword = keyword; - } - } - } + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; - return currentClosestKeyword; -}; + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } -convert.keyword.rgb = function (keyword) { - return cssKeywords[keyword]; -}; + return false; + }; + } -convert.rgb.xyz = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; + function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); - // assume sRGB - r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; + } - return [x * 100, y * 100, z * 100]; -}; + function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } -convert.rgb.lab = function (rgb) { - var xyz = convert.rgb.xyz(rgb); - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; + return m; + } - x /= 95.047; - y /= 100; - z /= 108.883; + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = hooks.momentProperties = []; - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + function copyConfig(to, from) { + var i, prop, val; - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -}; + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } -convert.hsl.rgb = function (hsl) { - var h = hsl[0] / 360; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var t1; - var t2; - var t3; - var rgb; - var val; + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } - if (s === 0) { - val = l * 255; - return [val, val, val]; - } + return to; + } - if (l < 0.5) { - t2 = l * (1 + s); - } else { - t2 = l + s - l * s; - } + var updateInProgress = false; - t1 = 2 * l - t2; + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } + } - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { - t3 = h + 1 / 3 * -(i - 1); - if (t3 < 0) { - t3++; - } - if (t3 > 1) { - t3--; - } + function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } - if (6 * t3 < 1) { - val = t1 + (t2 - t1) * 6 * t3; - } else if (2 * t3 < 1) { - val = t2; - } else if (3 * t3 < 2) { - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - } else { - val = t1; - } + function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } - rgb[i] = val * 255; - } + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; - return rgb; -}; + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } -convert.hsl.hsv = function (hsl) { - var h = hsl[0]; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var smin = s; - var lmin = Math.max(l, 0.01); - var sv; - var v; + return value; + } - l *= 2; - s *= (l <= 1) ? l : 2 - l; - smin *= lmin <= 1 ? lmin : 2 - lmin; - v = (l + s) / 2; - sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } - return [h, sv * 100, v * 100]; -}; + function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } -convert.hsv.rgb = function (hsv) { - var h = hsv[0] / 60; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var hi = Math.floor(h) % 6; + function deprecate(msg, fn) { + var firstTime = true; - var f = h - Math.floor(h); - var p = 255 * v * (1 - s); - var q = 255 * v * (1 - (s * f)); - var t = 255 * v * (1 - (s * (1 - f))); - v *= 255; + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } - switch (hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } -}; + var deprecations = {}; -convert.hsv.hsl = function (hsv) { - var h = hsv[0]; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var vmin = Math.max(v, 0.01); - var lmin; - var sl; - var l; + function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } - l = (2 - s) * v; - lmin = (2 - s) * vmin; - sl = s * vmin; - sl /= (lmin <= 1) ? lmin : 2 - lmin; - sl = sl || 0; - l /= 2; + hooks.suppressDeprecationWarnings = false; + hooks.deprecationHandler = null; - return [h, sl * 100, l * 100]; -}; + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } -// http://dev.w3.org/csswg/css-color/#hwb-to-rgb -convert.hwb.rgb = function (hwb) { - var h = hwb[0] / 360; - var wh = hwb[1] / 100; - var bl = hwb[2] / 100; - var ratio = wh + bl; - var i; - var v; - var f; - var n; + function set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); + } - // wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; + } - i = Math.floor(6 * h); - v = 1 - bl; - f = 6 * h - i; + function Locale(config) { + if (config != null) { + this.set(config); + } + } - if ((i & 0x01) !== 0) { - f = 1 - f; - } + var keys; - n = wh + f * (v - wh); // linear interpolation + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } - var r; - var g; - var b; - switch (i) { - default: - case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; - } + var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }; - return [r * 255, g * 255, b * 255]; -}; + function calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; + } -convert.cmyk.rgb = function (cmyk) { - var c = cmyk[0] / 100; - var m = cmyk[1] / 100; - var y = cmyk[2] / 100; - var k = cmyk[3] / 100; - var r; - var g; - var b; + var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }; - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); + function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; - return [r * 255, g * 255, b * 255]; -}; + if (format || !formatUpper) { + return format; + } -convert.xyz.rgb = function (xyz) { - var x = xyz[0] / 100; - var y = xyz[1] / 100; - var z = xyz[2] / 100; - var r; - var g; - var b; + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); - r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); - g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); - b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + return this._longDateFormat[key]; + } - // assume sRGB - r = r > 0.0031308 - ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) - : r * 12.92; + var defaultInvalidDate = 'Invalid date'; - g = g > 0.0031308 - ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) - : g * 12.92; + function invalidDate () { + return this._invalidDate; + } - b = b > 0.0031308 - ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) - : b * 12.92; + var defaultOrdinal = '%d'; + var defaultDayOfMonthOrdinalParse = /\d{1,2}/; - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); + function ordinal (number) { + return this._ordinal.replace('%d', number); + } - return [r * 255, g * 255, b * 255]; -}; + var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }; -convert.xyz.lab = function (xyz) { - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; + function relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } - x /= 95.047; - y /= 100; - z /= 108.883; + function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + var aliases = {}; - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); + function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } - return [l, a, b]; -}; + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } -convert.lab.xyz = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var x; - var y; - var z; + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; - y = (l + 16) / 116; - x = a / 500 + y; - z = y - b / 200; + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } - var y2 = Math.pow(y, 3); - var x2 = Math.pow(x, 3); - var z2 = Math.pow(z, 3); - y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; - x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; - z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + return normalizedInput; + } - x *= 95.047; - y *= 100; - z *= 108.883; + var priorities = {}; - return [x, y, z]; -}; + function addUnitPriority(unit, priority) { + priorities[unit] = priority; + } -convert.lab.lch = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var hr; - var h; - var c; - - hr = Math.atan2(b, a); - h = hr * 360 / 2 / Math.PI; + function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; + } - if (h < 0) { - h += 360; - } + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } - c = Math.sqrt(a * a + b * b); + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; - return [l, c, h]; -}; + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; -convert.lch.lab = function (lch) { - var l = lch[0]; - var c = lch[1]; - var h = lch[2]; - var a; - var b; - var hr; + var formatFunctions = {}; - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); + var formatTokenFunctions = {}; - return [l, a, b]; -}; + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } -convert.rgb.ansi16 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; - var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } - value = Math.round(value / 50); + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; - if (value === 0) { - return 30; - } + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } - var ansi = 30 - + ((Math.round(b / 255) << 2) - | (Math.round(g / 255) << 1) - | Math.round(r / 255)); + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } - if (value === 2) { - ansi += 60; - } + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } - return ansi; -}; + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); -convert.hsv.ansi16 = function (args) { - // optimization here; we already know the value and don't need to get - // it converted for us. - return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); -}; + return formatFunctions[format](m); + } -convert.rgb.ansi256 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; + function expandFormat(format, locale) { + var i = 5; - // we use the extended greyscale palette here, with the exception of - // black and white. normal palette only has 4 greyscale shades. - if (r === g && g === b) { - if (r < 8) { - return 16; - } + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } - if (r > 248) { - return 231; - } + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } - return Math.round(((r - 8) / 247) * 24) + 232; - } + return format; + } - var ansi = 16 - + (36 * Math.round(r / 255 * 5)) - + (6 * Math.round(g / 255 * 5)) - + Math.round(b / 255 * 5); + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - return ansi; -}; + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf -convert.ansi16.rgb = function (args) { - var color = args % 10; + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - // handle greyscale - if (color === 0 || color === 7) { - if (args > 50) { - color += 3.5; - } + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - color = color / 10.5 * 255; + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; - return [color, color, color]; - } + var regexes = {}; - var mult = (~~(args > 50) + 1) * 0.5; - var r = ((color & 1) * mult) * 255; - var g = (((color >> 1) & 1) * mult) * 255; - var b = (((color >> 2) & 1) * mult) * 255; + function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } - return [r, g, b]; -}; + function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } -convert.ansi256.rgb = function (args) { - // handle greyscale - if (args >= 232) { - var c = (args - 232) * 10 + 8; - return [c, c, c]; - } + return regexes[token](config._strict, config._locale); + } - args -= 16; + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); + } - var rem; - var r = Math.floor(args / 36) / 5 * 255; - var g = Math.floor((rem = args % 36) / 6) / 5 * 255; - var b = (rem % 6) / 5 * 255; + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } - return [r, g, b]; -}; + var tokens = {}; -convert.rgb.hex = function (args) { - var integer = ((Math.round(args[0]) & 0xFF) << 16) - + ((Math.round(args[1]) & 0xFF) << 8) - + (Math.round(args[2]) & 0xFF); + function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } - var string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; + function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } -convert.hex.rgb = function (args) { - var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); - if (!match) { - return [0, 0, 0]; - } + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } - var colorString = match[0]; + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; - if (match[0].length === 3) { - colorString = colorString.split('').map(function (char) { - return char + char; - }).join(''); - } + // FORMATTING - var integer = parseInt(colorString, 16); - var r = (integer >> 16) & 0xFF; - var g = (integer >> 8) & 0xFF; - var b = integer & 0xFF; + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); - return [r, g, b]; -}; + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); -convert.rgb.hcg = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var max = Math.max(Math.max(r, g), b); - var min = Math.min(Math.min(r, g), b); - var chroma = (max - min); - var grayscale; - var hue; + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); - if (chroma < 1) { - grayscale = min / (1 - chroma); - } else { - grayscale = 0; - } + // ALIASES - if (chroma <= 0) { - hue = 0; - } else - if (max === r) { - hue = ((g - b) / chroma) % 6; - } else - if (max === g) { - hue = 2 + (b - r) / chroma; - } else { - hue = 4 + (r - g) / chroma + 4; - } + addUnitAlias('year', 'y'); - hue /= 6; - hue %= 1; + // PRIORITIES - return [hue * 360, chroma * 100, grayscale * 100]; -}; + addUnitPriority('year', 1); -convert.hsl.hcg = function (hsl) { - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var c = 1; - var f = 0; + // PARSING - if (l < 0.5) { - c = 2.0 * s * l; - } else { - c = 2.0 * s * (1.0 - l); - } + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); - if (c < 1.0) { - f = (l - 0.5 * c) / (1.0 - c); - } + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); - return [hsl[0], c * 100, f * 100]; -}; + // HELPERS -convert.hsv.hcg = function (hsv) { - var s = hsv[1] / 100; - var v = hsv[2] / 100; + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } - var c = s * v; - var f = 0; + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } - if (c < 1.0) { - f = (v - c) / (1 - c); - } + // HOOKS - return [hsv[0], c * 100, f * 100]; -}; + hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; -convert.hcg.rgb = function (hcg) { - var h = hcg[0] / 360; - var c = hcg[1] / 100; - var g = hcg[2] / 100; + // MOMENTS - if (c === 0.0) { - return [g * 255, g * 255, g * 255]; - } + var getSetYear = makeGetSet('FullYear', true); - var pure = [0, 0, 0]; - var hi = (h % 1) * 6; - var v = hi % 1; - var w = 1 - v; - var mg = 0; + function getIsLeapYear () { + return isLeapYear(this.year()); + } - switch (Math.floor(hi)) { - case 0: - pure[0] = 1; pure[1] = v; pure[2] = 0; break; - case 1: - pure[0] = w; pure[1] = 1; pure[2] = 0; break; - case 2: - pure[0] = 0; pure[1] = 1; pure[2] = v; break; - case 3: - pure[0] = 0; pure[1] = w; pure[2] = 1; break; - case 4: - pure[0] = v; pure[1] = 0; pure[2] = 1; break; - default: - pure[0] = 1; pure[1] = 0; pure[2] = w; - } + function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; + } - mg = (1.0 - c) * g; + function get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; + } - return [ - (c * pure[0] + mg) * 255, - (c * pure[1] + mg) * 255, - (c * pure[2] + mg) * 255 - ]; -}; + function set$1 (mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } + else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + } -convert.hcg.hsv = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; + // MOMENTS - var v = c + g * (1.0 - c); - var f = 0; + function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; + } - if (v > 0.0) { - f = c / v; - } - return [hcg[0], f * 100, v * 100]; -}; + function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } -convert.hcg.hsl = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; + function mod(n, x) { + return ((n % x) + x) % x; + } - var l = g * (1.0 - c) + 0.5 * c; - var s = 0; + var indexOf; - if (l > 0.0 && l < 0.5) { - s = c / (2 * l); - } else - if (l >= 0.5 && l < 1.0) { - s = c / (2 * (1 - l)); - } + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } - return [hcg[0], s * 100, l * 100]; -}; + function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); + } -convert.hcg.hwb = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - var v = c + g * (1.0 - c); - return [hcg[0], (v - c) * 100, (1 - v) * 100]; -}; + // FORMATTING -convert.hwb.hcg = function (hwb) { - var w = hwb[1] / 100; - var b = hwb[2] / 100; - var v = 1 - b; - var c = v - w; - var g = 0; + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); - if (c < 1) { - g = (v - c) / (1 - c); - } + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); - return [hwb[0], c * 100, g * 100]; -}; + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); -convert.apple.rgb = function (apple) { - return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; -}; + // ALIASES -convert.rgb.apple = function (rgb) { - return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; -}; + addUnitAlias('month', 'M'); -convert.gray.rgb = function (args) { - return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; -}; + // PRIORITY -convert.gray.hsl = convert.gray.hsv = function (args) { - return [0, 0, args[0]]; -}; + addUnitPriority('month', 8); -convert.gray.hwb = function (gray) { - return [0, 100, gray[0]]; -}; + // PARSING -convert.gray.cmyk = function (gray) { - return [0, 0, 0, gray[0]]; -}; + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); -convert.gray.lab = function (gray) { - return [gray[0], 0, 0]; -}; + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); -convert.gray.hex = function (gray) { - var val = Math.round(gray[0] / 100 * 255) & 0xFF; - var integer = (val << 16) + (val << 8) + val; + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); - var string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; + // LOCALES -convert.rgb.gray = function (rgb) { - var val = (rgb[0] + rgb[1] + rgb[2]) / 3; - return [val / 255 * 100]; -}; + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + function localeMonths (m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; + } + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + function localeMonthsShort (m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { + function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } -"use strict"; - - -module.exports = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } + function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } -var conversions = __webpack_require__(7); + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } -/* - this function routes a model to all other models. + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } - all functions that are routed have a property `.conversion` attached - to the returned synthetic function. This property is an array - of strings, each with the steps in between the 'from' and 'to' - color models (inclusive). + // MOMENTS - conversions that are not possible simply are not included. -*/ + function setMonth (mom, value) { + var dayOfMonth; -function buildGraph() { - var graph = {}; - // https://jsperf.com/object-keys-vs-for-in-with-closure/3 - var models = Object.keys(conversions); + if (!mom.isValid()) { + // No op + return mom; + } - for (var len = models.length, i = 0; i < len; i++) { - graph[models[i]] = { - // http://jsperf.com/1-vs-infinity - // micro-opt, but this is simple. - distance: -1, - parent: null - }; - } + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } - return graph; -} + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } -// https://en.wikipedia.org/wiki/Breadth-first_search -function deriveBFS(fromModel) { - var graph = buildGraph(); - var queue = [fromModel]; // unshift -> queue -> pop + function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } + } - graph[fromModel].distance = 0; + function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); + } - while (queue.length) { - var current = queue.pop(); - var adjacents = Object.keys(conversions[current]); + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } - for (var len = adjacents.length, i = 0; i < len; i++) { - var adjacent = adjacents[i]; - var node = graph[adjacent]; + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } - if (node.distance === -1) { - node.distance = graph[current].distance + 1; - node.parent = current; - queue.unshift(adjacent); - } - } - } + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } - return graph; -} + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } -function link(from, to) { - return function (args) { - return to(from(args)); - }; -} + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + } -function wrapConversion(toModel, graph) { - var path = [graph[toModel].parent, toModel]; - var fn = conversions[graph[toModel].parent][toModel]; + function createDate (y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date; + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + date = new Date(y + 400, m, d, h, M, s, ms); + if (isFinite(date.getFullYear())) { + date.setFullYear(y); + } + } else { + date = new Date(y, m, d, h, M, s, ms); + } - var cur = graph[toModel].parent; - while (graph[cur].parent) { - path.unshift(graph[cur].parent); - fn = link(conversions[graph[cur].parent][cur], fn); - cur = graph[cur].parent; - } - - fn.conversion = path; - return fn; -} - -module.exports = function (fromModel) { - var graph = deriveBFS(fromModel); - var conversion = {}; - - var models = Object.keys(graph); - for (var len = models.length, i = 0; i < len; i++) { - var toModel = models[i]; - var node = graph[toModel]; + return date; + } - if (node.parent === null) { - // no possible conversion, or this node is the source model. - continue; - } + function createUTCDate (y) { + var date; + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + var args = Array.prototype.slice.call(arguments); + // preserve leap years using a full 400 year cycle, then reset + args[0] = y + 400; + date = new Date(Date.UTC.apply(null, args)); + if (isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + } else { + date = new Date(Date.UTC.apply(null, arguments)); + } - conversion[toModel] = wrapConversion(toModel, graph); - } + return date; + } - return conversion; -}; + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + return -fwdlw + fwd - 1; + } + // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } -"use strict"; + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; -const env = process.env; + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} + return { + week: resWeek, + year: resYear + }; + } -function translateLevel(level) { - if (level === 0) { - return false; - } + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} + // FORMATTING -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } + // ALIASES - if (hasFlag('color=256')) { - return 2; - } + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } + // PRIORITIES - const min = forceColor ? 1 : 0; + addUnitPriority('week', 5); + addUnitPriority('isoWeek', 5); - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } + // PARSING - return 1; - } + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); - return min; - } + // HELPERS - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } + // LOCALES - if (env.COLORTERM === 'truecolor') { - return 3; - } + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. + }; - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } + function localeFirstDayOfWeek () { + return this._week.dow; + } - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } + function localeFirstDayOfYear () { + return this._week.doy; + } - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } + // MOMENTS - if ('COLORTERM' in env) { - return 1; - } + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } - if (env.TERM === 'dumb') { - return min; - } + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } - return min; -} + // FORMATTING -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} + addFormatToken('d', 0, 'do', 'day'); -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); -/***/ }), -/* 11 */ -/***/ (function(module, exports) { + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); -module.exports = require("os"); + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { + // ALIASES -"use strict"; + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); -module.exports = (flag, argv) => { - argv = argv || process.argv; - const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); - const pos = argv.indexOf(prefix + flag); - const terminatorPos = argv.indexOf('--'); - return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); -}; + // PRIORITY + addUnitPriority('day', 11); + addUnitPriority('weekday', 11); + addUnitPriority('isoWeekday', 11); + // PARSING -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); -"use strict"; + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); + // HELPERS -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); - } + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } - return ESCAPES.get(c) || c; -} + if (!isNaN(input)) { + return parseInt(input, 10); + } -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } + return null; + } - return results; -} + function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; + // LOCALES + function shiftWeekdays (ws, n) { + return ws.slice(n, 7).concat(ws.slice(0, n)); + } - const results = []; - let matches; + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + function localeWeekdays (m, format) { + var weekdays = isArray(this._weekdays) ? this._weekdays : + this._weekdays[(m && m !== true && this._weekdays.isFormat.test(format)) ? 'format' : 'standalone']; + return (m === true) ? shiftWeekdays(weekdays, this._week.dow) + : (m) ? weekdays[m.day()] : weekdays; + } - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + function localeWeekdaysShort (m) { + return (m === true) ? shiftWeekdays(this._weekdaysShort, this._week.dow) + : (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; + } - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + function localeWeekdaysMin (m) { + return (m === true) ? shiftWeekdays(this._weekdaysMin, this._week.dow) + : (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; + } - return results; -} + function handleStrictParse$1(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; -function buildStyle(chalk, styles) { - const enabled = {}; + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } + function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } - return current; -} + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); + // MOMENTS - chunks.push(chunk.join('')); + function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } + function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } - return chunks.join(''); -}; + function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } -"use strict"; + var defaultWeekdaysRegex = matchWord; + function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + var defaultWeekdaysShortRegex = matchWord; + function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } -function dedent(strings) { + var defaultWeekdaysMinRegex = matchWord; + function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } - var raw = void 0; - if (typeof strings === "string") { - // dedent can be used as a plain function - raw = [strings]; - } else { - raw = strings.raw; - } - // first, perform interpolation - var result = ""; - for (var i = 0; i < raw.length; i++) { - result += raw[i]. - // join lines when there is a suppressed newline - replace(/\\\n[ \t]*/g, ""). + function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } - // handle escaped backticks - replace(/\\`/g, "`"); + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } - if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) { - result += arguments.length <= i + 1 ? undefined : arguments[i + 1]; - } - } + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; - // now strip indentation - var lines = result.split("\n"); - var mindent = null; - lines.forEach(function (l) { - var m = l.match(/^(\s+)\S+/); - if (m) { - var indent = m[1].length; - if (!mindent) { - // this is the first indented line - mindent = indent; - } else { - mindent = Math.min(mindent, indent); - } + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); } - }); - if (mindent !== null) { - result = lines.map(function (l) { - return l[0] === " " ? l.slice(mindent) : l; - }).join("\n"); - } + // FORMATTING - // dedent eats leading and trailing whitespace too - result = result.trim(); + function hFormat() { + return this.hours() % 12 || 12; + } - // handle escaped newlines at the end to ensure they don't get stripped too - return result.replace(/\\n/g, "\n"); -} + function kFormat() { + return this.hours() || 24; + } -if (true) { - module.exports = dedent; -} + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); -"use strict"; + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); -const EMPTYARR = [] -const SHORTSPLIT = /$|[!-@[-`{-~][\s\S]*/g -const isArray = Array.isArray + function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } -const parseValue = function(any) { - if (any === "") return "" - if (any === "false") return false - const maybe = Number(any) - return maybe * 0 === 0 ? maybe : any -} + meridiem('a', true); + meridiem('A', false); -const parseAlias = function(aliases) { - let out = {}, - key, - alias, - prev, - len, - any, - i, - k + // ALIASES - for (key in aliases) { - any = aliases[key] - alias = out[key] = isArray(any) ? any : [any] + addUnitAlias('hour', 'h'); - for (i = 0, len = alias.length; i < len; i++) { - prev = out[alias[i]] = [key] + // PRIORITY + addUnitPriority('hour', 13); - for (k = 0; k < len; k++) { - if (i !== k) prev.push(alias[k]) - } + // PARSING + + function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; } - } - return out -} + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('k', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + addRegexToken('kk', match1to2, match2); -const parseDefault = function(aliases, defaults) { - let out = {}, - key, - alias, - value, - len, - i + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); - for (key in defaults) { - value = defaults[key] - alias = aliases[key] + addParseToken(['H', 'HH'], HOUR); + addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; + }); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); - out[key] = value + // LOCALES - if (alias === undefined) { - aliases[key] = EMPTYARR - } else { - for (i = 0, len = alias.length; i < len; i++) { - out[alias[i]] = value - } + function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); } - } - return out -} + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } -const parseOptions = function(aliases, options, value) { - let out = {}, - key, - alias, - len, - end, - i, - k - if (options !== undefined) { - for (i = 0, len = options.length; i < len; i++) { - key = options[i] - alias = aliases[key] + // MOMENTS - out[key] = value + // Setting the hour should keep the time, because the user explicitly + // specified which hour they want. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); - if (alias === undefined) { - aliases[key] = EMPTYARR - } else { - for (k = 0, end = alias.length; k < end; k++) { - out[alias[k]] = value - } - } - } - } + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, - return out -} + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, -const write = function(out, key, value, aliases, unknown) { - let i, - prev, - alias = aliases[key], - len = alias === undefined ? -1 : alias.length + week: defaultLocaleWeek, - if (len >= 0 || unknown === undefined || unknown(key)) { - prev = out[key] + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, - if (prev === undefined) { - out[key] = value - } else { - if (isArray(prev)) { - prev.push(value) - } else { - out[key] = [prev, value] - } - } + meridiemParse: defaultLocaleMeridiemParse + }; - for (i = 0; i < len; i++) { - out[alias[i]] = out[key] + // internal storage for locale config files + var locales = {}; + var localeFamilies = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; } - } -} -const getopts = function(argv, opts) { - let unknown = (opts = opts || {}).unknown, - aliases = parseAlias(opts.alias), - strings = parseOptions(aliases, opts.string, ""), - values = parseDefault(aliases, opts.default), - bools = parseOptions(aliases, opts.boolean, false), - stopEarly = opts.stopEarly, - _ = [], - out = { _ }, - i = 0, - k = 0, - len = argv.length, - key, - arg, - end, - match, - value + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; - for (; i < len; i++) { - arg = argv[i] + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return globalLocale; + } - if (arg[0] !== "-" || arg === "-") { - if (stopEarly) while (i < len) _.push(argv[i++]) - else _.push(arg) - } else if (arg === "--") { - while (++i < len) _.push(argv[i]) - } else if (arg[1] === "-") { - end = arg.indexOf("=", 2) - if (arg[2] === "n" && arg[3] === "o" && arg[4] === "-") { - key = arg.slice(5, end >= 0 ? end : undefined) - value = false - } else if (end >= 0) { - key = arg.slice(2, end) - value = - bools[key] !== undefined || - (strings[key] === undefined - ? parseValue(arg.slice(end + 1)) - : arg.slice(end + 1)) - } else { - key = arg.slice(2) - value = - bools[key] !== undefined || - (len === i + 1 || argv[i + 1][0] === "-" - ? strings[key] === undefined - ? true - : "" - : strings[key] === undefined - ? parseValue(argv[++i]) - : argv[++i]) - } - write(out, key, value, aliases, unknown) - } else { - SHORTSPLIT.lastIndex = 2 - match = SHORTSPLIT.exec(arg) - end = match.index - value = match[0] - - for (k = 1; k < end; k++) { - write( - out, - (key = arg[k]), - k + 1 < end - ? strings[key] === undefined || - arg.substring(k + 1, (k = end)) + value - : value === "" - ? len === i + 1 || argv[i + 1][0] === "-" - ? strings[key] === undefined || "" - : bools[key] !== undefined || - (strings[key] === undefined ? parseValue(argv[++i]) : argv[++i]) - : bools[key] !== undefined || - (strings[key] === undefined ? parseValue(value) : value), - aliases, - unknown - ) - } + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = require; + __webpack_require__(12)("./" + name); + getSetGlobalLocale(oldLocale); + } catch (e) {} + } + return locales[name]; } - } - - for (key in values) if (out[key] === undefined) out[key] = values[key] - for (key in bools) if (out[key] === undefined) out[key] = false - for (key in strings) if (out[key] === undefined) out[key] = "" - return out -} + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } + else { + data = defineLocale(key, values); + } -module.exports = getopts + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + else { + if ((typeof console !== 'undefined') && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn('Locale ' + key + ' not found. Did you forget to load it?'); + } + } + } + return globalLocale._abbr; + } -/***/ }), -/* 16 */ -/***/ (function(module, exports) { + function defineLocale (name, config) { + if (config !== null) { + var locale, parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); -module.exports = require("path"); + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } -/***/ }), -/* 17 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commands", function() { return commands; }); -/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18); -/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(586); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(686); -/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(687); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } -const commands = { - bootstrap: _bootstrap__WEBPACK_IMPORTED_MODULE_0__["BootstrapCommand"], - clean: _clean__WEBPACK_IMPORTED_MODULE_1__["CleanCommand"], - run: _run__WEBPACK_IMPORTED_MODULE_2__["RunCommand"], - watch: _watch__WEBPACK_IMPORTED_MODULE_3__["WatchCommand"] -}; + // returns locale data + function getLocale (key) { + var locale; -/***/ }), -/* 18 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCommand", function() { return BootstrapCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(19); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(501); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(502); -/* harmony import */ var _utils_project_checksums__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(580); -/* harmony import */ var _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(585); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ + if (!key) { + return globalLocale; + } + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + return chooseLocale(key); + } + function listLocales() { + return keys(locales); + } + function checkOverflow (m) { + var overflow; + var a = m._a; + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } -const BootstrapCommand = { - description: 'Install dependencies and crosslink projects', - name: 'bootstrap', + getParsingFlags(m).overflow = overflow; + } - async run(projects, projectGraph, { - options, - kbn - }) { - const batchedProjectsByWorkspace = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_4__["topologicallyBatchProjects"])(projects, projectGraph, { - batchByWorkspace: true - }); - const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_4__["topologicallyBatchProjects"])(projects, projectGraph); - const extraArgs = [...(options['frozen-lockfile'] === true ? ['--frozen-lockfile'] : []), ...(options['prefer-offline'] === true ? ['--prefer-offline'] : [])]; - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold('\nRunning installs in topological order:')); + return m; + } - for (const batch of batchedProjectsByWorkspace) { - for (const project of batch) { - if (project.isWorkspaceProject) { - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(`Skipping workspace project: ${project.name}`); - continue; + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; } - - if (project.hasDependencies()) { - await project.installDependencies({ - extraArgs - }); + if (b != null) { + return b; } - } + return c; } - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold('\nInstalls completed, linking package executables:\n')); - await Object(_utils_link_project_executables__WEBPACK_IMPORTED_MODULE_1__["linkProjectExecutables"])(projects, projectGraph); - /** - * At the end of the bootstrapping process we call all `kbn:bootstrap` scripts - * in the list of projects. We do this because some projects need to be - * transpiled before they can be used. Ideally we shouldn't do this unless we - * have to, as it will slow down the bootstrapping process. - */ + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold('\nLinking executables completed, running `kbn:bootstrap` scripts\n')); - const checksums = options.cache ? await Object(_utils_project_checksums__WEBPACK_IMPORTED_MODULE_5__["getAllChecksums"])(kbn, _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"]) : false; - await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_3__["parallelizeBatches"])(batchedProjects, async project => { - if (project.hasScript('kbn:bootstrap')) { - const cacheFile = new _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_6__["BootstrapCacheFile"](kbn, project, checksums); + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray (config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; - if (cacheFile.isValid()) { - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].success(`[${project.name}] cache up to date`); - } else { - cacheFile.delete(); - await project.runScriptStreaming('kbn:bootstrap'); - cacheFile.write(); + if (config._d) { + return; } - } - }); - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green.bold('\nBootstrapping completed!\n')); - } -}; - -/***/ }), -/* 19 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + currentDate = currentDateArray(config); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkProjectExecutables", function() { return linkProjectExecutables; }); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(20); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } -/** - * Yarn does not link the executables from dependencies that are installed - * using `link:` https://github.com/yarnpkg/yarn/pull/5046 - * - * We simulate this functionality by walking through each project's project - * dependencies, and manually linking their executables if defined. The logic - * for linking was mostly adapted from lerna: https://github.com/lerna/lerna/blob/1d7eb9eeff65d5a7de64dea73613b1bf6bfa8d57/src/PackageUtilities.js#L348 - */ -async function linkProjectExecutables(projectsByName, projectGraph) { - for (const [projectName, projectDeps] of projectGraph) { - const project = projectsByName.get(projectName); - const binsDir = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(project.nodeModulesLocation, '.bin'); + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } - for (const projectDep of projectDeps) { - const executables = projectDep.getExecutables(); + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } - for (const name of Object.keys(executables)) { - const srcPath = executables[name]; // existing logic from lerna -- ensure that the bin we are going to - // point to exists or ignore it + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); - if (!(await Object(_fs__WEBPACK_IMPORTED_MODULE_2__["isFile"])(srcPath))) { - continue; + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } - const dest = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(binsDir, name); // Get relative project path with normalized path separators. + if (config._nextDay) { + config._a[HOUR] = 24; + } - const projectRelativePath = Object(path__WEBPACK_IMPORTED_MODULE_0__["relative"])(project.path, srcPath).split(path__WEBPACK_IMPORTED_MODULE_0__["sep"]).join('/'); - _log__WEBPACK_IMPORTED_MODULE_3__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_1___default.a`{dim [${project.name}]} ${name} -> {dim ${projectRelativePath}}`); - await Object(_fs__WEBPACK_IMPORTED_MODULE_2__["mkdirp"])(Object(path__WEBPACK_IMPORTED_MODULE_0__["dirname"])(dest)); - await Object(_fs__WEBPACK_IMPORTED_MODULE_2__["createSymlink"])(srcPath, dest, 'exec'); - await Object(_fs__WEBPACK_IMPORTED_MODULE_2__["chmod"])(dest, '755'); - } + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } } - } -} - -/***/ }), -/* 20 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readFile", function() { return readFile; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "chmod", function() { return chmod; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mkdirp", function() { return mkdirp; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unlink", function() { return unlink; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyDirectory", function() { return copyDirectory; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSymlink", function() { return isSymlink; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDirectory", function() { return isDirectory; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFile", function() { return isFile; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSymlink", function() { return createSymlink; }); -/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(21); -/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cmd_shim__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(23); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(33); -/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ncp__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(29); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_4__); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ - - - + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; -const lstat = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.lstat); -const readFile = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.readFile); -const symlink = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.symlink); -const chmod = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.chmod); -const cmdShim = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(cmd_shim__WEBPACK_IMPORTED_MODULE_0___default.a); -const mkdir = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.mkdir); -const mkdirp = async path => await mkdir(path, { - recursive: true -}); -const unlink = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.unlink); -const copyDirectory = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(ncp__WEBPACK_IMPORTED_MODULE_2__["ncp"]); + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; -async function statTest(path, block) { - try { - return block((await lstat(path))); - } catch (e) { - if (e.code === 'ENOENT') { - return false; - } + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; - throw e; - } -} -/** - * Test if a path points to a symlink. - * @param path - */ + var curWeek = weekOfYear(createLocal(), dow, doy); + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); -async function isSymlink(path) { - return await statTest(path, stats => stats.isSymbolicLink()); -} -/** - * Test if a path points to a directory. - * @param path - */ + // Default to current week. + week = defaults(w.w, curWeek.week); -async function isDirectory(path) { - return await statTest(path, stats => stats.isDirectory()); -} -/** - * Test if a path points to a regular file. - * @param path - */ - -async function isFile(path) { - return await statTest(path, stats => stats.isFile()); -} -/** - * Create a symlink at dest that points to src. Adapted from - * https://github.com/lerna/lerna/blob/2f1b87d9e2295f587e4ac74269f714271d8ed428/src/FileSystemUtilities.js#L103. - * - * @param src - * @param dest - * @param type 'dir', 'file', 'junction', or 'exec'. 'exec' on - * windows will use the `cmd-shim` module since symlinks can't be used - * for executable files on windows. - */ - -async function createSymlink(src, dest, type) { - if (process.platform === 'win32') { - if (type === 'exec') { - await cmdShim(src, dest); - } else { - await forceCreate(src, dest, type); + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from beginning of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to beginning of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } } - } else { - const posixType = type === 'exec' ? 'file' : type; - const relativeSource = Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(Object(path__WEBPACK_IMPORTED_MODULE_3__["dirname"])(dest), src); - await forceCreate(relativeSource, dest, posixType); - } -} -async function forceCreate(src, dest, type) { - try { - // If something exists at `dest` we need to remove it first. - await unlink(dest); - } catch (error) { - if (error.code !== 'ENOENT') { - throw error; - } - } + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - await symlink(src, dest, type); -} + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] + ]; -// On windows, create a .cmd file. -// Read the #! in the file to see what it uses. The vast majority -// of the time, this will be either: -// "#!/usr/bin/env " -// or: -// "#! " -// -// Write a binroot/pkg.bin + ".cmd" file that has this line in it: -// @ %~dp0 %* + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] + ]; -module.exports = cmdShim -cmdShim.ifExists = cmdShimIfExists + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; -var fs = __webpack_require__(22) + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; -var mkdir = __webpack_require__(31) - , path = __webpack_require__(16) - , toBatchSyntax = __webpack_require__(32) - , shebangExpr = /^#\!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+=[^ \t]+\s+)*\s*([^ \t]+)(.*)$/ + if (match) { + getParsingFlags(config).iso = true; -function cmdShimIfExists (from, to, cb) { - fs.stat(from, function (er) { - if (er) return cb() - cmdShim(from, to, cb) - }) -} + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } -// Try to unlink, but ignore errors. -// Any problems will surface later. -function rm (path, cb) { - fs.unlink(path, function(er) { - cb() - }) -} + // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; -function cmdShim (from, to, cb) { - fs.stat(from, function (er, stat) { - if (er) - return cb(er) + function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; - cmdShim_(from, to, cb) - }) -} + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } -function cmdShim_ (from, to, cb) { - var then = times(2, next, cb) - rm(to, then) - rm(to + ".cmd", then) + return result; + } - function next(er) { - writeShim(from, to, cb) - } -} + function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; + } -function writeShim (from, to, cb) { - // make a cmd file and a sh script - // First, check if the bin is a #! of some sort. - // If not, then assume it's something that'll be compiled, or some other - // sort of script, and just call it directly. - mkdir(path.dirname(to), function (er) { - if (er) - return cb(er) - fs.readFile(from, "utf8", function (er, data) { - if (er) return writeShim_(from, to, null, null, cb) - var firstLine = data.trim().split(/\r*\n/)[0] - , shebang = firstLine.match(shebangExpr) - if (!shebang) return writeShim_(from, to, null, null, null, cb) - var vars = shebang[1] || "" - , prog = shebang[2] - , args = shebang[3] || "" - return writeShim_(from, to, prog, args, vars, cb) - }) - }) -} + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + + function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; + } + var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; -function writeShim_ (from, to, prog, args, variables, cb) { - var shTarget = path.relative(path.dirname(to), from) - , target = shTarget.split("/").join("\\") - , longProg - , shProg = prog && prog.split("\\").join("/") - , shLongProg - , pwshProg = shProg && "\"" + shProg + "$exe\"" - , pwshLongProg - shTarget = shTarget.split("\\").join("/") - args = args || "" - variables = variables || "" - if (!prog) { - prog = "\"%~dp0\\" + target + "\"" - shProg = "\"$basedir/" + shTarget + "\"" - pwshProg = shProg - args = "" - target = "" - shTarget = "" - } else { - longProg = "\"%~dp0\\" + prog + ".exe\"" - shLongProg = "\"$basedir/" + prog + "\"" - pwshLongProg = "\"$basedir/" + prog + "$exe\"" - target = "\"%~dp0\\" + target + "\"" - shTarget = "\"$basedir/" + shTarget + "\"" - } + function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; + } + } - // @SETLOCAL - // - // @IF EXIST "%~dp0\node.exe" ( - // @SET "_prog=%~dp0\node.exe" - // ) ELSE ( - // @SET "_prog=node" - // @SET PATHEXT=%PATHEXT:;.JS;=;% - // ) - // - // "%_prog%" "%~dp0\.\node_modules\npm\bin\npm-cli.js" %* - // @ENDLOCAL - var cmd - if (longProg) { - shLongProg = shLongProg.trim(); - args = args.trim(); - var variableDeclarationsAsBatch = toBatchSyntax.convertToSetCommands(variables) - cmd = "@SETLOCAL\r\n" - + variableDeclarationsAsBatch - + "\r\n" - + "@IF EXIST " + longProg + " (\r\n" - + " @SET \"_prog=" + longProg.replace(/(^")|("$)/g, '') + "\"\r\n" - + ") ELSE (\r\n" - + " @SET \"_prog=" + prog.replace(/(^")|("$)/g, '') + "\"\r\n" - + " @SET PATHEXT=%PATHEXT:;.JS;=;%\r\n" - + ")\r\n" - + "\r\n" - + "\"%_prog%\" " + args + " " + target + " %*\r\n" - + '@ENDLOCAL\r\n' - } else { - cmd = "@" + prog + " " + args + " " + target + " %*\r\n" - } + // date and time from ref 2822 format + function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } - // #!/bin/sh - // basedir=`dirname "$0"` - // - // case `uname` in - // *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; - // esac - // - // if [ -x "$basedir/node.exe" ]; then - // "$basedir/node.exe" "$basedir/node_modules/npm/bin/npm-cli.js" "$@" - // ret=$? - // else - // node "$basedir/node_modules/npm/bin/npm-cli.js" "$@" - // ret=$? - // fi - // exit $ret + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); - var sh = "#!/bin/sh\n" + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - sh = sh - + "basedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\,/,g')\")\n" - + "\n" - + "case `uname` in\n" - + " *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w \"$basedir\"`;;\n" - + "esac\n" - + "\n" + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } + } - if (shLongProg) { - sh = sh - + "if [ -x "+shLongProg+" ]; then\n" - + " " + variables + shLongProg + " " + args + " " + shTarget + " \"$@\"\n" - + " ret=$?\n" - + "else \n" - + " " + variables + shProg + " " + args + " " + shTarget + " \"$@\"\n" - + " ret=$?\n" - + "fi\n" - + "exit $ret\n" - } else { - sh = sh - + shProg + " " + args + " " + shTarget + " \"$@\"\n" - + "exit $?\n" - } + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); - // #!/usr/bin/env pwsh - // $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - // - // $ret=0 - // $exe = "" - // if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - // # Fix case when both the Windows and Linux builds of Node - // # are installed in the same directory - // $exe = ".exe" - // } - // if (Test-Path "$basedir/node") { - // & "$basedir/node$exe" "$basedir/node_modules/npm/bin/npm-cli.js" $args - // $ret=$LASTEXITCODE - // } else { - // & "node$exe" "$basedir/node_modules/npm/bin/npm-cli.js" $args - // $ret=$LASTEXITCODE - // } - // exit $ret - var pwsh = "#!/usr/bin/env pwsh\n" - + "$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n" - + "\n" - + "$exe=\"\"\n" - + "if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n" - + " # Fix case when both the Windows and Linux builds of Node\n" - + " # are installed in the same directory\n" - + " $exe=\".exe\"\n" - + "}\n" - if (shLongProg) { - pwsh = pwsh - + "$ret=0\n" - + "if (Test-Path " + pwshLongProg + ") {\n" - + " & " + pwshLongProg + " " + args + " " + shTarget + " $args\n" - + " $ret=$LASTEXITCODE\n" - + "} else {\n" - + " & " + pwshProg + " " + args + " " + shTarget + " $args\n" - + " $ret=$LASTEXITCODE\n" - + "}\n" - + "exit $ret\n" - } else { - pwsh = pwsh - + "& " + pwshProg + " " + args + " " + shTarget + " $args\n" - + "exit $LASTEXITCODE\n" - } + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } - var then = times(3, next, cb) - fs.writeFile(to + ".ps1", pwsh, "utf8", then) - fs.writeFile(to + ".cmd", cmd, "utf8", then) - fs.writeFile(to, sh, "utf8", then) - function next () { - chmodShim(to, cb) - } -} + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } -function chmodShim (to, cb) { - var then = times(2, cb, cb) - fs.chmod(to, "0755", then) - fs.chmod(to + ".cmd", "0755", then) - fs.chmod(to + ".ps1", "0755", then) -} + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } -function times(n, ok, cb) { - var errState = null - return function(er) { - if (!errState) { - if (er) - cb(errState = er) - else if (--n === 0) - ok() + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); } - } -} + hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { + // constant that refers to the ISO standard + hooks.ISO_8601 = function () {}; -var fs = __webpack_require__(23) -var polyfills = __webpack_require__(24) -var legacy = __webpack_require__(26) -var clone = __webpack_require__(28) + // constant that refers to the RFC 2822 form + hooks.RFC_2822 = function () {}; -var util = __webpack_require__(29) + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; -/* istanbul ignore next - node 0.x polyfill */ -var gracefulQueue -var previousSymbol - -/* istanbul ignore else - node 0.x polyfill */ -if (typeof Symbol === 'function' && typeof Symbol.for === 'function') { - gracefulQueue = Symbol.for('graceful-fs.queue') - // This is used in testing by future versions - previousSymbol = Symbol.for('graceful-fs.previous') -} else { - gracefulQueue = '___graceful-fs.queue' - previousSymbol = '___graceful-fs.previous' -} + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; -function noop () {} + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } -// Once time initialization -if (!global[gracefulQueue]) { - // This queue can be shared by multiple loaded instances - var queue = [] - Object.defineProperty(global, gracefulQueue, { - get: function() { - return queue - } - }) + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } - // Patch fs.close/closeSync to shared queue version, because we need - // to retry() whenever a close happens *anywhere* in the program. - // This is essential when multiple graceful-fs instances are - // in play at the same time. - fs.close = (function (fs$close) { - function close (fd, cb) { - return fs$close.call(fs, fd, function (err) { - // This function uses the graceful-fs shared queue - if (!err) { - retry() + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; } - if (typeof cb === 'function') - cb.apply(this, arguments) - }) + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); } - Object.defineProperty(close, previousSymbol, { - value: fs$close - }) - return close - })(fs.close) - fs.closeSync = (function (fs$closeSync) { - function closeSync (fd) { - // This function uses the graceful-fs shared queue - fs$closeSync.apply(fs, arguments) - retry() + function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } } - Object.defineProperty(closeSync, previousSymbol, { - value: fs$closeSync - }) - return closeSync - })(fs.closeSync) + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, - if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(global[gracefulQueue]) - __webpack_require__(30).equal(global[gracefulQueue].length, 0) - }) - } -} + scoreToBeat, + i, + currentScore; -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null + if (!isValid(tempConfig)) { + continue; + } - return go$readFile(path, options, cb) + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } } - }) + + extend(config, bestMoment || tempConfig); } - } - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + function configFromObject(config) { + if (config._d) { + return; + } - return go$writeFile(path, data, options, cb) + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + configFromArray(config); + } + + function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; } - }) + + return res; } - } - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + function prepareConfig (config) { + var input = config._i, + format = config._f; - return go$appendFile(path, data, options, cb) + config._locale = config._locale || getLocale(config._l); - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); } - }) - } - } - - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options - } - args.push(go$readdir$cb) - return go$readdir(args) + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) + if (!isValid(config)) { + config._d = null; + } - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } + return config; } - } - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } + } - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; - Object.defineProperty(fs, 'ReadStream', { - get: function () { - return ReadStream - }, - set: function (val) { - ReadStream = val - }, - enumerable: true, - configurable: true - }) - Object.defineProperty(fs, 'WriteStream', { - get: function () { - return WriteStream - }, - set: function (val) { - WriteStream = val - }, - enumerable: true, - configurable: true - }) + return createFromConfig(c); + } - // legacy names - var FileReadStream = ReadStream - Object.defineProperty(fs, 'FileReadStream', { - get: function () { - return FileReadStream - }, - set: function (val) { - FileReadStream = val - }, - enumerable: true, - configurable: true - }) - var FileWriteStream = WriteStream - Object.defineProperty(fs, 'FileWriteStream', { - get: function () { - return FileWriteStream - }, - set: function (val) { - FileWriteStream = val - }, - enumerable: true, - configurable: true - }) + function createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } + ); - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } + ); - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } + // TODO: Use [].sort instead? + function min () { + var args = [].slice.call(arguments, 0); - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } + return pickBy('isBefore', args); + } - function createReadStream (path, options) { - return new fs.ReadStream(path, options) - } + function max () { + var args = [].slice.call(arguments, 0); - function createWriteStream (path, options) { - return new fs.WriteStream(path, options) - } + return pickBy('isAfter', args); + } - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; - return go$open(path, flags, mode, cb) + var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } } - }) - } - } - return fs -} + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - global[gracefulQueue].push(elem) -} + return true; + } -function retry () { - var elem = global[gracefulQueue].shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } -} + function isValid$1() { + return this._isValid; + } + function createInvalid$1() { + return createDuration(NaN); + } -/***/ }), -/* 23 */ -/***/ (function(module, exports) { + function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || normalizedInput.isoWeek || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; -module.exports = require("fs"); + this._isValid = isDurationValid(normalizedInput); -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; -var constants = __webpack_require__(25) + this._data = {}; -var origCwd = process.cwd -var cwd = null + this._locale = getLocale(); -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform + this._bubble(); + } -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} + function isDuration (obj) { + return obj instanceof Duration; + } -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) -} + function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } -module.exports = patch + // FORMATTING -function patch (fs) { - // (re-)implement some things that are known busted or missing. + function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } + offset('Z', ':'); + offset('ZZ', ''); - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } + // PARSING - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) + // HELPERS - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) + function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) + if (matches === null) { + return null; + } - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; + } - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } } - fs.lchmodSync = function () {} - } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) + + function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; } - fs.lchownSync = function () {} - } - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. + // HOOKS - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + hooks.updateOffset = function () {}; - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { - function read (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset (input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) } - // This ensures `util.promisify` works as it does for native `fs.read`. - read.__proto__ = fs$read - return read - })(fs.read) + function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); } - throw er - } } - }})(fs.readSync) - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) + function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); } - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } } - } - return ret + return this; } - } - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } + function setOffsetToParsedOffset () { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } + else { + this.utcOffset(0, true); + } + } + return this; + } - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } + function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; } - return ret - } + input = input ? createLocal(input).utcOffset() : 0; - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} + return (this.utcOffset() - input) % 60 === 0; } - } - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); } - } - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } + function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; } - } + function isLocal () { + return this.isValid() ? !this._isUTC : false; + } - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + function isUtcOffset () { + return this.isValid() ? this._isUTC : false; } - } - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } + function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; } - } - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } - function callback (er, stats) { - if (stats) { - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - } - if (cb) cb.apply(this, arguments) - } - return options ? orig.call(fs, target, options, callback) - : orig.call(fs, target, callback) - } - } - - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, options) { - var stats = options ? orig.call(fs, target, options) - : orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; - } - } + // ASP.NET json date format regex + var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; - if (er.code === "ENOSYS") - return true + function createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); - return false - } -} + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + ret = new Duration(duration); -/***/ }), -/* 25 */ -/***/ (function(module, exports) { + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } -module.exports = require("constants"); + return ret; + } -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { + createDuration.fn = Duration.prototype; + createDuration.invalid = createInvalid$1; -var Stream = __webpack_require__(27).Stream + function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } -module.exports = legacy + function positiveMomentsDifference(base, other) { + var res = {}; -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - Stream.call(this); + return res; + } - var self = this; + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; + return res; + } - options = options || {}; + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; } - if (this.encoding) this.setEncoding(this.encoding); - - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } + function addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); - if (this.start > this.end) { - throw new Error('start must be <= end'); - } + if (!mom.isValid()) { + // No op + return; + } - this.pos = this.start; - } + updateOffset = updateOffset == null ? true : updateOffset; - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } } - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } + var add = createAdder(1, 'add'); + var subtract = createAdder(-1, 'subtract'); - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } + function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + } - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); + function calendar$1 (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; - Stream.call(this); + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); - this.path = path; - this.fd = null; - this.writable = true; + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); + } - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; + function clone () { + return new Moment(this); + } - options = options || {}; + function isAfter (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } + } - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; + function isBefore (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } } - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } + function isBetween (from, to, units, inclusivity) { + var localFrom = isMoment(from) ? from : createLocal(from), + localTo = isMoment(to) ? to : createLocal(to); + if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { + return false; + } + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && + (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)); + } - this.pos = this.start; + function isSame (input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } } - this.busy = false; - this._queue = []; + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input, units); + } - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input, units); } - } -} + function diff (input, units, asFloat) { + var that, + zoneDelta, + output; -/***/ }), -/* 27 */ -/***/ (function(module, exports) { + if (!this.isValid()) { + return NaN; + } -module.exports = require("stream"); + that = cloneWithOffset(input, this); -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { + if (!that.isValid()) { + return NaN; + } -"use strict"; + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + units = normalizeUnits(units); -module.exports = clone + switch (units) { + case 'year': output = monthDiff(this, that) / 12; break; + case 'month': output = monthDiff(this, that); break; + case 'quarter': output = monthDiff(this, that) / 3; break; + case 'second': output = (this - that) / 1e3; break; // 1000 + case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 + case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 + case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst + case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: output = this - that; + } -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj + return asFloat ? output : absFloor(output); + } - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } - return copy -} + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; + } + hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; -/***/ }), -/* 29 */ -/***/ (function(module, exports) { + function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } -module.exports = require("util"); + function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true; + var m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + } + } + return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } -/***/ }), -/* 30 */ -/***/ (function(module, exports) { + /** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ + function inspect () { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; -module.exports = require("assert"); + return this.format(prefix + year + datetime + suffix); + } -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { + function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } -var path = __webpack_require__(16); -var fs = __webpack_require__(23); -var _0777 = parseInt('0777', 8); + function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + function fromNow (withoutSuffix) { + return this.from(createLocal(), withoutSuffix); + } -function mkdirP (p, opts, f, made) { - if (typeof opts === 'function') { - f = opts; - opts = {}; + function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } } - else if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; + + function toNow (withoutSuffix) { + return this.to(createLocal(), withoutSuffix); } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - p = path.resolve(p); - - xfs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; } - switch (er.code) { - case 'ENOENT': - if (path.dirname(p) === p) return cb(er); - mkdirP(path.dirname(p), opts, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, opts, cb, made); - }); - break; + } - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - xfs.stat(p, function (er2, stat) { - // if the stat fails, then that's super weird. - // let the original error be the failure reason. - if (er2 || !stat.isDirectory()) cb(er, made) - else cb(null, made); - }); - break; + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } } - }); -} + ); -mkdirP.sync = function sync (p, opts, made) { - if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; + function localeData () { + return this._locale; } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); + + var MS_PER_SECOND = 1000; + var MS_PER_MINUTE = 60 * MS_PER_SECOND; + var MS_PER_HOUR = 60 * MS_PER_MINUTE; + var MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; + + // actual modulo - handles negative numbers (for dates before 1970): + function mod$1(dividend, divisor) { + return (dividend % divisor + divisor) % divisor; } - if (!made) made = null; - p = path.resolve(p); + function localStartOfDate(y, m, d) { + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + return new Date(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return new Date(y, m, d).valueOf(); + } + } - try { - xfs.mkdirSync(p, mode); - made = made || p; + function utcStartOfDate(y, m, d) { + // Date.UTC remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return Date.UTC(y, m, d); + } } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), opts, made); - sync(p, opts, made); - break; - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - var stat; - try { - stat = xfs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; + function startOf (units) { + var time; + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond' || !this.isValid()) { + return this; + } + + var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + + switch (units) { + case 'year': + time = startOfDate(this.year(), 0, 1); + break; + case 'quarter': + time = startOfDate(this.year(), this.month() - this.month() % 3, 1); + break; + case 'month': + time = startOfDate(this.year(), this.month(), 1); + break; + case 'week': + time = startOfDate(this.year(), this.month(), this.date() - this.weekday()); + break; + case 'isoWeek': + time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1)); + break; + case 'day': + case 'date': + time = startOfDate(this.year(), this.month(), this.date()); + break; + case 'hour': + time = this._d.valueOf(); + time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR); + break; + case 'minute': + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_MINUTE); + break; + case 'second': + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_SECOND); break; } + + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; } - return made; -}; + function endOf (units) { + var time; + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond' || !this.isValid()) { + return this; + } + var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; -/***/ }), -/* 32 */ -/***/ (function(module, exports) { + switch (units) { + case 'year': + time = startOfDate(this.year() + 1, 0, 1) - 1; + break; + case 'quarter': + time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1; + break; + case 'month': + time = startOfDate(this.year(), this.month() + 1, 1) - 1; + break; + case 'week': + time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1; + break; + case 'isoWeek': + time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1; + break; + case 'day': + case 'date': + time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; + break; + case 'hour': + time = this._d.valueOf(); + time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1; + break; + case 'minute': + time = this._d.valueOf(); + time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; + break; + case 'second': + time = this._d.valueOf(); + time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; + break; + } -exports.replaceDollarWithPercentPair = replaceDollarWithPercentPair -exports.convertToSetCommand = convertToSetCommand -exports.convertToSetCommands = convertToSetCommands - -function convertToSetCommand(key, value) { - var line = "" - key = key || "" - key = key.trim() - value = value || "" - value = value.trim() - if(key && value && value.length > 0) { - line = "@SET " + key + "=" + replaceDollarWithPercentPair(value) + "\r\n" - } - return line -} - -function extractVariableValuePairs(declarations) { - var pairs = {} - declarations.map(function(declaration) { - var split = declaration.split("=") - pairs[split[0]]=split[1] - }) - return pairs -} - -function convertToSetCommands(variableString) { - var variableValuePairs = extractVariableValuePairs(variableString.split(" ")) - var variableDeclarationsAsBatch = "" - Object.keys(variableValuePairs).forEach(function (key) { - variableDeclarationsAsBatch += convertToSetCommand(key, variableValuePairs[key]) - }) - return variableDeclarationsAsBatch -} - -function replaceDollarWithPercentPair(value) { - var dollarExpressions = /\$\{?([^\$@#\?\- \t{}:]+)\}?/g - var result = "" - var startIndex = 0 - value = value || "" - do { - var match = dollarExpressions.exec(value) - if(match) { - var betweenMatches = value.substring(startIndex, match.index) || "" - result += betweenMatches + "%" + match[1] + "%" - startIndex = dollarExpressions.lastIndex - } - } while (dollarExpressions.lastIndex > 0) - result += value.substr(startIndex) - return result -} - - + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; + } + function valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); + } -/***/ }), -/* 33 */ -/***/ (function(module, exports, __webpack_require__) { + function unix () { + return Math.floor(this.valueOf() / 1000); + } -var fs = __webpack_require__(23), - path = __webpack_require__(16); + function toDate () { + return new Date(this.valueOf()); + } -module.exports = ncp; -ncp.ncp = ncp; + function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } -function ncp (source, dest, options, callback) { - var cback = callback; + function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } - if (!callback) { - cback = options; - options = {}; - } + function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } - var basePath = process.cwd(), - currentPath = path.resolve(basePath, source), - targetPath = path.resolve(basePath, dest), - filter = options.filter, - rename = options.rename, - transform = options.transform, - clobber = options.clobber !== false, - modified = options.modified, - dereference = options.dereference, - errs = null, - started = 0, - finished = 0, - running = 0, - limit = options.limit || ncp.limit || 16; + function isValid$2 () { + return isValid(this); + } - limit = (limit < 1) ? 1 : (limit > 512) ? 512 : limit; + function parsingFlags () { + return extend({}, getParsingFlags(this)); + } - startCopy(currentPath); - - function startCopy(source) { - started++; - if (filter) { - if (filter instanceof RegExp) { - if (!filter.test(source)) { - return cb(true); - } - } - else if (typeof filter === 'function') { - if (!filter(source)) { - return cb(true); - } - } + function invalidAt () { + return getParsingFlags(this).overflow; } - return getStats(source); - } - function getStats(source) { - var stat = dereference ? fs.stat : fs.lstat; - if (running >= limit) { - return setImmediate(function () { - getStats(source); - }); + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; } - running++; - stat(source, function (err, stats) { - var item = {}; - if (err) { - return onError(err); - } - // We need to get the mode from the stats object and preserve it. - item.name = source; - item.mode = stats.mode; - item.mtime = stats.mtime; //modified time - item.atime = stats.atime; //access time + // FORMATTING - if (stats.isDirectory()) { - return onDir(item); - } - else if (stats.isFile()) { - return onFile(item); - } - else if (stats.isSymbolicLink()) { - // Symlinks don't really need to know about the mode. - return onLink(source); - } + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; }); - } - function onFile(file) { - var target = file.name.replace(currentPath, targetPath); - if(rename) { - target = rename(target); - } - isWritable(target, function (writable) { - if (writable) { - return copyFile(file, target); - } - if(clobber) { - rmFile(target, function () { - copyFile(file, target); - }); - } - if (modified) { - var stat = dereference ? fs.stat : fs.lstat; - stat(target, function(err, stats) { - //if souce modified time greater to target modified time copy file - if (file.mtime.getTime()>stats.mtime.getTime()) - copyFile(file, target); - else return cb(); - }); - } - else { - return cb(); - } + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; }); - } - function copyFile(file, target) { - var readStream = fs.createReadStream(file.name), - writeStream = fs.createWriteStream(target, { mode: file.mode }); - - readStream.on('error', onError); - writeStream.on('error', onError); - - if(transform) { - transform(readStream, writeStream, file); - } else { - writeStream.on('open', function() { - readStream.pipe(writeStream); - }); + function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); } - writeStream.once('finish', function() { - if (modified) { - //target file modified date sync. - fs.utimesSync(target, file.atime, file.mtime); - cb(); - } - else cb(); - }); - } - function rmFile(file, done) { - fs.unlink(file, function (err) { - if (err) { - return onError(err); - } - return done(); - }); - } + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - function onDir(dir) { - var target = dir.name.replace(currentPath, targetPath); - isWritable(target, function (writable) { - if (writable) { - return mkDir(dir, target); - } - copyDir(dir.name); - }); - } + // ALIASES - function mkDir(dir, target) { - fs.mkdir(target, dir.mode, function (err) { - if (err) { - return onError(err); - } - copyDir(dir.name); - }); - } + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); - function copyDir(dir) { - fs.readdir(dir, function (err, items) { - if (err) { - return onError(err); - } - items.forEach(function (item) { - startCopy(path.join(dir, item)); - }); - return cb(); + // PRIORITY + + addUnitPriority('weekYear', 1); + addUnitPriority('isoWeekYear', 1); + + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); }); - } - function onLink(link) { - var target = link.replace(currentPath, targetPath); - fs.readlink(link, function (err, resolvedPath) { - if (err) { - return onError(err); - } - checkLink(resolvedPath, target); + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); }); - } - function checkLink(resolvedPath, target) { - if (dereference) { - resolvedPath = path.resolve(basePath, resolvedPath); - } - isWritable(target, function (writable) { - if (writable) { - return makeLink(resolvedPath, target); - } - fs.readlink(target, function (err, targetDest) { - if (err) { - return onError(err); - } - if (dereference) { - targetDest = path.resolve(basePath, targetDest); - } - if (targetDest === resolvedPath) { - return cb(); - } - return rmFile(target, function () { - makeLink(resolvedPath, target); - }); - }); - }); - } - - function makeLink(linkPath, target) { - fs.symlink(linkPath, target, function (err) { - if (err) { - return onError(err); - } - return cb(); - }); - } - - function isWritable(path, done) { - fs.lstat(path, function (err) { - if (err) { - if (err.code === 'ENOENT') return done(true); - return done(false); - } - return done(false); - }); - } + // MOMENTS - function onError(err) { - if (options.stopOnError) { - return cback(err); + function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); } - else if (!errs && options.errs) { - errs = fs.createWriteStream(options.errs); + + function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); } - else if (!errs) { - errs = []; + + function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); } - if (typeof errs.write === 'undefined') { - errs.push(err); + + function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } - else { - errs.write(err.stack + '\n\n'); + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } } - return cb(); - } - function cb(skipped) { - if (!skipped) running--; - finished++; - if ((started === finished) && (running === 0)) { - if (cback !== undefined ) { - return errs ? cback(errs) : cback(null); - } + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; } - } -} + // FORMATTING + addFormatToken('Q', 0, 'Qo', 'quarter'); + // ALIASES -/***/ }), -/* 34 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + addUnitAlias('quarter', 'Q'); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log; }); -/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(35); -/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__); -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + // PRIORITY -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ + addUnitPriority('quarter', 7); + // PARSING -class Log extends _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["ToolingLog"] { - constructor() { - super({ - level: 'info', - writeTo: process.stdout + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; }); - _defineProperty(this, "testWriter", void 0); - } - /** - * Log something to the console. Ideally we would use a real logger in - * kbn-pm, but that's a pretty big change for now. - * @param ...args - */ - + // MOMENTS - write(...args) { - // eslint-disable-next-line no-console - console.log(...args); - } + function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } -} + // FORMATTING -const log = new Log(); + addFormatToken('D', ['DD', 2], 'Do', 'date'); -/***/ }), -/* 35 */ -/***/ (function(module, exports, __webpack_require__) { + // ALIASES -"use strict"; + addUnitAlias('date', 'D'); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -var proc_runner_1 = __webpack_require__(37); -exports.withProcRunner = proc_runner_1.withProcRunner; -exports.ProcRunner = proc_runner_1.ProcRunner; -tslib_1.__exportStar(__webpack_require__(414), exports); -var serializers_1 = __webpack_require__(419); -exports.createAbsolutePathSerializer = serializers_1.createAbsolutePathSerializer; -var certs_1 = __webpack_require__(443); -exports.CA_CERT_PATH = certs_1.CA_CERT_PATH; -exports.ES_KEY_PATH = certs_1.ES_KEY_PATH; -exports.ES_CERT_PATH = certs_1.ES_CERT_PATH; -exports.ES_P12_PATH = certs_1.ES_P12_PATH; -exports.ES_P12_PASSWORD = certs_1.ES_P12_PASSWORD; -exports.ES_EMPTYPASSWORD_P12_PATH = certs_1.ES_EMPTYPASSWORD_P12_PATH; -exports.ES_NOPASSWORD_P12_PATH = certs_1.ES_NOPASSWORD_P12_PATH; -exports.KBN_KEY_PATH = certs_1.KBN_KEY_PATH; -exports.KBN_CERT_PATH = certs_1.KBN_CERT_PATH; -exports.KBN_P12_PATH = certs_1.KBN_P12_PATH; -exports.KBN_P12_PASSWORD = certs_1.KBN_P12_PASSWORD; -var run_1 = __webpack_require__(444); -exports.run = run_1.run; -exports.createFailError = run_1.createFailError; -exports.createFlagError = run_1.createFlagError; -exports.combineErrors = run_1.combineErrors; -exports.isFailError = run_1.isFailError; -var repo_root_1 = __webpack_require__(421); -exports.REPO_ROOT = repo_root_1.REPO_ROOT; -var kbn_client_1 = __webpack_require__(449); -exports.KbnClient = kbn_client_1.KbnClient; -tslib_1.__exportStar(__webpack_require__(492), exports); -tslib_1.__exportStar(__webpack_require__(499), exports); + // PRIORITY + addUnitPriority('date', 9); + // PARSING -/***/ }), -/* 36 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; + }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __extends; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __assign; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__rest", function() { return __rest; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __decorate; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__param", function() { return __param; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__metadata", function() { return __metadata; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__awaiter", function() { return __awaiter; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__generator", function() { return __generator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__exportStar", function() { return __exportStar; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__values", function() { return __values; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__read", function() { return __read; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spread", function() { return __spread; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__await", function() { return __await; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncGenerator", function() { return __asyncGenerator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncDelegator", function() { return __asyncDelegator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncValues", function() { return __asyncValues; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__makeTemplateObject", function() { return __makeTemplateObject; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importStar", function() { return __importStar; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importDefault", function() { return __importDefault; }); -/*! ***************************************************************************** -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 __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - } - return __assign.apply(this, arguments); -} - -function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) - t[p[i]] = s[p[i]]; - return t; -} - -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); -} - -function __awaiter(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -function __exportStar(m, exports) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} - -function __values(o) { - var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; - if (m) return m.call(o); - return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; -} - -function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } - catch (error) { e = { error: error }; } - finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } - finally { if (e) throw e.error; } - } - return ar; -} - -function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; -} - -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} - -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } -} - -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } -} - -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } -} - -function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } - return cooked; -}; - -function __importStar(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result.default = mod; - return result; -} - -function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; -} + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); + }); + // MOMENTS -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { + var getSetDayOfMonth = makeGetSet('Date', true); -"use strict"; + // FORMATTING -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var with_proc_runner_1 = __webpack_require__(38); -exports.withProcRunner = with_proc_runner_1.withProcRunner; -var proc_runner_1 = __webpack_require__(39); -exports.ProcRunner = proc_runner_1.ProcRunner; + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + // ALIASES -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { + addUnitAlias('dayOfYear', 'DDD'); -"use strict"; + // PRIORITY + addUnitPriority('dayOfYear', 4); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const proc_runner_1 = __webpack_require__(39); -/** - * Create a ProcRunner and pass it to an async function. When - * the async function finishes the ProcRunner is torn-down - * automatically - * - * @param {ToolingLog} log - * @param {async Function} fn - * @return {Promise} - */ -async function withProcRunner(log, fn) { - const procs = new proc_runner_1.ProcRunner(log); - try { - await fn(procs); - } - finally { - await procs.teardown(); - } -} -exports.withProcRunner = withProcRunner; + // PARSING + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { + // HELPERS -"use strict"; + // MOMENTS -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const moment_1 = tslib_1.__importDefault(__webpack_require__(40)); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const operators_1 = __webpack_require__(270); -const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(368)); -const errors_1 = __webpack_require__(369); -const proc_1 = __webpack_require__(370); -const SECOND = 1000; -const MINUTE = 60 * SECOND; -const noop = () => { }; -/** - * Helper for starting and managing processes. In many ways it resembles the - * API from `grunt_run`, processes are named and can be started, waited for, - * backgrounded once they log something matching a RegExp... - * - * @class ProcRunner - */ -class ProcRunner { - constructor(log) { - this.log = log; - this.closing = false; - this.procs = []; - this.signalUnsubscribe = exit_hook_1.default(() => { - this.teardown().catch((error) => { - log.error(`ProcRunner teardown error: ${error.stack}`); - }); - }); - } - /** - * Start a process, tracking it by `name` - * @param {String} name - * @param {Object} options - * @property {String} options.cmd executable to run - * @property {Array?} options.args arguments to provide the executable - * @property {String?} options.cwd current working directory for the process - * @property {RegExp|Boolean} options.wait Should start() wait for some time? Use - * `true` will wait until the proc exits, - * a `RegExp` will wait until that log line - * is found - * @return {Promise} - */ - async run(name, options) { - const { cmd, args = [], cwd = process.cwd(), stdin = undefined, wait = false, waitTimeout = 15 * MINUTE, env = process.env, } = options; - if (this.closing) { - throw new Error('ProcRunner is closing'); - } - if (wait && !(wait instanceof RegExp) && wait !== true) { - throw new TypeError('wait param should either be a RegExp or `true`'); - } - if (!!this.getProc(name)) { - throw new Error(`Process with name "${name}" already running`); - } - const proc = this.startProc(name, { - cmd, - args, - cwd, - env, - stdin, - }); - try { - if (wait instanceof RegExp) { - // wait for process to log matching line - await Rx.race(proc.lines$.pipe(operators_1.filter((line) => wait.test(line)), operators_1.first(), operators_1.catchError((err) => { - if (err.name !== 'EmptyError') { - throw errors_1.createCliError(`[${name}] exited without matching pattern: ${wait}`); - } - else { - throw err; - } - })), waitTimeout === false - ? Rx.NEVER - : Rx.timer(waitTimeout).pipe(operators_1.map(() => { - const sec = waitTimeout / SECOND; - throw errors_1.createCliError(`[${name}] failed to match pattern within ${sec} seconds [pattern=${wait}]`); - }))).toPromise(); - } - if (wait === true) { - // wait for process to complete - await proc.outcomePromise; - } - } - finally { - // while the procRunner closes promises will resolve/reject because - // processes and stopping, but consumers of run() shouldn't have to - // prepare for that, so just return a never-resolving promise - if (this.closing) { - await new Promise(noop); - } - } - } - /** - * Stop a named proc - */ - async stop(name, signal = 'SIGTERM') { - const proc = this.getProc(name); - if (proc) { - await proc.stop(signal); - } - else { - this.log.warning('[%s] already stopped', name); - } - } - /** - * Wait for all running processes to stop naturally - * @return {Promise} - */ - async waitForAllToStop() { - await Promise.all(this.procs.map((proc) => proc.outcomePromise)); - } - /** - * Close the ProcRunner and stop all running - * processes with `signal` - * - * @param {String} [signal=undefined] - * @return {Promise} - */ - async teardown(signal = 'exit') { - if (this.closing) { - return; - } - this.closing = true; - this.signalUnsubscribe(); - if (!signal && this.procs.length > 0) { - this.log.warning('%d processes left running, stop them with procs.stop(name):', this.procs.length, this.procs.map((proc) => proc.name)); - } - await Promise.all(this.procs.map(async (proc) => { - await proc.stop(signal === 'exit' ? 'SIGKILL' : signal); - })); - } - getProc(name) { - return this.procs.find((proc) => { - return proc.name === name; - }); - } - startProc(name, options) { - const startMs = Date.now(); - const proc = proc_1.startProc(name, options, this.log); - this.procs.push(proc); - const remove = () => { - this.procs.splice(this.procs.indexOf(proc), 1); - }; - // tie into proc outcome$, remove from _procs on compete - proc.outcome$.subscribe({ - next: (code) => { - const duration = moment_1.default.duration(Date.now() - startMs); - this.log.info('[%s] exited with %s after %s', name, code, duration.humanize()); - }, - complete: () => { - remove(); - }, - error: (error) => { - if (this.closing) { - this.log.error(error); - } - remove(); - }, - }); - return proc; + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); } -} -exports.ProcRunner = ProcRunner; - - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(module) {var require;//! moment.js -;(function (global, factory) { - true ? module.exports = factory() : - undefined -}(this, (function () { 'use strict'; + // FORMATTING - var hookCallback; + addFormatToken('m', ['mm', 2], 0, 'minute'); - function hooks () { - return hookCallback.apply(null, arguments); - } + // ALIASES - // This is done to register the method called with moment() - // without creating circular dependencies. - function setHookCallback (callback) { - hookCallback = callback; - } + addUnitAlias('minute', 'm'); - function isArray(input) { - return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; - } + // PRIORITY - function isObject(input) { - // IE8 will treat undefined and null as object if it wasn't for - // input != null - return input != null && Object.prototype.toString.call(input) === '[object Object]'; - } + addUnitPriority('minute', 14); - function isObjectEmpty(obj) { - if (Object.getOwnPropertyNames) { - return (Object.getOwnPropertyNames(obj).length === 0); - } else { - var k; - for (k in obj) { - if (obj.hasOwnProperty(k)) { - return false; - } - } - return true; - } - } + // PARSING - function isUndefined(input) { - return input === void 0; - } + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); - function isNumber(input) { - return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; - } + // MOMENTS - function isDate(input) { - return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; - } + var getSetMinute = makeGetSet('Minutes', false); - function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; - } + // FORMATTING - function hasOwnProp(a, b) { - return Object.prototype.hasOwnProperty.call(a, b); - } + addFormatToken('s', ['ss', 2], 0, 'second'); - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } + // ALIASES - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } + addUnitAlias('second', 's'); - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } + // PRIORITY - return a; - } + addUnitPriority('second', 15); - function createUTC (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, true).utc(); - } + // PARSING - function defaultParsingFlags() { - // We need to deep clone this object. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso : false, - parsedDateParts : [], - meridiem : null, - rfc2822 : false, - weekdayMismatch : false - }; - } + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); - function getParsingFlags(m) { - if (m._pf == null) { - m._pf = defaultParsingFlags(); - } - return m._pf; - } + // MOMENTS - var some; - if (Array.prototype.some) { - some = Array.prototype.some; - } else { - some = function (fun) { - var t = Object(this); - var len = t.length >>> 0; + var getSetSecond = makeGetSet('Seconds', false); - for (var i = 0; i < len; i++) { - if (i in t && fun.call(this, t[i], i, t)) { - return true; - } - } + // FORMATTING - return false; - }; - } + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); - function isValid(m) { - if (m._isValid == null) { - var flags = getParsingFlags(m); - var parsedParts = some.call(flags.parsedDateParts, function (i) { - return i != null; - }); - var isNowValid = !isNaN(m._d.getTime()) && - flags.overflow < 0 && - !flags.empty && - !flags.invalidMonth && - !flags.invalidWeekday && - !flags.weekdayMismatch && - !flags.nullInput && - !flags.invalidFormat && - !flags.userInvalidated && - (!flags.meridiem || (flags.meridiem && parsedParts)); + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); - if (m._strict) { - isNowValid = isNowValid && - flags.charsLeftOver === 0 && - flags.unusedTokens.length === 0 && - flags.bigHour === undefined; - } + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); - if (Object.isFrozen == null || !Object.isFrozen(m)) { - m._isValid = isNowValid; - } - else { - return isNowValid; - } - } - return m._isValid; - } - function createInvalid (flags) { - var m = createUTC(NaN); - if (flags != null) { - extend(getParsingFlags(m), flags); - } - else { - getParsingFlags(m).userInvalidated = true; - } + // ALIASES - return m; - } + addUnitAlias('millisecond', 'ms'); - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - var momentProperties = hooks.momentProperties = []; + // PRIORITY - function copyConfig(to, from) { - var i, prop, val; + addUnitPriority('millisecond', 16); - if (!isUndefined(from._isAMomentObject)) { - to._isAMomentObject = from._isAMomentObject; - } - if (!isUndefined(from._i)) { - to._i = from._i; - } - if (!isUndefined(from._f)) { - to._f = from._f; - } - if (!isUndefined(from._l)) { - to._l = from._l; - } - if (!isUndefined(from._strict)) { - to._strict = from._strict; - } - if (!isUndefined(from._tzm)) { - to._tzm = from._tzm; - } - if (!isUndefined(from._isUTC)) { - to._isUTC = from._isUTC; - } - if (!isUndefined(from._offset)) { - to._offset = from._offset; - } - if (!isUndefined(from._pf)) { - to._pf = getParsingFlags(from); - } - if (!isUndefined(from._locale)) { - to._locale = from._locale; - } + // PARSING - if (momentProperties.length > 0) { - for (i = 0; i < momentProperties.length; i++) { - prop = momentProperties[i]; - val = from[prop]; - if (!isUndefined(val)) { - to[prop] = val; - } - } - } + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); - return to; + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); } - var updateInProgress = false; - - // Moment prototype object - function Moment(config) { - copyConfig(this, config); - this._d = new Date(config._d != null ? config._d.getTime() : NaN); - if (!this.isValid()) { - this._d = new Date(NaN); - } - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - hooks.updateOffset(this); - updateInProgress = false; - } + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); } - function isMoment (obj) { - return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); } + // MOMENTS - function absFloor (number) { - if (number < 0) { - // -0 -> 0 - return Math.ceil(number) || 0; - } else { - return Math.floor(number); - } - } + var getSetMillisecond = makeGetSet('Milliseconds', false); - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; + // FORMATTING - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - value = absFloor(coercedNumber); - } + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); - return value; - } + // MOMENTS - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; + function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; } - function warn(msg) { - if (hooks.suppressDeprecationWarnings === false && - (typeof console !== 'undefined') && console.warn) { - console.warn('Deprecation warning: ' + msg); - } + function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; } - function deprecate(msg, fn) { - var firstTime = true; + var proto = Moment.prototype; - return extend(function () { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(null, msg); - } - if (firstTime) { - var args = []; - var arg; - for (var i = 0; i < arguments.length; i++) { - arg = ''; - if (typeof arguments[i] === 'object') { - arg += '\n[' + i + '] '; - for (var key in arguments[0]) { - arg += key + ': ' + arguments[0][key] + ', '; - } - arg = arg.slice(0, -2); // Remove trailing comma and space - } else { - arg = arguments[i]; - } - args.push(arg); - } - warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); + proto.add = add; + proto.calendar = calendar$1; + proto.clone = clone; + proto.diff = diff; + proto.endOf = endOf; + proto.format = format; + proto.from = from; + proto.fromNow = fromNow; + proto.to = to; + proto.toNow = toNow; + proto.get = stringGet; + proto.invalidAt = invalidAt; + proto.isAfter = isAfter; + proto.isBefore = isBefore; + proto.isBetween = isBetween; + proto.isSame = isSame; + proto.isSameOrAfter = isSameOrAfter; + proto.isSameOrBefore = isSameOrBefore; + proto.isValid = isValid$2; + proto.lang = lang; + proto.locale = locale; + proto.localeData = localeData; + proto.max = prototypeMax; + proto.min = prototypeMin; + proto.parsingFlags = parsingFlags; + proto.set = stringSet; + proto.startOf = startOf; + proto.subtract = subtract; + proto.toArray = toArray; + proto.toObject = toObject; + proto.toDate = toDate; + proto.toISOString = toISOString; + proto.inspect = inspect; + proto.toJSON = toJSON; + proto.toString = toString; + proto.unix = unix; + proto.valueOf = valueOf; + proto.creationData = creationData; + proto.year = getSetYear; + proto.isLeapYear = getIsLeapYear; + proto.weekYear = getSetWeekYear; + proto.isoWeekYear = getSetISOWeekYear; + proto.quarter = proto.quarters = getSetQuarter; + proto.month = getSetMonth; + proto.daysInMonth = getDaysInMonth; + proto.week = proto.weeks = getSetWeek; + proto.isoWeek = proto.isoWeeks = getSetISOWeek; + proto.weeksInYear = getWeeksInYear; + proto.isoWeeksInYear = getISOWeeksInYear; + proto.date = getSetDayOfMonth; + proto.day = proto.days = getSetDayOfWeek; + proto.weekday = getSetLocaleDayOfWeek; + proto.isoWeekday = getSetISODayOfWeek; + proto.dayOfYear = getSetDayOfYear; + proto.hour = proto.hours = getSetHour; + proto.minute = proto.minutes = getSetMinute; + proto.second = proto.seconds = getSetSecond; + proto.millisecond = proto.milliseconds = getSetMillisecond; + proto.utcOffset = getSetOffset; + proto.utc = setOffsetToUTC; + proto.local = setOffsetToLocal; + proto.parseZone = setOffsetToParsedOffset; + proto.hasAlignedHourOffset = hasAlignedHourOffset; + proto.isDST = isDaylightSavingTime; + proto.isLocal = isLocal; + proto.isUtcOffset = isUtcOffset; + proto.isUtc = isUtc; + proto.isUTC = isUtc; + proto.zoneAbbr = getZoneAbbr; + proto.zoneName = getZoneName; + proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); + proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + + function createUnix (input) { + return createLocal(input * 1000); } - var deprecations = {}; + function createInZone () { + return createLocal.apply(null, arguments).parseZone(); + } - function deprecateSimple(name, msg) { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(name, msg); - } - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } + function preParsePostFormat (string) { + return string; } - hooks.suppressDeprecationWarnings = false; - hooks.deprecationHandler = null; + var proto$1 = Locale.prototype; - function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; - } + proto$1.calendar = calendar; + proto$1.longDateFormat = longDateFormat; + proto$1.invalidDate = invalidDate; + proto$1.ordinal = ordinal; + proto$1.preparse = preParsePostFormat; + proto$1.postformat = preParsePostFormat; + proto$1.relativeTime = relativeTime; + proto$1.pastFuture = pastFuture; + proto$1.set = set; - function set (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (isFunction(prop)) { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - this._config = config; - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. - // TODO: Remove "ordinalParse" fallback in next major release. - this._dayOfMonthOrdinalParseLenient = new RegExp( - (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + - '|' + (/\d{1,2}/).source); + proto$1.months = localeMonths; + proto$1.monthsShort = localeMonthsShort; + proto$1.monthsParse = localeMonthsParse; + proto$1.monthsRegex = monthsRegex; + proto$1.monthsShortRegex = monthsShortRegex; + proto$1.week = localeWeek; + proto$1.firstDayOfYear = localeFirstDayOfYear; + proto$1.firstDayOfWeek = localeFirstDayOfWeek; + + proto$1.weekdays = localeWeekdays; + proto$1.weekdaysMin = localeWeekdaysMin; + proto$1.weekdaysShort = localeWeekdaysShort; + proto$1.weekdaysParse = localeWeekdaysParse; + + proto$1.weekdaysRegex = weekdaysRegex; + proto$1.weekdaysShortRegex = weekdaysShortRegex; + proto$1.weekdaysMinRegex = weekdaysMinRegex; + + proto$1.isPM = localeIsPM; + proto$1.meridiem = localeMeridiem; + + function get$1 (format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); } - function mergeConfigs(parentConfig, childConfig) { - var res = extend({}, parentConfig), prop; - for (prop in childConfig) { - if (hasOwnProp(childConfig, prop)) { - if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { - res[prop] = {}; - extend(res[prop], parentConfig[prop]); - extend(res[prop], childConfig[prop]); - } else if (childConfig[prop] != null) { - res[prop] = childConfig[prop]; - } else { - delete res[prop]; - } - } + function listMonthsImpl (format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; } - for (prop in parentConfig) { - if (hasOwnProp(parentConfig, prop) && - !hasOwnProp(childConfig, prop) && - isObject(parentConfig[prop])) { - // make sure changes to properties don't modify parent config - res[prop] = extend({}, res[prop]); - } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); } - return res; - } - function Locale(config) { - if (config != null) { - this.set(config); + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); } + return out; } - var keys; - - if (Object.keys) { - keys = Object.keys; - } else { - keys = function (obj) { - var i, res = []; - for (i in obj) { - if (hasOwnProp(obj, i)) { - res.push(i); - } + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; } - return res; - }; - } - var defaultCalendar = { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }; + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; - function calendar (key, mom, now) { - var output = this._calendar[key] || this._calendar['sameElse']; - return isFunction(output) ? output.call(mom, now) : output; - } + if (isNumber(format)) { + index = format; + format = undefined; + } - var defaultLongDateFormat = { - LTS : 'h:mm:ss A', - LT : 'h:mm A', - L : 'MM/DD/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' - }; + format = format || ''; + } - function longDateFormat (key) { - var format = this._longDateFormat[key], - formatUpper = this._longDateFormat[key.toUpperCase()]; + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; - if (format || !formatUpper) { - return format; + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); } - this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - - return this._longDateFormat[key]; + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; } - var defaultInvalidDate = 'Invalid date'; - - function invalidDate () { - return this._invalidDate; + function listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); } - var defaultOrdinal = '%d'; - var defaultDayOfMonthOrdinalParse = /\d{1,2}/; - - function ordinal (number) { - return this._ordinal.replace('%d', number); + function listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); } - var defaultRelativeTime = { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }; - - function relativeTime (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (isFunction(output)) ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); + function listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } - function pastFuture (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return isFunction(format) ? format(output) : format.replace(/%s/i, output); + function listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } - var aliases = {}; - - function addUnitAlias (unit, shorthand) { - var lowerCase = unit.toLowerCase(); - aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + function listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); } - function normalizeUnits(units) { - return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; - } + getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; + // Side effect imports - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } + hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); + hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); - return normalizedInput; - } + var mathAbs = Math.abs; - var priorities = {}; + function abs () { + var data = this._data; - function addUnitPriority(unit, priority) { - priorities[unit] = priority; - } + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); - function getPrioritizedUnits(unitsObj) { - var units = []; - for (var u in unitsObj) { - units.push({unit: u, priority: priorities[u]}); - } - units.sort(function (a, b) { - return a.priority - b.priority; - }); - return units; - } + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); - function zeroFill(number, targetLength, forceSign) { - var absNumber = '' + Math.abs(number), - zerosToFill = targetLength - absNumber.length, - sign = number >= 0; - return (sign ? (forceSign ? '+' : '') : '-') + - Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + return this; } - var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + function addSubtract$1 (duration, input, value, direction) { + var other = createDuration(input, value); - var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; - var formatFunctions = {}; + return duration._bubble(); + } - var formatTokenFunctions = {}; + // supports only 2.0-style add(1, 's') or add(duration) + function add$1 (input, value) { + return addSubtract$1(this, input, value, 1); + } - // token: 'M' - // padded: ['MM', 2] - // ordinal: 'Mo' - // callback: function () { this.month() + 1 } - function addFormatToken (token, padded, ordinal, callback) { - var func = callback; - if (typeof callback === 'string') { - func = function () { - return this[callback](); - }; - } - if (token) { - formatTokenFunctions[token] = func; - } - if (padded) { - formatTokenFunctions[padded[0]] = function () { - return zeroFill(func.apply(this, arguments), padded[1], padded[2]); - }; - } - if (ordinal) { - formatTokenFunctions[ordinal] = function () { - return this.localeData().ordinal(func.apply(this, arguments), token); - }; - } + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function subtract$1 (input, value) { + return addSubtract$1(this, input, value, -1); } - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); + function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); } - return input.replace(/\\/g, ''); } - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; + function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; } - return function (mom) { - var output = '', i; - for (i = 0; i < length; i++) { - output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; - } - return output; - }; - } + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; - // format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; - format = expandFormat(format, m.localeData()); - formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; - return formatFunctions[format](m); - } + hours = absFloor(minutes / 60); + data.hours = hours % 24; - function expandFormat(format, locale) { - var i = 5; + days += absFloor(hours / 24); - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; - } - - var match1 = /\d/; // 0 - 9 - var match2 = /\d\d/; // 00 - 99 - var match3 = /\d{3}/; // 000 - 999 - var match4 = /\d{4}/; // 0000 - 9999 - var match6 = /[+-]?\d{6}/; // -999999 - 999999 - var match1to2 = /\d\d?/; // 0 - 99 - var match3to4 = /\d\d\d\d?/; // 999 - 9999 - var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 - var match1to3 = /\d{1,3}/; // 0 - 999 - var match1to4 = /\d{1,4}/; // 0 - 9999 - var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - - var matchUnsigned = /\d+/; // 0 - inf - var matchSigned = /[+-]?\d+/; // -inf - inf - - var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z - var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - - var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - - // any word (or two) characters or numbers including two/three word month in arabic. - // includes scottish gaelic two word and hyphenated months - var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; - var regexes = {}; + data.days = days; + data.months = months; + data.years = years; - function addRegexToken (token, regex, strictRegex) { - regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { - return (isStrict && strictRegex) ? strictRegex : regex; - }; + return this; } - function getParseRegexForToken (token, config) { - if (!hasOwnProp(regexes, token)) { - return new RegExp(unescapeFormat(token)); - } - - return regexes[token](config._strict, config._locale); + function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; } - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function unescapeFormat(s) { - return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - })); + function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; } - function regexEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } + function as (units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; - var tokens = {}; + units = normalizeUnits(units); - function addParseToken (token, callback) { - var i, func = callback; - if (typeof token === 'string') { - token = [token]; - } - if (isNumber(callback)) { - func = function (input, array) { - array[callback] = toInt(input); - }; - } - for (i = 0; i < token.length; i++) { - tokens[token[i]] = func; + if (units === 'month' || units === 'quarter' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + switch (units) { + case 'month': return months; + case 'quarter': return months / 3; + case 'year': return months / 12; + } + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } } } - function addWeekParseToken (token, callback) { - addParseToken(token, function (input, array, config, token) { - config._w = config._w || {}; - callback(input, config._w, config, token); - }); - } - - function addTimeToArrayFromToken(token, input, config) { - if (input != null && hasOwnProp(tokens, token)) { - tokens[token](input, config._a, config, token); + // TODO: Use this.as('ms')? + function valueOf$1 () { + if (!this.isValid()) { + return NaN; } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); } - var YEAR = 0; - var MONTH = 1; - var DATE = 2; - var HOUR = 3; - var MINUTE = 4; - var SECOND = 5; - var MILLISECOND = 6; - var WEEK = 7; - var WEEKDAY = 8; - - // FORMATTING - - addFormatToken('Y', 0, 0, function () { - var y = this.year(); - return y <= 9999 ? '' + y : '+' + y; - }); + function makeAs (alias) { + return function () { + return this.as(alias); + }; + } - addFormatToken(0, ['YY', 2], 0, function () { - return this.year() % 100; - }); + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asQuarters = makeAs('Q'); + var asYears = makeAs('y'); - addFormatToken(0, ['YYYY', 4], 0, 'year'); - addFormatToken(0, ['YYYYY', 5], 0, 'year'); - addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + function clone$1 () { + return createDuration(this); + } - // ALIASES + function get$2 (units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; + } - addUnitAlias('year', 'y'); + function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; + } - // PRIORITIES + var milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var months = makeGetter('months'); + var years = makeGetter('years'); - addUnitPriority('year', 1); + function weeks () { + return absFloor(this.days() / 7); + } - // PARSING + var round = Math.round; + var thresholds = { + ss: 44, // a few seconds to seconds + s : 45, // seconds to minute + m : 45, // minutes to hour + h : 22, // hours to day + d : 26, // days to month + M : 11 // months to year + }; - addRegexToken('Y', matchSigned); - addRegexToken('YY', match1to2, match2); - addRegexToken('YYYY', match1to4, match4); - addRegexToken('YYYYY', match1to6, match6); - addRegexToken('YYYYYY', match1to6, match6); + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } - addParseToken(['YYYYY', 'YYYYYY'], YEAR); - addParseToken('YYYY', function (input, array) { - array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); - }); - addParseToken('YY', function (input, array) { - array[YEAR] = hooks.parseTwoDigitYear(input); - }); - addParseToken('Y', function (input, array) { - array[YEAR] = parseInt(input, 10); - }); + function relativeTime$1 (posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); - // HELPERS + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); } - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + // This function allows you to set the rounding function for relative time strings + function getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; } - // HOOKS - - hooks.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; + // This function allows you to set a threshold for relative time strings + function getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; + } - // MOMENTS + function humanize (withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } - var getSetYear = makeGetSet('FullYear', true); + var locale = this.localeData(); + var output = relativeTime$1(this, !withSuffix, locale); - function getIsLeapYear () { - return isLeapYear(this.year()); - } + if (withSuffix) { + output = locale.pastFuture(+this, output); + } - function makeGetSet (unit, keepTime) { - return function (value) { - if (value != null) { - set$1(this, unit, value); - hooks.updateOffset(this, keepTime); - return this; - } else { - return get(this, unit); - } - }; + return locale.postformat(output); } - function get (mom, unit) { - return mom.isValid() ? - mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; - } + var abs$1 = Math.abs; - function set$1 (mom, unit, value) { - if (mom.isValid() && !isNaN(value)) { - if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); - } - else { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } + function sign(x) { + return ((x > 0) - (x < 0)) || +x; } - // MOMENTS - - function stringGet (units) { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](); + function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); } - return this; - } + var seconds = abs$1(this._milliseconds) / 1000; + var days = abs$1(this._days); + var months = abs$1(this._months); + var minutes, hours, years; - function stringSet (units, value) { - if (typeof units === 'object') { - units = normalizeObjectUnits(units); - var prioritized = getPrioritizedUnits(units); - for (var i = 0; i < prioritized.length; i++) { - this[prioritized[i].unit](units[prioritized[i].unit]); - } - } else { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](value); - } - } - return this; - } + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; - function mod(n, x) { - return ((n % x) + x) % x; - } + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; - var indexOf; - if (Array.prototype.indexOf) { - indexOf = Array.prototype.indexOf; - } else { - indexOf = function (o) { - // I know - var i; - for (i = 0; i < this.length; ++i) { - if (this[i] === o) { - return i; - } - } - return -1; - }; - } + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); - function daysInMonth(year, month) { - if (isNaN(year) || isNaN(month)) { - return NaN; + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; } - var modMonth = mod(month, 12); - year += (month - modMonth) / 12; - return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); - } - // FORMATTING + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; - addFormatToken('M', ['MM', 2], 'Mo', function () { - return this.month() + 1; - }); + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); + } - addFormatToken('MMM', 0, 0, function (format) { - return this.localeData().monthsShort(this, format); - }); + var proto$2 = Duration.prototype; - addFormatToken('MMMM', 0, 0, function (format) { - return this.localeData().months(this, format); - }); + proto$2.isValid = isValid$1; + proto$2.abs = abs; + proto$2.add = add$1; + proto$2.subtract = subtract$1; + proto$2.as = as; + proto$2.asMilliseconds = asMilliseconds; + proto$2.asSeconds = asSeconds; + proto$2.asMinutes = asMinutes; + proto$2.asHours = asHours; + proto$2.asDays = asDays; + proto$2.asWeeks = asWeeks; + proto$2.asMonths = asMonths; + proto$2.asQuarters = asQuarters; + proto$2.asYears = asYears; + proto$2.valueOf = valueOf$1; + proto$2._bubble = bubble; + proto$2.clone = clone$1; + proto$2.get = get$2; + proto$2.milliseconds = milliseconds; + proto$2.seconds = seconds; + proto$2.minutes = minutes; + proto$2.hours = hours; + proto$2.days = days; + proto$2.weeks = weeks; + proto$2.months = months; + proto$2.years = years; + proto$2.humanize = humanize; + proto$2.toISOString = toISOString$1; + proto$2.toString = toISOString$1; + proto$2.toJSON = toISOString$1; + proto$2.locale = locale; + proto$2.localeData = localeData; - // ALIASES + proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); + proto$2.lang = lang; - addUnitAlias('month', 'M'); + // Side effect imports - // PRIORITY + // FORMATTING - addUnitPriority('month', 8); + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); // PARSING - addRegexToken('M', match1to2); - addRegexToken('MM', match1to2, match2); - addRegexToken('MMM', function (isStrict, locale) { - return locale.monthsShortRegex(isStrict); - }); - addRegexToken('MMMM', function (isStrict, locale) { - return locale.monthsRegex(isStrict); + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); }); - - addParseToken(['M', 'MM'], function (input, array) { - array[MONTH] = toInt(input) - 1; + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); }); - addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { - var month = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (month != null) { - array[MONTH] = month; - } else { - getParsingFlags(config).invalidMonth = input; - } - }); + // Side effect imports - // LOCALES - var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); - function localeMonths (m, format) { - if (!m) { - return isArray(this._months) ? this._months : - this._months['standalone']; - } - return isArray(this._months) ? this._months[m.month()] : - this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; - } + hooks.version = '2.24.0'; - var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); - function localeMonthsShort (m, format) { - if (!m) { - return isArray(this._monthsShort) ? this._monthsShort : - this._monthsShort['standalone']; - } - return isArray(this._monthsShort) ? this._monthsShort[m.month()] : - this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; - } + setHookCallback(createLocal); - function handleStrictParse(monthName, format, strict) { - var i, ii, mom, llc = monthName.toLocaleLowerCase(); - if (!this._monthsParse) { - // this is not used - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - for (i = 0; i < 12; ++i) { - mom = createUTC([2000, i]); - this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); - this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); - } - } + hooks.fn = proto; + hooks.min = min; + hooks.max = max; + hooks.now = now; + hooks.utc = createUTC; + hooks.unix = createUnix; + hooks.months = listMonths; + hooks.isDate = isDate; + hooks.locale = getSetGlobalLocale; + hooks.invalid = createInvalid; + hooks.duration = createDuration; + hooks.isMoment = isMoment; + hooks.weekdays = listWeekdays; + hooks.parseZone = createInZone; + hooks.localeData = getLocale; + hooks.isDuration = isDuration; + hooks.monthsShort = listMonthsShort; + hooks.weekdaysMin = listWeekdaysMin; + hooks.defineLocale = defineLocale; + hooks.updateLocale = updateLocale; + hooks.locales = listLocales; + hooks.weekdaysShort = listWeekdaysShort; + hooks.normalizeUnits = normalizeUnits; + hooks.relativeTimeRounding = getSetRelativeTimeRounding; + hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; + hooks.calendarFormat = getCalendarFormat; + hooks.prototype = proto; - if (strict) { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } - } + // currently HTML5 input type only supports 24-hour formats + hooks.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'GGGG-[W]WW', // + MONTH: 'YYYY-MM' // + }; - function localeMonthsParse (monthName, format, strict) { - var i, mom, regex; + return hooks; - if (this._monthsParseExact) { - return handleStrictParse.call(this, monthName, format, strict); - } +}))); - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) - // TODO: add sorting - // Sorting makes sure if one month (or abbr) is a prefix of another - // see sorting in computeMonthsParse - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } - } +/***/ }), +/* 11 */ +/***/ (function(module, exports) { - // MOMENTS +module.exports = function(module) { + if (!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; +}; - function setMonth (mom, value) { - var dayOfMonth; - if (!mom.isValid()) { - // No op - return mom; - } +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { - if (typeof value === 'string') { - if (/^\d+$/.test(value)) { - value = toInt(value); - } else { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (!isNumber(value)) { - return mom; - } - } - } +var map = { + "./af": 13, + "./af.js": 13, + "./ar": 14, + "./ar-dz": 15, + "./ar-dz.js": 15, + "./ar-kw": 16, + "./ar-kw.js": 16, + "./ar-ly": 17, + "./ar-ly.js": 17, + "./ar-ma": 18, + "./ar-ma.js": 18, + "./ar-sa": 19, + "./ar-sa.js": 19, + "./ar-tn": 20, + "./ar-tn.js": 20, + "./ar.js": 14, + "./az": 21, + "./az.js": 21, + "./be": 22, + "./be.js": 22, + "./bg": 23, + "./bg.js": 23, + "./bm": 24, + "./bm.js": 24, + "./bn": 25, + "./bn.js": 25, + "./bo": 26, + "./bo.js": 26, + "./br": 27, + "./br.js": 27, + "./bs": 28, + "./bs.js": 28, + "./ca": 29, + "./ca.js": 29, + "./cs": 30, + "./cs.js": 30, + "./cv": 31, + "./cv.js": 31, + "./cy": 32, + "./cy.js": 32, + "./da": 33, + "./da.js": 33, + "./de": 34, + "./de-at": 35, + "./de-at.js": 35, + "./de-ch": 36, + "./de-ch.js": 36, + "./de.js": 34, + "./dv": 37, + "./dv.js": 37, + "./el": 38, + "./el.js": 38, + "./en-SG": 39, + "./en-SG.js": 39, + "./en-au": 40, + "./en-au.js": 40, + "./en-ca": 41, + "./en-ca.js": 41, + "./en-gb": 42, + "./en-gb.js": 42, + "./en-ie": 43, + "./en-ie.js": 43, + "./en-il": 44, + "./en-il.js": 44, + "./en-nz": 45, + "./en-nz.js": 45, + "./eo": 46, + "./eo.js": 46, + "./es": 47, + "./es-do": 48, + "./es-do.js": 48, + "./es-us": 49, + "./es-us.js": 49, + "./es.js": 47, + "./et": 50, + "./et.js": 50, + "./eu": 51, + "./eu.js": 51, + "./fa": 52, + "./fa.js": 52, + "./fi": 53, + "./fi.js": 53, + "./fo": 54, + "./fo.js": 54, + "./fr": 55, + "./fr-ca": 56, + "./fr-ca.js": 56, + "./fr-ch": 57, + "./fr-ch.js": 57, + "./fr.js": 55, + "./fy": 58, + "./fy.js": 58, + "./ga": 59, + "./ga.js": 59, + "./gd": 60, + "./gd.js": 60, + "./gl": 61, + "./gl.js": 61, + "./gom-latn": 62, + "./gom-latn.js": 62, + "./gu": 63, + "./gu.js": 63, + "./he": 64, + "./he.js": 64, + "./hi": 65, + "./hi.js": 65, + "./hr": 66, + "./hr.js": 66, + "./hu": 67, + "./hu.js": 67, + "./hy-am": 68, + "./hy-am.js": 68, + "./id": 69, + "./id.js": 69, + "./is": 70, + "./is.js": 70, + "./it": 71, + "./it-ch": 72, + "./it-ch.js": 72, + "./it.js": 71, + "./ja": 73, + "./ja.js": 73, + "./jv": 74, + "./jv.js": 74, + "./ka": 75, + "./ka.js": 75, + "./kk": 76, + "./kk.js": 76, + "./km": 77, + "./km.js": 77, + "./kn": 78, + "./kn.js": 78, + "./ko": 79, + "./ko.js": 79, + "./ku": 80, + "./ku.js": 80, + "./ky": 81, + "./ky.js": 81, + "./lb": 82, + "./lb.js": 82, + "./lo": 83, + "./lo.js": 83, + "./lt": 84, + "./lt.js": 84, + "./lv": 85, + "./lv.js": 85, + "./me": 86, + "./me.js": 86, + "./mi": 87, + "./mi.js": 87, + "./mk": 88, + "./mk.js": 88, + "./ml": 89, + "./ml.js": 89, + "./mn": 90, + "./mn.js": 90, + "./mr": 91, + "./mr.js": 91, + "./ms": 92, + "./ms-my": 93, + "./ms-my.js": 93, + "./ms.js": 92, + "./mt": 94, + "./mt.js": 94, + "./my": 95, + "./my.js": 95, + "./nb": 96, + "./nb.js": 96, + "./ne": 97, + "./ne.js": 97, + "./nl": 98, + "./nl-be": 99, + "./nl-be.js": 99, + "./nl.js": 98, + "./nn": 100, + "./nn.js": 100, + "./pa-in": 101, + "./pa-in.js": 101, + "./pl": 102, + "./pl.js": 102, + "./pt": 103, + "./pt-br": 104, + "./pt-br.js": 104, + "./pt.js": 103, + "./ro": 105, + "./ro.js": 105, + "./ru": 106, + "./ru.js": 106, + "./sd": 107, + "./sd.js": 107, + "./se": 108, + "./se.js": 108, + "./si": 109, + "./si.js": 109, + "./sk": 110, + "./sk.js": 110, + "./sl": 111, + "./sl.js": 111, + "./sq": 112, + "./sq.js": 112, + "./sr": 113, + "./sr-cyrl": 114, + "./sr-cyrl.js": 114, + "./sr.js": 113, + "./ss": 115, + "./ss.js": 115, + "./sv": 116, + "./sv.js": 116, + "./sw": 117, + "./sw.js": 117, + "./ta": 118, + "./ta.js": 118, + "./te": 119, + "./te.js": 119, + "./tet": 120, + "./tet.js": 120, + "./tg": 121, + "./tg.js": 121, + "./th": 122, + "./th.js": 122, + "./tl-ph": 123, + "./tl-ph.js": 123, + "./tlh": 124, + "./tlh.js": 124, + "./tr": 125, + "./tr.js": 125, + "./tzl": 126, + "./tzl.js": 126, + "./tzm": 127, + "./tzm-latn": 128, + "./tzm-latn.js": 128, + "./tzm.js": 127, + "./ug-cn": 129, + "./ug-cn.js": 129, + "./uk": 130, + "./uk.js": 130, + "./ur": 131, + "./ur.js": 131, + "./uz": 132, + "./uz-latn": 133, + "./uz-latn.js": 133, + "./uz.js": 132, + "./vi": 134, + "./vi.js": 134, + "./x-pseudo": 135, + "./x-pseudo.js": 135, + "./yo": 136, + "./yo.js": 136, + "./zh-cn": 137, + "./zh-cn.js": 137, + "./zh-hk": 138, + "./zh-hk.js": 138, + "./zh-tw": 139, + "./zh-tw.js": 139 +}; - dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - function getSetMonth (value) { - if (value != null) { - setMonth(this, value); - hooks.updateOffset(this, true); - return this; - } else { - return get(this, 'Month'); - } - } +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = 12; - function getDaysInMonth () { - return daysInMonth(this.year(), this.month()); - } +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { - var defaultMonthsShortRegex = matchWord; - function monthsShortRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsShortStrictRegex; - } else { - return this._monthsShortRegex; - } - } else { - if (!hasOwnProp(this, '_monthsShortRegex')) { - this._monthsShortRegex = defaultMonthsShortRegex; - } - return this._monthsShortStrictRegex && isStrict ? - this._monthsShortStrictRegex : this._monthsShortRegex; - } - } +//! moment.js locale configuration - var defaultMonthsRegex = matchWord; - function monthsRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsStrictRegex; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var af = moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; } else { - return this._monthsRegex; - } - } else { - if (!hasOwnProp(this, '_monthsRegex')) { - this._monthsRegex = defaultMonthsRegex; + return isLower ? 'nm' : 'NM'; } - return this._monthsStrictRegex && isStrict ? - this._monthsStrictRegex : this._monthsRegex; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + ss : '%d sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. } - } + }); - function computeMonthsParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } + return af; - var shortPieces = [], longPieces = [], mixedPieces = [], - i, mom; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - shortPieces.push(this.monthsShort(mom, '')); - longPieces.push(this.months(mom, '')); - mixedPieces.push(this.months(mom, '')); - mixedPieces.push(this.monthsShort(mom, '')); - } - // Sorting makes sure if one month (or abbr) is a prefix of another it - // will match the longer piece. - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 12; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - } - for (i = 0; i < 24; i++) { - mixedPieces[i] = regexEscape(mixedPieces[i]); - } +}))); - this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._monthsShortRegex = this._monthsRegex; - this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - } - function createDate (y, m, d, h, M, s, ms) { - // can't just apply() to create a date: - // https://stackoverflow.com/q/181348 - var date; - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - // preserve leap years using a full 400 year cycle, then reset - date = new Date(y + 400, m, d, h, M, s, ms); - if (isFinite(date.getFullYear())) { - date.setFullYear(y); - } - } else { - date = new Date(y, m, d, h, M, s, ms); - } +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { - return date; - } +//! moment.js locale configuration - function createUTCDate (y) { - var date; - // the Date.UTC function remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - var args = Array.prototype.slice.call(arguments); - // preserve leap years using a full 400 year cycle, then reset - args[0] = y + 400; - date = new Date(Date.UTC.apply(null, args)); - if (isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(y); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; } - } else { - date = new Date(Date.UTC.apply(null, arguments)); + return str.replace(/%d/i, number); + }; + }, months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر' + ]; + + var ar = moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/\u200FM/\u200FYYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + ss : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } + }); - return date; - } + return ar; - // start-of-first-week - start-of-year - function firstWeekOffset(year, dow, doy) { - var // first-week day -- which january is always in the first week (4 for iso, 1 for other) - fwd = 7 + dow - doy, - // first-week day local weekday -- which local weekday is fwd - fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; +}))); - return -fwdlw + fwd - 1; - } - // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, dow, doy) { - var localWeekday = (7 + weekday - dow) % 7, - weekOffset = firstWeekOffset(year, dow, doy), - dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, - resYear, resDayOfYear; +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { - if (dayOfYear <= 0) { - resYear = year - 1; - resDayOfYear = daysInYear(resYear) + dayOfYear; - } else if (dayOfYear > daysInYear(year)) { - resYear = year + 1; - resDayOfYear = dayOfYear - daysInYear(year); - } else { - resYear = year; - resDayOfYear = dayOfYear; - } +//! moment.js locale configuration - return { - year: resYear, - dayOfYear: resDayOfYear - }; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function weekOfYear(mom, dow, doy) { - var weekOffset = firstWeekOffset(mom.year(), dow, doy), - week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, - resWeek, resYear; - if (week < 1) { - resYear = mom.year() - 1; - resWeek = week + weeksInYear(resYear, dow, doy); - } else if (week > weeksInYear(mom.year(), dow, doy)) { - resWeek = week - weeksInYear(mom.year(), dow, doy); - resYear = mom.year() + 1; - } else { - resYear = mom.year(); - resWeek = week; + var arDz = moment.defineLocale('ar-dz', { + months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - return { - week: resWeek, - year: resYear - }; - } + return arDz; - function weeksInYear(year, dow, doy) { - var weekOffset = firstWeekOffset(year, dow, doy), - weekOffsetNext = firstWeekOffset(year + 1, dow, doy); - return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; - } +}))); - // FORMATTING - addFormatToken('w', ['ww', 2], 'wo', 'week'); - addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { - // ALIASES +//! moment.js locale configuration - addUnitAlias('week', 'w'); - addUnitAlias('isoWeek', 'W'); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PRIORITIES - addUnitPriority('week', 5); - addUnitPriority('isoWeek', 5); + var arKw = moment.defineLocale('ar-kw', { + months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. + } + }); - // PARSING + return arKw; - addRegexToken('w', match1to2); - addRegexToken('ww', match1to2, match2); - addRegexToken('W', match1to2); - addRegexToken('WW', match1to2, match2); +}))); - addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); - }); - // HELPERS +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { - // LOCALES +//! moment.js locale configuration - function localeWeek (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var defaultLocaleWeek = { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. - }; - function localeFirstDayOfWeek () { - return this._week.dow; - } + var symbolMap = { + '1': '1', + '2': '2', + '3': '3', + '4': '4', + '5': '5', + '6': '6', + '7': '7', + '8': '8', + '9': '9', + '0': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر' + ]; - function localeFirstDayOfYear () { - return this._week.doy; - } + var arLy = moment.defineLocale('ar-ly', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/\u200FM/\u200FYYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + ss : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. + } + }); - // MOMENTS + return arLy; - function getSetWeek (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - } +}))); - function getSetISOWeek (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - } - // FORMATTING +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { - addFormatToken('d', 0, 'do', 'day'); +//! moment.js locale configuration - addFormatToken('dd', 0, 0, function (format) { - return this.localeData().weekdaysMin(this, format); - }); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - addFormatToken('ddd', 0, 0, function (format) { - return this.localeData().weekdaysShort(this, format); - }); - addFormatToken('dddd', 0, 0, function (format) { - return this.localeData().weekdays(this, format); + var arMa = moment.defineLocale('ar-ma', { + months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. + } }); - addFormatToken('e', 0, 0, 'weekday'); - addFormatToken('E', 0, 0, 'isoWeekday'); + return arMa; - // ALIASES +}))); - addUnitAlias('day', 'd'); - addUnitAlias('weekday', 'e'); - addUnitAlias('isoWeekday', 'E'); - // PRIORITY - addUnitPriority('day', 11); - addUnitPriority('weekday', 11); - addUnitPriority('isoWeekday', 11); +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { - // PARSING +//! moment.js locale configuration - addRegexToken('d', match1to2); - addRegexToken('e', match1to2); - addRegexToken('E', match1to2); - addRegexToken('dd', function (isStrict, locale) { - return locale.weekdaysMinRegex(isStrict); - }); - addRegexToken('ddd', function (isStrict, locale) { - return locale.weekdaysShortRegex(isStrict); - }); - addRegexToken('dddd', function (isStrict, locale) { - return locale.weekdaysRegex(isStrict); - }); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { - var weekday = config._locale.weekdaysParse(input, token, config._strict); - // if we didn't get a weekday name, mark the date as invalid - if (weekday != null) { - week.d = weekday; - } else { - getParsingFlags(config).invalidWeekday = input; - } - }); - addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { - week[token] = toInt(input); + var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }; + + var arSa = moment.defineLocale('ar-sa', { + months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. + } }); - // HELPERS + return arSa; - function parseWeekday(input, locale) { - if (typeof input !== 'string') { - return input; - } +}))); - if (!isNaN(input)) { - return parseInt(input, 10); - } - input = locale.weekdaysParse(input); - if (typeof input === 'number') { - return input; - } +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { - return null; - } +//! moment.js locale configuration - function parseIsoWeekday(input, locale) { - if (typeof input === 'string') { - return locale.weekdaysParse(input) % 7 || 7; - } - return isNaN(input) ? null : input; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // LOCALES - function shiftWeekdays (ws, n) { - return ws.slice(n, 7).concat(ws.slice(0, n)); - } - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); - function localeWeekdays (m, format) { - var weekdays = isArray(this._weekdays) ? this._weekdays : - this._weekdays[(m && m !== true && this._weekdays.isFormat.test(format)) ? 'format' : 'standalone']; - return (m === true) ? shiftWeekdays(weekdays, this._week.dow) - : (m) ? weekdays[m.day()] : weekdays; - } - - var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); - function localeWeekdaysShort (m) { - return (m === true) ? shiftWeekdays(this._weekdaysShort, this._week.dow) - : (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; - } + var arTn = moment.defineLocale('ar-tn', { + months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'في %s', + past: 'منذ %s', + s: 'ثوان', + ss : '%d ثانية', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); - var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); - function localeWeekdaysMin (m) { - return (m === true) ? shiftWeekdays(this._weekdaysMin, this._week.dow) - : (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; - } + return arTn; - function handleStrictParse$1(weekdayName, format, strict) { - var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._shortWeekdaysParse = []; - this._minWeekdaysParse = []; +}))); - for (i = 0; i < 7; ++i) { - mom = createUTC([2000, 1]).day(i); - this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); - this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); - this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); - } - } - if (strict) { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } - } +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { - function localeWeekdaysParse (weekdayName, format, strict) { - var i, mom, regex; +//! moment.js locale configuration - if (this._weekdaysParseExact) { - return handleStrictParse$1.call(this, weekdayName, format, strict); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._minWeekdaysParse = []; - this._shortWeekdaysParse = []; - this._fullWeekdaysParse = []; - } - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + 6: '-ncı', + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + 60: '-ıncı', + 90: '-ıncı' + }; - mom = createUTC([2000, 1]).day(i); - if (strict && !this._fullWeekdaysParse[i]) { - this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i'); - this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i'); - this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i'); - } - if (!this._weekdaysParse[i]) { - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + var az = moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gələn həftə] dddd [saat] LT', + lastDay : '[dünən] LT', + lastWeek : '[keçən həftə] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s əvvəl', + s : 'birneçə saniyə', + ss : '%d saniyə', + m : 'bir dəqiqə', + mm : '%d dəqiqə', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecə|səhər|gündüz|axşam/, + isPM : function (input) { + return /^(gündüz|axşam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecə'; + } else if (hour < 12) { + return 'səhər'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axşam'; } - // test the regex - if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { - return i; + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } - } + }); - // MOMENTS + return az; - function getSetDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - } +}))); - function getSetLocaleDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - } - function getSetISODayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. +//! moment.js locale configuration - if (input != null) { - var weekday = parseIsoWeekday(input, this.localeData()); - return this.day(this.day() % 7 ? weekday : weekday - 7); - } else { - return this.day() || 7; - } - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var defaultWeekdaysRegex = matchWord; - function weekdaysRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysStrictRegex; - } else { - return this._weekdaysRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysRegex')) { - this._weekdaysRegex = defaultWeekdaysRegex; - } - return this._weekdaysStrictRegex && isStrict ? - this._weekdaysStrictRegex : this._weekdaysRegex; - } - } - var defaultWeekdaysShortRegex = matchWord; - function weekdaysShortRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysShortStrictRegex; - } else { - return this._weekdaysShortRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysShortRegex')) { - this._weekdaysShortRegex = defaultWeekdaysShortRegex; - } - return this._weekdaysShortStrictRegex && isStrict ? - this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'месяц_месяцы_месяцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); } } - var defaultWeekdaysMinRegex = matchWord; - function weekdaysMinRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysMinStrictRegex; + var be = moment.defineLocale('be', { + months : { + format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'), + standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_') + }, + monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'), + weekdays : { + format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'), + standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'), + isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/ + }, + weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., HH:mm', + LLLL : 'dddd, D MMMM YYYY г., HH:mm' + }, + calendar : { + sameDay: '[Сёння ў] LT', + nextDay: '[Заўтра ў] LT', + lastDay: '[Учора ў] LT', + nextWeek: function () { + return '[У] dddd [ў] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [ў] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [ў] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі секунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'месяц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|дня|вечара/, + isPM : function (input) { + return /^(дня|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'дня'; } else { - return this._weekdaysMinRegex; + return 'вечара'; } - } else { - if (!hasOwnProp(this, '_weekdaysMinRegex')) { - this._weekdaysMinRegex = defaultWeekdaysMinRegex; + }, + dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы'; + case 'D': + return number + '-га'; + default: + return number; } - return this._weekdaysMinStrictRegex && isStrict ? - this._weekdaysMinStrictRegex : this._weekdaysMinRegex; - } - } - - - function computeWeekdaysParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], - i, mom, minp, shortp, longp; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, 1]).day(i); - minp = this.weekdaysMin(mom, ''); - shortp = this.weekdaysShort(mom, ''); - longp = this.weekdays(mom, ''); - minPieces.push(minp); - shortPieces.push(shortp); - longPieces.push(longp); - mixedPieces.push(minp); - mixedPieces.push(shortp); - mixedPieces.push(longp); - } - // Sorting makes sure if one weekday (or abbr) is a prefix of another it - // will match the longer piece. - minPieces.sort(cmpLenRev); - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 7; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - mixedPieces[i] = regexEscape(mixedPieces[i]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } + }); - this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._weekdaysShortRegex = this._weekdaysRegex; - this._weekdaysMinRegex = this._weekdaysRegex; + return be; - this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); - } +}))); - // FORMATTING - function hFormat() { - return this.hours() % 12 || 12; - } +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { - function kFormat() { - return this.hours() || 24; - } +//! moment.js locale configuration - addFormatToken('H', ['HH', 2], 0, 'hour'); - addFormatToken('h', ['hh', 2], 0, hFormat); - addFormatToken('k', ['kk', 2], 0, kFormat); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - addFormatToken('hmm', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); - }); - addFormatToken('hmmss', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - addFormatToken('Hmm', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2); - }); - - addFormatToken('Hmmss', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); + var bg = moment.defineLocale('bg', { + months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'), + weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Днес в] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[В изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[В изминалия] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'след %s', + past : 'преди %s', + s : 'няколко секунди', + ss : '%d секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дни', + M : 'месец', + MM : '%d месеца', + y : 'година', + yy : '%d години' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. + } }); - function meridiem (token, lowercase) { - addFormatToken(token, 0, 0, function () { - return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); - }); - } - - meridiem('a', true); - meridiem('A', false); - - // ALIASES - - addUnitAlias('hour', 'h'); - - // PRIORITY - addUnitPriority('hour', 13); - - // PARSING + return bg; - function matchMeridiem (isStrict, locale) { - return locale._meridiemParse; - } +}))); - addRegexToken('a', matchMeridiem); - addRegexToken('A', matchMeridiem); - addRegexToken('H', match1to2); - addRegexToken('h', match1to2); - addRegexToken('k', match1to2); - addRegexToken('HH', match1to2, match2); - addRegexToken('hh', match1to2, match2); - addRegexToken('kk', match1to2, match2); - addRegexToken('hmm', match3to4); - addRegexToken('hmmss', match5to6); - addRegexToken('Hmm', match3to4); - addRegexToken('Hmmss', match5to6); +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { - addParseToken(['H', 'HH'], HOUR); - addParseToken(['k', 'kk'], function (input, array, config) { - var kInput = toInt(input); - array[HOUR] = kInput === 24 ? 0 : kInput; - }); - addParseToken(['a', 'A'], function (input, array, config) { - config._isPm = config._locale.isPM(input); - config._meridiem = input; - }); - addParseToken(['h', 'hh'], function (input, array, config) { - array[HOUR] = toInt(input); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('Hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - }); - addParseToken('Hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - }); +//! moment.js locale configuration - // LOCALES +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function localeIsPM (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - } - var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; - function localeMeridiem (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; + var bm = moment.defineLocale('bm', { + months : 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'), + monthsShort : 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'), + weekdays : 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'), + weekdaysShort : 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'), + weekdaysMin : 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'MMMM [tile] D [san] YYYY', + LLL : 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', + LLLL : 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm' + }, + calendar : { + sameDay : '[Bi lɛrɛ] LT', + nextDay : '[Sini lɛrɛ] LT', + nextWeek : 'dddd [don lɛrɛ] LT', + lastDay : '[Kunu lɛrɛ] LT', + lastWeek : 'dddd [tɛmɛnen lɛrɛ] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s kɔnɔ', + past : 'a bɛ %s bɔ', + s : 'sanga dama dama', + ss : 'sekondi %d', + m : 'miniti kelen', + mm : 'miniti %d', + h : 'lɛrɛ kelen', + hh : 'lɛrɛ %d', + d : 'tile kelen', + dd : 'tile %d', + M : 'kalo kelen', + MM : 'kalo %d', + y : 'san kelen', + yy : 'san %d' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); + return bm; - // MOMENTS +}))); - // Setting the hour should keep the time, because the user explicitly - // specified which hour they want. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - var getSetHour = makeGetSet('Hours', true); - var baseConfig = { - calendar: defaultCalendar, - longDateFormat: defaultLongDateFormat, - invalidDate: defaultInvalidDate, - ordinal: defaultOrdinal, - dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, - relativeTime: defaultRelativeTime, +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { - months: defaultLocaleMonths, - monthsShort: defaultLocaleMonthsShort, +//! moment.js locale configuration - week: defaultLocaleWeek, +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - weekdays: defaultLocaleWeekdays, - weekdaysMin: defaultLocaleWeekdaysMin, - weekdaysShort: defaultLocaleWeekdaysShort, - meridiemParse: defaultLocaleMeridiemParse + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' }; - // internal storage for locale config files - var locales = {}; - var localeFamilies = {}; - var globalLocale; - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - - // pick the locale from the array - // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return globalLocale; - } - - function loadLocale(name) { - var oldLocale = null; - // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && (typeof module !== 'undefined') && - module && module.exports) { - try { - oldLocale = globalLocale._abbr; - var aliasedRequire = require; - __webpack_require__(41)("./" + name); - getSetGlobalLocale(oldLocale); - } catch (e) {} - } - return locales[name]; - } - - // This function will load locale and then set the global locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - function getSetGlobalLocale (key, values) { - var data; - if (key) { - if (isUndefined(values)) { - data = getLocale(key); - } - else { - data = defineLocale(key, values); + var bn = moment.defineLocale('bn', { + months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'), + monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'), + weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm সময়', + LLLL : 'dddd, D MMMM YYYY, A h:mm সময়' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কয়েক সেকেন্ড', + ss : '%d সেকেন্ড', + m : 'এক মিনিট', + mm : '%d মিনিট', + h : 'এক ঘন্টা', + hh : '%d ঘন্টা', + d : 'এক দিন', + dd : '%d দিন', + M : 'এক মাস', + MM : '%d মাস', + y : 'এক বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; } - - if (data) { - // moment.duration._locale = moment._locale = data; - globalLocale = data; + if ((meridiem === 'রাত' && hour >= 4) || + (meridiem === 'দুপুর' && hour < 5) || + meridiem === 'বিকাল') { + return hour + 12; + } else { + return hour; } - else { - if ((typeof console !== 'undefined') && console.warn) { - //warn user if arguments are passed but the locale could not be set - console.warn('Locale ' + key + ' not found. Did you forget to load it?'); - } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'সকাল'; + } else if (hour < 17) { + return 'দুপুর'; + } else if (hour < 20) { + return 'বিকাল'; + } else { + return 'রাত'; } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } + }); - return globalLocale._abbr; - } - - function defineLocale (name, config) { - if (config !== null) { - var locale, parentConfig = baseConfig; - config.abbr = name; - if (locales[name] != null) { - deprecateSimple('defineLocaleOverride', - 'use moment.updateLocale(localeName, config) to change ' + - 'an existing locale. moment.defineLocale(localeName, ' + - 'config) should only be used for creating a new locale ' + - 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); - parentConfig = locales[name]._config; - } else if (config.parentLocale != null) { - if (locales[config.parentLocale] != null) { - parentConfig = locales[config.parentLocale]._config; - } else { - locale = loadLocale(config.parentLocale); - if (locale != null) { - parentConfig = locale._config; - } else { - if (!localeFamilies[config.parentLocale]) { - localeFamilies[config.parentLocale] = []; - } - localeFamilies[config.parentLocale].push({ - name: name, - config: config - }); - return null; - } - } - } - locales[name] = new Locale(mergeConfigs(parentConfig, config)); - - if (localeFamilies[name]) { - localeFamilies[name].forEach(function (x) { - defineLocale(x.name, x.config); - }); - } - - // backwards compat for now: also set the locale - // make sure we set the locale AFTER all child locales have been - // created, so we won't end up with the child locale set. - getSetGlobalLocale(name); + return bn; +}))); - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - } - function updateLocale(name, config) { - if (config != null) { - var locale, tmpLocale, parentConfig = baseConfig; - // MERGE - tmpLocale = loadLocale(name); - if (tmpLocale != null) { - parentConfig = tmpLocale._config; - } - config = mergeConfigs(parentConfig, config); - locale = new Locale(config); - locale.parentLocale = locales[name]; - locales[name] = locale; +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { - // backwards compat for now: also set the locale - getSetGlobalLocale(name); - } else { - // pass null for config to unupdate, useful for tests - if (locales[name] != null) { - if (locales[name].parentLocale != null) { - locales[name] = locales[name].parentLocale; - } else if (locales[name] != null) { - delete locales[name]; - } - } - } - return locales[name]; - } +//! moment.js locale configuration - // returns locale data - function getLocale (key) { - var locale; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - if (!key) { - return globalLocale; - } + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; + var bo = moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[ཁ་སང] LT', + lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + ss : '%d སྐར་ཆ།', + m : 'སྐར་མ་གཅིག', + mm : '%d སྐར་མ', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; } - key = [key]; + if ((meridiem === 'མཚན་མོ' && hour >= 4) || + (meridiem === 'ཉིན་གུང' && hour < 5) || + meridiem === 'དགོང་དག') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } + }); - return chooseLocale(key); - } + return bo; - function listLocales() { - return keys(locales); - } +}))); - function checkOverflow (m) { - var overflow; - var a = m._a; - if (a && getParsingFlags(m).overflow === -2) { - overflow = - a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : - a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : - a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : - a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : - a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : - a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : - -1; +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { - if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - if (getParsingFlags(m)._overflowWeeks && overflow === -1) { - overflow = WEEK; - } - if (getParsingFlags(m)._overflowWeekday && overflow === -1) { - overflow = WEEKDAY; - } +//! moment.js locale configuration - getParsingFlags(m).overflow = overflow; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - return m; - } - // Pick the first defined of two or three arguments. - function defaults(a, b, c) { - if (a != null) { - return a; + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; } - if (b != null) { - return b; + } + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); } - return c; + return number; } - - function currentDateArray(config) { - // hooks is actually the exported moment object - var nowValue = new Date(hooks.now()); - if (config._useUTC) { - return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + function mutation(text, number) { + if (number === 2) { + return softMutation(text); } - return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + return text; } - - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function configFromArray (config) { - var i, date, input = [], currentDate, expectedWeekday, yearToUse; - - if (config._d) { - return; + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; } + return mutationTable[text.charAt(0)] + text.substring(1); + } - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); + var br = moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY h[e]mm A', + LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + ss : '%d eilenn', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - //if the day of the year is set, figure out what it is - if (config._dayOfYear != null) { - yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { - getParsingFlags(config)._overflowDayOfYear = true; - } - - date = createUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } + return br; - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } +}))); - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { - config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); - expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); +//! moment.js locale configuration - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (config._nextDay) { - config._a[HOUR] = 24; - } - // check for mismatching day of week - if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { - getParsingFlags(config).weekdayMismatch = true; + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + if (number === 1) { + result += 'sekunda'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sekunde'; + } else { + result += 'sekundi'; + } + return result; + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; } } - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + var bs = moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. + } + }); - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; + return bs; - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); - week = defaults(w.W, 1); - weekday = defaults(w.E, 1); - if (weekday < 1 || weekday > 7) { - weekdayOverflow = true; - } - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; +}))); - var curWeek = weekOfYear(createLocal(), dow, doy); - weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { - // Default to current week. - week = defaults(w.w, curWeek.week); +//! moment.js locale configuration - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < 0 || weekday > 6) { - weekdayOverflow = true; - } - } else if (w.e != null) { - // local weekday -- counting starts from beginning of week - weekday = w.e + dow; - if (w.e < 0 || w.e > 6) { - weekdayOverflow = true; - } - } else { - // default to beginning of week - weekday = dow; - } - } - if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { - getParsingFlags(config)._overflowWeeks = true; - } else if (weekdayOverflow != null) { - getParsingFlags(config)._overflowWeekday = true; - } else { - temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; - - var isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], - ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], - ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], - ['GGGG-[W]WW', /\d{4}-W\d\d/, false], - ['YYYY-DDD', /\d{4}-\d{3}/], - ['YYYY-MM', /\d{4}-\d\d/, false], - ['YYYYYYMMDD', /[+-]\d{10}/], - ['YYYYMMDD', /\d{8}/], - // YYYYMM is NOT allowed by the standard - ['GGGG[W]WWE', /\d{4}W\d{3}/], - ['GGGG[W]WW', /\d{4}W\d{2}/, false], - ['YYYYDDD', /\d{7}/] - ]; - - // iso time formats and regexes - var isoTimes = [ - ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], - ['HH:mm:ss', /\d\d:\d\d:\d\d/], - ['HH:mm', /\d\d:\d\d/], - ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], - ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], - ['HHmmss', /\d\d\d\d\d\d/], - ['HHmm', /\d\d\d\d/], - ['HH', /\d\d/] - ]; + var ca = moment.defineLocale('ca', { + months : { + standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + format: 'de gener_de febrer_de març_d\'abril_de maig_de juny_de juliol_d\'agost_de setembre_d\'octubre_de novembre_de desembre'.split('_'), + isFormat: /D[oD]?(\s)+MMMM/ + }, + monthsShort : 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'dg_dl_dt_dc_dj_dv_ds'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [de] YYYY', + ll : 'D MMM YYYY', + LLL : 'D MMMM [de] YYYY [a les] H:mm', + lll : 'D MMM YYYY, H:mm', + LLLL : 'dddd D MMMM [de] YYYY [a les] H:mm', + llll : 'ddd D MMM YYYY, H:mm' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'd\'aquí %s', + past : 'fa %s', + s : 'uns segons', + ss : '%d segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + return ca; - // date from iso format - function configFromISO(config) { - var i, l, - string = config._i, - match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), - allowTime, dateFormat, timeFormat, tzFormat; +}))); - if (match) { - getParsingFlags(config).iso = true; - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(match[1])) { - dateFormat = isoDates[i][0]; - allowTime = isoDates[i][2] !== false; - break; - } - } - if (dateFormat == null) { - config._isValid = false; - return; - } - if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(match[3])) { - // match[2] should be 'T' or space - timeFormat = (match[2] || ' ') + isoTimes[i][0]; - break; - } - } - if (timeFormat == null) { - config._isValid = false; - return; - } - } - if (!allowTime && timeFormat != null) { - config._isValid = false; - return; - } - if (match[4]) { - if (tzRegex.exec(match[4])) { - tzFormat = 'Z'; - } else { - config._isValid = false; - return; - } - } - config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); - configFromStringAndFormat(config); - } else { - config._isValid = false; - } - } +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { - // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 - var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; +//! moment.js locale configuration - function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { - var result = [ - untruncateYear(yearStr), - defaultLocaleMonthsShort.indexOf(monthStr), - parseInt(dayStr, 10), - parseInt(hourStr, 10), - parseInt(minuteStr, 10) - ]; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (secondStr) { - result.push(parseInt(secondStr, 10)); - } - return result; - } + var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'); - function untruncateYear(yearStr) { - var year = parseInt(yearStr, 10); - if (year <= 49) { - return 2000 + year; - } else if (year <= 999) { - return 1900 + year; - } - return year; - } + var monthsParse = [/^led/i, /^úno/i, /^bře/i, /^dub/i, /^kvě/i, /^(čvn|červen$|června)/i, /^(čvc|červenec|července)/i, /^srp/i, /^zář/i, /^říj/i, /^lis/i, /^pro/i]; + // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched. + // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'. + var monthsRegex = /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i; - function preprocessRFC2822(s) { - // Remove comments and folding whitespace and replace multiple-spaces with a single space - return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); } - - function checkWeekday(weekdayStr, parsedInput, config) { - if (weekdayStr) { - // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. - var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), - weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); - if (weekdayProvided !== weekdayActual) { - getParsingFlags(config).weekdayMismatch = true; - config._isValid = false; - return false; - } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'sekundy' : 'sekund'); + } else { + return result + 'sekundami'; + } + break; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'měsíce' : 'měsíců'); + } else { + return result + 'měsíci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; } - return true; } - var obsOffsets = { - UT: 0, - GMT: 0, - EDT: -4 * 60, - EST: -5 * 60, - CDT: -5 * 60, - CST: -6 * 60, - MDT: -6 * 60, - MST: -7 * 60, - PDT: -7 * 60, - PST: -8 * 60 - }; - - function calculateOffset(obsOffset, militaryOffset, numOffset) { - if (obsOffset) { - return obsOffsets[obsOffset]; - } else if (militaryOffset) { - // the only allowed military tz is Z - return 0; - } else { - var hm = parseInt(numOffset, 10); - var m = hm % 100, h = (hm - m) / 100; - return h * 60 + m; + var cs = moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsRegex : monthsRegex, + monthsShortRegex : monthsRegex, + // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched. + // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'. + monthsStrictRegex : /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i, + monthsShortStrictRegex : /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i, + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm', + l : 'D. M. YYYY' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v neděli v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve středu v] LT'; + case 4: + return '[ve čtvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[včera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou neděli v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou středu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'před %s', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); - // date and time from ref 2822 format - function configFromRFC2822(config) { - var match = rfc2822.exec(preprocessRFC2822(config._i)); - if (match) { - var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); - if (!checkWeekday(match[1], parsedArray, config)) { - return; - } + return cs; - config._a = parsedArray; - config._tzm = calculateOffset(match[8], match[9], match[10]); +}))); - config._d = createUTCDate.apply(null, config._a); - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - getParsingFlags(config).rfc2822 = true; - } else { - config._isValid = false; - } - } +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { - // date from iso format or fallback - function configFromString(config) { - var matched = aspNetJsonRegex.exec(config._i); +//! moment.js locale configuration - if (matched !== null) { - config._d = new Date(+matched[1]); - return; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - configFromISO(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - configFromRFC2822(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; + var cv = moment.defineLocale('cv', { + months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'), + weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'), + weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', + LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', + LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm' + }, + calendar : { + sameDay: '[Паян] LT [сехетре]', + nextDay: '[Ыран] LT [сехетре]', + lastDay: '[Ӗнер] LT [сехетре]', + nextWeek: '[Ҫитес] dddd LT [сехетре]', + lastWeek: '[Иртнӗ] dddd LT [сехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каялла', + s : 'пӗр-ик ҫеккунт', + ss : '%d ҫеккунт', + m : 'пӗр минут', + mm : '%d минут', + h : 'пӗр сехет', + hh : '%d сехет', + d : 'пӗр кун', + dd : '%d кун', + M : 'пӗр уйӑх', + MM : '%d уйӑх', + y : 'пӗр ҫул', + yy : '%d ҫул' + }, + dayOfMonthOrdinalParse: /\d{1,2}-мӗш/, + ordinal : '%d-мӗш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } + }); - // Final attempt, use Input Fallback - hooks.createFromInputFallback(config); - } + return cv; - hooks.createFromInputFallback = deprecate( - 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + - 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + - 'discouraged and will be removed in an upcoming major release. Please refer to ' + - 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } - ); +}))); - // constant that refers to the ISO standard - hooks.ISO_8601 = function () {}; - // constant that refers to the RFC 2822 form - hooks.RFC_2822 = function () {}; +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { - // date from string and format string - function configFromStringAndFormat(config) { - // TODO: Move this to another part of the creation flow to prevent circular deps - if (config._f === hooks.ISO_8601) { - configFromISO(config); - return; - } - if (config._f === hooks.RFC_2822) { - configFromRFC2822(config); - return; - } - config._a = []; - getParsingFlags(config).empty = true; +//! moment.js locale configuration - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - // console.log('token', token, 'parsedInput', parsedInput, - // 'regex', getParseRegexForToken(token, config)); - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - getParsingFlags(config).unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - getParsingFlags(config).empty = false; - } - else { - getParsingFlags(config).unusedTokens.push(token); + var cy = moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + weekdaysParseExact : true, + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + ss: '%d eiliad', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - getParsingFlags(config).unusedTokens.push(token); + } else if (b > 0) { + output = lookup[b]; } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - // add remaining unparsed input length to the string - getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - getParsingFlags(config).unusedInput.push(string); - } + return cy; - // clear _12h flag if hour is <= 12 - if (config._a[HOUR] <= 12 && - getParsingFlags(config).bigHour === true && - config._a[HOUR] > 0) { - getParsingFlags(config).bigHour = undefined; - } +}))); - getParsingFlags(config).parsedDateParts = config._a.slice(0); - getParsingFlags(config).meridiem = config._meridiem; - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); - configFromArray(config); - checkOverflow(config); - } +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { +//! moment.js locale configuration - function meridiemFixWrap (locale, hour, meridiem) { - var isPm; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // this is not supposed to happen - return hour; + + var da = moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay : '[i dag kl.] LT', + nextDay : '[i morgen kl.] LT', + nextWeek : 'på dddd [kl.] LT', + lastDay : '[i går kl.] LT', + lastWeek : '[i] dddd[s kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'få sekunder', + ss : '%d sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en måned', + MM : '%d måneder', + y : 'et år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); - // date from string and array of format strings - function configFromStringAndArray(config) { - var tempConfig, - bestMoment, + return da; - scoreToBeat, - i, - currentScore; +}))); - if (config._f.length === 0) { - getParsingFlags(config).invalidFormat = true; - config._d = new Date(NaN); - return; - } - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._f = config._f[i]; - configFromStringAndFormat(tempConfig); +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { - if (!isValid(tempConfig)) { - continue; - } +//! moment.js locale configuration - // if there is any input that was not parsed add a penalty for that format - currentScore += getParsingFlags(tempConfig).charsLeftOver; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - //or tokens - currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; - getParsingFlags(tempConfig).score = currentScore; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } + var de = moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + ss : '%d Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - extend(config, bestMoment || tempConfig); - } + return de; - function configFromObject(config) { - if (config._d) { - return; - } +}))); - var i = normalizeObjectUnits(config._i); - config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { - return obj && parseInt(obj, 10); - }); - configFromArray(config); +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; } - function createFromConfig (config) { - var res = new Moment(checkOverflow(prepareConfig(config))); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; + var deAt = moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + ss : '%d Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - return res; - } + return deAt; - function prepareConfig (config) { - var input = config._i, - format = config._f; +}))); - config._locale = config._locale || getLocale(config._l); - if (input === null || (format === undefined && input === '')) { - return createInvalid({nullInput: true}); - } +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } +//! moment.js locale configuration - if (isMoment(input)) { - return new Moment(checkOverflow(input)); - } else if (isDate(input)) { - config._d = input; - } else if (isArray(format)) { - configFromStringAndArray(config); - } else if (format) { - configFromStringAndFormat(config); - } else { - configFromInput(config); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (!isValid(config)) { - config._d = null; - } - return config; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; } - function configFromInput(config) { - var input = config._i; - if (isUndefined(input)) { - config._d = new Date(hooks.now()); - } else if (isDate(input)) { - config._d = new Date(input.valueOf()); - } else if (typeof input === 'string') { - configFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - configFromArray(config); - } else if (isObject(input)) { - configFromObject(config); - } else if (isNumber(input)) { - // from milliseconds - config._d = new Date(input); - } else { - hooks.createFromInputFallback(config); + var deCh = moment.defineLocale('de-ch', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + ss : '%d Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); - function createLocalOrUTC (input, format, locale, strict, isUTC) { - var c = {}; + return deCh; - if (locale === true || locale === false) { - strict = locale; - locale = undefined; - } +}))); - if ((isObject(input) && isObjectEmpty(input)) || - (isArray(input) && input.length === 0)) { - input = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c._isAMomentObject = true; - c._useUTC = c._isUTC = isUTC; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - return createFromConfig(c); - } +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { - function createLocal (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, false); - } +//! moment.js locale configuration - var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other < this ? this : other; - } else { - return createInvalid(); - } - } - ); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var prototypeMax = deprecate( - 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other > this ? this : other; + + var months = [ + 'ޖެނުއަރީ', + 'ފެބްރުއަރީ', + 'މާރިޗު', + 'އޭޕްރީލު', + 'މޭ', + 'ޖޫން', + 'ޖުލައި', + 'އޯގަސްޓު', + 'ސެޕްޓެމްބަރު', + 'އޮކްޓޯބަރު', + 'ނޮވެމްބަރު', + 'ޑިސެމްބަރު' + ], weekdays = [ + 'އާދިއްތަ', + 'ހޯމަ', + 'އަންގާރަ', + 'ބުދަ', + 'ބުރާސްފަތި', + 'ހުކުރު', + 'ހޮނިހިރު' + ]; + + var dv = moment.defineLocale('dv', { + months : months, + monthsShort : months, + weekdays : weekdays, + weekdaysShort : weekdays, + weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'), + longDateFormat : { + + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/M/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /މކ|މފ/, + isPM : function (input) { + return 'މފ' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'މކ'; } else { - return createInvalid(); + return 'މފ'; } + }, + calendar : { + sameDay : '[މިއަދު] LT', + nextDay : '[މާދަމާ] LT', + nextWeek : 'dddd LT', + lastDay : '[އިއްޔެ] LT', + lastWeek : '[ފާއިތުވި] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ތެރޭގައި %s', + past : 'ކުރިން %s', + s : 'ސިކުންތުކޮޅެއް', + ss : 'd% ސިކުންތު', + m : 'މިނިޓެއް', + mm : 'މިނިޓު %d', + h : 'ގަޑިއިރެއް', + hh : 'ގަޑިއިރު %d', + d : 'ދުވަހެއް', + dd : 'ދުވަސް %d', + M : 'މަހެއް', + MM : 'މަސް %d', + y : 'އަހަރެއް', + yy : 'އަހަރު %d' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 7, // Sunday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } - ); + }); - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return createLocal(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (!moments[i].isValid() || moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } + return dv; - // TODO: Use [].sort instead? - function min () { - var args = [].slice.call(arguments, 0); +}))); - return pickBy('isBefore', args); - } - function max () { - var args = [].slice.call(arguments, 0); +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { - return pickBy('isAfter', args); - } +//! moment.js locale configuration - var now = function () { - return Date.now ? Date.now() : +(new Date()); - }; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } - function isDurationValid(m) { - for (var key in m) { - if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { - return false; - } - } - var unitHasDecimal = false; - for (var i = 0; i < ordering.length; ++i) { - if (m[ordering[i]]) { - if (unitHasDecimal) { - return false; // only allow non-integers for smallest unit - } - if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { - unitHasDecimal = true; + var el = moment.defineLocale('el', { + monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'), + monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'), + months : function (momentToFormat, format) { + if (!momentToFormat) { + return this._monthsNominativeEl; + } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'), + weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'), + weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Μ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendarEl : { + sameDay : '[Σήμερα {}] LT', + nextDay : '[Αύριο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το προηγούμενο] dddd [{}] LT'; + default: + return '[την προηγούμενη] dddd [{}] LT'; } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + if (isFunction(output)) { + output = output.apply(mom); } + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s πριν', + s : 'λίγα δευτερόλεπτα', + ss : '%d δευτερόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ώρα', + hh : '%d ώρες', + d : 'μία μέρα', + dd : '%d μέρες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χρόνος', + yy : '%d χρόνια' + }, + dayOfMonthOrdinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. } + }); - return true; - } - - function isValid$1() { - return this._isValid; - } - - function createInvalid$1() { - return createDuration(NaN); - } - - function Duration (duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || normalizedInput.isoWeek || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; + return el; - this._isValid = isDurationValid(normalizedInput); +}))); - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible to translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - this._data = {}; +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { - this._locale = getLocale(); +//! moment.js locale configuration - this._bubble(); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function isDuration (obj) { - return obj instanceof Duration; - } - function absRound (number) { - if (number < 0) { - return Math.round(-1 * number) * -1; - } else { - return Math.round(number); + var enSG = moment.defineLocale('en-SG', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } - - // FORMATTING + }); - function offset (token, separator) { - addFormatToken(token, 0, 0, function () { - var offset = this.utcOffset(); - var sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); - }); - } + return enSG; - offset('Z', ':'); - offset('ZZ', ''); +}))); - // PARSING - addRegexToken('Z', matchShortOffset); - addRegexToken('ZZ', matchShortOffset); - addParseToken(['Z', 'ZZ'], function (input, array, config) { - config._useUTC = true; - config._tzm = offsetFromString(matchShortOffset, input); - }); +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { - // HELPERS +//! moment.js locale configuration - // timezone chunker - // '+10:00' > ['10', '00'] - // '-1530' > ['-15', '30'] - var chunkOffset = /([\+\-]|\d\d)/gi; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function offsetFromString(matcher, string) { - var matches = (string || '').match(matcher); - if (matches === null) { - return null; + var enAu = moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - var chunk = matches[matches.length - 1] || []; - var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; - var minutes = +(parts[1] * 60) + toInt(parts[2]); + return enAu; - return minutes === 0 ? - 0 : - parts[0] === '+' ? minutes : -minutes; - } +}))); - // Return a moment from input, that is local/utc/zone equivalent to model. - function cloneWithOffset(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); - // Use low-level api, because this fn is low-level api. - res._d.setTime(res._d.valueOf() + diff); - hooks.updateOffset(res, false); - return res; - } else { - return createLocal(input).local(); - } - } - function getDateOffset (m) { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(m._d.getTimezoneOffset() / 15) * 15; - } +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { - // HOOKS +//! moment.js locale configuration - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - hooks.updateOffset = function () {}; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // MOMENTS - // keepLocalTime = true means only change the timezone, without - // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> - // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset - // +0200, so we adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - function getSetOffset (input, keepLocalTime, keepMinutes) { - var offset = this._offset || 0, - localAdjust; - if (!this.isValid()) { - return input != null ? this : NaN; - } - if (input != null) { - if (typeof input === 'string') { - input = offsetFromString(matchShortOffset, input); - if (input === null) { - return this; - } - } else if (Math.abs(input) < 16 && !keepMinutes) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = getDateOffset(this); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addSubtract(this, createDuration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - hooks.updateOffset(this, true); - this._changeInProgress = null; - } - } - return this; - } else { - return this._isUTC ? offset : getDateOffset(this); + var enCa = moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; } - } + }); - function getSetZone (input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } + return enCa; - this.utcOffset(input, keepLocalTime); +}))); - return this; - } else { - return -this.utcOffset(); - } - } - function setOffsetToUTC (keepLocalTime) { - return this.utcOffset(0, keepLocalTime); - } +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { - function setOffsetToLocal (keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; +//! moment.js locale configuration - if (keepLocalTime) { - this.subtract(getDateOffset(this), 'm'); - } - } - return this; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function setOffsetToParsedOffset () { - if (this._tzm != null) { - this.utcOffset(this._tzm, false, true); - } else if (typeof this._i === 'string') { - var tZone = offsetFromString(matchOffset, this._i); - if (tZone != null) { - this.utcOffset(tZone); - } - else { - this.utcOffset(0, true); - } - } - return this; - } - function hasAlignedHourOffset (input) { - if (!this.isValid()) { - return false; + var enGb = moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - input = input ? createLocal(input).utcOffset() : 0; - - return (this.utcOffset() - input) % 60 === 0; - } + }); - function isDaylightSavingTime () { - return ( - this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset() - ); - } + return enGb; - function isDaylightSavingTimeShifted () { - if (!isUndefined(this._isDSTShifted)) { - return this._isDSTShifted; - } +}))); - var c = {}; - copyConfig(c, this); - c = prepareConfig(c); +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { - if (c._a) { - var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); - this._isDSTShifted = this.isValid() && - compareArrays(c._a, other.toArray()) > 0; - } else { - this._isDSTShifted = false; - } +//! moment.js locale configuration - return this._isDSTShifted; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function isLocal () { - return this.isValid() ? !this._isUTC : false; - } - function isUtcOffset () { - return this.isValid() ? this._isUTC : false; - } + var enIe = moment.defineLocale('en-ie', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - function isUtc () { - return this.isValid() ? this._isUTC && this._offset === 0 : false; - } + return enIe; - // ASP.NET json date format regex - var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; +}))); - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - // and further modified to allow for strings containing both week and day - var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; - function createDuration (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - diffRes; +/***/ }), +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { - if (isDuration(input)) { - duration = { - ms : input._milliseconds, - d : input._days, - M : input._months - }; - } else if (isNumber(input)) { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : 0, - d : toInt(match[DATE]) * sign, - h : toInt(match[HOUR]) * sign, - m : toInt(match[MINUTE]) * sign, - s : toInt(match[SECOND]) * sign, - ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match - }; - } else if (!!(match = isoRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : parseIso(match[2], sign), - M : parseIso(match[3], sign), - w : parseIso(match[4], sign), - d : parseIso(match[5], sign), - h : parseIso(match[6], sign), - m : parseIso(match[7], sign), - s : parseIso(match[8], sign) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); +//! moment.js locale configuration - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - ret = new Duration(duration); - if (isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; + var enIl = moment.defineLocale('en-il', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; } + }); - return ret; - } + return enIl; - createDuration.fn = Duration.prototype; - createDuration.invalid = createInvalid$1; +}))); - function parseIso (inp, sign) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - } - function positiveMomentsDifference(base, other) { - var res = {}; +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } +//! moment.js locale configuration - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - return res; - } - function momentsDifference(base, other) { - var res; - if (!(base.isValid() && other.isValid())) { - return {milliseconds: 0, months: 0}; + var enNz = moment.defineLocale('en-nz', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - other = cloneWithOffset(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } + return enNz; - return res; - } +}))); - // TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + - 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); - tmp = val; val = period; period = tmp; - } - val = typeof val === 'string' ? +val : val; - dur = createDuration(val, period); - addSubtract(this, dur, direction); - return this; - }; - } +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { - function addSubtract (mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = absRound(duration._days), - months = absRound(duration._months); +//! moment.js locale configuration - if (!mom.isValid()) { - // No op - return; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - updateOffset = updateOffset == null ? true : updateOffset; - if (months) { - setMonth(mom, get(mom, 'Month') + months * isAdding); - } - if (days) { - set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); - } - if (milliseconds) { - mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); - } - if (updateOffset) { - hooks.updateOffset(mom, days || months); + var eo = moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'), + weekdays : 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'), + weekdaysShort : 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'), + weekdaysMin : 'di_lu_ma_me_ĵa_ve_sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D[-a de] MMMM, YYYY', + LLL : 'D[-a de] MMMM, YYYY HH:mm', + LLLL : 'dddd, [la] D[-a de] MMMM, YYYY HH:mm' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[Hodiaŭ je] LT', + nextDay : '[Morgaŭ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[Hieraŭ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'post %s', + past : 'antaŭ %s', + s : 'sekundoj', + ss : '%d sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + dayOfMonthOrdinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } - } + }); - var add = createAdder(1, 'add'); - var subtract = createAdder(-1, 'subtract'); + return eo; - function getCalendarFormat(myMoment, now) { - var diff = myMoment.diff(now, 'days', true); - return diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - } +}))); - function calendar$1 (time, formats) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're local/utc/offset or not. - var now = time || createLocal(), - sod = cloneWithOffset(now, this).startOf('day'), - format = hooks.calendarFormat(this, sod) || 'sameElse'; - var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { - return this.format(output || this.localeData().calendar(format, this, createLocal(now))); - } +//! moment.js locale configuration - function clone () { - return new Moment(this); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function isAfter (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units) || 'millisecond'; - if (units === 'millisecond') { - return this.valueOf() > localInput.valueOf(); - } else { - return localInput.valueOf() < this.clone().startOf(units).valueOf(); - } - } - function isBefore (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units) || 'millisecond'; - if (units === 'millisecond') { - return this.valueOf() < localInput.valueOf(); - } else { - return this.clone().endOf(units).valueOf() < localInput.valueOf(); - } - } + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - function isBetween (from, to, units, inclusivity) { - var localFrom = isMoment(from) ? from : createLocal(from), - localTo = isMoment(to) ? to : createLocal(to); - if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { - return false; - } - inclusivity = inclusivity || '()'; - return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && - (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)); - } + var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; + var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; - function isSame (input, units) { - var localInput = isMoment(input) ? input : createLocal(input), - inputMs; - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units) || 'millisecond'; - if (units === 'millisecond') { - return this.valueOf() === localInput.valueOf(); - } else { - inputMs = localInput.valueOf(); - return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + var es = moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsRegex : monthsRegex, + monthsShortRegex : monthsRegex, + monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); - function isSameOrAfter (input, units) { - return this.isSame(input, units) || this.isAfter(input, units); - } + return es; - function isSameOrBefore (input, units) { - return this.isSame(input, units) || this.isBefore(input, units); - } +}))); - function diff (input, units, asFloat) { - var that, - zoneDelta, - output; - if (!this.isValid()) { - return NaN; - } +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { - that = cloneWithOffset(input, this); +//! moment.js locale configuration - if (!that.isValid()) { - return NaN; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - units = normalizeUnits(units); + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - switch (units) { - case 'year': output = monthDiff(this, that) / 12; break; - case 'month': output = monthDiff(this, that); break; - case 'quarter': output = monthDiff(this, that) / 3; break; - case 'second': output = (this - that) / 1e3; break; // 1000 - case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 - case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 - case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst - case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst - default: output = this - that; + var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; + var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + + var esDo = moment.defineLocale('es-do', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse: monthsParse, + longMonthsParse: monthsParse, + shortMonthsParse: monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY h:mm A', + LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - return asFloat ? output : absFloor(output); - } + return esDo; - function monthDiff (a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; +}))); - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - //check for negative zero, return zero if negative zero - return -(wholeMonthDiff + adjust) || 0; - } +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { - hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; - hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; +//! moment.js locale configuration - function toString () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function toISOString(keepOffset) { - if (!this.isValid()) { - return null; - } - var utc = keepOffset !== true; - var m = utc ? this.clone().utc() : this; - if (m.year() < 0 || m.year() > 9999) { - return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); - } - if (isFunction(Date.prototype.toISOString)) { - // native implementation is ~50x faster, use it when we can - if (utc) { - return this.toDate().toISOString(); + + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; + var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + + var esUs = moment.defineLocale('es-us', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; } else { - return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + return monthsShortDot[m.month()]; } + }, + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse: monthsParse, + longMonthsParse: monthsParse, + shortMonthsParse: monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'MM/DD/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY h:mm A', + LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } - return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); - } + }); - /** - * Return a human readable representation of a moment that can - * also be evaluated to get a new moment which is the same - * - * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects - */ - function inspect () { - if (!this.isValid()) { - return 'moment.invalid(/* ' + this._i + ' */)'; - } - var func = 'moment'; - var zone = ''; - if (!this.isLocal()) { - func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; - zone = 'Z'; - } - var prefix = '[' + func + '("]'; - var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; - var datetime = '-MM-DD[T]HH:mm:ss.SSS'; - var suffix = zone + '[")]'; + return esUs; - return this.format(prefix + year + datetime + suffix); - } +}))); - function format (inputString) { - if (!inputString) { - inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; - } - var output = formatMoment(this, inputString); - return this.localeData().postformat(output); - } - function from (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { - function fromNow (withoutSuffix) { - return this.from(createLocal(), withoutSuffix); - } +//! moment.js locale configuration - function to (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function toNow (withoutSuffix) { - return this.to(createLocal(), withoutSuffix); - } - // If passed a locale key, it will set the locale for this - // instance. Otherwise, it will return the locale configuration - // variables for this instance. - function locale (key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = getLocale(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'ss': [number + 'sekundi', number + 'sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; } + return isFuture ? format[key][0] : format[key][1]; } - var lang = deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } + var et = moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - ); + }); - function localeData () { - return this._locale; - } + return et; - var MS_PER_SECOND = 1000; - var MS_PER_MINUTE = 60 * MS_PER_SECOND; - var MS_PER_HOUR = 60 * MS_PER_MINUTE; - var MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; +}))); - // actual modulo - handles negative numbers (for dates before 1970): - function mod$1(dividend, divisor) { - return (dividend % divisor + divisor) % divisor; - } - function localStartOfDate(y, m, d) { - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - // preserve leap years using a full 400 year cycle, then reset - return new Date(y + 400, m, d) - MS_PER_400_YEARS; - } else { - return new Date(y, m, d).valueOf(); - } - } +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { - function utcStartOfDate(y, m, d) { - // Date.UTC remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - // preserve leap years using a full 400 year cycle, then reset - return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; - } else { - return Date.UTC(y, m, d); - } - } +//! moment.js locale configuration - function startOf (units) { - var time; - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond' || !this.isValid()) { - return this; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; - switch (units) { - case 'year': - time = startOfDate(this.year(), 0, 1); - break; - case 'quarter': - time = startOfDate(this.year(), this.month() - this.month() % 3, 1); - break; - case 'month': - time = startOfDate(this.year(), this.month(), 1); - break; - case 'week': - time = startOfDate(this.year(), this.month(), this.date() - this.weekday()); - break; - case 'isoWeek': - time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1)); - break; - case 'day': - case 'date': - time = startOfDate(this.year(), this.month(), this.date()); - break; - case 'hour': - time = this._d.valueOf(); - time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR); - break; - case 'minute': - time = this._d.valueOf(); - time -= mod$1(time, MS_PER_MINUTE); - break; - case 'second': - time = this._d.valueOf(); - time -= mod$1(time, MS_PER_SECOND); - break; + var eu = moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + monthsParseExact : true, + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] HH:mm', + llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + ss : '%d segundo', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } + }); - this._d.setTime(time); - hooks.updateOffset(this, true); - return this; - } + return eu; - function endOf (units) { - var time; - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond' || !this.isValid()) { - return this; +}))); + + +/***/ }), +/* 52 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '۱', + '2': '۲', + '3': '۳', + '4': '۴', + '5': '۵', + '6': '۶', + '7': '۷', + '8': '۸', + '9': '۹', + '0': '۰' + }, numberMap = { + '۱': '1', + '۲': '2', + '۳': '3', + '۴': '4', + '۵': '5', + '۶': '6', + '۷': '7', + '۸': '8', + '۹': '9', + '۰': '0' + }; + + var fa = moment.defineLocale('fa', { + months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[فردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چند ثانیه', + ss : 'ثانیه d%', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[۰-۹]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + dayOfMonthOrdinalParse: /\d{1,2}م/, + ordinal : '%dم', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } + }); - var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + return fa; - switch (units) { - case 'year': - time = startOfDate(this.year() + 1, 0, 1) - 1; - break; - case 'quarter': - time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1; - break; - case 'month': - time = startOfDate(this.year(), this.month() + 1, 1) - 1; - break; - case 'week': - time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1; - break; - case 'isoWeek': - time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1; +}))); + + +/***/ }), +/* 53 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'ss': + return isFuture ? 'sekunnin' : 'sekuntia'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; break; - case 'day': - case 'date': - time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; break; - case 'hour': - time = this._d.valueOf(); - time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; break; - case 'minute': - time = this._d.valueOf(); - time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; break; - case 'second': - time = this._d.valueOf(); - time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; break; } - - this._d.setTime(time); - hooks.updateOffset(this, true); - return this; - } - - function valueOf () { - return this._d.valueOf() - ((this._offset || 0) * 60000); + result = verbalNumber(number, isFuture) + ' ' + result; + return result; } - - function unix () { - return Math.floor(this.valueOf() / 1000); + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; } - function toDate () { - return new Date(this.valueOf()); - } + var fi = moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] HH.mm', + llll : 'ddd, Do MMM YYYY, [klo] HH.mm' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - function toArray () { - var m = this; - return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; - } + return fi; - function toObject () { - var m = this; - return { - years: m.year(), - months: m.month(), - date: m.date(), - hours: m.hours(), - minutes: m.minutes(), - seconds: m.seconds(), - milliseconds: m.milliseconds() - }; - } +}))); - function toJSON () { - // new Date(NaN).toJSON() === null - return this.isValid() ? this.toISOString() : null; - } - function isValid$2 () { - return isValid(this); - } +/***/ }), +/* 54 */ +/***/ (function(module, exports, __webpack_require__) { - function parsingFlags () { - return extend({}, getParsingFlags(this)); - } +//! moment.js locale configuration - function invalidAt () { - return getParsingFlags(this).overflow; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function creationData() { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict - }; - } - // FORMATTING - - addFormatToken(0, ['gg', 2], 0, function () { - return this.weekYear() % 100; - }); - - addFormatToken(0, ['GG', 2], 0, function () { - return this.isoWeekYear() % 100; + var fo = moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D. MMMM, YYYY HH:mm' + }, + calendar : { + sameDay : '[Í dag kl.] LT', + nextDay : '[Í morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[Í gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + ss : '%d sekundir', + m : 'ein minuttur', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaður', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } }); - function addWeekYearFormatToken (token, getter) { - addFormatToken(0, [token, token.length], 0, getter); - } - - addWeekYearFormatToken('gggg', 'weekYear'); - addWeekYearFormatToken('ggggg', 'weekYear'); - addWeekYearFormatToken('GGGG', 'isoWeekYear'); - addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - - // ALIASES - - addUnitAlias('weekYear', 'gg'); - addUnitAlias('isoWeekYear', 'GG'); - - // PRIORITY - - addUnitPriority('weekYear', 1); - addUnitPriority('isoWeekYear', 1); - - - // PARSING + return fo; - addRegexToken('G', matchSigned); - addRegexToken('g', matchSigned); - addRegexToken('GG', match1to2, match2); - addRegexToken('gg', match1to2, match2); - addRegexToken('GGGG', match1to4, match4); - addRegexToken('gggg', match1to4, match4); - addRegexToken('GGGGG', match1to6, match6); - addRegexToken('ggggg', match1to6, match6); +}))); - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { - week[token.substr(0, 2)] = toInt(input); - }); - addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { - week[token] = hooks.parseTwoDigitYear(input); - }); +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { - // MOMENTS +//! moment.js locale configuration - function getSetWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, - this.week(), - this.weekday(), - this.localeData()._week.dow, - this.localeData()._week.doy); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function getSetISOWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, this.isoWeek(), this.isoWeekday(), 1, 4); - } - function getISOWeeksInYear () { - return weeksInYear(this.year(), 1, 4); - } + var fr = moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|)/, + ordinal : function (number, period) { + switch (period) { + // TODO: Return 'e' when day of month > 1. Move this case inside + // block for masculine words below. + // See https://github.com/moment/moment/issues/3375 + case 'D': + return number + (number === 1 ? 'er' : ''); - function getWeeksInYear () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - } + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); - function getSetWeekYearHelper(input, week, weekday, dow, doy) { - var weeksTarget; - if (input == null) { - return weekOfYear(this, dow, doy).year; - } else { - weeksTarget = weeksInYear(input, dow, doy); - if (week > weeksTarget) { - week = weeksTarget; + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); } - return setWeekAll.call(this, input, week, weekday, dow, doy); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } - - function setWeekAll(weekYear, week, weekday, dow, doy) { - var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), - date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); - - this.year(date.getUTCFullYear()); - this.month(date.getUTCMonth()); - this.date(date.getUTCDate()); - return this; - } - - // FORMATTING - - addFormatToken('Q', 0, 'Qo', 'quarter'); - - // ALIASES - - addUnitAlias('quarter', 'Q'); - - // PRIORITY - - addUnitPriority('quarter', 7); - - // PARSING - - addRegexToken('Q', match1); - addParseToken('Q', function (input, array) { - array[MONTH] = (toInt(input) - 1) * 3; }); - // MOMENTS - - function getSetQuarter (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - } + return fr; - // FORMATTING +}))); - addFormatToken('D', ['DD', 2], 'Do', 'date'); - // ALIASES +/***/ }), +/* 56 */ +/***/ (function(module, exports, __webpack_require__) { - addUnitAlias('date', 'D'); +//! moment.js locale configuration - // PRIORITY - addUnitPriority('date', 9); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PARSING - addRegexToken('D', match1to2); - addRegexToken('DD', match1to2, match2); - addRegexToken('Do', function (isStrict, locale) { - // TODO: Remove "ordinalParse" fallback in next major release. - return isStrict ? - (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : - locale._dayOfMonthOrdinalParseLenient; - }); + var frCa = moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); - addParseToken(['D', 'DD'], DATE); - addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0]); + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + } }); - // MOMENTS + return frCa; - var getSetDayOfMonth = makeGetSet('Date', true); +}))); - // FORMATTING - addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); +/***/ }), +/* 57 */ +/***/ (function(module, exports, __webpack_require__) { - // ALIASES +//! moment.js locale configuration - addUnitAlias('dayOfYear', 'DDD'); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PRIORITY - addUnitPriority('dayOfYear', 4); - // PARSING + var frCh = moment.defineLocale('fr-ch', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); - addRegexToken('DDD', match1to3); - addRegexToken('DDDD', match3); - addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } }); - // HELPERS - - // MOMENTS - - function getSetDayOfYear (input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); - } - - // FORMATTING + return frCh; - addFormatToken('m', ['mm', 2], 0, 'minute'); +}))); - // ALIASES - addUnitAlias('minute', 'm'); +/***/ }), +/* 58 */ +/***/ (function(module, exports, __webpack_require__) { - // PRIORITY +//! moment.js locale configuration - addUnitPriority('minute', 14); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PARSING - addRegexToken('m', match1to2); - addRegexToken('mm', match1to2, match2); - addParseToken(['m', 'mm'], MINUTE); + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); - // MOMENTS + var fy = moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + monthsParseExact : true, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + ss : '%d sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - var getSetMinute = makeGetSet('Minutes', false); + return fy; - // FORMATTING +}))); - addFormatToken('s', ['ss', 2], 0, 'second'); - // ALIASES +/***/ }), +/* 59 */ +/***/ (function(module, exports, __webpack_require__) { - addUnitAlias('second', 's'); +//! moment.js locale configuration - // PRIORITY +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - addUnitPriority('second', 15); - // PARSING - addRegexToken('s', match1to2); - addRegexToken('ss', match1to2, match2); - addParseToken(['s', 'ss'], SECOND); + var months = [ + 'Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Méitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deaireadh Fómhair', 'Samhain', 'Nollaig' + ]; - // MOMENTS + var monthsShort = ['Eaná', 'Feab', 'Márt', 'Aibr', 'Beal', 'Méit', 'Iúil', 'Lúna', 'Meán', 'Deai', 'Samh', 'Noll']; - var getSetSecond = makeGetSet('Seconds', false); + var weekdays = ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Satharn']; - // FORMATTING + var weekdaysShort = ['Dom', 'Lua', 'Mái', 'Céa', 'Déa', 'hAo', 'Sat']; - addFormatToken('S', 0, 0, function () { - return ~~(this.millisecond() / 100); - }); + var weekdaysMin = ['Do', 'Lu', 'Má', 'Ce', 'Dé', 'hA', 'Sa']; - addFormatToken(0, ['SS', 2], 0, function () { - return ~~(this.millisecond() / 10); + var ga = moment.defineLocale('ga', { + months: months, + monthsShort: monthsShort, + monthsParseExact: true, + weekdays: weekdays, + weekdaysShort: weekdaysShort, + weekdaysMin: weekdaysMin, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[Inniu ag] LT', + nextDay: '[Amárach ag] LT', + nextWeek: 'dddd [ag] LT', + lastDay: '[Inné aig] LT', + lastWeek: 'dddd [seo caite] [ag] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'i %s', + past: '%s ó shin', + s: 'cúpla soicind', + ss: '%d soicind', + m: 'nóiméad', + mm: '%d nóiméad', + h: 'uair an chloig', + hh: '%d uair an chloig', + d: 'lá', + dd: '%d lá', + M: 'mí', + MM: '%d mí', + y: 'bliain', + yy: '%d bliain' + }, + dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/, + ordinal: function (number) { + var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; + return number + output; + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } }); - addFormatToken(0, ['SSS', 3], 0, 'millisecond'); - addFormatToken(0, ['SSSS', 4], 0, function () { - return this.millisecond() * 10; - }); - addFormatToken(0, ['SSSSS', 5], 0, function () { - return this.millisecond() * 100; - }); - addFormatToken(0, ['SSSSSS', 6], 0, function () { - return this.millisecond() * 1000; - }); - addFormatToken(0, ['SSSSSSS', 7], 0, function () { - return this.millisecond() * 10000; - }); - addFormatToken(0, ['SSSSSSSS', 8], 0, function () { - return this.millisecond() * 100000; - }); - addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { - return this.millisecond() * 1000000; - }); + return ga; +}))); - // ALIASES - addUnitAlias('millisecond', 'ms'); +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { - // PRIORITY +//! moment.js locale configuration - addUnitPriority('millisecond', 16); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PARSING - addRegexToken('S', match1to3, match1); - addRegexToken('SS', match1to3, match2); - addRegexToken('SSS', match1to3, match3); + var months = [ + 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' + ]; - var token; - for (token = 'SSSS'; token.length <= 9; token += 'S') { - addRegexToken(token, matchUnsigned); - } + var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; - function parseMs(input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); - } + var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; - for (token = 'S'; token.length <= 9; token += 'S') { - addParseToken(token, parseMs); - } - // MOMENTS + var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; - var getSetMillisecond = makeGetSet('Milliseconds', false); + var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; - // FORMATTING + var gd = moment.defineLocale('gd', { + months : months, + monthsShort : monthsShort, + monthsParseExact : true, + weekdays : weekdays, + weekdaysShort : weekdaysShort, + weekdaysMin : weekdaysMin, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[An-diugh aig] LT', + nextDay : '[A-màireach aig] LT', + nextWeek : 'dddd [aig] LT', + lastDay : '[An-dè aig] LT', + lastWeek : 'dddd [seo chaidh] [aig] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ann an %s', + past : 'bho chionn %s', + s : 'beagan diogan', + ss : '%d diogan', + m : 'mionaid', + mm : '%d mionaidean', + h : 'uair', + hh : '%d uairean', + d : 'latha', + dd : '%d latha', + M : 'mìos', + MM : '%d mìosan', + y : 'bliadhna', + yy : '%d bliadhna' + }, + dayOfMonthOrdinalParse : /\d{1,2}(d|na|mh)/, + ordinal : function (number) { + var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - addFormatToken('z', 0, 0, 'zoneAbbr'); - addFormatToken('zz', 0, 0, 'zoneName'); + return gd; - // MOMENTS +}))); - function getZoneAbbr () { - return this._isUTC ? 'UTC' : ''; - } - function getZoneName () { - return this._isUTC ? 'Coordinated Universal Time' : ''; - } +/***/ }), +/* 61 */ +/***/ (function(module, exports, __webpack_require__) { - var proto = Moment.prototype; +//! moment.js locale configuration - proto.add = add; - proto.calendar = calendar$1; - proto.clone = clone; - proto.diff = diff; - proto.endOf = endOf; - proto.format = format; - proto.from = from; - proto.fromNow = fromNow; - proto.to = to; - proto.toNow = toNow; - proto.get = stringGet; - proto.invalidAt = invalidAt; - proto.isAfter = isAfter; - proto.isBefore = isBefore; - proto.isBetween = isBetween; - proto.isSame = isSame; - proto.isSameOrAfter = isSameOrAfter; - proto.isSameOrBefore = isSameOrBefore; - proto.isValid = isValid$2; - proto.lang = lang; - proto.locale = locale; - proto.localeData = localeData; - proto.max = prototypeMax; - proto.min = prototypeMin; - proto.parsingFlags = parsingFlags; - proto.set = stringSet; - proto.startOf = startOf; - proto.subtract = subtract; - proto.toArray = toArray; - proto.toObject = toObject; - proto.toDate = toDate; - proto.toISOString = toISOString; - proto.inspect = inspect; - proto.toJSON = toJSON; - proto.toString = toString; - proto.unix = unix; - proto.valueOf = valueOf; - proto.creationData = creationData; - proto.year = getSetYear; - proto.isLeapYear = getIsLeapYear; - proto.weekYear = getSetWeekYear; - proto.isoWeekYear = getSetISOWeekYear; - proto.quarter = proto.quarters = getSetQuarter; - proto.month = getSetMonth; - proto.daysInMonth = getDaysInMonth; - proto.week = proto.weeks = getSetWeek; - proto.isoWeek = proto.isoWeeks = getSetISOWeek; - proto.weeksInYear = getWeeksInYear; - proto.isoWeeksInYear = getISOWeeksInYear; - proto.date = getSetDayOfMonth; - proto.day = proto.days = getSetDayOfWeek; - proto.weekday = getSetLocaleDayOfWeek; - proto.isoWeekday = getSetISODayOfWeek; - proto.dayOfYear = getSetDayOfYear; - proto.hour = proto.hours = getSetHour; - proto.minute = proto.minutes = getSetMinute; - proto.second = proto.seconds = getSetSecond; - proto.millisecond = proto.milliseconds = getSetMillisecond; - proto.utcOffset = getSetOffset; - proto.utc = setOffsetToUTC; - proto.local = setOffsetToLocal; - proto.parseZone = setOffsetToParsedOffset; - proto.hasAlignedHourOffset = hasAlignedHourOffset; - proto.isDST = isDaylightSavingTime; - proto.isLocal = isLocal; - proto.isUtcOffset = isUtcOffset; - proto.isUtc = isUtc; - proto.isUTC = isUtc; - proto.zoneAbbr = getZoneAbbr; - proto.zoneName = getZoneName; - proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); - proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); - proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); - proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); - proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function createUnix (input) { - return createLocal(input * 1000); - } - function createInZone () { - return createLocal.apply(null, arguments).parseZone(); - } + var gl = moment.defineLocale('gl', { + months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), + monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str.indexOf('un') === 0) { + return 'n' + str; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - function preParsePostFormat (string) { - return string; - } + return gl; - var proto$1 = Locale.prototype; +}))); - proto$1.calendar = calendar; - proto$1.longDateFormat = longDateFormat; - proto$1.invalidDate = invalidDate; - proto$1.ordinal = ordinal; - proto$1.preparse = preParsePostFormat; - proto$1.postformat = preParsePostFormat; - proto$1.relativeTime = relativeTime; - proto$1.pastFuture = pastFuture; - proto$1.set = set; - proto$1.months = localeMonths; - proto$1.monthsShort = localeMonthsShort; - proto$1.monthsParse = localeMonthsParse; - proto$1.monthsRegex = monthsRegex; - proto$1.monthsShortRegex = monthsShortRegex; - proto$1.week = localeWeek; - proto$1.firstDayOfYear = localeFirstDayOfYear; - proto$1.firstDayOfWeek = localeFirstDayOfWeek; +/***/ }), +/* 62 */ +/***/ (function(module, exports, __webpack_require__) { - proto$1.weekdays = localeWeekdays; - proto$1.weekdaysMin = localeWeekdaysMin; - proto$1.weekdaysShort = localeWeekdaysShort; - proto$1.weekdaysParse = localeWeekdaysParse; +//! moment.js locale configuration - proto$1.weekdaysRegex = weekdaysRegex; - proto$1.weekdaysShortRegex = weekdaysShortRegex; - proto$1.weekdaysMinRegex = weekdaysMinRegex; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - proto$1.isPM = localeIsPM; - proto$1.meridiem = localeMeridiem; - function get$1 (format, index, field, setter) { - var locale = getLocale(); - var utc = createUTC().set(setter, index); - return locale[field](utc, format); + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['thodde secondanim', 'thodde second'], + 'ss': [number + ' secondanim', number + ' second'], + 'm': ['eka mintan', 'ek minute'], + 'mm': [number + ' mintanim', number + ' mintam'], + 'h': ['eka voran', 'ek vor'], + 'hh': [number + ' voranim', number + ' voram'], + 'd': ['eka disan', 'ek dis'], + 'dd': [number + ' disanim', number + ' dis'], + 'M': ['eka mhoinean', 'ek mhoino'], + 'MM': [number + ' mhoineanim', number + ' mhoine'], + 'y': ['eka vorsan', 'ek voros'], + 'yy': [number + ' vorsanim', number + ' vorsam'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; } - function listMonthsImpl (format, index, field) { - if (isNumber(format)) { - index = format; - format = undefined; + var gomLatn = moment.defineLocale('gom-latn', { + months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'), + monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\'var'.split('_'), + weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'), + weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'A h:mm [vazta]', + LTS : 'A h:mm:ss [vazta]', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY A h:mm [vazta]', + LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', + llll: 'ddd, D MMM YYYY, A h:mm [vazta]' + }, + calendar : { + sameDay: '[Aiz] LT', + nextDay: '[Faleam] LT', + nextWeek: '[Ieta to] dddd[,] LT', + lastDay: '[Kal] LT', + lastWeek: '[Fatlo] dddd[,] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s', + past : '%s adim', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse : /\d{1,2}(er)/, + ordinal : function (number, period) { + switch (period) { + // the ordinal 'er' only applies to day of the month + case 'D': + return number + 'er'; + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + case 'w': + case 'W': + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + }, + meridiemParse: /rati|sokalli|donparam|sanje/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'rati') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'sokalli') { + return hour; + } else if (meridiem === 'donparam') { + return hour > 12 ? hour : hour + 12; + } else if (meridiem === 'sanje') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'rati'; + } else if (hour < 12) { + return 'sokalli'; + } else if (hour < 16) { + return 'donparam'; + } else if (hour < 20) { + return 'sanje'; + } else { + return 'rati'; + } } + }); - format = format || ''; + return gomLatn; - if (index != null) { - return get$1(format, index, field, 'month'); - } +}))); - var i; - var out = []; - for (i = 0; i < 12; i++) { - out[i] = get$1(format, i, field, 'month'); - } - return out; - } - // () - // (5) - // (fmt, 5) - // (fmt) - // (true) - // (true, 5) - // (true, fmt, 5) - // (true, fmt) - function listWeekdaysImpl (localeSorted, format, index, field) { - if (typeof localeSorted === 'boolean') { - if (isNumber(format)) { - index = format; - format = undefined; - } +/***/ }), +/* 63 */ +/***/ (function(module, exports, __webpack_require__) { - format = format || ''; - } else { - format = localeSorted; - index = format; - localeSorted = false; +//! moment.js locale configuration - if (isNumber(format)) { - index = format; - format = undefined; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - format = format || ''; - } - var locale = getLocale(), - shift = localeSorted ? locale._week.dow : 0; + var symbolMap = { + '1': '૧', + '2': '૨', + '3': '૩', + '4': '૪', + '5': '૫', + '6': '૬', + '7': '૭', + '8': '૮', + '9': '૯', + '0': '૦' + }, + numberMap = { + '૧': '1', + '૨': '2', + '૩': '3', + '૪': '4', + '૫': '5', + '૬': '6', + '૭': '7', + '૮': '8', + '૯': '9', + '૦': '0' + }; - if (index != null) { - return get$1(format, (index + shift) % 7, field, 'day'); + var gu = moment.defineLocale('gu', { + months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'), + monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'), + monthsParseExact: true, + weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'), + weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'), + weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'), + longDateFormat: { + LT: 'A h:mm વાગ્યે', + LTS: 'A h:mm:ss વાગ્યે', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY, A h:mm વાગ્યે', + LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે' + }, + calendar: { + sameDay: '[આજ] LT', + nextDay: '[કાલે] LT', + nextWeek: 'dddd, LT', + lastDay: '[ગઇકાલે] LT', + lastWeek: '[પાછલા] dddd, LT', + sameElse: 'L' + }, + relativeTime: { + future: '%s મા', + past: '%s પેહલા', + s: 'અમુક પળો', + ss: '%d સેકંડ', + m: 'એક મિનિટ', + mm: '%d મિનિટ', + h: 'એક કલાક', + hh: '%d કલાક', + d: 'એક દિવસ', + dd: '%d દિવસ', + M: 'એક મહિનો', + MM: '%d મહિનો', + y: 'એક વર્ષ', + yy: '%d વર્ષ' + }, + preparse: function (string) { + return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Gujarati notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati. + meridiemParse: /રાત|બપોર|સવાર|સાંજ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'રાત') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'સવાર') { + return hour; + } else if (meridiem === 'બપોર') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'સાંજ') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'રાત'; + } else if (hour < 10) { + return 'સવાર'; + } else if (hour < 17) { + return 'બપોર'; + } else if (hour < 20) { + return 'સાંજ'; + } else { + return 'રાત'; + } + }, + week: { + dow: 0, // Sunday is the first day of the week. + doy: 6 // The week that contains Jan 6th is the first week of the year. } + }); - var i; - var out = []; - for (i = 0; i < 7; i++) { - out[i] = get$1(format, (i + shift) % 7, field, 'day'); - } - return out; - } + return gu; - function listMonths (format, index) { - return listMonthsImpl(format, index, 'months'); - } +}))); - function listMonthsShort (format, index) { - return listMonthsImpl(format, index, 'monthsShort'); - } - function listWeekdays (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); - } +/***/ }), +/* 64 */ +/***/ (function(module, exports, __webpack_require__) { - function listWeekdaysShort (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); - } +//! moment.js locale configuration - function listWeekdaysMin (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - getSetGlobalLocale('en', { - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + + var he = moment.defineLocale('he', { + months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY HH:mm', + LLLL : 'dddd, D [ב]MMMM YYYY HH:mm', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay : '[היום ב־]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[אתמול ב־]LT', + lastWeek : '[ביום] dddd [האחרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + ss : '%d שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיים'; + } + return number + ' שעות'; + }, + d : 'יום', + dd : function (number) { + if (number === 2) { + return 'יומיים'; + } + return number + ' ימים'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיים'; + } + return number + ' חודשים'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיים'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שנים'; + } + }, + meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, + isPM : function (input) { + return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 5) { + return 'לפנות בוקר'; + } else if (hour < 10) { + return 'בבוקר'; + } else if (hour < 12) { + return isLower ? 'לפנה"צ' : 'לפני הצהריים'; + } else if (hour < 18) { + return isLower ? 'אחה"צ' : 'אחרי הצהריים'; + } else { + return 'בערב'; + } } }); - // Side effect imports - - hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); - hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); - - var mathAbs = Math.abs; - - function abs () { - var data = this._data; - - this._milliseconds = mathAbs(this._milliseconds); - this._days = mathAbs(this._days); - this._months = mathAbs(this._months); - - data.milliseconds = mathAbs(data.milliseconds); - data.seconds = mathAbs(data.seconds); - data.minutes = mathAbs(data.minutes); - data.hours = mathAbs(data.hours); - data.months = mathAbs(data.months); - data.years = mathAbs(data.years); - - return this; - } + return he; - function addSubtract$1 (duration, input, value, direction) { - var other = createDuration(input, value); +}))); - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - return duration._bubble(); - } +/***/ }), +/* 65 */ +/***/ (function(module, exports, __webpack_require__) { - // supports only 2.0-style add(1, 's') or add(duration) - function add$1 (input, value) { - return addSubtract$1(this, input, value, 1); - } +//! moment.js locale configuration - // supports only 2.0-style subtract(1, 's') or subtract(duration) - function subtract$1 (input, value) { - return addSubtract$1(this, input, value, -1); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function absCeil (number) { - if (number < 0) { - return Math.floor(number); - } else { - return Math.ceil(number); - } - } - function bubble () { - var milliseconds = this._milliseconds; - var days = this._days; - var months = this._months; - var data = this._data; - var seconds, minutes, hours, years, monthsFromDays; + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; - // if we have a mix of positive and negative values, bubble down first - // check: https://github.com/moment/moment/issues/2166 - if (!((milliseconds >= 0 && days >= 0 && months >= 0) || - (milliseconds <= 0 && days <= 0 && months <= 0))) { - milliseconds += absCeil(monthsToDays(months) + days) * 864e5; - days = 0; - months = 0; + var hi = moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), + monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), + monthsParseExact: true, + weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, A h:mm बजे' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कुछ ही क्षण', + ss : '%d सेकंड', + m : 'एक मिनट', + mm : '%d मिनट', + h : 'एक घंटा', + hh : '%d घंटे', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महीने', + MM : '%d महीने', + y : 'एक वर्ष', + yy : '%d वर्ष' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सुबह|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सुबह') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सुबह'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } + }); - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absFloor(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absFloor(seconds / 60); - data.minutes = minutes % 60; - - hours = absFloor(minutes / 60); - data.hours = hours % 24; + return hi; - days += absFloor(hours / 24); +}))); - // convert days to months - monthsFromDays = absFloor(daysToMonths(days)); - months += monthsFromDays; - days -= absCeil(monthsToDays(monthsFromDays)); - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; +/***/ }), +/* 66 */ +/***/ (function(module, exports, __webpack_require__) { - data.days = days; - data.months = months; - data.years = years; +//! moment.js locale configuration - return this; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function daysToMonths (days) { - // 400 years have 146097 days (taking into account leap year rules) - // 400 years have 12 months === 4800 - return days * 4800 / 146097; - } - function monthsToDays (months) { - // the reverse of daysToMonths - return months * 146097 / 4800; + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + if (number === 1) { + result += 'sekunda'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sekunde'; + } else { + result += 'sekundi'; + } + return result; + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } } - function as (units) { - if (!this.isValid()) { - return NaN; - } - var days; - var months; - var milliseconds = this._milliseconds; - - units = normalizeUnits(units); - - if (units === 'month' || units === 'quarter' || units === 'year') { - days = this._days + milliseconds / 864e5; - months = this._months + daysToMonths(days); - switch (units) { - case 'month': return months; - case 'quarter': return months / 3; - case 'year': return months / 12; - } - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(monthsToDays(this._months)); - switch (units) { - case 'week' : return days / 7 + milliseconds / 6048e5; - case 'day' : return days + milliseconds / 864e5; - case 'hour' : return days * 24 + milliseconds / 36e5; - case 'minute' : return days * 1440 + milliseconds / 6e4; - case 'second' : return days * 86400 + milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 864e5) + milliseconds; - default: throw new Error('Unknown unit ' + units); - } - } - } - - // TODO: Use this.as('ms')? - function valueOf$1 () { - if (!this.isValid()) { - return NaN; + var hr = moment.defineLocale('hr', { + months : { + format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), + standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') + }, + monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + monthsParseExact: true, + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } - return ( - this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6 - ); - } - - function makeAs (alias) { - return function () { - return this.as(alias); - }; - } - - var asMilliseconds = makeAs('ms'); - var asSeconds = makeAs('s'); - var asMinutes = makeAs('m'); - var asHours = makeAs('h'); - var asDays = makeAs('d'); - var asWeeks = makeAs('w'); - var asMonths = makeAs('M'); - var asQuarters = makeAs('Q'); - var asYears = makeAs('y'); - - function clone$1 () { - return createDuration(this); - } - - function get$2 (units) { - units = normalizeUnits(units); - return this.isValid() ? this[units + 's']() : NaN; - } - - function makeGetter(name) { - return function () { - return this.isValid() ? this._data[name] : NaN; - }; - } + }); - var milliseconds = makeGetter('milliseconds'); - var seconds = makeGetter('seconds'); - var minutes = makeGetter('minutes'); - var hours = makeGetter('hours'); - var days = makeGetter('days'); - var months = makeGetter('months'); - var years = makeGetter('years'); + return hr; - function weeks () { - return absFloor(this.days() / 7); - } +}))); - var round = Math.round; - var thresholds = { - ss: 44, // a few seconds to seconds - s : 45, // seconds to minute - m : 45, // minutes to hour - h : 22, // hours to day - d : 26, // days to month - M : 11 // months to year - }; - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } +/***/ }), +/* 67 */ +/***/ (function(module, exports, __webpack_require__) { - function relativeTime$1 (posNegDuration, withoutSuffix, locale) { - var duration = createDuration(posNegDuration).abs(); - var seconds = round(duration.as('s')); - var minutes = round(duration.as('m')); - var hours = round(duration.as('h')); - var days = round(duration.as('d')); - var months = round(duration.as('M')); - var years = round(duration.as('y')); +//! moment.js locale configuration - var a = seconds <= thresholds.ss && ['s', seconds] || - seconds < thresholds.s && ['ss', seconds] || - minutes <= 1 && ['m'] || - minutes < thresholds.m && ['mm', minutes] || - hours <= 1 && ['h'] || - hours < thresholds.h && ['hh', hours] || - days <= 1 && ['d'] || - days < thresholds.d && ['dd', days] || - months <= 1 && ['M'] || - months < thresholds.M && ['MM', months] || - years <= 1 && ['y'] || ['yy', years]; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - a[2] = withoutSuffix; - a[3] = +posNegDuration > 0; - a[4] = locale; - return substituteTimeAgo.apply(null, a); - } - // This function allows you to set the rounding function for relative time strings - function getSetRelativeTimeRounding (roundingFunction) { - if (roundingFunction === undefined) { - return round; - } - if (typeof(roundingFunction) === 'function') { - round = roundingFunction; - return true; + var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); + function translate(number, withoutSuffix, key, isFuture) { + var num = number; + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'ss': + return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); } - return false; + return ''; } - - // This function allows you to set a threshold for relative time strings - function getSetRelativeTimeThreshold (threshold, limit) { - if (thresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return thresholds[threshold]; - } - thresholds[threshold] = limit; - if (threshold === 's') { - thresholds.ss = limit - 1; - } - return true; + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; } - function humanize (withSuffix) { - if (!this.isValid()) { - return this.localeData().invalidDate(); + var hu = moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D. H:mm', + LLLL : 'YYYY. MMMM D., dddd H:mm' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - var locale = this.localeData(); - var output = relativeTime$1(this, !withSuffix, locale); - - if (withSuffix) { - output = locale.pastFuture(+this, output); - } + return hu; - return locale.postformat(output); - } +}))); - var abs$1 = Math.abs; - function sign(x) { - return ((x > 0) - (x < 0)) || +x; - } +/***/ }), +/* 68 */ +/***/ (function(module, exports, __webpack_require__) { - function toISOString$1() { - // for ISO strings we do not use the normal bubbling rules: - // * milliseconds bubble up until they become hours - // * days do not bubble at all - // * months bubble up until they become years - // This is because there is no context-free conversion between hours and days - // (think of clock changes) - // and also not between days and months (28-31 days per month) - if (!this.isValid()) { - return this.localeData().invalidDate(); - } +//! moment.js locale configuration - var seconds = abs$1(this._milliseconds) / 1000; - var days = abs$1(this._days); - var months = abs$1(this._months); - var minutes, hours, years; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // 3600 seconds -> 60 minutes -> 1 hour - minutes = absFloor(seconds / 60); - hours = absFloor(minutes / 60); - seconds %= 60; - minutes %= 60; - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; + var hyAm = moment.defineLocale('hy-am', { + months : { + format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), + standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') + }, + monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), + weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), + weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY թ.', + LLL : 'D MMMM YYYY թ., HH:mm', + LLLL : 'dddd, D MMMM YYYY թ., HH:mm' + }, + calendar : { + sameDay: '[այսօր] LT', + nextDay: '[վաղը] LT', + lastDay: '[երեկ] LT', + nextWeek: function () { + return 'dddd [օրը ժամը] LT'; + }, + lastWeek: function () { + return '[անցած] dddd [օրը ժամը] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s հետո', + past : '%s առաջ', + s : 'մի քանի վայրկյան', + ss : '%d վայրկյան', + m : 'րոպե', + mm : '%d րոպե', + h : 'ժամ', + hh : '%d ժամ', + d : 'օր', + dd : '%d օր', + M : 'ամիս', + MM : '%d ամիս', + y : 'տարի', + yy : '%d տարի' + }, + meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, + isPM: function (input) { + return /^(ցերեկվա|երեկոյան)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'գիշերվա'; + } else if (hour < 12) { + return 'առավոտվա'; + } else if (hour < 17) { + return 'ցերեկվա'; + } else { + return 'երեկոյան'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-ին'; + } + return number + '-րդ'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. + } + }); + return hyAm; - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var Y = years; - var M = months; - var D = days; - var h = hours; - var m = minutes; - var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; - var total = this.asSeconds(); +}))); - if (!total) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - var totalSign = total < 0 ? '-' : ''; - var ymSign = sign(this._months) !== sign(total) ? '-' : ''; - var daysSign = sign(this._days) !== sign(total) ? '-' : ''; - var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; +/***/ }), +/* 69 */ +/***/ (function(module, exports, __webpack_require__) { - return totalSign + 'P' + - (Y ? ymSign + Y + 'Y' : '') + - (M ? ymSign + M + 'M' : '') + - (D ? daysSign + D + 'D' : '') + - ((h || m || s) ? 'T' : '') + - (h ? hmsSign + h + 'H' : '') + - (m ? hmsSign + m + 'M' : '') + - (s ? hmsSign + s + 'S' : ''); - } +//! moment.js locale configuration - var proto$2 = Duration.prototype; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - proto$2.isValid = isValid$1; - proto$2.abs = abs; - proto$2.add = add$1; - proto$2.subtract = subtract$1; - proto$2.as = as; - proto$2.asMilliseconds = asMilliseconds; - proto$2.asSeconds = asSeconds; - proto$2.asMinutes = asMinutes; - proto$2.asHours = asHours; - proto$2.asDays = asDays; - proto$2.asWeeks = asWeeks; - proto$2.asMonths = asMonths; - proto$2.asQuarters = asQuarters; - proto$2.asYears = asYears; - proto$2.valueOf = valueOf$1; - proto$2._bubble = bubble; - proto$2.clone = clone$1; - proto$2.get = get$2; - proto$2.milliseconds = milliseconds; - proto$2.seconds = seconds; - proto$2.minutes = minutes; - proto$2.hours = hours; - proto$2.days = days; - proto$2.weeks = weeks; - proto$2.months = months; - proto$2.years = years; - proto$2.humanize = humanize; - proto$2.toISOString = toISOString$1; - proto$2.toString = toISOString$1; - proto$2.toJSON = toISOString$1; - proto$2.locale = locale; - proto$2.localeData = localeData; - proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); - proto$2.lang = lang; - - // Side effect imports - - // FORMATTING - - addFormatToken('X', 0, 0, 'unix'); - addFormatToken('x', 0, 0, 'valueOf'); - - // PARSING - - addRegexToken('x', matchSigned); - addRegexToken('X', matchTimestamp); - addParseToken('X', function (input, array, config) { - config._d = new Date(parseFloat(input, 10) * 1000); - }); - addParseToken('x', function (input, array, config) { - config._d = new Date(toInt(input)); - }); - - // Side effect imports - - - hooks.version = '2.24.0'; - - setHookCallback(createLocal); - - hooks.fn = proto; - hooks.min = min; - hooks.max = max; - hooks.now = now; - hooks.utc = createUTC; - hooks.unix = createUnix; - hooks.months = listMonths; - hooks.isDate = isDate; - hooks.locale = getSetGlobalLocale; - hooks.invalid = createInvalid; - hooks.duration = createDuration; - hooks.isMoment = isMoment; - hooks.weekdays = listWeekdays; - hooks.parseZone = createInZone; - hooks.localeData = getLocale; - hooks.isDuration = isDuration; - hooks.monthsShort = listMonthsShort; - hooks.weekdaysMin = listWeekdaysMin; - hooks.defineLocale = defineLocale; - hooks.updateLocale = updateLocale; - hooks.locales = listLocales; - hooks.weekdaysShort = listWeekdaysShort; - hooks.normalizeUnits = normalizeUnits; - hooks.relativeTimeRounding = getSetRelativeTimeRounding; - hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; - hooks.calendarFormat = getCalendarFormat; - hooks.prototype = proto; - - // currently HTML5 input type only supports 24-hour formats - hooks.HTML5_FMT = { - DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // - DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // - DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // - DATE: 'YYYY-MM-DD', // - TIME: 'HH:mm', // - TIME_SECONDS: 'HH:mm:ss', // - TIME_MS: 'HH:mm:ss.SSS', // - WEEK: 'GGGG-[W]WW', // - MONTH: 'YYYY-MM' // - }; - - return hooks; - -}))); - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./af": 42, - "./af.js": 42, - "./ar": 43, - "./ar-dz": 44, - "./ar-dz.js": 44, - "./ar-kw": 45, - "./ar-kw.js": 45, - "./ar-ly": 46, - "./ar-ly.js": 46, - "./ar-ma": 47, - "./ar-ma.js": 47, - "./ar-sa": 48, - "./ar-sa.js": 48, - "./ar-tn": 49, - "./ar-tn.js": 49, - "./ar.js": 43, - "./az": 50, - "./az.js": 50, - "./be": 51, - "./be.js": 51, - "./bg": 52, - "./bg.js": 52, - "./bm": 53, - "./bm.js": 53, - "./bn": 54, - "./bn.js": 54, - "./bo": 55, - "./bo.js": 55, - "./br": 56, - "./br.js": 56, - "./bs": 57, - "./bs.js": 57, - "./ca": 58, - "./ca.js": 58, - "./cs": 59, - "./cs.js": 59, - "./cv": 60, - "./cv.js": 60, - "./cy": 61, - "./cy.js": 61, - "./da": 62, - "./da.js": 62, - "./de": 63, - "./de-at": 64, - "./de-at.js": 64, - "./de-ch": 65, - "./de-ch.js": 65, - "./de.js": 63, - "./dv": 66, - "./dv.js": 66, - "./el": 67, - "./el.js": 67, - "./en-SG": 68, - "./en-SG.js": 68, - "./en-au": 69, - "./en-au.js": 69, - "./en-ca": 70, - "./en-ca.js": 70, - "./en-gb": 71, - "./en-gb.js": 71, - "./en-ie": 72, - "./en-ie.js": 72, - "./en-il": 73, - "./en-il.js": 73, - "./en-nz": 74, - "./en-nz.js": 74, - "./eo": 75, - "./eo.js": 75, - "./es": 76, - "./es-do": 77, - "./es-do.js": 77, - "./es-us": 78, - "./es-us.js": 78, - "./es.js": 76, - "./et": 79, - "./et.js": 79, - "./eu": 80, - "./eu.js": 80, - "./fa": 81, - "./fa.js": 81, - "./fi": 82, - "./fi.js": 82, - "./fo": 83, - "./fo.js": 83, - "./fr": 84, - "./fr-ca": 85, - "./fr-ca.js": 85, - "./fr-ch": 86, - "./fr-ch.js": 86, - "./fr.js": 84, - "./fy": 87, - "./fy.js": 87, - "./ga": 88, - "./ga.js": 88, - "./gd": 89, - "./gd.js": 89, - "./gl": 90, - "./gl.js": 90, - "./gom-latn": 91, - "./gom-latn.js": 91, - "./gu": 92, - "./gu.js": 92, - "./he": 93, - "./he.js": 93, - "./hi": 94, - "./hi.js": 94, - "./hr": 95, - "./hr.js": 95, - "./hu": 96, - "./hu.js": 96, - "./hy-am": 97, - "./hy-am.js": 97, - "./id": 98, - "./id.js": 98, - "./is": 99, - "./is.js": 99, - "./it": 100, - "./it-ch": 101, - "./it-ch.js": 101, - "./it.js": 100, - "./ja": 102, - "./ja.js": 102, - "./jv": 103, - "./jv.js": 103, - "./ka": 104, - "./ka.js": 104, - "./kk": 105, - "./kk.js": 105, - "./km": 106, - "./km.js": 106, - "./kn": 107, - "./kn.js": 107, - "./ko": 108, - "./ko.js": 108, - "./ku": 109, - "./ku.js": 109, - "./ky": 110, - "./ky.js": 110, - "./lb": 111, - "./lb.js": 111, - "./lo": 112, - "./lo.js": 112, - "./lt": 113, - "./lt.js": 113, - "./lv": 114, - "./lv.js": 114, - "./me": 115, - "./me.js": 115, - "./mi": 116, - "./mi.js": 116, - "./mk": 117, - "./mk.js": 117, - "./ml": 118, - "./ml.js": 118, - "./mn": 119, - "./mn.js": 119, - "./mr": 120, - "./mr.js": 120, - "./ms": 121, - "./ms-my": 122, - "./ms-my.js": 122, - "./ms.js": 121, - "./mt": 123, - "./mt.js": 123, - "./my": 124, - "./my.js": 124, - "./nb": 125, - "./nb.js": 125, - "./ne": 126, - "./ne.js": 126, - "./nl": 127, - "./nl-be": 128, - "./nl-be.js": 128, - "./nl.js": 127, - "./nn": 129, - "./nn.js": 129, - "./pa-in": 130, - "./pa-in.js": 130, - "./pl": 131, - "./pl.js": 131, - "./pt": 132, - "./pt-br": 133, - "./pt-br.js": 133, - "./pt.js": 132, - "./ro": 134, - "./ro.js": 134, - "./ru": 135, - "./ru.js": 135, - "./sd": 136, - "./sd.js": 136, - "./se": 137, - "./se.js": 137, - "./si": 138, - "./si.js": 138, - "./sk": 139, - "./sk.js": 139, - "./sl": 140, - "./sl.js": 140, - "./sq": 141, - "./sq.js": 141, - "./sr": 142, - "./sr-cyrl": 143, - "./sr-cyrl.js": 143, - "./sr.js": 142, - "./ss": 144, - "./ss.js": 144, - "./sv": 145, - "./sv.js": 145, - "./sw": 146, - "./sw.js": 146, - "./ta": 147, - "./ta.js": 147, - "./te": 148, - "./te.js": 148, - "./tet": 149, - "./tet.js": 149, - "./tg": 150, - "./tg.js": 150, - "./th": 151, - "./th.js": 151, - "./tl-ph": 152, - "./tl-ph.js": 152, - "./tlh": 153, - "./tlh.js": 153, - "./tr": 154, - "./tr.js": 154, - "./tzl": 155, - "./tzl.js": 155, - "./tzm": 156, - "./tzm-latn": 157, - "./tzm-latn.js": 157, - "./tzm.js": 156, - "./ug-cn": 158, - "./ug-cn.js": 158, - "./uk": 159, - "./uk.js": 159, - "./ur": 160, - "./ur.js": 160, - "./uz": 161, - "./uz-latn": 162, - "./uz-latn.js": 162, - "./uz.js": 161, - "./vi": 163, - "./vi.js": 163, - "./x-pseudo": 164, - "./x-pseudo.js": 164, - "./yo": 165, - "./yo.js": 165, - "./zh-cn": 166, - "./zh-cn.js": 166, - "./zh-hk": 167, - "./zh-hk.js": 167, - "./zh-tw": 168, - "./zh-tw.js": 168 -}; - - -function webpackContext(req) { - var id = webpackContextResolve(req); - return __webpack_require__(id); -} -function webpackContextResolve(req) { - if(!__webpack_require__.o(map, req)) { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - } - return map[req]; -} -webpackContext.keys = function webpackContextKeys() { - return Object.keys(map); -}; -webpackContext.resolve = webpackContextResolve; -module.exports = webpackContext; -webpackContext.id = 41; - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var af = moment.defineLocale('af', { - months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), - weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), - weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), - meridiemParse: /vm|nm/i, - isPM : function (input) { - return /^nm$/i.test(input); + var id = moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } }, meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'vm' : 'VM'; + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; } else { - return isLower ? 'nm' : 'NM'; + return 'malam'; } }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, calendar : { - sameDay : '[Vandag om] LT', - nextDay : '[Môre om] LT', - nextWeek : 'dddd [om] LT', - lastDay : '[Gister om] LT', - lastWeek : '[Laas] dddd [om] LT', + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', sameElse : 'L' }, relativeTime : { - future : 'oor %s', - past : '%s gelede', - s : '\'n paar sekondes', - ss : '%d sekondes', - m : '\'n minuut', - mm : '%d minute', - h : '\'n uur', - hh : '%d ure', - d : '\'n dag', - dd : '%d dae', - M : '\'n maand', - MM : '%d maande', - y : '\'n jaar', - yy : '%d jaar' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + ss : '%d detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' }, week : { - dow : 1, // Maandag is die eerste dag van die week. - doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return af; + return id; }))); /***/ }), -/* 43 */ +/* 70 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' - }, numberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' - }, pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; - }, plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] - }, pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; - }, months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر' - ]; + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'ss': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum'); + } + return result + 'sekúnda'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } - var ar = moment.defineLocale('ar', { - months : months, - monthsShort : months, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, + var is = moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'D/\u200FM/\u200FYYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' }, calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' }, relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - ss : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ar; + return is; }))); /***/ }), -/* 44 */ +/* 71 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var arDz = moment.defineLocale('ar-dz', { - months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'), - weekdaysParseExact : true, + var it = moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), + weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), + weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', @@ -10130,446 +11445,586 @@ webpackContext.id = 41; LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, sameElse: 'L' }, relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + ss : '%d secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal: '%dº', week : { - dow : 0, // Sunday is the first day of the week. + dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return arDz; + return it; }))); /***/ }), -/* 45 */ +/* 72 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var arKw = moment.defineLocale('ar-kw', { - months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', + var itCh = moment.defineLocale('it-ch', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), + weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), + weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', + L : 'DD.MM.YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, sameElse: 'L' }, relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + ss : '%d secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal: '%dº', week : { - dow : 0, // Sunday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return arKw; + return itCh; }))); /***/ }), -/* 46 */ +/* 73 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '1', - '2': '2', - '3': '3', - '4': '4', - '5': '5', - '6': '6', - '7': '7', - '8': '8', - '9': '9', - '0': '0' - }, pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; - }, plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] - }, pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; - }, months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر' - ]; - - var arLy = moment.defineLocale('ar-ly', { - months : months, - monthsShort : months, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, + var ja = moment.defineLocale('ja', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : '日_月_火_水_木_金_土'.split('_'), + weekdaysMin : '日_月_火_水_木_金_土'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'D/\u200FM/\u200FYYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日 dddd HH:mm', + l : 'YYYY/MM/DD', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日(ddd) HH:mm' }, - meridiemParse: /ص|م/, + meridiemParse: /午前|午後/i, isPM : function (input) { - return 'م' === input; + return input === '午後'; }, meridiem : function (hour, minute, isLower) { if (hour < 12) { - return 'ص'; + return '午前'; } else { - return 'م'; + return '午後'; } }, calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - ss : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/،/g, ','); + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : function (now) { + if (now.week() < this.week()) { + return '[来週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + lastDay : '[昨日] LT', + lastWeek : function (now) { + if (this.week() < now.week()) { + return '[先週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + sameElse : 'L' }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + dayOfMonthOrdinalParse : /\d{1,2}日/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + default: + return number; + } }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + relativeTime : { + future : '%s後', + past : '%s前', + s : '数秒', + ss : '%d秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1日', + dd : '%d日', + M : '1ヶ月', + MM : '%dヶ月', + y : '1年', + yy : '%d年' } }); - return arLy; + return ja; }))); /***/ }), -/* 47 */ +/* 74 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var arMa = moment.defineLocale('ar-ma', { - months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, + var jv = moment.defineLocale('jv', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), + weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'HH.mm', + LTS : 'HH.mm.ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /enjing|siyang|sonten|ndalu/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'enjing') { + return hour; + } else if (meridiem === 'siyang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sonten' || meridiem === 'ndalu') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'enjing'; + } else if (hours < 15) { + return 'siyang'; + } else if (hours < 19) { + return 'sonten'; + } else { + return 'ndalu'; + } }, calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' + sameDay : '[Dinten puniko pukul] LT', + nextDay : '[Mbenjang pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kala wingi pukul] LT', + lastWeek : 'dddd [kepengker pukul] LT', + sameElse : 'L' }, relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' + future : 'wonten ing %s', + past : '%s ingkang kepengker', + s : 'sawetawis detik', + ss : '%d detik', + m : 'setunggal menit', + mm : '%d menit', + h : 'setunggal jam', + hh : '%d jam', + d : 'sedinten', + dd : '%d dinten', + M : 'sewulan', + MM : '%d wulan', + y : 'setaun', + yy : '%d taun' }, week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return arMa; + return jv; }))); /***/ }), -/* 48 */ +/* 75 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' - }, numberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' - }; - - var arSa = moment.defineLocale('ar-sa', { - months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, + var ka = moment.defineLocale('ka', { + months : { + standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), + format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') + }, + monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), + weekdays : { + standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), + format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), + isFormat: /(წინა|შემდეგ)/ + }, + weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), + weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'h:mm A', + LTS : 'h:mm:ss A', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' }, calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვალ] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინა] dddd LT-ზე', + sameElse : 'L' }, relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); + future : function (s) { + return (/(წამი|წუთი|საათი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რამდენიმე წამი', + ss : '%d წამი', + m : 'წუთი', + mm : '%d წუთი', + h : 'საათი', + hh : '%d საათი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + if (number === 1) { + return number + '-ლი'; + } + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + return number + '-ე'; }, week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + dow : 1, + doy : 7 } }); - return arSa; + return ka; }))); /***/ }), -/* 49 */ +/* 76 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var arTn = moment.defineLocale('ar-tn', { - months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd D MMMM YYYY HH:mm' + var suffixes = { + 0: '-ші', + 1: '-ші', + 2: '-ші', + 3: '-ші', + 4: '-ші', + 5: '-ші', + 6: '-шы', + 7: '-ші', + 8: '-ші', + 9: '-шы', + 10: '-шы', + 20: '-шы', + 30: '-шы', + 40: '-шы', + 50: '-ші', + 60: '-шы', + 70: '-ші', + 80: '-ші', + 90: '-шы', + 100: '-ші' + }; + + var kk = moment.defineLocale('kk', { + months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), + monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), + weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), + weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'), + weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, - calendar: { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', + calendar : { + sameDay : '[Бүгін сағат] LT', + nextDay : '[Ертең сағат] LT', + nextWeek : 'dddd [сағат] LT', + lastDay : '[Кеше сағат] LT', + lastWeek : '[Өткен аптаның] dddd [сағат] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ішінде', + past : '%s бұрын', + s : 'бірнеше секунд', + ss : '%d секунд', + m : 'бір минут', + mm : '%d минут', + h : 'бір сағат', + hh : '%d сағат', + d : 'бір күн', + dd : '%d күн', + M : 'бір ай', + MM : '%d ай', + y : 'бір жыл', + yy : '%d жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. + } + }); + + return kk; + +}))); + + +/***/ }), +/* 77 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '១', + '2': '២', + '3': '៣', + '4': '៤', + '5': '៥', + '6': '៦', + '7': '៧', + '8': '៨', + '9': '៩', + '0': '០' + }, numberMap = { + '១': '1', + '២': '2', + '៣': '3', + '៤': '4', + '៥': '5', + '៦': '6', + '៧': '7', + '៨': '8', + '៩': '9', + '០': '0' + }; + + var km = moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( + '_' + ), + monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( + '_' + ), + weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), + weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), + weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), + weekdaysParseExact: true, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + meridiemParse: /ព្រឹក|ល្ងាច/, + isPM: function (input) { + return input === 'ល្ងាច'; + }, + meridiem: function (hour, minute, isLower) { + if (hour < 12) { + return 'ព្រឹក'; + } else { + return 'ល្ងាច'; + } + }, + calendar: { + sameDay: '[ថ្ងៃនេះ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', sameElse: 'L' }, relativeTime: { - future: 'في %s', - past: 'منذ %s', - s: 'ثوان', - ss : '%d ثانية', - m: 'دقيقة', - mm: '%d دقائق', - h: 'ساعة', - hh: '%d ساعات', - d: 'يوم', - dd: '%d أيام', - M: 'شهر', - MM: '%d أشهر', - y: 'سنة', - yy: '%d سنوات' + future: '%sទៀត', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + ss: '%d វិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយថ្ងៃ', + dd: '%d ថ្ងៃ', + M: 'មួយខែ', + MM: '%d ខែ', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + dayOfMonthOrdinalParse : /ទី\d{1,2}/, + ordinal : 'ទី%d', + preparse: function (string) { + return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); }, week: { dow: 1, // Monday is the first day of the week. @@ -10577,857 +12032,926 @@ webpackContext.id = 41; } }); - return arTn; + return km; }))); /***/ }), -/* 50 */ +/* 78 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var suffixes = { - 1: '-inci', - 5: '-inci', - 8: '-inci', - 70: '-inci', - 80: '-inci', - 2: '-nci', - 7: '-nci', - 20: '-nci', - 50: '-nci', - 3: '-üncü', - 4: '-üncü', - 100: '-üncü', - 6: '-ncı', - 9: '-uncu', - 10: '-uncu', - 30: '-uncu', - 60: '-ıncı', - 90: '-ıncı' + var symbolMap = { + '1': '೧', + '2': '೨', + '3': '೩', + '4': '೪', + '5': '೫', + '6': '೬', + '7': '೭', + '8': '೮', + '9': '೯', + '0': '೦' + }, + numberMap = { + '೧': '1', + '೨': '2', + '೩': '3', + '೪': '4', + '೫': '5', + '೬': '6', + '೭': '7', + '೮': '8', + '೯': '9', + '೦': '0' }; - var az = moment.defineLocale('az', { - months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), - monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), - weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'), - weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), - weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), - weekdaysParseExact : true, + var kn = moment.defineLocale('kn', { + months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'), + monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'), + monthsParseExact: true, + weekdays : 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'), + weekdaysShort : 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'), + weekdaysMin : 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' }, calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[sabah saat] LT', - nextWeek : '[gələn həftə] dddd [saat] LT', - lastDay : '[dünən] LT', - lastWeek : '[keçən həftə] dddd [saat] LT', + sameDay : '[ಇಂದು] LT', + nextDay : '[ನಾಳೆ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ನಿನ್ನೆ] LT', + lastWeek : '[ಕೊನೆಯ] dddd, LT', sameElse : 'L' }, relativeTime : { - future : '%s sonra', - past : '%s əvvəl', - s : 'birneçə saniyə', - ss : '%d saniyə', - m : 'bir dəqiqə', - mm : '%d dəqiqə', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir il', - yy : '%d il' + future : '%s ನಂತರ', + past : '%s ಹಿಂದೆ', + s : 'ಕೆಲವು ಕ್ಷಣಗಳು', + ss : '%d ಸೆಕೆಂಡುಗಳು', + m : 'ಒಂದು ನಿಮಿಷ', + mm : '%d ನಿಮಿಷ', + h : 'ಒಂದು ಗಂಟೆ', + hh : '%d ಗಂಟೆ', + d : 'ಒಂದು ದಿನ', + dd : '%d ದಿನ', + M : 'ಒಂದು ತಿಂಗಳು', + MM : '%d ತಿಂಗಳು', + y : 'ಒಂದು ವರ್ಷ', + yy : '%d ವರ್ಷ' }, - meridiemParse: /gecə|səhər|gündüz|axşam/, - isPM : function (input) { - return /^(gündüz|axşam)$/.test(input); + preparse: function (string) { + return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ರಾತ್ರಿ') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') { + return hour; + } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'ಸಂಜೆ') { + return hour + 12; + } }, meridiem : function (hour, minute, isLower) { if (hour < 4) { - return 'gecə'; - } else if (hour < 12) { - return 'səhər'; + return 'ರಾತ್ರಿ'; + } else if (hour < 10) { + return 'ಬೆಳಿಗ್ಗೆ'; } else if (hour < 17) { - return 'gündüz'; + return 'ಮಧ್ಯಾಹ್ನ'; + } else if (hour < 20) { + return 'ಸಂಜೆ'; } else { - return 'axşam'; + return 'ರಾತ್ರಿ'; } }, - dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/, ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '-ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - return number + (suffixes[a] || suffixes[b] || suffixes[c]); + return number + 'ನೇ'; }, week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return az; + return kn; }))); /***/ }), -/* 51 */ +/* 79 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', - 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', - 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', - 'dd': 'дзень_дні_дзён', - 'MM': 'месяц_месяцы_месяцаў', - 'yy': 'год_гады_гадоў' - }; - if (key === 'm') { - return withoutSuffix ? 'хвіліна' : 'хвіліну'; - } - else if (key === 'h') { - return withoutSuffix ? 'гадзіна' : 'гадзіну'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - var be = moment.defineLocale('be', { - months : { - format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'), - standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_') - }, - monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'), - weekdays : { - format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'), - standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'), - isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/ - }, - weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), - weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + var ko = moment.defineLocale('ko', { + months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), + weekdaysShort : '일_월_화_수_목_금_토'.split('_'), + weekdaysMin : '일_월_화_수_목_금_토'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., HH:mm', - LLLL : 'dddd, D MMMM YYYY г., HH:mm' + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY년 MMMM D일', + LLL : 'YYYY년 MMMM D일 A h:mm', + LLLL : 'YYYY년 MMMM D일 dddd A h:mm', + l : 'YYYY.MM.DD.', + ll : 'YYYY년 MMMM D일', + lll : 'YYYY년 MMMM D일 A h:mm', + llll : 'YYYY년 MMMM D일 dddd A h:mm' }, calendar : { - sameDay: '[Сёння ў] LT', - nextDay: '[Заўтра ў] LT', - lastDay: '[Учора ў] LT', - nextWeek: function () { - return '[У] dddd [ў] LT'; - }, - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return '[У мінулую] dddd [ў] LT'; - case 1: - case 2: - case 4: - return '[У мінулы] dddd [ў] LT'; - } - }, - sameElse: 'L' + sameDay : '오늘 LT', + nextDay : '내일 LT', + nextWeek : 'dddd LT', + lastDay : '어제 LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' }, relativeTime : { - future : 'праз %s', - past : '%s таму', - s : 'некалькі секунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : relativeTimeWithPlural, - hh : relativeTimeWithPlural, - d : 'дзень', - dd : relativeTimeWithPlural, - M : 'месяц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночы|раніцы|дня|вечара/, - isPM : function (input) { - return /^(дня|вечара)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночы'; - } else if (hour < 12) { - return 'раніцы'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечара'; - } + future : '%s 후', + past : '%s 전', + s : '몇 초', + ss : '%d초', + m : '1분', + mm : '%d분', + h : '한 시간', + hh : '%d시간', + d : '하루', + dd : '%d일', + M : '한 달', + MM : '%d달', + y : '일 년', + yy : '%d년' }, - dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/, - ordinal: function (number, period) { + dayOfMonthOrdinalParse : /\d{1,2}(일|월|주)/, + ordinal : function (number, period) { switch (period) { - case 'M': case 'd': + case 'D': case 'DDD': + return number + '일'; + case 'M': + return number + '월'; case 'w': case 'W': - return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы'; - case 'D': - return number + '-га'; + return number + '주'; default: return number; } }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; } }); - return be; + return ko; }))); /***/ }), -/* 52 */ +/* 80 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var bg = moment.defineLocale('bg', { - months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'), - monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'), - weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'), - weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'), - weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Днес в] LT', - nextDay : '[Утре в] LT', - nextWeek : 'dddd [в] LT', - lastDay : '[Вчера в] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[В изминалата] dddd [в] LT'; - case 1: - case 2: - case 4: - case 5: - return '[В изминалия] dddd [в] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'след %s', - past : 'преди %s', - s : 'няколко секунди', - ss : '%d секунди', - m : 'минута', - mm : '%d минути', - h : 'час', - hh : '%d часа', - d : 'ден', - dd : '%d дни', - M : 'месец', - MM : '%d месеца', - y : 'година', - yy : '%d години' + var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }, + months = [ + 'کانونی دووەم', + 'شوبات', + 'ئازار', + 'نیسان', + 'ئایار', + 'حوزەیران', + 'تەمموز', + 'ئاب', + 'ئەیلوول', + 'تشرینی یەكەم', + 'تشرینی دووەم', + 'كانونی یەکەم' + ]; + + + var ku = moment.defineLocale('ku', { + months : months, + monthsShort : months, + weekdays : 'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split('_'), + weekdaysShort : 'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'), + weekdaysMin : 'ی_د_س_چ_پ_ه_ش'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, - dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; + meridiemParse: /ئێواره‌|به‌یانی/, + isPM: function (input) { + return /ئێواره‌/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'به‌یانی'; } else { - return number + '-ти'; + return 'ئێواره‌'; } }, + calendar : { + sameDay : '[ئه‌مرۆ كاتژمێر] LT', + nextDay : '[به‌یانی كاتژمێر] LT', + nextWeek : 'dddd [كاتژمێر] LT', + lastDay : '[دوێنێ كاتژمێر] LT', + lastWeek : 'dddd [كاتژمێر] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'له‌ %s', + past : '%s', + s : 'چه‌ند چركه‌یه‌ك', + ss : 'چركه‌ %d', + m : 'یه‌ك خوله‌ك', + mm : '%d خوله‌ك', + h : 'یه‌ك كاتژمێر', + hh : '%d كاتژمێر', + d : 'یه‌ك ڕۆژ', + dd : '%d ڕۆژ', + M : 'یه‌ك مانگ', + MM : '%d مانگ', + y : 'یه‌ك ساڵ', + yy : '%d ساڵ' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } }); - return bg; + return ku; }))); /***/ }), -/* 53 */ +/* 81 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var bm = moment.defineLocale('bm', { - months : 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'), - monthsShort : 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'), - weekdays : 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'), - weekdaysShort : 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'), - weekdaysMin : 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'), + var suffixes = { + 0: '-чү', + 1: '-чи', + 2: '-чи', + 3: '-чү', + 4: '-чү', + 5: '-чи', + 6: '-чы', + 7: '-чи', + 8: '-чи', + 9: '-чу', + 10: '-чу', + 20: '-чы', + 30: '-чу', + 40: '-чы', + 50: '-чү', + 60: '-чы', + 70: '-чи', + 80: '-чи', + 90: '-чу', + 100: '-чү' + }; + + var ky = moment.defineLocale('ky', { + months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), + monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), + weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'), + weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'MMMM [tile] D [san] YYYY', - LLL : 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', - LLLL : 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm' + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[Bi lɛrɛ] LT', - nextDay : '[Sini lɛrɛ] LT', - nextWeek : 'dddd [don lɛrɛ] LT', - lastDay : '[Kunu lɛrɛ] LT', - lastWeek : 'dddd [tɛmɛnen lɛrɛ] LT', + sameDay : '[Бүгүн саат] LT', + nextDay : '[Эртең саат] LT', + nextWeek : 'dddd [саат] LT', + lastDay : '[Кечээ саат] LT', + lastWeek : '[Өткөн аптанын] dddd [күнү] [саат] LT', sameElse : 'L' }, relativeTime : { - future : '%s kɔnɔ', - past : 'a bɛ %s bɔ', - s : 'sanga dama dama', - ss : 'sekondi %d', - m : 'miniti kelen', - mm : 'miniti %d', - h : 'lɛrɛ kelen', - hh : 'lɛrɛ %d', - d : 'tile kelen', - dd : 'tile %d', - M : 'kalo kelen', - MM : 'kalo %d', - y : 'san kelen', - yy : 'san %d' + future : '%s ичинде', + past : '%s мурун', + s : 'бирнече секунд', + ss : '%d секунд', + m : 'бир мүнөт', + mm : '%d мүнөт', + h : 'бир саат', + hh : '%d саат', + d : 'бир күн', + dd : '%d күн', + M : 'бир ай', + MM : '%d ай', + y : 'бир жыл', + yy : '%d жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); }, week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return bm; + return ky; }))); /***/ }), -/* 54 */ +/* 82 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '১', - '2': '২', - '3': '৩', - '4': '৪', - '5': '৫', - '6': '৬', - '7': '৭', - '8': '৮', - '9': '৯', - '0': '০' - }, - numberMap = { - '১': '1', - '২': '2', - '৩': '3', - '৪': '4', - '৫': '5', - '৬': '6', - '৭': '7', - '৮': '8', - '৯': '9', - '০': '0' - }; - - var bn = moment.defineLocale('bn', { - months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'), - monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'), - weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'), - weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'), - weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'), - longDateFormat : { - LT : 'A h:mm সময়', - LTS : 'A h:mm:ss সময়', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm সময়', - LLLL : 'dddd, D MMMM YYYY, A h:mm সময়' - }, - calendar : { - sameDay : '[আজ] LT', - nextDay : '[আগামীকাল] LT', - nextWeek : 'dddd, LT', - lastDay : '[গতকাল] LT', - lastWeek : '[গত] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s পরে', - past : '%s আগে', - s : 'কয়েক সেকেন্ড', - ss : '%d সেকেন্ড', - m : 'এক মিনিট', - mm : '%d মিনিট', - h : 'এক ঘন্টা', - hh : '%d ঘন্টা', - d : 'এক দিন', - dd : '%d দিন', - M : 'এক মাস', - MM : '%d মাস', - y : 'এক বছর', - yy : '%d বছর' - }, - preparse: function (string) { - return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; } - if ((meridiem === 'রাত' && hour >= 4) || - (meridiem === 'দুপুর' && hour < 5) || - meridiem === 'বিকাল') { - return hour + 12; - } else { - return hour; + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + var lb = moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm [Auer]', + LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'রাত'; - } else if (hour < 10) { - return 'সকাল'; - } else if (hour < 17) { - return 'দুপুর'; - } else if (hour < 20) { - return 'বিকাল'; - } else { - return 'রাত'; + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } } }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + ss : '%d Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. } }); - return bn; + return lb; }))); /***/ }), -/* 55 */ +/* 83 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '༡', - '2': '༢', - '3': '༣', - '4': '༤', - '5': '༥', - '6': '༦', - '7': '༧', - '8': '༨', - '9': '༩', - '0': '༠' - }, - numberMap = { - '༡': '1', - '༢': '2', - '༣': '3', - '༤': '4', - '༥': '5', - '༦': '6', - '༧': '7', - '༨': '8', - '༩': '9', - '༠': '0' - }; - - var bo = moment.defineLocale('bo', { - months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), - weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + var lo = moment.defineLocale('lo', { + months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'ວັນdddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/, + isPM: function (input) { + return input === 'ຕອນແລງ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ຕອນເຊົ້າ'; + } else { + return 'ຕອນແລງ'; + } }, calendar : { - sameDay : '[དི་རིང] LT', - nextDay : '[སང་ཉིན] LT', - nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', - lastDay : '[ཁ་སང] LT', - lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', + sameDay : '[ມື້ນີ້ເວລາ] LT', + nextDay : '[ມື້ອື່ນເວລາ] LT', + nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT', + lastDay : '[ມື້ວານນີ້ເວລາ] LT', + lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', sameElse : 'L' }, relativeTime : { - future : '%s ལ་', - past : '%s སྔན་ལ', - s : 'ལམ་སང', - ss : '%d སྐར་ཆ།', - m : 'སྐར་མ་གཅིག', - mm : '%d སྐར་མ', - h : 'ཆུ་ཚོད་གཅིག', - hh : '%d ཆུ་ཚོད', - d : 'ཉིན་གཅིག', - dd : '%d ཉིན་', - M : 'ཟླ་བ་གཅིག', - MM : '%d ཟླ་བ', - y : 'ལོ་གཅིག', - yy : '%d ལོ' - }, - preparse: function (string) { - return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); + future : 'ອີກ %s', + past : '%sຜ່ານມາ', + s : 'ບໍ່ເທົ່າໃດວິນາທີ', + ss : '%d ວິນາທີ' , + m : '1 ນາທີ', + mm : '%d ນາທີ', + h : '1 ຊົ່ວໂມງ', + hh : '%d ຊົ່ວໂມງ', + d : '1 ມື້', + dd : '%d ມື້', + M : '1 ເດືອນ', + MM : '%d ເດືອນ', + y : '1 ປີ', + yy : '%d ປີ' }, - meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'མཚན་མོ' && hour >= 4) || - (meridiem === 'ཉིན་གུང' && hour < 5) || - meridiem === 'དགོང་དག') { - return hour + 12; + dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/, + ordinal : function (number) { + return 'ທີ່' + number; + } + }); + + return lo; + +}))); + + +/***/ }), +/* 84 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var units = { + 'ss' : 'sekundė_sekundžių_sekundes', + 'm' : 'minutė_minutės_minutę', + 'mm': 'minutės_minučių_minutes', + 'h' : 'valanda_valandos_valandą', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dieną', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mėnuo_mėnesio_mėnesį', + 'MM': 'mėnesiai_mėnesių_mėnesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }; + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundės'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + function forms(key) { + return units[key].split('_'); + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; } else { - return hour; + return result + (special(number) ? forms(key)[1] : forms(key)[2]); } + } + } + var lt = moment.defineLocale('lt', { + months : { + format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), + standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), + isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'མཚན་མོ'; - } else if (hour < 10) { - return 'ཞོགས་ཀས'; - } else if (hour < 17) { - return 'ཉིན་གུང'; - } else if (hour < 20) { - return 'དགོང་དག'; - } else { - return 'མཚན་མོ'; - } + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : { + format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), + standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), + isFormat: /dddd HH:mm/ + }, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' + }, + calendar : { + sameDay : '[Šiandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[Praėjusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieš %s', + s : translateSeconds, + ss : translate, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; }, week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return bo; + return lt; }))); /***/ }), -/* 56 */ +/* 85 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function relativeTimeWithMutation(number, withoutSuffix, key) { - var format = { - 'mm': 'munutenn', - 'MM': 'miz', - 'dd': 'devezh' - }; - return number + ' ' + mutation(format[key], number); - } - function specialMutationForYears(number) { - switch (lastNumber(number)) { - case 1: - case 3: - case 4: - case 5: - case 9: - return number + ' bloaz'; - default: - return number + ' vloaz'; + var units = { + 'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'), + 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'h': 'stundas_stundām_stunda_stundas'.split('_'), + 'hh': 'stundas_stundām_stunda_stundas'.split('_'), + 'd': 'dienas_dienām_diena_dienas'.split('_'), + 'dd': 'dienas_dienām_diena_dienas'.split('_'), + 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'y': 'gada_gadiem_gads_gadi'.split('_'), + 'yy': 'gada_gadiem_gads_gadi'.split('_') + }; + /** + * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. + */ + function format(forms, number, withoutSuffix) { + if (withoutSuffix) { + // E.g. "21 minūte", "3 minūtes". + return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; + } else { + // E.g. "21 minūtes" as in "pēc 21 minūtes". + // E.g. "3 minūtēm" as in "pēc 3 minūtēm". + return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; } } - function lastNumber(number) { - if (number > 9) { - return lastNumber(number % 10); - } - return number; + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); } - function mutation(text, number) { - if (number === 2) { - return softMutation(text); - } - return text; + function relativeTimeWithSingular(number, withoutSuffix, key) { + return format(units[key], number, withoutSuffix); } - function softMutation(text) { - var mutationTable = { - 'm': 'v', - 'b': 'v', - 'd': 'z' - }; - if (mutationTable[text.charAt(0)] === undefined) { - return text; - } - return mutationTable[text.charAt(0)] + text.substring(1); + function relativeSeconds(number, withoutSuffix) { + return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; } - var br = moment.defineLocale('br', { - months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), - monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), - weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), - weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), - weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + var lv = moment.defineLocale('lv', { + months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'h[e]mm A', - LTS : 'h[e]mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D [a viz] MMMM YYYY', - LLL : 'D [a viz] MMMM YYYY h[e]mm A', - LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY.', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, HH:mm', + LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' }, calendar : { - sameDay : '[Hiziv da] LT', - nextDay : '[Warc\'hoazh da] LT', - nextWeek : 'dddd [da] LT', - lastDay : '[Dec\'h da] LT', - lastWeek : 'dddd [paset da] LT', + sameDay : '[Šodien pulksten] LT', + nextDay : '[Rīt pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[Pagājušā] dddd [pulksten] LT', sameElse : 'L' }, relativeTime : { - future : 'a-benn %s', - past : '%s \'zo', - s : 'un nebeud segondennoù', - ss : '%d eilenn', - m : 'ur vunutenn', - mm : relativeTimeWithMutation, - h : 'un eur', - hh : '%d eur', - d : 'un devezh', - dd : relativeTimeWithMutation, - M : 'ur miz', - MM : relativeTimeWithMutation, - y : 'ur bloaz', - yy : specialMutationForYears - }, - dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/, - ordinal : function (number) { - var output = (number === 1) ? 'añ' : 'vet'; - return number + output; + future : 'pēc %s', + past : 'pirms %s', + s : relativeSeconds, + ss : relativeTimeWithPlural, + m : relativeTimeWithSingular, + mm : relativeTimeWithPlural, + h : relativeTimeWithSingular, + hh : relativeTimeWithPlural, + d : relativeTimeWithSingular, + dd : relativeTimeWithPlural, + M : relativeTimeWithSingular, + MM : relativeTimeWithPlural, + y : relativeTimeWithSingular, + yy : relativeTimeWithPlural }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return br; + return lv; }))); /***/ }), -/* 57 */ +/* 86 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'ss': - if (number === 1) { - result += 'sekunda'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sekunde'; - } else { - result += 'sekundi'; - } - return result; - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; + var translator = { + words: { //Different grammatical cases + ss: ['sekund', 'sekunda', 'sekundi'], + m: ['jedan minut', 'jednog minuta'], + mm: ['minut', 'minuta', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mjesec', 'mjeseca', 'mjeseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } } - } + }; - var bs = moment.defineLocale('bs', { - months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + var me = moment.defineLocale('me', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact : true, + weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', + longDateFormat: { + LT: 'H:mm', LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - nextWeek : function () { + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sjutra u] LT', + + nextWeek: function () { switch (this.day()) { case 0: return '[u] [nedjelju] [u] LT'; @@ -11442,38 +12966,36 @@ webpackContext.id = 41; return '[u] dddd [u] LT'; } }, - lastDay : '[jučer u] LT', + lastDay : '[juče u] LT', lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prošli] dddd [u] LT'; - } + var lastWeekDays = [ + '[prošle] [nedjelje] [u] LT', + '[prošlog] [ponedjeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srijede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; }, sameElse : 'L' }, relativeTime : { future : 'za %s', past : 'prije %s', - s : 'par sekundi', - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, + s : 'nekoliko sekundi', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, d : 'dan', - dd : translate, + dd : translator.translate, M : 'mjesec', - MM : translate, + MM : translator.translate, y : 'godinu', - yy : translate + yy : translator.translate }, dayOfMonthOrdinalParse: /\d{1,2}\./, ordinal : '%d.', @@ -11483,1059 +13005,1123 @@ webpackContext.id = 41; } }); - return bs; + return me; }))); /***/ }), -/* 58 */ +/* 87 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var ca = moment.defineLocale('ca', { - months : { - standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), - format: 'de gener_de febrer_de març_d\'abril_de maig_de juny_de juliol_d\'agost_de setembre_d\'octubre_de novembre_de desembre'.split('_'), - isFormat: /D[oD]?(\s)+MMMM/ + var mi = moment.defineLocale('mi', { + months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), + monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), + monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, + weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), + weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY [i] HH:mm', + LLLL: 'dddd, D MMMM YYYY [i] HH:mm' }, - monthsShort : 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'), - monthsParseExact : true, - weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), - weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), - weekdaysMin : 'dg_dl_dt_dc_dj_dv_ds'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [de] YYYY', - ll : 'D MMM YYYY', - LLL : 'D MMMM [de] YYYY [a les] H:mm', - lll : 'D MMM YYYY, H:mm', - LLLL : 'dddd D MMMM [de] YYYY [a les] H:mm', - llll : 'ddd D MMM YYYY, H:mm' - }, - calendar : { - sameDay : function () { - return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextDay : function () { - return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastDay : function () { - return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'd\'aquí %s', - past : 'fa %s', - s : 'uns segons', - ss : '%d segons', - m : 'un minut', - mm : '%d minuts', - h : 'una hora', - hh : '%d hores', - d : 'un dia', - dd : '%d dies', - M : 'un mes', - MM : '%d mesos', - y : 'un any', - yy : '%d anys' + calendar: { + sameDay: '[i teie mahana, i] LT', + nextDay: '[apopo i] LT', + nextWeek: 'dddd [i] LT', + lastDay: '[inanahi i] LT', + lastWeek: 'dddd [whakamutunga i] LT', + sameElse: 'L' }, - dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/, - ordinal : function (number, period) { - var output = (number === 1) ? 'r' : - (number === 2) ? 'n' : - (number === 3) ? 'r' : - (number === 4) ? 't' : 'è'; - if (period === 'w' || period === 'W') { - output = 'a'; - } - return number + output; + relativeTime: { + future: 'i roto i %s', + past: '%s i mua', + s: 'te hēkona ruarua', + ss: '%d hēkona', + m: 'he meneti', + mm: '%d meneti', + h: 'te haora', + hh: '%d haora', + d: 'he ra', + dd: '%d ra', + M: 'he marama', + MM: '%d marama', + y: 'he tau', + yy: '%d tau' }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal: '%dº', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ca; + return mi; }))); /***/ }), -/* 59 */ +/* 88 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'), - monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'); - - var monthsParse = [/^led/i, /^úno/i, /^bře/i, /^dub/i, /^kvě/i, /^(čvn|červen$|června)/i, /^(čvc|červenec|července)/i, /^srp/i, /^zář/i, /^říj/i, /^lis/i, /^pro/i]; - // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched. - // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'. - var monthsRegex = /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i; - - function plural(n) { - return (n > 1) && (n < 5) && (~~(n / 10) !== 1); - } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; - case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'sekundy' : 'sekund'); - } else { - return result + 'sekundami'; - } - break; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minuty' : 'minut'); - } else { - return result + 'minutami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodin'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'den' : 'dnem'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dny' : 'dní'); - } else { - return result + 'dny'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'měsíce' : 'měsíců'); - } else { - return result + 'měsíci'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'let'); - } else { - return result + 'lety'; - } - break; - } - } - - var cs = moment.defineLocale('cs', { - months : months, - monthsShort : monthsShort, - monthsRegex : monthsRegex, - monthsShortRegex : monthsRegex, - // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched. - // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'. - monthsStrictRegex : /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i, - monthsShortStrictRegex : /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i, - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'), - weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'), - weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'), + var mk = moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), + weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), + weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'), longDateFormat : { - LT: 'H:mm', + LT : 'H:mm', LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd D. MMMM YYYY H:mm', - l : 'D. M. YYYY' + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' }, calendar : { - sameDay: '[dnes v] LT', - nextDay: '[zítra v] LT', - nextWeek: function () { + sameDay : '[Денес во] LT', + nextDay : '[Утре во] LT', + nextWeek : '[Во] dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { switch (this.day()) { case 0: - return '[v neděli v] LT'; - case 1: - case 2: - return '[v] dddd [v] LT'; case 3: - return '[ve středu v] LT'; - case 4: - return '[ve čtvrtek v] LT'; - case 5: - return '[v pátek v] LT'; case 6: - return '[v sobotu v] LT'; - } - }, - lastDay: '[včera v] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulou neděli v] LT'; + return '[Изминатата] dddd [во] LT'; case 1: case 2: - return '[minulé] dddd [v] LT'; - case 3: - return '[minulou středu v] LT'; case 4: case 5: - return '[minulý] dddd [v] LT'; - case 6: - return '[minulou sobotu v] LT'; + return '[Изминатиот] dddd [во] LT'; } }, - sameElse: 'L' + sameElse : 'L' }, relativeTime : { - future : 'za %s', - past : 'před %s', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate + future : 'после %s', + past : 'пред %s', + s : 'неколку секунди', + ss : '%d секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дена', + M : 'месец', + MM : '%d месеци', + y : 'година', + yy : '%d години' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } }, - dayOfMonthOrdinalParse : /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return cs; + return mk; }))); /***/ }), -/* 60 */ +/* 89 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var cv = moment.defineLocale('cv', { - months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'), - monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'), - weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'), - weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'), - weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'), + var ml = moment.defineLocale('ml', { + months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), + monthsParseExact : true, + weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'), + weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'), + weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', - LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', - LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm' + LT : 'A h:mm -നു', + LTS : 'A h:mm:ss -നു', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm -നു', + LLLL : 'dddd, D MMMM YYYY, A h:mm -നു' }, calendar : { - sameDay: '[Паян] LT [сехетре]', - nextDay: '[Ыран] LT [сехетре]', - lastDay: '[Ӗнер] LT [сехетре]', - nextWeek: '[Ҫитес] dddd LT [сехетре]', - lastWeek: '[Иртнӗ] dddd LT [сехетре]', - sameElse: 'L' + sameDay : '[ഇന്ന്] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇന്നലെ] LT', + lastWeek : '[കഴിഞ്ഞ] dddd, LT', + sameElse : 'L' }, relativeTime : { - future : function (output) { - var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран'; - return output + affix; - }, - past : '%s каялла', - s : 'пӗр-ик ҫеккунт', - ss : '%d ҫеккунт', - m : 'пӗр минут', - mm : '%d минут', - h : 'пӗр сехет', - hh : '%d сехет', - d : 'пӗр кун', - dd : '%d кун', - M : 'пӗр уйӑх', - MM : '%d уйӑх', - y : 'пӗр ҫул', - yy : '%d ҫул' - }, - dayOfMonthOrdinalParse: /\d{1,2}-мӗш/, - ordinal : '%d-мӗш', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - - return cv; - -}))); - - -/***/ }), -/* 61 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var cy = moment.defineLocale('cy', { - months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), - monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), - weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), - weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), - weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), - weekdaysParseExact : true, - // time formats are the same as en-gb - longDateFormat: { - LT: 'HH:mm', - LTS : 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[Heddiw am] LT', - nextDay: '[Yfory am] LT', - nextWeek: 'dddd [am] LT', - lastDay: '[Ddoe am] LT', - lastWeek: 'dddd [diwethaf am] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'mewn %s', - past: '%s yn ôl', - s: 'ychydig eiliadau', - ss: '%d eiliad', - m: 'munud', - mm: '%d munud', - h: 'awr', - hh: '%d awr', - d: 'diwrnod', - dd: '%d diwrnod', - M: 'mis', - MM: '%d mis', - y: 'blwyddyn', - yy: '%d flynedd' + future : '%s കഴിഞ്ഞ്', + past : '%s മുൻപ്', + s : 'അൽപ നിമിഷങ്ങൾ', + ss : '%d സെക്കൻഡ്', + m : 'ഒരു മിനിറ്റ്', + mm : '%d മിനിറ്റ്', + h : 'ഒരു മണിക്കൂർ', + hh : '%d മണിക്കൂർ', + d : 'ഒരു ദിവസം', + dd : '%d ദിവസം', + M : 'ഒരു മാസം', + MM : '%d മാസം', + y : 'ഒരു വർഷം', + yy : '%d വർഷം' }, - dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, - // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh - ordinal: function (number) { - var b = number, - output = '', - lookup = [ - '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed - 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed - ]; - if (b > 20) { - if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { - output = 'fed'; // not 30ain, 70ain or 90ain - } else { - output = 'ain'; - } - } else if (b > 0) { - output = lookup[b]; + meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'രാത്രി' && hour >= 4) || + meridiem === 'ഉച്ച കഴിഞ്ഞ്' || + meridiem === 'വൈകുന്നേരം') { + return hour + 12; + } else { + return hour; } - return number + output; }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാത്രി'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉച്ച കഴിഞ്ഞ്'; + } else if (hour < 20) { + return 'വൈകുന്നേരം'; + } else { + return 'രാത്രി'; + } } }); - return cy; + return ml; }))); /***/ }), -/* 62 */ +/* 90 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var da = moment.defineLocale('da', { - months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + function translate(number, withoutSuffix, key, isFuture) { + switch (key) { + case 's': + return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын'; + case 'ss': + return number + (withoutSuffix ? ' секунд' : ' секундын'); + case 'm': + case 'mm': + return number + (withoutSuffix ? ' минут' : ' минутын'); + case 'h': + case 'hh': + return number + (withoutSuffix ? ' цаг' : ' цагийн'); + case 'd': + case 'dd': + return number + (withoutSuffix ? ' өдөр' : ' өдрийн'); + case 'M': + case 'MM': + return number + (withoutSuffix ? ' сар' : ' сарын'); + case 'y': + case 'yy': + return number + (withoutSuffix ? ' жил' : ' жилийн'); + default: + return number; + } + } + + var mn = moment.defineLocale('mn', { + months : 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'), + monthsShort : '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'), + monthsParseExact : true, + weekdays : 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'), + weekdaysShort : 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'), + weekdaysMin : 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'), + weekdaysParseExact : true, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm' + L : 'YYYY-MM-DD', + LL : 'YYYY оны MMMMын D', + LLL : 'YYYY оны MMMMын D HH:mm', + LLLL : 'dddd, YYYY оны MMMMын D HH:mm' }, - calendar : { - sameDay : '[i dag kl.] LT', - nextDay : '[i morgen kl.] LT', - nextWeek : 'på dddd [kl.] LT', - lastDay : '[i går kl.] LT', - lastWeek : '[i] dddd[s kl.] LT', - sameElse : 'L' + meridiemParse: /ҮӨ|ҮХ/i, + isPM : function (input) { + return input === 'ҮХ'; }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'få sekunder', - ss : '%d sekunder', - m : 'et minut', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dage', - M : 'en måned', - MM : '%d måneder', - y : 'et år', - yy : '%d år' + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ҮӨ'; + } else { + return 'ҮХ'; + } }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + calendar : { + sameDay : '[Өнөөдөр] LT', + nextDay : '[Маргааш] LT', + nextWeek : '[Ирэх] dddd LT', + lastDay : '[Өчигдөр] LT', + lastWeek : '[Өнгөрсөн] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s дараа', + past : '%s өмнө', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2} өдөр/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + ' өдөр'; + default: + return number; + } } }); - return da; + return mn; }))); /***/ }), -/* 63 */ +/* 91 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + function relativeTimeMr(number, withoutSuffix, string, isFuture) + { + var output = ''; + if (withoutSuffix) { + switch (string) { + case 's': output = 'काही सेकंद'; break; + case 'ss': output = '%d सेकंद'; break; + case 'm': output = 'एक मिनिट'; break; + case 'mm': output = '%d मिनिटे'; break; + case 'h': output = 'एक तास'; break; + case 'hh': output = '%d तास'; break; + case 'd': output = 'एक दिवस'; break; + case 'dd': output = '%d दिवस'; break; + case 'M': output = 'एक महिना'; break; + case 'MM': output = '%d महिने'; break; + case 'y': output = 'एक वर्ष'; break; + case 'yy': output = '%d वर्षे'; break; + } + } + else { + switch (string) { + case 's': output = 'काही सेकंदां'; break; + case 'ss': output = '%d सेकंदां'; break; + case 'm': output = 'एका मिनिटा'; break; + case 'mm': output = '%d मिनिटां'; break; + case 'h': output = 'एका तासा'; break; + case 'hh': output = '%d तासां'; break; + case 'd': output = 'एका दिवसा'; break; + case 'dd': output = '%d दिवसां'; break; + case 'M': output = 'एका महिन्या'; break; + case 'MM': output = '%d महिन्यां'; break; + case 'y': output = 'एका वर्षा'; break; + case 'yy': output = '%d वर्षां'; break; + } + } + return output.replace(/%d/i, number); } - var de = moment.defineLocale('de', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + var mr = moment.defineLocale('mr', { + months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, + weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm वाजता', + LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता' }, calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' + sameDay : '[आज] LT', + nextDay : '[उद्या] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - ss : '%d Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + future: '%sमध्ये', + past: '%sपूर्वी', + s: relativeTimeMr, + ss: relativeTimeMr, + m: relativeTimeMr, + mm: relativeTimeMr, + h: relativeTimeMr, + hh: relativeTimeMr, + d: relativeTimeMr, + dd: relativeTimeMr, + M: relativeTimeMr, + MM: relativeTimeMr, + y: relativeTimeMr, + yy: relativeTimeMr + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात्री') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दुपारी') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'रात्री'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दुपारी'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रात्री'; + } }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return de; + return mr; }))); /***/ }), -/* 64 */ +/* 92 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var deAt = moment.defineLocale('de-at', { - months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, + var ms = moment.defineLocale('ms', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } }, calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - ss : '%d Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return deAt; + return ms; }))); /***/ }), -/* 65 */ +/* 93 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var deCh = moment.defineLocale('de-ch', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, + var msMy = moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } }, calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - ss : '%d Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return deCh; + return msMy; }))); /***/ }), -/* 66 */ +/* 94 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var months = [ - 'ޖެނުއަރީ', - 'ފެބްރުއަރީ', - 'މާރިޗު', - 'އޭޕްރީލު', - 'މޭ', - 'ޖޫން', - 'ޖުލައި', - 'އޯގަސްޓު', - 'ސެޕްޓެމްބަރު', - 'އޮކްޓޯބަރު', - 'ނޮވެމްބަރު', - 'ޑިސެމްބަރު' - ], weekdays = [ - 'އާދިއްތަ', - 'ހޯމަ', - 'އަންގާރަ', - 'ބުދަ', - 'ބުރާސްފަތި', - 'ހުކުރު', - 'ހޮނިހިރު' - ]; - - var dv = moment.defineLocale('dv', { - months : months, - monthsShort : months, - weekdays : weekdays, - weekdaysShort : weekdays, - weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'), + var mt = moment.defineLocale('mt', { + months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'), + monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'), + weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'), + weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'), + weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'), longDateFormat : { - LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'D/M/YYYY', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /މކ|މފ/, - isPM : function (input) { - return 'މފ' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'މކ'; - } else { - return 'މފ'; - } + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[މިއަދު] LT', - nextDay : '[މާދަމާ] LT', - nextWeek : 'dddd LT', - lastDay : '[އިއްޔެ] LT', - lastWeek : '[ފާއިތުވި] dddd LT', + sameDay : '[Illum fil-]LT', + nextDay : '[Għada fil-]LT', + nextWeek : 'dddd [fil-]LT', + lastDay : '[Il-bieraħ fil-]LT', + lastWeek : 'dddd [li għadda] [fil-]LT', sameElse : 'L' }, relativeTime : { - future : 'ތެރޭގައި %s', - past : 'ކުރިން %s', - s : 'ސިކުންތުކޮޅެއް', - ss : 'd% ސިކުންތު', - m : 'މިނިޓެއް', - mm : 'މިނިޓު %d', - h : 'ގަޑިއިރެއް', - hh : 'ގަޑިއިރު %d', - d : 'ދުވަހެއް', - dd : 'ދުވަސް %d', - M : 'މަހެއް', - MM : 'މަސް %d', - y : 'އަހަރެއް', - yy : 'އަހަރު %d' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); + future : 'f’ %s', + past : '%s ilu', + s : 'ftit sekondi', + ss : '%d sekondi', + m : 'minuta', + mm : '%d minuti', + h : 'siegħa', + hh : '%d siegħat', + d : 'ġurnata', + dd : '%d ġranet', + M : 'xahar', + MM : '%d xhur', + y : 'sena', + yy : '%d sni' }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal: '%dº', week : { - dow : 7, // Sunday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return dv; + return mt; }))); /***/ }), -/* 67 */ +/* 95 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; - } + var symbolMap = { + '1': '၁', + '2': '၂', + '3': '၃', + '4': '၄', + '5': '၅', + '6': '၆', + '7': '၇', + '8': '၈', + '9': '၉', + '0': '၀' + }, numberMap = { + '၁': '1', + '၂': '2', + '၃': '3', + '၄': '4', + '၅': '5', + '၆': '6', + '၇': '7', + '၈': '8', + '၉': '9', + '၀': '0' + }; - var el = moment.defineLocale('el', { - monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'), - monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'), - months : function (momentToFormat, format) { - if (!momentToFormat) { - return this._monthsNominativeEl; - } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' - return this._monthsGenitiveEl[momentToFormat.month()]; - } else { - return this._monthsNominativeEl[momentToFormat.month()]; - } + var my = moment.defineLocale('my', { + months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' }, - monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'), - weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'), - weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'), - weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'), - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'μμ' : 'ΜΜ'; - } else { - return isLower ? 'πμ' : 'ΠΜ'; - } + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]', + sameElse: 'L' }, - isPM : function (input) { - return ((input + '').toLowerCase()[0] === 'μ'); + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်ခဲ့သော %s က', + s: 'စက္ကန်.အနည်းငယ်', + ss : '%d စက္ကန့်', + m: 'တစ်မိနစ်', + mm: '%d မိနစ်', + h: 'တစ်နာရီ', + hh: '%d နာရီ', + d: 'တစ်ရက်', + dd: '%d ရက်', + M: 'တစ်လ', + MM: '%d လ', + y: 'တစ်နှစ်', + yy: '%d နှစ်' }, - meridiemParse : /[ΠΜ]\.?Μ?\.?/i, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' + preparse: function (string) { + return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) { + return numberMap[match]; + }); }, - calendarEl : { - sameDay : '[Σήμερα {}] LT', - nextDay : '[Αύριο {}] LT', - nextWeek : 'dddd [{}] LT', - lastDay : '[Χθες {}] LT', - lastWeek : function () { - switch (this.day()) { - case 6: - return '[το προηγούμενο] dddd [{}] LT'; - default: - return '[την προηγούμενη] dddd [{}] LT'; - } - }, - sameElse : 'L' + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); }, - calendar : function (key, mom) { - var output = this._calendarEl[key], - hours = mom && mom.hours(); - if (isFunction(output)) { - output = output.apply(mom); - } - return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return my; + +}))); + + +/***/ }), +/* 96 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var nb = moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i går kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' }, relativeTime : { - future : 'σε %s', - past : '%s πριν', - s : 'λίγα δευτερόλεπτα', - ss : '%d δευτερόλεπτα', - m : 'ένα λεπτό', - mm : '%d λεπτά', - h : 'μία ώρα', - hh : '%d ώρες', - d : 'μία μέρα', - dd : '%d μέρες', - M : 'ένας μήνας', - MM : '%d μήνες', - y : 'ένας χρόνος', - yy : '%d χρόνια' + future : 'om %s', + past : '%s siden', + s : 'noen sekunder', + ss : '%d sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en måned', + MM : '%d måneder', + y : 'ett år', + yy : '%d år' }, - dayOfMonthOrdinalParse: /\d{1,2}η/, - ordinal: '%dη', + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4st is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return el; + return nb; }))); /***/ }), -/* 68 */ +/* 97 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enSG = moment.defineLocale('en-SG', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + var ne = moment.defineLocale('ne', { + months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), + monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), + monthsParseExact : true, + weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), + weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY, Aको h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राति|बिहान|दिउँसो|साँझ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राति') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउँसो') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'साँझ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राति'; + } else if (hour < 12) { + return 'बिहान'; + } else if (hour < 16) { + return 'दिउँसो'; + } else if (hour < 20) { + return 'साँझ'; + } else { + return 'राति'; + } }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', + sameDay : '[आज] LT', + nextDay : '[भोलि] LT', + nextWeek : '[आउँदो] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गएको] dddd[,] LT', sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + future : '%sमा', + past : '%s अगाडि', + s : 'केही क्षण', + ss : '%d सेकेण्ड', + m : 'एक मिनेट', + mm : '%d मिनेट', + h : 'एक घण्टा', + hh : '%d घण्टा', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महिना', + MM : '%d महिना', + y : 'एक बर्ष', + yy : '%d बर्ष' }, week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return enSG; + return ne; }))); /***/ }), -/* 69 */ +/* 98 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enAu = moment.defineLocale('en-au', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; + var monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + + var nl = moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); }, week : { dow : 1, // Monday is the first day of the week. @@ -12543,135 +14129,89 @@ webpackContext.id = 41; } }); - return enAu; + return nl; }))); /***/ }), -/* 70 */ +/* 99 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enCa = moment.defineLocale('en-ca', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'YYYY-MM-DD', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - - return enCa; - -}))); - + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { + var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; + var monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; -//! moment.js locale configuration + var nlBe = moment.defineLocale('nl-be', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, - var enGb = moment.defineLocale('en-gb', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), + weekdaysParseExact : true, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); }, week : { dow : 1, // Monday is the first day of the week. @@ -12679,373 +14219,386 @@ webpackContext.id = 41; } }); - return enGb; + return nlBe; }))); /***/ }), -/* 72 */ +/* 100 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enIe = moment.defineLocale('en-ie', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var nn = moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I går klokka] LT', + lastWeek: '[Føregåande] dddd [klokka] LT', + sameElse: 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + future : 'om %s', + past : '%s sidan', + s : 'nokre sekund', + ss : '%d sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein månad', + MM : '%d månader', + y : 'eit år', + yy : '%d år' }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return enIe; + return nn; }))); /***/ }), -/* 73 */ +/* 101 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enIl = moment.defineLocale('en-il', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var symbolMap = { + '1': '੧', + '2': '੨', + '3': '੩', + '4': '੪', + '5': '੫', + '6': '੬', + '7': '੭', + '8': '੮', + '9': '੯', + '0': '੦' + }, + numberMap = { + '੧': '1', + '੨': '2', + '੩': '3', + '੪': '4', + '੫': '5', + '੬': '6', + '੭': '7', + '੮': '8', + '੯': '9', + '੦': '0' + }; + + var paIn = moment.defineLocale('pa-in', { + // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi. + months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'), + weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), + weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'A h:mm ਵਜੇ', + LTS : 'A h:mm:ss ਵਜੇ', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY, A h:mm ਵਜੇ', + LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', + sameDay : '[ਅਜ] LT', + nextDay : '[ਕਲ] LT', + nextWeek : '[ਅਗਲਾ] dddd, LT', + lastDay : '[ਕਲ] LT', + lastWeek : '[ਪਿਛਲੇ] dddd, LT', sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' + future : '%s ਵਿੱਚ', + past : '%s ਪਿਛਲੇ', + s : 'ਕੁਝ ਸਕਿੰਟ', + ss : '%d ਸਕਿੰਟ', + m : 'ਇਕ ਮਿੰਟ', + mm : '%d ਮਿੰਟ', + h : 'ਇੱਕ ਘੰਟਾ', + hh : '%d ਘੰਟੇ', + d : 'ਇੱਕ ਦਿਨ', + dd : '%d ਦਿਨ', + M : 'ਇੱਕ ਮਹੀਨਾ', + MM : '%d ਮਹੀਨੇ', + y : 'ਇੱਕ ਸਾਲ', + yy : '%d ਸਾਲ' }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + preparse: function (string) { + return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Punjabi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. + meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ਰਾਤ') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ਸਵੇਰ') { + return hour; + } else if (meridiem === 'ਦੁਪਹਿਰ') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'ਸ਼ਾਮ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ਰਾਤ'; + } else if (hour < 10) { + return 'ਸਵੇਰ'; + } else if (hour < 17) { + return 'ਦੁਪਹਿਰ'; + } else if (hour < 20) { + return 'ਸ਼ਾਮ'; + } else { + return 'ਰਾਤ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return enIl; + return paIn; }))); /***/ }), -/* 74 */ +/* 102 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enNz = moment.defineLocale('en-nz', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + return result + (plural(number) ? 'sekundy' : 'sekund'); + case 'm': + return withoutSuffix ? 'minuta' : 'minutę'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinę'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiące' : 'miesięcy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + var pl = moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (!momentToFormat) { + return monthsNominative; + } else if (format === '') { + // Hack: if format empty we know this is used to generate + // RegExp by moment. Give then back both valid forms of months + // in RegExp ready format. + return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; + } else if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), + weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), + weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' + sameDay: '[Dziś o] LT', + nextDay: '[Jutro o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[W niedzielę o] LT'; + + case 2: + return '[We wtorek o] LT'; + + case 3: + return '[W środę o] LT'; + + case 6: + return '[W sobotę o] LT'; + + default: + return '[W] dddd [o] LT'; + } + }, + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszłą niedzielę o] LT'; + case 3: + return '[W zeszłą środę o] LT'; + case 6: + return '[W zeszłą sobotę o] LT'; + default: + return '[W zeszły] dddd [o] LT'; + } + }, + sameElse: 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzień', + dd : '%d dni', + M : 'miesiąc', + MM : translate, + y : 'rok', + yy : translate }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return enNz; + return pl; }))); /***/ }), -/* 75 */ +/* 103 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var eo = moment.defineLocale('eo', { - months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'), - weekdays : 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'), - weekdaysShort : 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'), - weekdaysMin : 'di_lu_ma_me_ĵa_ve_sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D[-a de] MMMM, YYYY', - LLL : 'D[-a de] MMMM, YYYY HH:mm', - LLLL : 'dddd, [la] D[-a de] MMMM, YYYY HH:mm' - }, - meridiemParse: /[ap]\.t\.m/i, - isPM: function (input) { - return input.charAt(0).toLowerCase() === 'p'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'p.t.m.' : 'P.T.M.'; - } else { - return isLower ? 'a.t.m.' : 'A.T.M.'; - } - }, - calendar : { - sameDay : '[Hodiaŭ je] LT', - nextDay : '[Morgaŭ je] LT', - nextWeek : 'dddd [je] LT', - lastDay : '[Hieraŭ je] LT', - lastWeek : '[pasinta] dddd [je] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'post %s', - past : 'antaŭ %s', - s : 'sekundoj', - ss : '%d sekundoj', - m : 'minuto', - mm : '%d minutoj', - h : 'horo', - hh : '%d horoj', - d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo - dd : '%d tagoj', - M : 'monato', - MM : '%d monatoj', - y : 'jaro', - yy : '%d jaroj' - }, - dayOfMonthOrdinalParse: /\d{1,2}a/, - ordinal : '%da', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - - return eo; - -}))); - - -/***/ }), -/* 76 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; - var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; - - var es = moment.defineLocale('es', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortDot; - } else if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsRegex : monthsRegex, - monthsShortRegex : monthsRegex, - monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + var pt = moment.defineLocale('pt', { + months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY H:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + LLL : 'D [de] MMMM [de] YYYY HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' }, calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday }, - sameElse : 'L' + sameElse: 'L' }, relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', + future : 'em %s', + past : 'há %s', + s : 'segundos', ss : '%d segundos', - m : 'un minuto', + m : 'um minuto', mm : '%d minutos', - h : 'una hora', + h : 'uma hora', hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', + d : 'um dia', + dd : '%d dias', + M : 'um mês', MM : '%d meses', - y : 'un año', - yy : '%d años' + y : 'um ano', + yy : '%d anos' }, - dayOfMonthOrdinalParse : /\d{1,2}º/, + dayOfMonthOrdinalParse: /\d{1,2}º/, ordinal : '%dº', week : { dow : 1, // Monday is the first day of the week. @@ -13053,560 +14606,488 @@ webpackContext.id = 41; } }); - return es; + return pt; }))); /***/ }), -/* 77 */ +/* 104 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; - var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; - - var esDo = moment.defineLocale('es-do', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortDot; - } else if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, - monthsParse: monthsParse, - longMonthsParse: monthsParse, - shortMonthsParse: monthsParse, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + var ptBr = moment.defineLocale('pt-br', { + months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY h:mm A', - LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' }, calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday }, - sameElse : 'L' + sameElse: 'L' }, relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', + future : 'em %s', + past : 'há %s', + s : 'poucos segundos', ss : '%d segundos', - m : 'un minuto', + m : 'um minuto', mm : '%d minutos', - h : 'una hora', + h : 'uma hora', hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', + d : 'um dia', + dd : '%d dias', + M : 'um mês', MM : '%d meses', - y : 'un año', - yy : '%d años' + y : 'um ano', + yy : '%d anos' }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal : '%dº' }); - return esDo; + return ptBr; }))); /***/ }), -/* 78 */ +/* 105 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; - var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': 'secunde', + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + return number + separator + format[key]; + } - var esUs = moment.defineLocale('es-us', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortDot; - } else if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, - monthsParse: monthsParse, - longMonthsParse: monthsParse, - shortMonthsParse: monthsParse, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), - weekdaysParseExact : true, + var ro = moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'MM/DD/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY h:mm A', - LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' }, calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' }, relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - ss : '%d segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + ss : relativeTimeWithPlural, + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return esUs; + return ro; }))); /***/ }), -/* 79 */ +/* 106 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function relativeTimeWithPlural(number, withoutSuffix, key) { var format = { - 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], - 'ss': [number + 'sekundi', number + 'sekundit'], - 'm' : ['ühe minuti', 'üks minut'], - 'mm': [number + ' minuti', number + ' minutit'], - 'h' : ['ühe tunni', 'tund aega', 'üks tund'], - 'hh': [number + ' tunni', number + ' tundi'], - 'd' : ['ühe päeva', 'üks päev'], - 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], - 'MM': [number + ' kuu', number + ' kuud'], - 'y' : ['ühe aasta', 'aasta', 'üks aasta'], - 'yy': [number + ' aasta', number + ' aastat'] + 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'час_часа_часов', + 'dd': 'день_дня_дней', + 'MM': 'месяц_месяца_месяцев', + 'yy': 'год_года_лет' }; - if (withoutSuffix) { - return format[key][2] ? format[key][2] : format[key][1]; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); } - return isFuture ? format[key][0] : format[key][1]; } + var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; - var et = moment.defineLocale('et', { - months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), - monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), - weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), - weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), - weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' + // http://new.gramota.ru/spravka/rules/139-prop : § 103 + // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 + // CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 + var ru = moment.defineLocale('ru', { + months : { + format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), + standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') }, - calendar : { - sameDay : '[Täna,] LT', - nextDay : '[Homme,] LT', - nextWeek : '[Järgmine] dddd LT', - lastDay : '[Eile,] LT', - lastWeek : '[Eelmine] dddd LT', - sameElse : 'L' + monthsShort : { + // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? + format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), + standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') }, - relativeTime : { - future : '%s pärast', - past : '%s tagasi', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : '%d päeva', - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + weekdays : { + standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), + format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), + isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return et; - -}))); - - -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { + weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, -//! moment.js locale configuration + // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки + monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; + // копия предыдущего + monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + // полные названия с падежами + monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, - var eu = moment.defineLocale('eu', { - months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), - monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), - monthsParseExact : true, - weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), - weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), - weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), - weekdaysParseExact : true, + // Выражение, которое соотвествует только сокращённым формам + monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY[ko] MMMM[ren] D[a]', - LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', - LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', - l : 'YYYY-M-D', - ll : 'YYYY[ko] MMM D[a]', - lll : 'YYYY[ko] MMM D[a] HH:mm', - llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., H:mm', + LLLL : 'dddd, D MMMM YYYY г., H:mm' }, calendar : { - sameDay : '[gaur] LT[etan]', - nextDay : '[bihar] LT[etan]', - nextWeek : 'dddd LT[etan]', - lastDay : '[atzo] LT[etan]', - lastWeek : '[aurreko] dddd LT[etan]', - sameElse : 'L' + sameDay: '[Сегодня, в] LT', + nextDay: '[Завтра, в] LT', + lastDay: '[Вчера, в] LT', + nextWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В следующее] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В следующий] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В следующую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В прошлое] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В прошлый] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В прошлую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + sameElse: 'L' }, relativeTime : { - future : '%s barru', - past : 'duela %s', - s : 'segundo batzuk', - ss : '%d segundo', - m : 'minutu bat', - mm : '%d minutu', - h : 'ordu bat', - hh : '%d ordu', - d : 'egun bat', - dd : '%d egun', - M : 'hilabete bat', - MM : '%d hilabete', - y : 'urte bat', - yy : '%d urte' + future : 'через %s', + past : '%s назад', + s : 'несколько секунд', + ss : relativeTimeWithPlural, + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'час', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'месяц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночи|утра|дня|вечера/i, + isPM : function (input) { + return /^(дня|вечера)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечера'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-я'; + default: + return number; + } }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return eu; + return ru; }))); /***/ }), -/* 81 */ +/* 107 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '۱', - '2': '۲', - '3': '۳', - '4': '۴', - '5': '۵', - '6': '۶', - '7': '۷', - '8': '۸', - '9': '۹', - '0': '۰' - }, numberMap = { - '۱': '1', - '۲': '2', - '۳': '3', - '۴': '4', - '۵': '5', - '۶': '6', - '۷': '7', - '۸': '8', - '۹': '9', - '۰': '0' - }; + var months = [ + 'جنوري', + 'فيبروري', + 'مارچ', + 'اپريل', + 'مئي', + 'جون', + 'جولاءِ', + 'آگسٽ', + 'سيپٽمبر', + 'آڪٽوبر', + 'نومبر', + 'ڊسمبر' + ]; + var days = [ + 'آچر', + 'سومر', + 'اڱارو', + 'اربع', + 'خميس', + 'جمع', + 'ڇنڇر' + ]; - var fa = moment.defineLocale('fa', { - months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'), - weekdaysParseExact : true, + var sd = moment.defineLocale('sd', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLLL : 'dddd، D MMMM YYYY HH:mm' }, - meridiemParse: /قبل از ظهر|بعد از ظهر/, - isPM: function (input) { - return /بعد از ظهر/.test(input); + meridiemParse: /صبح|شام/, + isPM : function (input) { + return 'شام' === input; }, meridiem : function (hour, minute, isLower) { if (hour < 12) { - return 'قبل از ظهر'; - } else { - return 'بعد از ظهر'; + return 'صبح'; } + return 'شام'; }, calendar : { - sameDay : '[امروز ساعت] LT', - nextDay : '[فردا ساعت] LT', - nextWeek : 'dddd [ساعت] LT', - lastDay : '[دیروز ساعت] LT', - lastWeek : 'dddd [پیش] [ساعت] LT', + sameDay : '[اڄ] LT', + nextDay : '[سڀاڻي] LT', + nextWeek : 'dddd [اڳين هفتي تي] LT', + lastDay : '[ڪالهه] LT', + lastWeek : '[گزريل هفتي] dddd [تي] LT', sameElse : 'L' }, relativeTime : { - future : 'در %s', - past : '%s پیش', - s : 'چند ثانیه', - ss : 'ثانیه d%', - m : 'یک دقیقه', - mm : '%d دقیقه', - h : 'یک ساعت', - hh : '%d ساعت', - d : 'یک روز', - dd : '%d روز', - M : 'یک ماه', - MM : '%d ماه', - y : 'یک سال', + future : '%s پوء', + past : '%s اڳ', + s : 'چند سيڪنڊ', + ss : '%d سيڪنڊ', + m : 'هڪ منٽ', + mm : '%d منٽ', + h : 'هڪ ڪلاڪ', + hh : '%d ڪلاڪ', + d : 'هڪ ڏينهن', + dd : '%d ڏينهن', + M : 'هڪ مهينو', + MM : '%d مهينا', + y : 'هڪ سال', yy : '%d سال' }, preparse: function (string) { - return string.replace(/[۰-۹]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); + return string.replace(/،/g, ','); }, postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + return string.replace(/,/g, '،'); }, - dayOfMonthOrdinalParse: /\d{1,2}م/, - ordinal : '%dم', week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return fa; + return sd; }))); /***/ }), -/* 82 */ +/* 108 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), - numbersFuture = [ - 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', - numbersPast[7], numbersPast[8], numbersPast[9] - ]; - function translate(number, withoutSuffix, key, isFuture) { - var result = ''; - switch (key) { - case 's': - return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; - case 'ss': - return isFuture ? 'sekunnin' : 'sekuntia'; - case 'm': - return isFuture ? 'minuutin' : 'minuutti'; - case 'mm': - result = isFuture ? 'minuutin' : 'minuuttia'; - break; - case 'h': - return isFuture ? 'tunnin' : 'tunti'; - case 'hh': - result = isFuture ? 'tunnin' : 'tuntia'; - break; - case 'd': - return isFuture ? 'päivän' : 'päivä'; - case 'dd': - result = isFuture ? 'päivän' : 'päivää'; - break; - case 'M': - return isFuture ? 'kuukauden' : 'kuukausi'; - case 'MM': - result = isFuture ? 'kuukauden' : 'kuukautta'; - break; - case 'y': - return isFuture ? 'vuoden' : 'vuosi'; - case 'yy': - result = isFuture ? 'vuoden' : 'vuotta'; - break; - } - result = verbalNumber(number, isFuture) + ' ' + result; - return result; - } - function verbalNumber(number, isFuture) { - return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; - } - - var fi = moment.defineLocale('fi', { - months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), - monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), - weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), - weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), - weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + var se = moment.defineLocale('se', { + months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), + monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), + weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), + weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), + weekdaysMin : 's_v_m_g_d_b_L'.split('_'), longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD.MM.YYYY', - LL : 'Do MMMM[ta] YYYY', - LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', - LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', - l : 'D.M.YYYY', - ll : 'Do MMM YYYY', - lll : 'Do MMM YYYY, [klo] HH.mm', - llll : 'ddd, Do MMM YYYY, [klo] HH.mm' + LL : 'MMMM D. [b.] YYYY', + LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', + LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' }, calendar : { - sameDay : '[tänään] [klo] LT', - nextDay : '[huomenna] [klo] LT', - nextWeek : 'dddd [klo] LT', - lastDay : '[eilen] [klo] LT', - lastWeek : '[viime] dddd[na] [klo] LT', - sameElse : 'L' + sameDay: '[otne ti] LT', + nextDay: '[ihttin ti] LT', + nextWeek: 'dddd [ti] LT', + lastDay: '[ikte ti] LT', + lastWeek: '[ovddit] dddd [ti] LT', + sameElse: 'L' }, relativeTime : { - future : '%s päästä', - past : '%s sitten', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate + future : '%s geažes', + past : 'maŋit %s', + s : 'moadde sekunddat', + ss: '%d sekunddat', + m : 'okta minuhta', + mm : '%d minuhtat', + h : 'okta diimmu', + hh : '%d diimmut', + d : 'okta beaivi', + dd : '%d beaivvit', + M : 'okta mánnu', + MM : '%d mánut', + y : 'okta jahki', + yy : '%d jagit' }, dayOfMonthOrdinalParse: /\d{1,2}\./, ordinal : '%d.', @@ -13616,1102 +15097,1155 @@ webpackContext.id = 41; } }); - return fi; + return se; }))); /***/ }), -/* 83 */ +/* 109 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var fo = moment.defineLocale('fo', { - months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), - weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), - weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + /*jshint -W100*/ + var si = moment.defineLocale('si', { + months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), + monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), + weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), + weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), + weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D. MMMM, YYYY HH:mm' + LT : 'a h:mm', + LTS : 'a h:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY MMMM D', + LLL : 'YYYY MMMM D, a h:mm', + LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' }, calendar : { - sameDay : '[Í dag kl.] LT', - nextDay : '[Í morgin kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[Í gjár kl.] LT', - lastWeek : '[síðstu] dddd [kl] LT', + sameDay : '[අද] LT[ට]', + nextDay : '[හෙට] LT[ට]', + nextWeek : 'dddd LT[ට]', + lastDay : '[ඊයේ] LT[ට]', + lastWeek : '[පසුගිය] dddd LT[ට]', sameElse : 'L' }, relativeTime : { - future : 'um %s', - past : '%s síðani', - s : 'fá sekund', - ss : '%d sekundir', - m : 'ein minuttur', - mm : '%d minuttir', - h : 'ein tími', - hh : '%d tímar', - d : 'ein dagur', - dd : '%d dagar', - M : 'ein mánaður', - MM : '%d mánaðir', - y : 'eitt ár', - yy : '%d ár' + future : '%sකින්', + past : '%sකට පෙර', + s : 'තත්පර කිහිපය', + ss : 'තත්පර %d', + m : 'මිනිත්තුව', + mm : 'මිනිත්තු %d', + h : 'පැය', + hh : 'පැය %d', + d : 'දිනය', + dd : 'දින %d', + M : 'මාසය', + MM : 'මාස %d', + y : 'වසර', + yy : 'වසර %d' }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + dayOfMonthOrdinalParse: /\d{1,2} වැනි/, + ordinal : function (number) { + return number + ' වැනි'; + }, + meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, + isPM : function (input) { + return input === 'ප.ව.' || input === 'පස් වරු'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'ප.ව.' : 'පස් වරු'; + } else { + return isLower ? 'පෙ.ව.' : 'පෙර වරු'; + } } }); - return fo; + return si; }))); /***/ }), -/* 84 */ +/* 110 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var fr = moment.defineLocale('fr', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Aujourd’hui à] LT', - nextDay : '[Demain à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[Hier à] LT', - lastWeek : 'dddd [dernier à] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - ss : '%d secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - dayOfMonthOrdinalParse: /\d{1,2}(er|)/, - ordinal : function (number, period) { - switch (period) { - // TODO: Return 'e' when day of month > 1. Move this case inside - // block for masculine words below. - // See https://github.com/moment/moment/issues/3375 - case 'D': - return number + (number === 1 ? 'er' : ''); - - // Words with masculine grammatical gender: mois, trimestre, jour - default: - case 'M': - case 'Q': - case 'DDD': - case 'd': - return number + (number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return number + (number === 1 ? 're' : 'e'); - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + function plural(n) { + return (n > 1) && (n < 5); + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'sekundy' : 'sekúnd'); + } else { + return result + 'sekundami'; + } + break; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; } - }); - - return fr; - -}))); - - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - + } - var frCa = moment.defineLocale('fr-ca', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), - weekdaysParseExact : true, + var sk = moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm' }, calendar : { - sameDay : '[Aujourd’hui à] LT', - nextDay : '[Demain à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[Hier à] LT', - lastWeek : 'dddd [dernier à] LT', - sameElse : 'L' + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo štvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[včera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' }, relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - ss : '%d secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' + future : 'za %s', + past : 'pred %s', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate }, - dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, - ordinal : function (number, period) { - switch (period) { - // Words with masculine grammatical gender: mois, trimestre, jour - default: - case 'M': - case 'Q': - case 'D': - case 'DDD': - case 'd': - return number + (number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return number + (number === 1 ? 're' : 'e'); - } + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return frCa; + return sk; }))); /***/ }), -/* 86 */ +/* 111 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var frCh = moment.defineLocale('fr-ch', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; + case 'ss': + if (number === 1) { + result += withoutSuffix ? 'sekundo' : 'sekundi'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah'; + } else { + result += 'sekund'; + } + return result; + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += withoutSuffix ? 'minuta' : 'minuto'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'minute' : 'minutami'; + } else { + result += withoutSuffix || isFuture ? 'minut' : 'minutami'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += withoutSuffix ? 'ura' : 'uro'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'uri' : 'urama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'ure' : 'urami'; + } else { + result += withoutSuffix || isFuture ? 'ur' : 'urami'; + } + return result; + case 'd': + return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; + case 'dd': + if (number === 1) { + result += withoutSuffix || isFuture ? 'dan' : 'dnem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; + } else { + result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; + } + return result; + case 'M': + return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; + case 'MM': + if (number === 1) { + result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; + } else { + result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; + } + return result; + case 'y': + return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; + case 'yy': + if (number === 1) { + result += withoutSuffix || isFuture ? 'leto' : 'letom'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'leti' : 'letoma'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'leta' : 'leti'; + } else { + result += withoutSuffix || isFuture ? 'let' : 'leti'; + } + return result; + } + } + + var sl = moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'H:mm', + LTS : 'H:mm:ss', L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' }, calendar : { - sameDay : '[Aujourd’hui à] LT', - nextDay : '[Demain à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[Hier à] LT', - lastWeek : 'dddd [dernier à] LT', + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[včeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + return '[prejšnjo] [nedeljo] [ob] LT'; + case 3: + return '[prejšnjo] [sredo] [ob] LT'; + case 6: + return '[prejšnjo] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejšnji] dddd [ob] LT'; + } + }, sameElse : 'L' }, relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - ss : '%d secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, - ordinal : function (number, period) { - switch (period) { - // Words with masculine grammatical gender: mois, trimestre, jour - default: - case 'M': - case 'Q': - case 'D': - case 'DDD': - case 'd': - return number + (number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return number + (number === 1 ? 're' : 'e'); - } + future : 'čez %s', + past : 'pred %s', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return frCh; + return sl; }))); /***/ }), -/* 87 */ +/* 112 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); - - var fy = moment.defineLocale('fy', { - months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortWithDots; - } else if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - monthsParseExact : true, - weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), - weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), - weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + var sq = moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), weekdaysParseExact : true, + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay: '[hjoed om] LT', - nextDay: '[moarn om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[juster om] LT', - lastWeek: '[ôfrûne] dddd [om] LT', - sameElse: 'L' + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' }, relativeTime : { - future : 'oer %s', - past : '%s lyn', - s : 'in pear sekonden', - ss : '%d sekonden', - m : 'ien minút', - mm : '%d minuten', - h : 'ien oere', - hh : '%d oeren', - d : 'ien dei', - dd : '%d dagen', - M : 'ien moanne', - MM : '%d moannen', - y : 'ien jier', - yy : '%d jierren' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + ss : '%d sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return fy; + return sq; }))); /***/ }), -/* 88 */ +/* 113 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; + var translator = { + words: { //Different grammatical cases + ss: ['sekunda', 'sekunde', 'sekundi'], + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; - var months = [ - 'Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Méitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deaireadh Fómhair', 'Samhain', 'Nollaig' - ]; - - var monthsShort = ['Eaná', 'Feab', 'Márt', 'Aibr', 'Beal', 'Méit', 'Iúil', 'Lúna', 'Meán', 'Deai', 'Samh', 'Noll']; - - var weekdays = ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Satharn']; - - var weekdaysShort = ['Dom', 'Lua', 'Mái', 'Céa', 'Déa', 'hAo', 'Sat']; - - var weekdaysMin = ['Do', 'Lu', 'Má', 'Ce', 'Dé', 'hA', 'Sa']; - - var ga = moment.defineLocale('ga', { - months: months, - monthsShort: monthsShort, + var sr = moment.defineLocale('sr', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), monthsParseExact: true, - weekdays: weekdays, - weekdaysShort: weekdaysShort, - weekdaysMin: weekdaysMin, + weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'), + weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' }, calendar: { - sameDay: '[Inniu ag] LT', - nextDay: '[Amárach ag] LT', - nextWeek: 'dddd [ag] LT', - lastDay: '[Inné aig] LT', - lastWeek: 'dddd [seo caite] [ag] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'i %s', - past: '%s ó shin', - s: 'cúpla soicind', - ss: '%d soicind', - m: 'nóiméad', - mm: '%d nóiméad', - h: 'uair an chloig', - hh: '%d uair an chloig', - d: 'lá', - dd: '%d lá', - M: 'mí', - MM: '%d mí', - y: 'bliain', - yy: '%d bliain' + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedelje] [u] LT', + '[prošlog] [ponedeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' }, - dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/, - ordinal: function (number) { - var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; - return number + output; + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return ga; + return sr; }))); /***/ }), -/* 89 */ +/* 114 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var months = [ - 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' - ]; - - var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; - - var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; - - var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; - - var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; + var translator = { + words: { //Different grammatical cases + ss: ['секунда', 'секунде', 'секунди'], + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један сат', 'једног сата'], + hh: ['сат', 'сата', 'сати'], + dd: ['дан', 'дана', 'дана'], + MM: ['месец', 'месеца', 'месеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; - var gd = moment.defineLocale('gd', { - months : months, - monthsShort : monthsShort, - monthsParseExact : true, - weekdays : weekdays, - weekdaysShort : weekdaysShort, - weekdaysMin : weekdaysMin, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + var srCyrl = moment.defineLocale('sr-cyrl', { + months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), + monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), + monthsParseExact: true, + weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), + weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), + weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' }, - calendar : { - sameDay : '[An-diugh aig] LT', - nextDay : '[A-màireach aig] LT', - nextWeek : 'dddd [aig] LT', - lastDay : '[An-dè aig] LT', - lastWeek : 'dddd [seo chaidh] [aig] LT', + calendar: { + sameDay: '[данас у] LT', + nextDay: '[сутра у] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [среду] [у] LT'; + case 6: + return '[у] [суботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [среде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [суботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, sameElse : 'L' }, relativeTime : { - future : 'ann an %s', - past : 'bho chionn %s', - s : 'beagan diogan', - ss : '%d diogan', - m : 'mionaid', - mm : '%d mionaidean', - h : 'uair', - hh : '%d uairean', - d : 'latha', - dd : '%d latha', - M : 'mìos', - MM : '%d mìosan', - y : 'bliadhna', - yy : '%d bliadhna' - }, - dayOfMonthOrdinalParse : /\d{1,2}(d|na|mh)/, - ordinal : function (number) { - var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; - return number + output; + future : 'за %s', + past : 'пре %s', + s : 'неколико секунди', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'месец', + MM : translator.translate, + y : 'годину', + yy : translator.translate }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return gd; + return srCyrl; }))); /***/ }), -/* 90 */ +/* 115 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var gl = moment.defineLocale('gl', { - months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), - monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'), + var ss = moment.defineLocale('ss', { + months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), + monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), + weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), + weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), + weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', + LT : 'h:mm A', + LTS : 'h:mm:ss A', L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY H:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' }, calendar : { - sameDay : function () { - return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextDay : function () { - return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextWeek : function () { - return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - lastDay : function () { - return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; - }, - lastWeek : function () { - return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, + sameDay : '[Namuhla nga] LT', + nextDay : '[Kusasa nga] LT', + nextWeek : 'dddd [nga] LT', + lastDay : '[Itolo nga] LT', + lastWeek : 'dddd [leliphelile] [nga] LT', sameElse : 'L' }, relativeTime : { - future : function (str) { - if (str.indexOf('un') === 0) { - return 'n' + str; + future : 'nga %s', + past : 'wenteka nga %s', + s : 'emizuzwana lomcane', + ss : '%d mzuzwana', + m : 'umzuzu', + mm : '%d emizuzu', + h : 'lihora', + hh : '%d emahora', + d : 'lilanga', + dd : '%d emalanga', + M : 'inyanga', + MM : '%d tinyanga', + y : 'umnyaka', + yy : '%d iminyaka' + }, + meridiemParse: /ekuseni|emini|entsambama|ebusuku/, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'ekuseni'; + } else if (hours < 15) { + return 'emini'; + } else if (hours < 19) { + return 'entsambama'; + } else { + return 'ebusuku'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ekuseni') { + return hour; + } else if (meridiem === 'emini') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { + if (hour === 0) { + return 0; } - return 'en ' + str; - }, - past : 'hai %s', - s : 'uns segundos', - ss : '%d segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'unha hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un ano', - yy : '%d anos' + return hour + 12; + } }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : '%d', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return gl; + return ss; }))); /***/ }), -/* 91 */ +/* 116 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's': ['thodde secondanim', 'thodde second'], - 'ss': [number + ' secondanim', number + ' second'], - 'm': ['eka mintan', 'ek minute'], - 'mm': [number + ' mintanim', number + ' mintam'], - 'h': ['eka voran', 'ek vor'], - 'hh': [number + ' voranim', number + ' voram'], - 'd': ['eka disan', 'ek dis'], - 'dd': [number + ' disanim', number + ' dis'], - 'M': ['eka mhoinean', 'ek mhoino'], - 'MM': [number + ' mhoineanim', number + ' mhoine'], - 'y': ['eka vorsan', 'ek voros'], - 'yy': [number + ' vorsanim', number + ' vorsam'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var gomLatn = moment.defineLocale('gom-latn', { - months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'), - monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\'var'.split('_'), - weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'), - weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'), - weekdaysParseExact : true, + var sv = moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), longDateFormat : { - LT : 'A h:mm [vazta]', - LTS : 'A h:mm:ss [vazta]', - L : 'DD-MM-YYYY', + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY A h:mm [vazta]', - LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', - llll: 'ddd, D MMM YYYY, A h:mm [vazta]' + LLL : 'D MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd D MMM YYYY HH:mm' }, calendar : { - sameDay: '[Aiz] LT', - nextDay: '[Faleam] LT', - nextWeek: '[Ieta to] dddd[,] LT', - lastDay: '[Kal] LT', - lastWeek: '[Fatlo] dddd[,] LT', + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[Igår] LT', + nextWeek: '[På] dddd LT', + lastWeek: '[I] dddd[s] LT', sameElse: 'L' }, relativeTime : { - future : '%s', - past : '%s adim', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + future : 'om %s', + past : 'för %s sedan', + s : 'några sekunder', + ss : '%d sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en månad', + MM : '%d månader', + y : 'ett år', + yy : '%d år' }, - dayOfMonthOrdinalParse : /\d{1,2}(er)/, - ordinal : function (number, period) { - switch (period) { - // the ordinal 'er' only applies to day of the month - case 'D': - return number + 'er'; - default: - case 'M': - case 'Q': - case 'DDD': - case 'd': - case 'w': - case 'W': - return number; - } + dayOfMonthOrdinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; }, week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. - }, - meridiemParse: /rati|sokalli|donparam|sanje/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'rati') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'sokalli') { - return hour; - } else if (meridiem === 'donparam') { - return hour > 12 ? hour : hour + 12; - } else if (meridiem === 'sanje') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'rati'; - } else if (hour < 12) { - return 'sokalli'; - } else if (hour < 16) { - return 'donparam'; - } else if (hour < 20) { - return 'sanje'; - } else { - return 'rati'; - } } }); - return gomLatn; + return sv; }))); /***/ }), -/* 92 */ +/* 117 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '૧', - '2': '૨', - '3': '૩', - '4': '૪', - '5': '૫', - '6': '૬', - '7': '૭', - '8': '૮', - '9': '૯', - '0': '૦' - }, - numberMap = { - '૧': '1', - '૨': '2', - '૩': '3', - '૪': '4', - '૫': '5', - '૬': '6', - '૭': '7', - '૮': '8', - '૯': '9', - '૦': '0' - }; - - var gu = moment.defineLocale('gu', { - months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'), - monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'), - monthsParseExact: true, - weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'), - weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'), - weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'), - longDateFormat: { - LT: 'A h:mm વાગ્યે', - LTS: 'A h:mm:ss વાગ્યે', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY, A h:mm વાગ્યે', - LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે' - }, - calendar: { - sameDay: '[આજ] LT', - nextDay: '[કાલે] LT', - nextWeek: 'dddd, LT', - lastDay: '[ગઇકાલે] LT', - lastWeek: '[પાછલા] dddd, LT', - sameElse: 'L' - }, - relativeTime: { - future: '%s મા', - past: '%s પેહલા', - s: 'અમુક પળો', - ss: '%d સેકંડ', - m: 'એક મિનિટ', - mm: '%d મિનિટ', - h: 'એક કલાક', - hh: '%d કલાક', - d: 'એક દિવસ', - dd: '%d દિવસ', - M: 'એક મહિનો', - MM: '%d મહિનો', - y: 'એક વર્ષ', - yy: '%d વર્ષ' - }, - preparse: function (string) { - return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); + var sw = moment.defineLocale('sw', { + months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), + weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), + weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, - // Gujarati notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati. - meridiemParse: /રાત|બપોર|સવાર|સાંજ/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'રાત') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'સવાર') { - return hour; - } else if (meridiem === 'બપોર') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'સાંજ') { - return hour + 12; - } + calendar : { + sameDay : '[leo saa] LT', + nextDay : '[kesho saa] LT', + nextWeek : '[wiki ijayo] dddd [saat] LT', + lastDay : '[jana] LT', + lastWeek : '[wiki iliyopita] dddd [saat] LT', + sameElse : 'L' }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'રાત'; - } else if (hour < 10) { - return 'સવાર'; - } else if (hour < 17) { - return 'બપોર'; - } else if (hour < 20) { - return 'સાંજ'; - } else { - return 'રાત'; - } + relativeTime : { + future : '%s baadaye', + past : 'tokea %s', + s : 'hivi punde', + ss : 'sekunde %d', + m : 'dakika moja', + mm : 'dakika %d', + h : 'saa limoja', + hh : 'masaa %d', + d : 'siku moja', + dd : 'masiku %d', + M : 'mwezi mmoja', + MM : 'miezi %d', + y : 'mwaka mmoja', + yy : 'miaka %d' }, - week: { - dow: 0, // Sunday is the first day of the week. - doy: 6 // The week that contains Jan 6th is the first week of the year. + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return gu; + return sw; }))); /***/ }), -/* 93 */ +/* 118 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var he = moment.defineLocale('he', { - months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), - monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), - weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), - weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), - weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'), + var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; + + var ta = moment.defineLocale('ta', { + months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), + weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', - LL : 'D [ב]MMMM YYYY', - LLL : 'D [ב]MMMM YYYY HH:mm', - LLLL : 'dddd, D [ב]MMMM YYYY HH:mm', - l : 'D/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd, D MMM YYYY HH:mm' + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, HH:mm', + LLLL : 'dddd, D MMMM YYYY, HH:mm' }, calendar : { - sameDay : '[היום ב־]LT', - nextDay : '[מחר ב־]LT', - nextWeek : 'dddd [בשעה] LT', - lastDay : '[אתמול ב־]LT', - lastWeek : '[ביום] dddd [האחרון בשעה] LT', + sameDay : '[இன்று] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேற்று] LT', + lastWeek : '[கடந்த வாரம்] dddd, LT', sameElse : 'L' }, relativeTime : { - future : 'בעוד %s', - past : 'לפני %s', - s : 'מספר שניות', - ss : '%d שניות', - m : 'דקה', - mm : '%d דקות', - h : 'שעה', - hh : function (number) { - if (number === 2) { - return 'שעתיים'; - } - return number + ' שעות'; - }, - d : 'יום', - dd : function (number) { - if (number === 2) { - return 'יומיים'; - } - return number + ' ימים'; - }, - M : 'חודש', - MM : function (number) { - if (number === 2) { - return 'חודשיים'; - } - return number + ' חודשים'; - }, - y : 'שנה', - yy : function (number) { - if (number === 2) { - return 'שנתיים'; - } else if (number % 10 === 0 && number !== 10) { - return number + ' שנה'; - } - return number + ' שנים'; - } + future : '%s இல்', + past : '%s முன்', + s : 'ஒரு சில விநாடிகள்', + ss : '%d விநாடிகள்', + m : 'ஒரு நிமிடம்', + mm : '%d நிமிடங்கள்', + h : 'ஒரு மணி நேரம்', + hh : '%d மணி நேரம்', + d : 'ஒரு நாள்', + dd : '%d நாட்கள்', + M : 'ஒரு மாதம்', + MM : '%d மாதங்கள்', + y : 'ஒரு வருடம்', + yy : '%d ஆண்டுகள்' }, - meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, - isPM : function (input) { - return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); + dayOfMonthOrdinalParse: /\d{1,2}வது/, + ordinal : function (number) { + return number + 'வது'; }, + preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, meridiem : function (hour, minute, isLower) { - if (hour < 5) { - return 'לפנות בוקר'; + if (hour < 2) { + return ' யாமம்'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை } else if (hour < 10) { - return 'בבוקר'; - } else if (hour < 12) { - return isLower ? 'לפנה"צ' : 'לפני הצהריים'; + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நண்பகல்'; // நண்பகல் } else if (hour < 18) { - return isLower ? 'אחה"צ' : 'אחרי הצהריים'; + return ' எற்பாடு'; // எற்பாடு + } else if (hour < 22) { + return ' மாலை'; // மாலை } else { - return 'בערב'; + return ' யாமம்'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமம்') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நண்பகல்') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return he; + return ta; }))); /***/ }), -/* 94 */ +/* 119 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - var hi = moment.defineLocale('hi', { - months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), - monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), - monthsParseExact: true, - weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + var te = moment.defineLocale('te', { + months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), + monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), + monthsParseExact : true, + weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'), + weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'), + weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'), longDateFormat : { - LT : 'A h:mm बजे', - LTS : 'A h:mm:ss बजे', + LT : 'A h:mm', + LTS : 'A h:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm बजे', - LLLL : 'dddd, D MMMM YYYY, A h:mm बजे' + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' }, calendar : { - sameDay : '[आज] LT', - nextDay : '[कल] LT', + sameDay : '[నేడు] LT', + nextDay : '[రేపు] LT', nextWeek : 'dddd, LT', - lastDay : '[कल] LT', - lastWeek : '[पिछले] dddd, LT', + lastDay : '[నిన్న] LT', + lastWeek : '[గత] dddd, LT', sameElse : 'L' }, relativeTime : { - future : '%s में', - past : '%s पहले', - s : 'कुछ ही क्षण', - ss : '%d सेकंड', - m : 'एक मिनट', - mm : '%d मिनट', - h : 'एक घंटा', - hh : '%d घंटे', - d : 'एक दिन', - dd : '%d दिन', - M : 'एक महीने', - MM : '%d महीने', - y : 'एक वर्ष', - yy : '%d वर्ष' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); + future : '%s లో', + past : '%s క్రితం', + s : 'కొన్ని క్షణాలు', + ss : '%d సెకన్లు', + m : 'ఒక నిమిషం', + mm : '%d నిమిషాలు', + h : 'ఒక గంట', + hh : '%d గంటలు', + d : 'ఒక రోజు', + dd : '%d రోజులు', + M : 'ఒక నెల', + MM : '%d నెలలు', + y : 'ఒక సంవత్సరం', + yy : '%d సంవత్సరాలు' }, - // Hindi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. - meridiemParse: /रात|सुबह|दोपहर|शाम/, + dayOfMonthOrdinalParse : /\d{1,2}వ/, + ordinal : '%dవ', + meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/, meridiemHour : function (hour, meridiem) { if (hour === 12) { hour = 0; } - if (meridiem === 'रात') { + if (meridiem === 'రాత్రి') { return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सुबह') { + } else if (meridiem === 'ఉదయం') { return hour; - } else if (meridiem === 'दोपहर') { + } else if (meridiem === 'మధ్యాహ్నం') { return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'शाम') { + } else if (meridiem === 'సాయంత్రం') { return hour + 12; } }, meridiem : function (hour, minute, isLower) { if (hour < 4) { - return 'रात'; + return 'రాత్రి'; } else if (hour < 10) { - return 'सुबह'; + return 'ఉదయం'; } else if (hour < 17) { - return 'दोपहर'; + return 'మధ్యాహ్నం'; } else if (hour < 20) { - return 'शाम'; + return 'సాయంత్రం'; } else { - return 'रात'; + return 'రాత్రి'; } }, week : { @@ -14720,584 +16254,445 @@ webpackContext.id = 41; } }); - return hi; + return te; }))); /***/ }), -/* 95 */ +/* 120 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'ss': - if (number === 1) { - result += 'sekunda'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sekunde'; - } else { - result += 'sekundi'; - } - return result; - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - var hr = moment.defineLocale('hr', { - months : { - format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), - standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') - }, - monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), - monthsParseExact: true, - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, + var tet = moment.defineLocale('tet', { + months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'), + weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'), + weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'), longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[jučer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prošli] dddd [u] LT'; - } - }, - sameElse : 'L' + sameDay: '[Ohin iha] LT', + nextDay: '[Aban iha] LT', + nextWeek: 'dddd [iha] LT', + lastDay: '[Horiseik iha] LT', + lastWeek: 'dddd [semana kotuk] [iha] LT', + sameElse: 'L' }, relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate + future : 'iha %s', + past : '%s liuba', + s : 'minutu balun', + ss : 'minutu %d', + m : 'minutu ida', + mm : 'minutu %d', + h : 'oras ida', + hh : 'oras %d', + d : 'loron ida', + dd : 'loron %d', + M : 'fulan ida', + MM : 'fulan %d', + y : 'tinan ida', + yy : 'tinan %d' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return hr; + return tet; }))); /***/ }), -/* 96 */ +/* 121 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); - function translate(number, withoutSuffix, key, isFuture) { - var num = number; - switch (key) { - case 's': - return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; - case 'ss': - return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce'; - case 'm': - return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'mm': - return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'h': - return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'hh': - return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'd': - return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'dd': - return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'M': - return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'MM': - return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'y': - return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); - case 'yy': - return num + (isFuture || withoutSuffix ? ' év' : ' éve'); - } - return ''; - } - function week(isFuture) { - return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; - } + var suffixes = { + 0: '-ум', + 1: '-ум', + 2: '-юм', + 3: '-юм', + 4: '-ум', + 5: '-ум', + 6: '-ум', + 7: '-ум', + 8: '-ум', + 9: '-ум', + 10: '-ум', + 12: '-ум', + 13: '-ум', + 20: '-ум', + 30: '-юм', + 40: '-ум', + 50: '-ум', + 60: '-ум', + 70: '-ум', + 80: '-ум', + 90: '-ум', + 100: '-ум' + }; - var hu = moment.defineLocale('hu', { - months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), - monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), - weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), - weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), - weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + var tg = moment.defineLocale('tg', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'), + weekdaysShort : 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'), + weekdaysMin : 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'), longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY. MMMM D.', - LLL : 'YYYY. MMMM D. H:mm', - LLLL : 'YYYY. MMMM D., dddd H:mm' - }, - meridiemParse: /de|du/i, - isPM: function (input) { - return input.charAt(1).toLowerCase() === 'u'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower === true ? 'de' : 'DE'; - } else { - return isLower === true ? 'du' : 'DU'; - } + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[ma] LT[-kor]', - nextDay : '[holnap] LT[-kor]', - nextWeek : function () { - return week.call(this, true); - }, - lastDay : '[tegnap] LT[-kor]', - lastWeek : function () { - return week.call(this, false); - }, + sameDay : '[Имрӯз соати] LT', + nextDay : '[Пагоҳ соати] LT', + lastDay : '[Дирӯз соати] LT', + nextWeek : 'dddd[и] [ҳафтаи оянда соати] LT', + lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT', sameElse : 'L' }, relativeTime : { - future : '%s múlva', - past : '%s', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate + future : 'баъди %s', + past : '%s пеш', + s : 'якчанд сония', + m : 'як дақиқа', + mm : '%d дақиқа', + h : 'як соат', + hh : '%d соат', + d : 'як рӯз', + dd : '%d рӯз', + M : 'як моҳ', + MM : '%d моҳ', + y : 'як сол', + yy : '%d сол' + }, + meridiemParse: /шаб|субҳ|рӯз|бегоҳ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'шаб') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'субҳ') { + return hour; + } else if (meridiem === 'рӯз') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'бегоҳ') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'шаб'; + } else if (hour < 11) { + return 'субҳ'; + } else if (hour < 16) { + return 'рӯз'; + } else if (hour < 19) { + return 'бегоҳ'; + } else { + return 'шаб'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/, + ordinal: function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 1th is the first week of the year. } }); - return hu; + return tg; }))); /***/ }), -/* 97 */ +/* 122 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var hyAm = moment.defineLocale('hy-am', { - months : { - format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), - standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') - }, - monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), - weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), - weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), - weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + var th = moment.defineLocale('th', { + months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), + monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), + monthsParseExact: true, + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY թ.', - LLL : 'D MMMM YYYY թ., HH:mm', - LLLL : 'dddd, D MMMM YYYY թ., HH:mm' - }, - calendar : { - sameDay: '[այսօր] LT', - nextDay: '[վաղը] LT', - lastDay: '[երեկ] LT', - nextWeek: function () { - return 'dddd [օրը ժամը] LT'; - }, - lastWeek: function () { - return '[անցած] dddd [օրը ժամը] LT'; - }, - sameElse: 'L' - }, - relativeTime : { - future : '%s հետո', - past : '%s առաջ', - s : 'մի քանի վայրկյան', - ss : '%d վայրկյան', - m : 'րոպե', - mm : '%d րոպե', - h : 'ժամ', - hh : '%d ժամ', - d : 'օր', - dd : '%d օր', - M : 'ամիս', - MM : '%d ամիս', - y : 'տարի', - yy : '%d տարի' + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา H:mm', + LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm' }, - meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, + meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, isPM: function (input) { - return /^(ցերեկվա|երեկոյան)$/.test(input); + return input === 'หลังเที่ยง'; }, - meridiem : function (hour) { - if (hour < 4) { - return 'գիշերվա'; - } else if (hour < 12) { - return 'առավոտվա'; - } else if (hour < 17) { - return 'ցերեկվա'; + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ก่อนเที่ยง'; } else { - return 'երեկոյան'; + return 'หลังเที่ยง'; } }, - dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, - ordinal: function (number, period) { - switch (period) { - case 'DDD': - case 'w': - case 'W': - case 'DDDo': - if (number === 1) { - return number + '-ին'; - } - return number + '-րդ'; - default: - return number; - } + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT', + sameElse : 'L' }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + relativeTime : { + future : 'อีก %s', + past : '%sที่แล้ว', + s : 'ไม่กี่วินาที', + ss : '%d วินาที', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' } }); - return hyAm; + return th; }))); /***/ }), -/* 98 */ +/* 123 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var id = moment.defineLocale('id', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + var tlPh = moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|siang|sore|malam/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'siang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sore' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'siang'; - } else if (hours < 19) { - return 'sore'; - } else { - return 'malam'; - } + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY HH:mm', + LLLL : 'dddd, MMMM DD, YYYY HH:mm' }, calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Besok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kemarin pukul] LT', - lastWeek : 'dddd [lalu pukul] LT', - sameElse : 'L' + sameDay: 'LT [ngayong araw]', + nextDay: '[Bukas ng] LT', + nextWeek: 'LT [sa susunod na] dddd', + lastDay: 'LT [kahapon]', + lastWeek: 'LT [noong nakaraang] dddd', + sameElse: 'L' }, relativeTime : { - future : 'dalam %s', - past : '%s yang lalu', - s : 'beberapa detik', - ss : '%d detik', - m : 'semenit', - mm : '%d menit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + ss : '%d segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; }, week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return id; + return tlPh; }))); /***/ }), -/* 99 */ +/* 124 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function plural(n) { - if (n % 100 === 11) { - return true; - } else if (n % 10 === 1) { - return false; - } - return true; + var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); + + function translateFuture(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'leS' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'waQ' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'nem' : + time + ' pIq'; + return time; } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; - case 'ss': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum'); - } - return result + 'sekúnda'; - case 'm': - return withoutSuffix ? 'mínúta' : 'mínútu'; + + function translatePast(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'Hu’' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'wen' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'ben' : + time + ' ret'; + return time; + } + + function translate(number, withoutSuffix, string, isFuture) { + var numberNoun = numberAsNoun(number); + switch (string) { + case 'ss': + return numberNoun + ' lup'; case 'mm': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); - } else if (withoutSuffix) { - return result + 'mínúta'; - } - return result + 'mínútu'; + return numberNoun + ' tup'; case 'hh': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); - } - return result + 'klukkustund'; - case 'd': - if (withoutSuffix) { - return 'dagur'; - } - return isFuture ? 'dag' : 'degi'; + return numberNoun + ' rep'; case 'dd': - if (plural(number)) { - if (withoutSuffix) { - return result + 'dagar'; - } - return result + (isFuture ? 'daga' : 'dögum'); - } else if (withoutSuffix) { - return result + 'dagur'; - } - return result + (isFuture ? 'dag' : 'degi'); - case 'M': - if (withoutSuffix) { - return 'mánuður'; - } - return isFuture ? 'mánuð' : 'mánuði'; + return numberNoun + ' jaj'; case 'MM': - if (plural(number)) { - if (withoutSuffix) { - return result + 'mánuðir'; - } - return result + (isFuture ? 'mánuði' : 'mánuðum'); - } else if (withoutSuffix) { - return result + 'mánuður'; - } - return result + (isFuture ? 'mánuð' : 'mánuði'); - case 'y': - return withoutSuffix || isFuture ? 'ár' : 'ári'; + return numberNoun + ' jar'; case 'yy': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); - } - return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + return numberNoun + ' DIS'; } } - var is = moment.defineLocale('is', { - months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), - weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), - weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), - weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + function numberAsNoun(number) { + var hundred = Math.floor((number % 1000) / 100), + ten = Math.floor((number % 100) / 10), + one = number % 10, + word = ''; + if (hundred > 0) { + word += numbersNouns[hundred] + 'vatlh'; + } + if (ten > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; + } + if (one > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[one]; + } + return (word === '') ? 'pagh' : word; + } + + var tlh = moment.defineLocale('tlh', { + months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), + monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), + monthsParseExact : true, + weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] H:mm', - LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[í dag kl.] LT', - nextDay : '[á morgun kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[í gær kl.] LT', - lastWeek : '[síðasta] dddd [kl.] LT', - sameElse : 'L' + sameDay: '[DaHjaj] LT', + nextDay: '[wa’leS] LT', + nextWeek: 'LLL', + lastDay: '[wa’Hu’] LT', + lastWeek: 'LLL', + sameElse: 'L' }, relativeTime : { - future : 'eftir %s', - past : 'fyrir %s síðan', - s : translate, + future : translateFuture, + past : translatePast, + s : 'puS lup', ss : translate, - m : translate, + m : 'wa’ tup', mm : translate, - h : 'klukkustund', + h : 'wa’ rep', hh : translate, - d : translate, + d : 'wa’ jaj', dd : translate, - M : translate, + M : 'wa’ jar', MM : translate, - y : translate, + y : 'wa’ DIS', yy : translate }, dayOfMonthOrdinalParse: /\d{1,2}\./, @@ -15308,32250 +16703,27327 @@ webpackContext.id = 41; } }); - return is; + return tlh; }))); /***/ }), -/* 100 */ +/* 125 */ /***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + 6: '\'ncı', + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + 60: '\'ıncı', + 90: '\'ıncı' + }; - var it = moment.defineLocale('it', { - months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), - monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), - weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), - weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), - weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), + var tr = moment.defineLocale('tr', { + months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', + L : 'DD.MM.YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay: '[Oggi alle] LT', - nextDay: '[Domani alle] LT', - nextWeek: 'dddd [alle] LT', - lastDay: '[Ieri alle] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - sameElse: 'L' + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[gelecek] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen] dddd [saat] LT', + sameElse : 'L' }, relativeTime : { - future : function (s) { - return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; - }, - past : '%s fa', - s : 'alcuni secondi', - ss : '%d secondi', - m : 'un minuto', - mm : '%d minuti', - h : 'un\'ora', - hh : '%d ore', - d : 'un giorno', - dd : '%d giorni', - M : 'un mese', - MM : '%d mesi', - y : 'un anno', - yy : '%d anni' + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + ss : '%d saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'Do': + case 'DD': + return number; + default: + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + } }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal: '%dº', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return it; + return tr; }))); /***/ }), -/* 101 */ +/* 126 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var itCh = moment.defineLocale('it-ch', { - months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), - monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), - weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), - weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), - weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), + // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. + // This is currently too difficult (maybe even impossible) to add. + var tzl = moment.defineLocale('tzl', { + months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), + monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), + weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), + weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), + weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'HH.mm', + LTS : 'HH.mm.ss', L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LL : 'D. MMMM [dallas] YYYY', + LLL : 'D. MMMM [dallas] YYYY HH.mm', + LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' + }, + meridiemParse: /d\'o|d\'a/i, + isPM : function (input) { + return 'd\'o' === input.toLowerCase(); + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'd\'o' : 'D\'O'; + } else { + return isLower ? 'd\'a' : 'D\'A'; + } }, calendar : { - sameDay: '[Oggi alle] LT', - nextDay: '[Domani alle] LT', - nextWeek: 'dddd [alle] LT', - lastDay: '[Ieri alle] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - sameElse: 'L' + sameDay : '[oxhi à] LT', + nextDay : '[demà à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[ieiri à] LT', + lastWeek : '[sür el] dddd [lasteu à] LT', + sameElse : 'L' }, relativeTime : { - future : function (s) { - return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; - }, - past : '%s fa', - s : 'alcuni secondi', - ss : '%d secondi', - m : 'un minuto', - mm : '%d minuti', - h : 'un\'ora', - hh : '%d ore', - d : 'un giorno', - dd : '%d giorni', - M : 'un mese', - MM : '%d mesi', - y : 'un anno', - yy : '%d anni' + future : 'osprei %s', + past : 'ja%s', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal: '%dº', + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return itCh; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['viensas secunds', '\'iensas secunds'], + 'ss': [number + ' secunds', '' + number + ' secunds'], + 'm': ['\'n míut', '\'iens míut'], + 'mm': [number + ' míuts', '' + number + ' míuts'], + 'h': ['\'n þora', '\'iensa þora'], + 'hh': [number + ' þoras', '' + number + ' þoras'], + 'd': ['\'n ziua', '\'iensa ziua'], + 'dd': [number + ' ziuas', '' + number + ' ziuas'], + 'M': ['\'n mes', '\'iens mes'], + 'MM': [number + ' mesen', '' + number + ' mesen'], + 'y': ['\'n ar', '\'iens ar'], + 'yy': [number + ' ars', '' + number + ' ars'] + }; + return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); + } + + return tzl; }))); /***/ }), -/* 102 */ +/* 127 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var ja = moment.defineLocale('ja', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), - weekdaysShort : '日_月_火_水_木_金_土'.split('_'), - weekdaysMin : '日_月_火_水_木_金_土'.split('_'), + var tzm = moment.defineLocale('tzm', { + months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), longDateFormat : { LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日 HH:mm', - LLLL : 'YYYY年M月D日 dddd HH:mm', - l : 'YYYY/MM/DD', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日(ddd) HH:mm' - }, - meridiemParse: /午前|午後/i, - isPM : function (input) { - return input === '午後'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return '午前'; - } else { - return '午後'; - } + LTS: 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[今日] LT', - nextDay : '[明日] LT', - nextWeek : function (now) { - if (now.week() < this.week()) { - return '[来週]dddd LT'; - } else { - return 'dddd LT'; - } - }, - lastDay : '[昨日] LT', - lastWeek : function (now) { - if (this.week() < now.week()) { - return '[先週]dddd LT'; - } else { - return 'dddd LT'; - } - }, - sameElse : 'L' - }, - dayOfMonthOrdinalParse : /\d{1,2}日/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '日'; - default: - return number; - } + sameDay: '[ⴰⵙⴷⵅ ⴴ] LT', + nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', + nextWeek: 'dddd [ⴴ] LT', + lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', + lastWeek: 'dddd [ⴴ] LT', + sameElse: 'L' }, relativeTime : { - future : '%s後', - past : '%s前', - s : '数秒', - ss : '%d秒', - m : '1分', - mm : '%d分', - h : '1時間', - hh : '%d時間', - d : '1日', - dd : '%d日', - M : '1ヶ月', - MM : '%dヶ月', - y : '1年', - yy : '%d年' + future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s', + past : 'ⵢⴰⵏ %s', + s : 'ⵉⵎⵉⴽ', + ss : '%d ⵉⵎⵉⴽ', + m : 'ⵎⵉⵏⵓⴺ', + mm : '%d ⵎⵉⵏⵓⴺ', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰⵏ', + M : 'ⴰⵢoⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔⵏ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙⵏ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } }); - return ja; + return tzm; }))); /***/ }), -/* 103 */ +/* 128 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var jv = moment.defineLocale('jv', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), - weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), + var tzmLatn = moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' }, - meridiemParse: /enjing|siyang|sonten|ndalu/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'enjing') { - return hour; - } else if (meridiem === 'siyang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sonten' || meridiem === 'ndalu') { - return hour + 12; - } + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'enjing'; - } else if (hours < 15) { - return 'siyang'; - } else if (hours < 19) { - return 'sonten'; + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + ss : '%d imik', + m : 'minuḍ', + mm : '%d minuḍ', + h : 'saɛa', + hh : '%d tassaɛin', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. + } + }); + + return tzmLatn; + +}))); + + +/***/ }), +/* 129 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js language configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var ugCn = moment.defineLocale('ug-cn', { + months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split( + '_' + ), + weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'YYYY-MM-DD', + LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى', + LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', + LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm' + }, + meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ( + meridiem === 'يېرىم كېچە' || + meridiem === 'سەھەر' || + meridiem === 'چۈشتىن بۇرۇن' + ) { + return hour; + } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') { + return hour + 12; } else { - return 'ndalu'; + return hour >= 11 ? hour : hour + 12; } }, - calendar : { - sameDay : '[Dinten puniko pukul] LT', - nextDay : '[Mbenjang pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kala wingi pukul] LT', - lastWeek : 'dddd [kepengker pukul] LT', - sameElse : 'L' + meridiem: function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return 'يېرىم كېچە'; + } else if (hm < 900) { + return 'سەھەر'; + } else if (hm < 1130) { + return 'چۈشتىن بۇرۇن'; + } else if (hm < 1230) { + return 'چۈش'; + } else if (hm < 1800) { + return 'چۈشتىن كېيىن'; + } else { + return 'كەچ'; + } }, - relativeTime : { - future : 'wonten ing %s', - past : '%s ingkang kepengker', - s : 'sawetawis detik', - ss : '%d detik', - m : 'setunggal menit', - mm : '%d menit', - h : 'setunggal jam', - hh : '%d jam', - d : 'sedinten', - dd : '%d dinten', - M : 'sewulan', - MM : '%d wulan', - y : 'setaun', - yy : '%d taun' + calendar: { + sameDay: '[بۈگۈن سائەت] LT', + nextDay: '[ئەتە سائەت] LT', + nextWeek: '[كېلەركى] dddd [سائەت] LT', + lastDay: '[تۆنۈگۈن] LT', + lastWeek: '[ئالدىنقى] dddd [سائەت] LT', + sameElse: 'L' }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + relativeTime: { + future: '%s كېيىن', + past: '%s بۇرۇن', + s: 'نەچچە سېكونت', + ss: '%d سېكونت', + m: 'بىر مىنۇت', + mm: '%d مىنۇت', + h: 'بىر سائەت', + hh: '%d سائەت', + d: 'بىر كۈن', + dd: '%d كۈن', + M: 'بىر ئاي', + MM: '%d ئاي', + y: 'بىر يىل', + yy: '%d يىل' + }, + + dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '-كۈنى'; + case 'w': + case 'W': + return number + '-ھەپتە'; + default: + return number; + } + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week: { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow: 1, // Monday is the first day of the week. + doy: 7 // The week that contains Jan 1st is the first week of the year. } }); - return jv; + return ugCn; }))); /***/ }), -/* 104 */ +/* 130 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var ka = moment.defineLocale('ka', { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд', + 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин', + 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'місяць_місяці_місяців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') + }; + + if (m === true) { + return weekdays['nominative'].slice(1, 7).concat(weekdays['nominative'].slice(0, 1)); + } + if (!m) { + return weekdays['nominative']; + } + + var nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + return weekdays[nounCase][m.day()]; + } + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + var uk = moment.defineLocale('uk', { months : { - standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), - format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') - }, - monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), - weekdays : { - standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), - format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), - isFormat: /(წინა|შემდეგ)/ + 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), + 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') }, - weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), - weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'), + monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY р.', + LLL : 'D MMMM YYYY р., HH:mm', + LLLL : 'dddd, D MMMM YYYY р., HH:mm' }, calendar : { - sameDay : '[დღეს] LT[-ზე]', - nextDay : '[ხვალ] LT[-ზე]', - lastDay : '[გუშინ] LT[-ზე]', - nextWeek : '[შემდეგ] dddd LT[-ზე]', - lastWeek : '[წინა] dddd LT-ზე', - sameElse : 'L' - }, - relativeTime : { - future : function (s) { - return (/(წამი|წუთი|საათი|წელი)/).test(s) ? - s.replace(/ი$/, 'ში') : - s + 'ში'; - }, - past : function (s) { - if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { - return s.replace(/(ი|ე)$/, 'ის წინ'); - } - if ((/წელი/).test(s)) { - return s.replace(/წელი$/, 'წლის წინ'); + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); } }, - s : 'რამდენიმე წამი', - ss : '%d წამი', - m : 'წუთი', - mm : '%d წუთი', - h : 'საათი', - hh : '%d საათი', - d : 'დღე', - dd : '%d დღე', - M : 'თვე', - MM : '%d თვე', - y : 'წელი', - yy : '%d წელი' + sameElse: 'L' }, - dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, - ordinal : function (number) { - if (number === 0) { - return number; - } - if (number === 1) { - return number + '-ლი'; + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька секунд', + ss : relativeTimeWithPlural, + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'місяць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + meridiemParse: /ночі|ранку|дня|вечора/, + isPM: function (input) { + return /^(дня|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечора'; } - if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { - return 'მე-' + number; + }, + dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; } - return number + '-ე'; }, week : { - dow : 1, - doy : 7 + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return ka; + return uk; }))); /***/ }), -/* 105 */ +/* 131 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var suffixes = { - 0: '-ші', - 1: '-ші', - 2: '-ші', - 3: '-ші', - 4: '-ші', - 5: '-ші', - 6: '-шы', - 7: '-ші', - 8: '-ші', - 9: '-шы', - 10: '-шы', - 20: '-шы', - 30: '-шы', - 40: '-шы', - 50: '-ші', - 60: '-шы', - 70: '-ші', - 80: '-ші', - 90: '-шы', - 100: '-ші' - }; + var months = [ + 'جنوری', + 'فروری', + 'مارچ', + 'اپریل', + 'مئی', + 'جون', + 'جولائی', + 'اگست', + 'ستمبر', + 'اکتوبر', + 'نومبر', + 'دسمبر' + ]; + var days = [ + 'اتوار', + 'پیر', + 'منگل', + 'بدھ', + 'جمعرات', + 'جمعہ', + 'ہفتہ' + ]; - var kk = moment.defineLocale('kk', { - months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), - monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), - weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), - weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'), - weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'), + var ur = moment.defineLocale('ur', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLLL : 'dddd، D MMMM YYYY HH:mm' + }, + meridiemParse: /صبح|شام/, + isPM : function (input) { + return 'شام' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'صبح'; + } + return 'شام'; }, calendar : { - sameDay : '[Бүгін сағат] LT', - nextDay : '[Ертең сағат] LT', - nextWeek : 'dddd [сағат] LT', - lastDay : '[Кеше сағат] LT', - lastWeek : '[Өткен аптаның] dddd [сағат] LT', + sameDay : '[آج بوقت] LT', + nextDay : '[کل بوقت] LT', + nextWeek : 'dddd [بوقت] LT', + lastDay : '[گذشتہ روز بوقت] LT', + lastWeek : '[گذشتہ] dddd [بوقت] LT', sameElse : 'L' }, relativeTime : { - future : '%s ішінде', - past : '%s бұрын', - s : 'бірнеше секунд', - ss : '%d секунд', - m : 'бір минут', - mm : '%d минут', - h : 'бір сағат', - hh : '%d сағат', - d : 'бір күн', - dd : '%d күн', - M : 'бір ай', - MM : '%d ай', - y : 'бір жыл', - yy : '%d жыл' + future : '%s بعد', + past : '%s قبل', + s : 'چند سیکنڈ', + ss : '%d سیکنڈ', + m : 'ایک منٹ', + mm : '%d منٹ', + h : 'ایک گھنٹہ', + hh : '%d گھنٹے', + d : 'ایک دن', + dd : '%d دن', + M : 'ایک ماہ', + MM : '%d ماہ', + y : 'ایک سال', + yy : '%d سال' }, - dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/, - ordinal : function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes[number] || suffixes[a] || suffixes[b]); + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); }, week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return kk; + return ur; }))); /***/ }), -/* 106 */ +/* 132 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '១', - '2': '២', - '3': '៣', - '4': '៤', - '5': '៥', - '6': '៦', - '7': '៧', - '8': '៨', - '9': '៩', - '0': '០' - }, numberMap = { - '១': '1', - '២': '2', - '៣': '3', - '៤': '4', - '៥': '5', - '៦': '6', - '៧': '7', - '៨': '8', - '៩': '9', - '០': '0' - }; - - var km = moment.defineLocale('km', { - months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( - '_' - ), - monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( - '_' - ), - weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), - weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), - weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), - weekdaysParseExact: true, - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' - }, - meridiemParse: /ព្រឹក|ល្ងាច/, - isPM: function (input) { - return input === 'ល្ងាច'; - }, - meridiem: function (hour, minute, isLower) { - if (hour < 12) { - return 'ព្រឹក'; - } else { - return 'ល្ងាច'; - } - }, - calendar: { - sameDay: '[ថ្ងៃនេះ ម៉ោង] LT', - nextDay: '[ស្អែក ម៉ោង] LT', - nextWeek: 'dddd [ម៉ោង] LT', - lastDay: '[ម្សិលមិញ ម៉ោង] LT', - lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%sទៀត', - past: '%sមុន', - s: 'ប៉ុន្មានវិនាទី', - ss: '%d វិនាទី', - m: 'មួយនាទី', - mm: '%d នាទី', - h: 'មួយម៉ោង', - hh: '%d ម៉ោង', - d: 'មួយថ្ងៃ', - dd: '%d ថ្ងៃ', - M: 'មួយខែ', - MM: '%d ខែ', - y: 'មួយឆ្នាំ', - yy: '%d ឆ្នាំ' + var uz = moment.defineLocale('uz', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' }, - dayOfMonthOrdinalParse : /ទី\d{1,2}/, - ordinal : 'ទី%d', - preparse: function (string) { - return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) { - return numberMap[match]; - }); + calendar : { + sameDay : '[Бугун соат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни соат] LT [да]', + lastDay : '[Кеча соат] LT [да]', + lastWeek : '[Утган] dddd [куни соат] LT [да]', + sameElse : 'L' }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурсат', + ss : '%d фурсат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир соат', + hh : '%d соат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. } }); - return km; + return uz; }))); /***/ }), -/* 107 */ +/* 133 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '೧', - '2': '೨', - '3': '೩', - '4': '೪', - '5': '೫', - '6': '೬', - '7': '೭', - '8': '೮', - '9': '೯', - '0': '೦' - }, - numberMap = { - '೧': '1', - '೨': '2', - '೩': '3', - '೪': '4', - '೫': '5', - '೬': '6', - '೭': '7', - '೮': '8', - '೯': '9', - '೦': '0' - }; - - var kn = moment.defineLocale('kn', { - months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'), - monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'), - monthsParseExact: true, - weekdays : 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'), - weekdaysShort : 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'), - weekdaysMin : 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'), + var uzLatn = moment.defineLocale('uz-latn', { + months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'), + monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'), + weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'), + weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'), + weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'), longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' }, calendar : { - sameDay : '[ಇಂದು] LT', - nextDay : '[ನಾಳೆ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ನಿನ್ನೆ] LT', - lastWeek : '[ಕೊನೆಯ] dddd, LT', + sameDay : '[Bugun soat] LT [da]', + nextDay : '[Ertaga] LT [da]', + nextWeek : 'dddd [kuni soat] LT [da]', + lastDay : '[Kecha soat] LT [da]', + lastWeek : '[O\'tgan] dddd [kuni soat] LT [da]', sameElse : 'L' }, relativeTime : { - future : '%s ನಂತರ', - past : '%s ಹಿಂದೆ', - s : 'ಕೆಲವು ಕ್ಷಣಗಳು', - ss : '%d ಸೆಕೆಂಡುಗಳು', - m : 'ಒಂದು ನಿಮಿಷ', - mm : '%d ನಿಮಿಷ', - h : 'ಒಂದು ಗಂಟೆ', - hh : '%d ಗಂಟೆ', - d : 'ಒಂದು ದಿನ', - dd : '%d ದಿನ', - M : 'ಒಂದು ತಿಂಗಳು', - MM : '%d ತಿಂಗಳು', - y : 'ಒಂದು ವರ್ಷ', - yy : '%d ವರ್ಷ' - }, - preparse: function (string) { - return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ರಾತ್ರಿ') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') { - return hour; - } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'ಸಂಜೆ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ರಾತ್ರಿ'; - } else if (hour < 10) { - return 'ಬೆಳಿಗ್ಗೆ'; - } else if (hour < 17) { - return 'ಮಧ್ಯಾಹ್ನ'; - } else if (hour < 20) { - return 'ಸಂಜೆ'; - } else { - return 'ರಾತ್ರಿ'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/, - ordinal : function (number) { - return number + 'ನೇ'; + future : 'Yaqin %s ichida', + past : 'Bir necha %s oldin', + s : 'soniya', + ss : '%d soniya', + m : 'bir daqiqa', + mm : '%d daqiqa', + h : 'bir soat', + hh : '%d soat', + d : 'bir kun', + dd : '%d kun', + M : 'bir oy', + MM : '%d oy', + y : 'bir yil', + yy : '%d yil' }, week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return kn; + return uzLatn; }))); /***/ }), -/* 108 */ +/* 134 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var ko = moment.defineLocale('ko', { - months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), - monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), - weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), - weekdaysShort : '일_월_화_수_목_금_토'.split('_'), - weekdaysMin : '일_월_화_수_목_금_토'.split('_'), + var vi = moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + monthsParseExact : true, + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysParseExact : true, + meridiemParse: /sa|ch/i, + isPM : function (input) { + return /^ch$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'sa' : 'SA'; + } else { + return isLower ? 'ch' : 'CH'; + } + }, longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY년 MMMM D일', - LLL : 'YYYY년 MMMM D일 A h:mm', - LLLL : 'YYYY년 MMMM D일 dddd A h:mm', - l : 'YYYY.MM.DD.', - ll : 'YYYY년 MMMM D일', - lll : 'YYYY년 MMMM D일 A h:mm', - llll : 'YYYY년 MMMM D일 dddd A h:mm' + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY HH:mm', + LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' }, calendar : { - sameDay : '오늘 LT', - nextDay : '내일 LT', - nextWeek : 'dddd LT', - lastDay : '어제 LT', - lastWeek : '지난주 dddd LT', - sameElse : 'L' + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tới lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' }, relativeTime : { - future : '%s 후', - past : '%s 전', - s : '몇 초', - ss : '%d초', - m : '1분', - mm : '%d분', - h : '한 시간', - hh : '%d시간', - d : '하루', - dd : '%d일', - M : '한 달', - MM : '%d달', - y : '일 년', - yy : '%d년' - }, - dayOfMonthOrdinalParse : /\d{1,2}(일|월|주)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '일'; - case 'M': - return number + '월'; - case 'w': - case 'W': - return number + '주'; - default: - return number; - } + future : '%s tới', + past : '%s trước', + s : 'vài giây', + ss : '%d giây' , + m : 'một phút', + mm : '%d phút', + h : 'một giờ', + hh : '%d giờ', + d : 'một ngày', + dd : '%d ngày', + M : 'một tháng', + MM : '%d tháng', + y : 'một năm', + yy : '%d năm' }, - meridiemParse : /오전|오후/, - isPM : function (token) { - return token === '오후'; + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; }, - meridiem : function (hour, minute, isUpper) { - return hour < 12 ? '오전' : '오후'; + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ko; + return vi; }))); /***/ }), -/* 109 */ +/* 135 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' - }, numberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' - }, - months = [ - 'کانونی دووەم', - 'شوبات', - 'ئازار', - 'نیسان', - 'ئایار', - 'حوزەیران', - 'تەمموز', - 'ئاب', - 'ئەیلوول', - 'تشرینی یەكەم', - 'تشرینی دووەم', - 'كانونی یەکەم' - ]; - - - var ku = moment.defineLocale('ku', { - months : months, - monthsShort : months, - weekdays : 'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split('_'), - weekdaysShort : 'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'), - weekdaysMin : 'ی_د_س_چ_پ_ه_ش'.split('_'), + var xPseudo = moment.defineLocale('x-pseudo', { + months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), + monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), + monthsParseExact : true, + weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), + weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), + weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), weekdaysParseExact : true, longDateFormat : { LT : 'HH:mm', - LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', LLLL : 'dddd, D MMMM YYYY HH:mm' }, - meridiemParse: /ئێواره‌|به‌یانی/, - isPM: function (input) { - return /ئێواره‌/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'به‌یانی'; - } else { - return 'ئێواره‌'; - } - }, calendar : { - sameDay : '[ئه‌مرۆ كاتژمێر] LT', - nextDay : '[به‌یانی كاتژمێر] LT', - nextWeek : 'dddd [كاتژمێر] LT', - lastDay : '[دوێنێ كاتژمێر] LT', - lastWeek : 'dddd [كاتژمێر] LT', + sameDay : '[T~ódá~ý át] LT', + nextDay : '[T~ómó~rró~w át] LT', + nextWeek : 'dddd [át] LT', + lastDay : '[Ý~ést~érdá~ý át] LT', + lastWeek : '[L~ást] dddd [át] LT', sameElse : 'L' }, relativeTime : { - future : 'له‌ %s', - past : '%s', - s : 'چه‌ند چركه‌یه‌ك', - ss : 'چركه‌ %d', - m : 'یه‌ك خوله‌ك', - mm : '%d خوله‌ك', - h : 'یه‌ك كاتژمێر', - hh : '%d كاتژمێر', - d : 'یه‌ك ڕۆژ', - dd : '%d ڕۆژ', - M : 'یه‌ك مانگ', - MM : '%d مانگ', - y : 'یه‌ك ساڵ', - yy : '%d ساڵ' - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); + future : 'í~ñ %s', + past : '%s á~gó', + s : 'á ~féw ~sécó~ñds', + ss : '%d s~écóñ~ds', + m : 'á ~míñ~úté', + mm : '%d m~íñú~tés', + h : 'á~ñ hó~úr', + hh : '%d h~óúrs', + d : 'á ~dáý', + dd : '%d d~áýs', + M : 'á ~móñ~th', + MM : '%d m~óñt~hs', + y : 'á ~ýéár', + yy : '%d ý~éárs' }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; }, week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ku; + return xPseudo; }))); /***/ }), -/* 110 */ +/* 136 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var suffixes = { - 0: '-чү', - 1: '-чи', - 2: '-чи', - 3: '-чү', - 4: '-чү', - 5: '-чи', - 6: '-чы', - 7: '-чи', - 8: '-чи', - 9: '-чу', - 10: '-чу', - 20: '-чы', - 30: '-чу', - 40: '-чы', - 50: '-чү', - 60: '-чы', - 70: '-чи', - 80: '-чи', - 90: '-чу', - 100: '-чү' - }; - - var ky = moment.defineLocale('ky', { - months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), - monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), - weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'), - weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', + var yo = moment.defineLocale('yo', { + months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), + monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), + weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), + weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), + weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' }, calendar : { - sameDay : '[Бүгүн саат] LT', - nextDay : '[Эртең саат] LT', - nextWeek : 'dddd [саат] LT', - lastDay : '[Кечээ саат] LT', - lastWeek : '[Өткөн аптанын] dddd [күнү] [саат] LT', + sameDay : '[Ònì ni] LT', + nextDay : '[Ọ̀la ni] LT', + nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', + lastDay : '[Àna ni] LT', + lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', sameElse : 'L' }, relativeTime : { - future : '%s ичинде', - past : '%s мурун', - s : 'бирнече секунд', - ss : '%d секунд', - m : 'бир мүнөт', - mm : '%d мүнөт', - h : 'бир саат', - hh : '%d саат', - d : 'бир күн', - dd : '%d күн', - M : 'бир ай', - MM : '%d ай', - y : 'бир жыл', - yy : '%d жыл' - }, - dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/, - ordinal : function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes[number] || suffixes[a] || suffixes[b]); + future : 'ní %s', + past : '%s kọjá', + s : 'ìsẹjú aayá die', + ss :'aayá %d', + m : 'ìsẹjú kan', + mm : 'ìsẹjú %d', + h : 'wákati kan', + hh : 'wákati %d', + d : 'ọjọ́ kan', + dd : 'ọjọ́ %d', + M : 'osù kan', + MM : 'osù %d', + y : 'ọdún kan', + yy : 'ọdún %d' }, + dayOfMonthOrdinalParse : /ọjọ́\s\d{1,2}/, + ordinal : 'ọjọ́ %d', week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ky; + return yo; }))); /***/ }), -/* 111 */ +/* 137 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eng Minutt', 'enger Minutt'], - 'h': ['eng Stonn', 'enger Stonn'], - 'd': ['een Dag', 'engem Dag'], - 'M': ['ee Mount', 'engem Mount'], - 'y': ['ee Joer', 'engem Joer'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - function processFutureTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'a ' + string; - } - return 'an ' + string; - } - function processPastTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'viru ' + string; - } - return 'virun ' + string; - } - /** - * Returns true if the word before the given number loses the '-n' ending. - * e.g. 'an 10 Deeg' but 'a 5 Deeg' - * - * @param number {integer} - * @returns {boolean} - */ - function eifelerRegelAppliesToNumber(number) { - number = parseInt(number, 10); - if (isNaN(number)) { - return false; - } - if (number < 0) { - // Negative Number --> always true - return true; - } else if (number < 10) { - // Only 1 digit - if (4 <= number && number <= 7) { - return true; + var zhCn = moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日Ah点mm分', + LLLL : 'YYYY年M月D日ddddAh点mm分', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; } - return false; - } else if (number < 100) { - // 2 digits - var lastDigit = number % 10, firstDigit = number / 10; - if (lastDigit === 0) { - return eifelerRegelAppliesToNumber(firstDigit); + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上午') { + return hour; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } else { + // '中午' + return hour >= 11 ? hour : hour + 12; } - return eifelerRegelAppliesToNumber(lastDigit); - } else if (number < 10000) { - // 3 or 4 digits --> recursively check first digit - while (number >= 10) { - number = number / 10; + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; } - return eifelerRegelAppliesToNumber(number); - } else { - // Anything larger than 4 digits: recursively check first n-3 digits - number = number / 1000; - return eifelerRegelAppliesToNumber(number); - } - } - - var lb = moment.defineLocale('lb', { - months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), - weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), - weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm [Auer]', - LTS: 'H:mm:ss [Auer]', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm [Auer]', - LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' }, - calendar: { - sameDay: '[Haut um] LT', - sameElse: 'L', - nextDay: '[Muer um] LT', - nextWeek: 'dddd [um] LT', - lastDay: '[Gëschter um] LT', - lastWeek: function () { - // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule - switch (this.day()) { - case 2: - case 4: - return '[Leschten] dddd [um] LT'; - default: - return '[Leschte] dddd [um] LT'; - } + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; } }, relativeTime : { - future : processFutureTime, - past : processPastTime, - s : 'e puer Sekonnen', - ss : '%d Sekonnen', - m : processRelativeTime, - mm : '%d Minutten', - h : processRelativeTime, - hh : '%d Stonnen', - d : processRelativeTime, - dd : '%d Deeg', - M : processRelativeTime, - MM : '%d Méint', - y : processRelativeTime, - yy : '%d Joer' + future : '%s内', + past : '%s前', + s : '几秒', + ss : '%d 秒', + m : '1 分钟', + mm : '%d 分钟', + h : '1 小时', + hh : '%d 小时', + d : '1 天', + dd : '%d 天', + M : '1 个月', + MM : '%d 个月', + y : '1 年', + yy : '%d 年' }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal: '%d.', - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. + week : { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return lb; + return zhCn; }))); /***/ }), -/* 112 */ +/* 138 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var lo = moment.defineLocale('lo', { - months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), - monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), - weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), - weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), - weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'), - weekdaysParseExact : true, + var zhHk = moment.defineLocale('zh-hk', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'ວັນdddd D MMMM YYYY HH:mm' + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' }, - meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/, - isPM: function (input) { - return input === 'ຕອນແລງ'; + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } }, meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ຕອນເຊົ້າ'; + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; } else { - return 'ຕອນແລງ'; + return '晚上'; } }, calendar : { - sameDay : '[ມື້ນີ້ເວລາ] LT', - nextDay : '[ມື້ອື່ນເວລາ] LT', - nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT', - lastDay : '[ມື້ວານນີ້ເວລາ] LT', - lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', sameElse : 'L' }, - relativeTime : { - future : 'ອີກ %s', - past : '%sຜ່ານມາ', - s : 'ບໍ່ເທົ່າໃດວິນາທີ', - ss : '%d ວິນາທີ' , - m : '1 ນາທີ', - mm : '%d ນາທີ', - h : '1 ຊົ່ວໂມງ', - hh : '%d ຊົ່ວໂມງ', - d : '1 ມື້', - dd : '%d ມື້', - M : '1 ເດືອນ', - MM : '%d ເດືອນ', - y : '1 ປີ', - yy : '%d ປີ' + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } }, - dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/, - ordinal : function (number) { - return 'ທີ່' + number; + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' } }); - return lo; + return zhHk; }))); /***/ }), -/* 113 */ +/* 139 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var units = { - 'ss' : 'sekundė_sekundžių_sekundes', - 'm' : 'minutė_minutės_minutę', - 'mm': 'minutės_minučių_minutes', - 'h' : 'valanda_valandos_valandą', - 'hh': 'valandos_valandų_valandas', - 'd' : 'diena_dienos_dieną', - 'dd': 'dienos_dienų_dienas', - 'M' : 'mėnuo_mėnesio_mėnesį', - 'MM': 'mėnesiai_mėnesių_mėnesius', - 'y' : 'metai_metų_metus', - 'yy': 'metai_metų_metus' - }; - function translateSeconds(number, withoutSuffix, key, isFuture) { - if (withoutSuffix) { - return 'kelios sekundės'; - } else { - return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; - } - } - function translateSingular(number, withoutSuffix, key, isFuture) { - return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); - } - function special(number) { - return number % 10 === 0 || (number > 10 && number < 20); - } - function forms(key) { - return units[key].split('_'); - } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - if (number === 1) { - return result + translateSingular(number, withoutSuffix, key[0], isFuture); - } else if (withoutSuffix) { - return result + (special(number) ? forms(key)[1] : forms(key)[0]); - } else { - if (isFuture) { - return result + forms(key)[1]; - } else { - return result + (special(number) ? forms(key)[1] : forms(key)[2]); - } - } - } - var lt = moment.defineLocale('lt', { - months : { - format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), - standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), - isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ - }, - monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), - weekdays : { - format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), - standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), - isFormat: /dddd HH:mm/ - }, - weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), - weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), - weekdaysParseExact : true, + var zhTw = moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY [m.] MMMM D [d.]', - LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', - LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', - l : 'YYYY-MM-DD', - ll : 'YYYY [m.] MMMM D [d.]', - lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', - llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } }, calendar : { - sameDay : '[Šiandien] LT', - nextDay : '[Rytoj] LT', - nextWeek : 'dddd LT', - lastDay : '[Vakar] LT', - lastWeek : '[Praėjusį] dddd LT', + sameDay : '[今天] LT', + nextDay : '[明天] LT', + nextWeek : '[下]dddd LT', + lastDay : '[昨天] LT', + lastWeek : '[上]dddd LT', sameElse : 'L' }, - relativeTime : { - future : 'po %s', - past : 'prieš %s', - s : translateSeconds, - ss : translate, - m : translateSingular, - mm : translate, - h : translateSingular, - hh : translate, - d : translateSingular, - dd : translate, - M : translateSingular, - MM : translate, - y : translateSingular, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}-oji/, - ordinal : function (number) { - return number + '-oji'; + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' } }); - return lt; + return zhTw; }))); /***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { +/* 140 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return _internal_Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(157); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__["ConnectableObservable"]; }); +/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(162); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__["GroupedObservable"]; }); - var units = { - 'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'), - 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), - 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), - 'h': 'stundas_stundām_stunda_stundas'.split('_'), - 'hh': 'stundas_stundām_stunda_stundas'.split('_'), - 'd': 'dienas_dienām_diena_dienas'.split('_'), - 'dd': 'dienas_dienām_diena_dienas'.split('_'), - 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), - 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), - 'y': 'gada_gadiem_gads_gadi'.split('_'), - 'yy': 'gada_gadiem_gads_gadi'.split('_') - }; - /** - * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. - */ - function format(forms, number, withoutSuffix) { - if (withoutSuffix) { - // E.g. "21 minūte", "3 minūtes". - return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; - } else { - // E.g. "21 minūtes" as in "pēc 21 minūtes". - // E.g. "3 minūtēm" as in "pēc 3 minūtēm". - return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; - } - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - return number + ' ' + format(units[key], number, withoutSuffix); - } - function relativeTimeWithSingular(number, withoutSuffix, key) { - return format(units[key], number, withoutSuffix); - } - function relativeSeconds(number, withoutSuffix) { - return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; - } +/* harmony import */ var _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(154); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__["observable"]; }); - var lv = moment.defineLocale('lv', { - months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), - weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY.', - LL : 'YYYY. [gada] D. MMMM', - LLL : 'YYYY. [gada] D. MMMM, HH:mm', - LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' - }, - calendar : { - sameDay : '[Šodien pulksten] LT', - nextDay : '[Rīt pulksten] LT', - nextWeek : 'dddd [pulksten] LT', - lastDay : '[Vakar pulksten] LT', - lastWeek : '[Pagājušā] dddd [pulksten] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'pēc %s', - past : 'pirms %s', - s : relativeSeconds, - ss : relativeTimeWithPlural, - m : relativeTimeWithSingular, - mm : relativeTimeWithPlural, - h : relativeTimeWithSingular, - hh : relativeTimeWithPlural, - d : relativeTimeWithSingular, - dd : relativeTimeWithPlural, - M : relativeTimeWithSingular, - MM : relativeTimeWithPlural, - y : relativeTimeWithSingular, - yy : relativeTimeWithPlural - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +/* harmony import */ var _internal_Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(158); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return _internal_Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]; }); - return lv; +/* harmony import */ var _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(163); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__["BehaviorSubject"]; }); -}))); +/* harmony import */ var _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(164); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__["ReplaySubject"]; }); +/* harmony import */ var _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(181); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__["AsyncSubject"]; }); -/***/ }), -/* 115 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(182); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asapScheduler", function() { return _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__["asap"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(186); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asyncScheduler", function() { return _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__["async"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(165); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "queueScheduler", function() { return _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__["queue"]; }); +/* harmony import */ var _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(187); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "animationFrameScheduler", function() { return _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__["animationFrame"]; }); - var translator = { - words: { //Different grammatical cases - ss: ['sekund', 'sekunda', 'sekundi'], - m: ['jedan minut', 'jednog minuta'], - mm: ['minut', 'minuta', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mjesec', 'mjeseca', 'mjeseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; +/* harmony import */ var _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(190); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualTimeScheduler"]; }); - var me = moment.defineLocale('me', { - months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact : true, - weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sjutra u] LT', +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualAction"]; }); - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juče u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[prošle] [nedjelje] [u] LT', - '[prošlog] [ponedjeljka] [u] LT', - '[prošlog] [utorka] [u] LT', - '[prošle] [srijede] [u] LT', - '[prošlog] [četvrtka] [u] LT', - '[prošlog] [petka] [u] LT', - '[prošle] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'nekoliko sekundi', - ss : translator.translate, - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mjesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); +/* harmony import */ var _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(171); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__["Scheduler"]; }); - return me; +/* harmony import */ var _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(148); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__["Subscription"]; }); -}))); +/* harmony import */ var _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(143); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__["Subscriber"]; }); +/* harmony import */ var _internal_Notification__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(173); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["Notification"]; }); -/***/ }), -/* 116 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["NotificationKind"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(155); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__["pipe"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(156); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__["noop"]; }); +/* harmony import */ var _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(191); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__["identity"]; }); - var mi = moment.defineLocale('mi', { - months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), - monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), - monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, - weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), - weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), - weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY [i] HH:mm', - LLLL: 'dddd, D MMMM YYYY [i] HH:mm' - }, - calendar: { - sameDay: '[i teie mahana, i] LT', - nextDay: '[apopo i] LT', - nextWeek: 'dddd [i] LT', - lastDay: '[inanahi i] LT', - lastWeek: 'dddd [whakamutunga i] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'i roto i %s', - past: '%s i mua', - s: 'te hēkona ruarua', - ss: '%d hēkona', - m: 'he meneti', - mm: '%d meneti', - h: 'te haora', - hh: '%d haora', - d: 'he ra', - dd: '%d ra', - M: 'he marama', - MM: '%d marama', - y: 'he tau', - yy: '%d tau' - }, - dayOfMonthOrdinalParse: /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +/* harmony import */ var _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(192); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__["isObservable"]; }); - return mi; +/* harmony import */ var _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(193); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__["ArgumentOutOfRangeError"]; }); -}))); +/* harmony import */ var _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(194); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__["EmptyError"]; }); +/* harmony import */ var _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(159); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__["ObjectUnsubscribedError"]; }); -/***/ }), -/* 117 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(151); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__["UnsubscriptionError"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(195); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__["TimeoutError"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(196); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__["bindCallback"]; }); +/* harmony import */ var _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(198); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__["bindNodeCallback"]; }); - var mk = moment.defineLocale('mk', { - months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), - monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), - weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), - weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), - weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Денес во] LT', - nextDay : '[Утре во] LT', - nextWeek : '[Во] dddd [во] LT', - lastDay : '[Вчера во] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Изминатата] dddd [во] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Изминатиот] dddd [во] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'после %s', - past : 'пред %s', - s : 'неколку секунди', - ss : '%d секунди', - m : 'минута', - mm : '%d минути', - h : 'час', - hh : '%d часа', - d : 'ден', - dd : '%d дена', - M : 'месец', - MM : '%d месеци', - y : 'година', - yy : '%d години' - }, - dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); +/* harmony import */ var _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(199); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__["combineLatest"]; }); - return mk; +/* harmony import */ var _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(210); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__["concat"]; }); -}))); +/* harmony import */ var _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(221); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__["defer"]; }); +/* harmony import */ var _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(174); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["empty"]; }); -/***/ }), -/* 118 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(222); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__["forkJoin"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(214); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "from", function() { return _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__["from"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(223); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__["fromEvent"]; }); +/* harmony import */ var _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(224); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__["fromEventPattern"]; }); - var ml = moment.defineLocale('ml', { - months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), - monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), - monthsParseExact : true, - weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'), - weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'), - weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'), - longDateFormat : { - LT : 'A h:mm -നു', - LTS : 'A h:mm:ss -നു', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm -നു', - LLLL : 'dddd, D MMMM YYYY, A h:mm -നു' - }, - calendar : { - sameDay : '[ഇന്ന്] LT', - nextDay : '[നാളെ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ഇന്നലെ] LT', - lastWeek : '[കഴിഞ്ഞ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s കഴിഞ്ഞ്', - past : '%s മുൻപ്', - s : 'അൽപ നിമിഷങ്ങൾ', - ss : '%d സെക്കൻഡ്', - m : 'ഒരു മിനിറ്റ്', - mm : '%d മിനിറ്റ്', - h : 'ഒരു മണിക്കൂർ', - hh : '%d മണിക്കൂർ', - d : 'ഒരു ദിവസം', - dd : '%d ദിവസം', - M : 'ഒരു മാസം', - MM : '%d മാസം', - y : 'ഒരു വർഷം', - yy : '%d വർഷം' - }, - meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'രാത്രി' && hour >= 4) || - meridiem === 'ഉച്ച കഴിഞ്ഞ്' || - meridiem === 'വൈകുന്നേരം') { - return hour + 12; - } else { - return hour; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'രാത്രി'; - } else if (hour < 12) { - return 'രാവിലെ'; - } else if (hour < 17) { - return 'ഉച്ച കഴിഞ്ഞ്'; - } else if (hour < 20) { - return 'വൈകുന്നേരം'; - } else { - return 'രാത്രി'; - } - } - }); +/* harmony import */ var _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(225); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__["generate"]; }); - return ml; +/* harmony import */ var _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(226); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__["iif"]; }); -}))); +/* harmony import */ var _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(227); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__["interval"]; }); +/* harmony import */ var _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(229); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__["merge"]; }); -/***/ }), -/* 119 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(230); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "never", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["never"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(175); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "of", function() { return _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__["of"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(231); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__["onErrorResumeNext"]; }); +/* harmony import */ var _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(232); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__["pairs"]; }); - function translate(number, withoutSuffix, key, isFuture) { - switch (key) { - case 's': - return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын'; - case 'ss': - return number + (withoutSuffix ? ' секунд' : ' секундын'); - case 'm': - case 'mm': - return number + (withoutSuffix ? ' минут' : ' минутын'); - case 'h': - case 'hh': - return number + (withoutSuffix ? ' цаг' : ' цагийн'); - case 'd': - case 'dd': - return number + (withoutSuffix ? ' өдөр' : ' өдрийн'); - case 'M': - case 'MM': - return number + (withoutSuffix ? ' сар' : ' сарын'); - case 'y': - case 'yy': - return number + (withoutSuffix ? ' жил' : ' жилийн'); - default: - return number; - } - } +/* harmony import */ var _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(233); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__["partition"]; }); - var mn = moment.defineLocale('mn', { - months : 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'), - monthsShort : '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'), - monthsParseExact : true, - weekdays : 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'), - weekdaysShort : 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'), - weekdaysMin : 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY оны MMMMын D', - LLL : 'YYYY оны MMMMын D HH:mm', - LLLL : 'dddd, YYYY оны MMMMын D HH:mm' - }, - meridiemParse: /ҮӨ|ҮХ/i, - isPM : function (input) { - return input === 'ҮХ'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ҮӨ'; - } else { - return 'ҮХ'; - } - }, - calendar : { - sameDay : '[Өнөөдөр] LT', - nextDay : '[Маргааш] LT', - nextWeek : '[Ирэх] dddd LT', - lastDay : '[Өчигдөр] LT', - lastWeek : '[Өнгөрсөн] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s дараа', - past : '%s өмнө', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2} өдөр/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + ' өдөр'; - default: - return number; - } - } - }); +/* harmony import */ var _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(236); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__["race"]; }); - return mn; +/* harmony import */ var _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(237); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__["range"]; }); -}))); +/* harmony import */ var _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(180); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__["throwError"]; }); +/* harmony import */ var _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(238); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__["timer"]; }); -/***/ }), -/* 120 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(239); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "using", function() { return _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__["using"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(240); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__["zip"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(215); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__["scheduled"]; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["EMPTY"]; }); - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["NEVER"]; }); - function relativeTimeMr(number, withoutSuffix, string, isFuture) - { - var output = ''; - if (withoutSuffix) { - switch (string) { - case 's': output = 'काही सेकंद'; break; - case 'ss': output = '%d सेकंद'; break; - case 'm': output = 'एक मिनिट'; break; - case 'mm': output = '%d मिनिटे'; break; - case 'h': output = 'एक तास'; break; - case 'hh': output = '%d तास'; break; - case 'd': output = 'एक दिवस'; break; - case 'dd': output = '%d दिवस'; break; - case 'M': output = 'एक महिना'; break; - case 'MM': output = '%d महिने'; break; - case 'y': output = 'एक वर्ष'; break; - case 'yy': output = '%d वर्षे'; break; - } - } - else { - switch (string) { - case 's': output = 'काही सेकंदां'; break; - case 'ss': output = '%d सेकंदां'; break; - case 'm': output = 'एका मिनिटा'; break; - case 'mm': output = '%d मिनिटां'; break; - case 'h': output = 'एका तासा'; break; - case 'hh': output = '%d तासां'; break; - case 'd': output = 'एका दिवसा'; break; - case 'dd': output = '%d दिवसां'; break; - case 'M': output = 'एका महिन्या'; break; - case 'MM': output = '%d महिन्यां'; break; - case 'y': output = 'एका वर्षा'; break; - case 'yy': output = '%d वर्षां'; break; - } - } - return output.replace(/%d/i, number); - } +/* harmony import */ var _internal_config__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(146); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "config", function() { return _internal_config__WEBPACK_IMPORTED_MODULE_52__["config"]; }); - var mr = moment.defineLocale('mr', { - months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), - monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), - monthsParseExact : true, - weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), - longDateFormat : { - LT : 'A h:mm वाजता', - LTS : 'A h:mm:ss वाजता', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm वाजता', - LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[उद्या] LT', - nextWeek : 'dddd, LT', - lastDay : '[काल] LT', - lastWeek: '[मागील] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future: '%sमध्ये', - past: '%sपूर्वी', - s: relativeTimeMr, - ss: relativeTimeMr, - m: relativeTimeMr, - mm: relativeTimeMr, - h: relativeTimeMr, - hh: relativeTimeMr, - d: relativeTimeMr, - dd: relativeTimeMr, - M: relativeTimeMr, - MM: relativeTimeMr, - y: relativeTimeMr, - yy: relativeTimeMr - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रात्री') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सकाळी') { - return hour; - } else if (meridiem === 'दुपारी') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'सायंकाळी') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'रात्री'; - } else if (hour < 10) { - return 'सकाळी'; - } else if (hour < 17) { - return 'दुपारी'; - } else if (hour < 20) { - return 'सायंकाळी'; - } else { - return 'रात्री'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. - } - }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ - return mr; -}))); -/***/ }), -/* 121 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var ms = moment.defineLocale('ms', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - ss : '%d saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return ms; -}))); -/***/ }), -/* 122 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var msMy = moment.defineLocale('ms-my', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - ss : '%d saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return msMy; -}))); -/***/ }), -/* 123 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var mt = moment.defineLocale('mt', { - months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'), - monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'), - weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'), - weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'), - weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Illum fil-]LT', - nextDay : '[Għada fil-]LT', - nextWeek : 'dddd [fil-]LT', - lastDay : '[Il-bieraħ fil-]LT', - lastWeek : 'dddd [li għadda] [fil-]LT', - sameElse : 'L' - }, - relativeTime : { - future : 'f’ %s', - past : '%s ilu', - s : 'ftit sekondi', - ss : '%d sekondi', - m : 'minuta', - mm : '%d minuti', - h : 'siegħa', - hh : '%d siegħat', - d : 'ġurnata', - dd : '%d ġranet', - M : 'xahar', - MM : '%d xhur', - y : 'sena', - yy : '%d sni' - }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - return mt; -}))); -/***/ }), -/* 124 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '၁', - '2': '၂', - '3': '၃', - '4': '၄', - '5': '၅', - '6': '၆', - '7': '၇', - '8': '၈', - '9': '၉', - '0': '၀' - }, numberMap = { - '၁': '1', - '၂': '2', - '၃': '3', - '၄': '4', - '၅': '5', - '၆': '6', - '၇': '7', - '၈': '8', - '၉': '9', - '၀': '0' - }; - var my = moment.defineLocale('my', { - months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), - monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), - weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), - weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[ယနေ.] LT [မှာ]', - nextDay: '[မနက်ဖြန်] LT [မှာ]', - nextWeek: 'dddd LT [မှာ]', - lastDay: '[မနေ.က] LT [မှာ]', - lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]', - sameElse: 'L' - }, - relativeTime: { - future: 'လာမည့် %s မှာ', - past: 'လွန်ခဲ့သော %s က', - s: 'စက္ကန်.အနည်းငယ်', - ss : '%d စက္ကန့်', - m: 'တစ်မိနစ်', - mm: '%d မိနစ်', - h: 'တစ်နာရီ', - hh: '%d နာရီ', - d: 'တစ်ရက်', - dd: '%d ရက်', - M: 'တစ်လ', - MM: '%d လ', - y: 'တစ်နှစ်', - yy: '%d နှစ်' - }, - preparse: function (string) { - return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return my; -}))); -/***/ }), -/* 125 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var nb = moment.defineLocale('nb', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), - monthsParseExact : true, - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] HH:mm', - LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' - }, - calendar : { - sameDay: '[i dag kl.] LT', - nextDay: '[i morgen kl.] LT', - nextWeek: 'dddd [kl.] LT', - lastDay: '[i går kl.] LT', - lastWeek: '[forrige] dddd [kl.] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'noen sekunder', - ss : '%d sekunder', - m : 'ett minutt', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dager', - M : 'en måned', - MM : '%d måneder', - y : 'ett år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - return nb; -}))); -/***/ }), -/* 126 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - var ne = moment.defineLocale('ne', { - months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), - monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), - monthsParseExact : true, - weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), - weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), - weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'Aको h:mm बजे', - LTS : 'Aको h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, Aको h:mm बजे', - LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /राति|बिहान|दिउँसो|साँझ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'राति') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'बिहान') { - return hour; - } else if (meridiem === 'दिउँसो') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'साँझ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 3) { - return 'राति'; - } else if (hour < 12) { - return 'बिहान'; - } else if (hour < 16) { - return 'दिउँसो'; - } else if (hour < 20) { - return 'साँझ'; - } else { - return 'राति'; - } - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[भोलि] LT', - nextWeek : '[आउँदो] dddd[,] LT', - lastDay : '[हिजो] LT', - lastWeek : '[गएको] dddd[,] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%sमा', - past : '%s अगाडि', - s : 'केही क्षण', - ss : '%d सेकेण्ड', - m : 'एक मिनेट', - mm : '%d मिनेट', - h : 'एक घण्टा', - hh : '%d घण्टा', - d : 'एक दिन', - dd : '%d दिन', - M : 'एक महिना', - MM : '%d महिना', - y : 'एक बर्ष', - yy : '%d बर्ष' - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. - } - }); - return ne; -}))); -/***/ }), -/* 127 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration +//# sourceMappingURL=index.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 141 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return Observable; }); +/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(142); +/* harmony import */ var _util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(153); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(154); +/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(155); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(146); +/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ - var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; - var monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; - var nl = moment.defineLocale('nl', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortWithDots; - } else if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - ss : '%d seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +var Observable = /*@__PURE__*/ (function () { + function Observable(subscribe) { + this._isScalar = false; + if (subscribe) { + this._subscribe = subscribe; } - }); - - return nl; + } + Observable.prototype.lift = function (operator) { + var observable = new Observable(); + observable.source = this; + observable.operator = operator; + return observable; + }; + Observable.prototype.subscribe = function (observerOrNext, error, complete) { + var operator = this.operator; + var sink = Object(_util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__["toSubscriber"])(observerOrNext, error, complete); + if (operator) { + sink.add(operator.call(sink, this.source)); + } + else { + sink.add(this.source || (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ? + this._subscribe(sink) : + this._trySubscribe(sink)); + } + if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { + if (sink.syncErrorThrowable) { + sink.syncErrorThrowable = false; + if (sink.syncErrorThrown) { + throw sink.syncErrorValue; + } + } + } + return sink; + }; + Observable.prototype._trySubscribe = function (sink) { + try { + return this._subscribe(sink); + } + catch (err) { + if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { + sink.syncErrorThrown = true; + sink.syncErrorValue = err; + } + if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_0__["canReportError"])(sink)) { + sink.error(err); + } + else { + console.warn(err); + } + } + }; + Observable.prototype.forEach = function (next, promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var subscription; + subscription = _this.subscribe(function (value) { + try { + next(value); + } + catch (err) { + reject(err); + if (subscription) { + subscription.unsubscribe(); + } + } + }, reject, resolve); + }); + }; + Observable.prototype._subscribe = function (subscriber) { + var source = this.source; + return source && source.subscribe(subscriber); + }; + Observable.prototype[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]] = function () { + return this; + }; + Observable.prototype.pipe = function () { + var operations = []; + for (var _i = 0; _i < arguments.length; _i++) { + operations[_i] = arguments[_i]; + } + if (operations.length === 0) { + return this; + } + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipeFromArray"])(operations)(this); + }; + Observable.prototype.toPromise = function (promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var value; + _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); }); + }); + }; + Observable.create = function (subscribe) { + return new Observable(subscribe); + }; + return Observable; +}()); -}))); +function getPromiseCtor(promiseCtor) { + if (!promiseCtor) { + promiseCtor = _config__WEBPACK_IMPORTED_MODULE_4__["config"].Promise || Promise; + } + if (!promiseCtor) { + throw new Error('no Promise impl found'); + } + return promiseCtor; +} +//# sourceMappingURL=Observable.js.map /***/ }), -/* 128 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - +/* 142 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canReportError", function() { return canReportError; }); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(143); +/** PURE_IMPORTS_START _Subscriber PURE_IMPORTS_END */ - var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; - var monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; +function canReportError(observer) { + while (observer) { + var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped; + if (closed_1 || isStopped) { + return false; + } + else if (destination && destination instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { + observer = destination; + } + else { + observer = null; + } + } + return true; +} +//# sourceMappingURL=canReportError.js.map - var nlBe = moment.defineLocale('nl-be', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortWithDots; - } else if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, +/***/ }), +/* 143 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return Subscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SafeSubscriber", function() { return SafeSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(144); +/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(148); +/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(152); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(146); +/* harmony import */ var _util_hostReportError__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(147); +/** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */ - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - ss : '%d seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - return nlBe; -}))); -/***/ }), -/* 129 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var nn = moment.defineLocale('nn', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), - weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), - weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] H:mm', - LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' - }, - calendar : { - sameDay: '[I dag klokka] LT', - nextDay: '[I morgon klokka] LT', - nextWeek: 'dddd [klokka] LT', - lastDay: '[I går klokka] LT', - lastWeek: '[Føregåande] dddd [klokka] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s sidan', - s : 'nokre sekund', - ss : '%d sekund', - m : 'eit minutt', - mm : '%d minutt', - h : 'ein time', - hh : '%d timar', - d : 'ein dag', - dd : '%d dagar', - M : 'ein månad', - MM : '%d månader', - y : 'eit år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +var Subscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subscriber, _super); + function Subscriber(destinationOrNext, error, complete) { + var _this = _super.call(this) || this; + _this.syncErrorValue = null; + _this.syncErrorThrown = false; + _this.syncErrorThrowable = false; + _this.isStopped = false; + switch (arguments.length) { + case 0: + _this.destination = _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]; + break; + case 1: + if (!destinationOrNext) { + _this.destination = _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]; + break; + } + if (typeof destinationOrNext === 'object') { + if (destinationOrNext instanceof Subscriber) { + _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable; + _this.destination = destinationOrNext; + destinationOrNext.add(_this); + } + else { + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext); + } + break; + } + default: + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete); + break; } - }); + return _this; + } + Subscriber.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__["rxSubscriber"]] = function () { return this; }; + Subscriber.create = function (next, error, complete) { + var subscriber = new Subscriber(next, error, complete); + subscriber.syncErrorThrowable = false; + return subscriber; + }; + Subscriber.prototype.next = function (value) { + if (!this.isStopped) { + this._next(value); + } + }; + Subscriber.prototype.error = function (err) { + if (!this.isStopped) { + this.isStopped = true; + this._error(err); + } + }; + Subscriber.prototype.complete = function () { + if (!this.isStopped) { + this.isStopped = true; + this._complete(); + } + }; + Subscriber.prototype.unsubscribe = function () { + if (this.closed) { + return; + } + this.isStopped = true; + _super.prototype.unsubscribe.call(this); + }; + Subscriber.prototype._next = function (value) { + this.destination.next(value); + }; + Subscriber.prototype._error = function (err) { + this.destination.error(err); + this.unsubscribe(); + }; + Subscriber.prototype._complete = function () { + this.destination.complete(); + this.unsubscribe(); + }; + Subscriber.prototype._unsubscribeAndRecycle = function () { + var _parentOrParents = this._parentOrParents; + this._parentOrParents = null; + this.unsubscribe(); + this.closed = false; + this.isStopped = false; + this._parentOrParents = _parentOrParents; + return this; + }; + return Subscriber; +}(_Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"])); - return nn; +var SafeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SafeSubscriber, _super); + function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) { + var _this = _super.call(this) || this; + _this._parentSubscriber = _parentSubscriber; + var next; + var context = _this; + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__["isFunction"])(observerOrNext)) { + next = observerOrNext; + } + else if (observerOrNext) { + next = observerOrNext.next; + error = observerOrNext.error; + complete = observerOrNext.complete; + if (observerOrNext !== _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]) { + context = Object.create(observerOrNext); + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__["isFunction"])(context.unsubscribe)) { + _this.add(context.unsubscribe.bind(context)); + } + context.unsubscribe = _this.unsubscribe.bind(_this); + } + } + _this._context = context; + _this._next = next; + _this._error = error; + _this._complete = complete; + return _this; + } + SafeSubscriber.prototype.next = function (value) { + if (!this.isStopped && this._next) { + var _parentSubscriber = this._parentSubscriber; + if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(this._next, value); + } + else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) { + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var _parentSubscriber = this._parentSubscriber; + var useDeprecatedSynchronousErrorHandling = _config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling; + if (this._error) { + if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(this._error, err); + this.unsubscribe(); + } + else { + this.__tryOrSetError(_parentSubscriber, this._error, err); + this.unsubscribe(); + } + } + else if (!_parentSubscriber.syncErrorThrowable) { + this.unsubscribe(); + if (useDeprecatedSynchronousErrorHandling) { + throw err; + } + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + } + else { + if (useDeprecatedSynchronousErrorHandling) { + _parentSubscriber.syncErrorValue = err; + _parentSubscriber.syncErrorThrown = true; + } + else { + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + } + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.complete = function () { + var _this = this; + if (!this.isStopped) { + var _parentSubscriber = this._parentSubscriber; + if (this._complete) { + var wrappedComplete = function () { return _this._complete.call(_this._context); }; + if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(wrappedComplete); + this.unsubscribe(); + } + else { + this.__tryOrSetError(_parentSubscriber, wrappedComplete); + this.unsubscribe(); + } + } + else { + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) { + try { + fn.call(this._context, value); + } + catch (err) { + this.unsubscribe(); + if (_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { + throw err; + } + else { + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + } + } + }; + SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) { + if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { + throw new Error('bad call'); + } + try { + fn.call(this._context, value); + } + catch (err) { + if (_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { + parent.syncErrorValue = err; + parent.syncErrorThrown = true; + return true; + } + else { + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + return true; + } + } + return false; + }; + SafeSubscriber.prototype._unsubscribe = function () { + var _parentSubscriber = this._parentSubscriber; + this._context = null; + this._parentSubscriber = null; + _parentSubscriber.unsubscribe(); + }; + return SafeSubscriber; +}(Subscriber)); -}))); +//# sourceMappingURL=Subscriber.js.map /***/ }), -/* 130 */ -/***/ (function(module, exports, __webpack_require__) { +/* 144 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFunction", function() { return isFunction; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isFunction(x) { + return typeof x === 'function'; +} +//# sourceMappingURL=isFunction.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 145 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(146); +/* harmony import */ var _util_hostReportError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(147); +/** PURE_IMPORTS_START _config,_util_hostReportError PURE_IMPORTS_END */ - var symbolMap = { - '1': '੧', - '2': '੨', - '3': '੩', - '4': '੪', - '5': '੫', - '6': '੬', - '7': '੭', - '8': '੮', - '9': '੯', - '0': '੦' + +var empty = { + closed: true, + next: function (value) { }, + error: function (err) { + if (_config__WEBPACK_IMPORTED_MODULE_0__["config"].useDeprecatedSynchronousErrorHandling) { + throw err; + } + else { + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_1__["hostReportError"])(err); + } }, - numberMap = { - '੧': '1', - '੨': '2', - '੩': '3', - '੪': '4', - '੫': '5', - '੬': '6', - '੭': '7', - '੮': '8', - '੯': '9', - '੦': '0' - }; + complete: function () { } +}; +//# sourceMappingURL=Observer.js.map - var paIn = moment.defineLocale('pa-in', { - // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi. - months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), - monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), - weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'), - weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), - weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), - longDateFormat : { - LT : 'A h:mm ਵਜੇ', - LTS : 'A h:mm:ss ਵਜੇ', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm ਵਜੇ', - LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ' - }, - calendar : { - sameDay : '[ਅਜ] LT', - nextDay : '[ਕਲ] LT', - nextWeek : '[ਅਗਲਾ] dddd, LT', - lastDay : '[ਕਲ] LT', - lastWeek : '[ਪਿਛਲੇ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ਵਿੱਚ', - past : '%s ਪਿਛਲੇ', - s : 'ਕੁਝ ਸਕਿੰਟ', - ss : '%d ਸਕਿੰਟ', - m : 'ਇਕ ਮਿੰਟ', - mm : '%d ਮਿੰਟ', - h : 'ਇੱਕ ਘੰਟਾ', - hh : '%d ਘੰਟੇ', - d : 'ਇੱਕ ਦਿਨ', - dd : '%d ਦਿਨ', - M : 'ਇੱਕ ਮਹੀਨਾ', - MM : '%d ਮਹੀਨੇ', - y : 'ਇੱਕ ਸਾਲ', - yy : '%d ਸਾਲ' - }, - preparse: function (string) { - return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // Punjabi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. - meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ਰਾਤ') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ਸਵੇਰ') { - return hour; - } else if (meridiem === 'ਦੁਪਹਿਰ') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'ਸ਼ਾਮ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ਰਾਤ'; - } else if (hour < 10) { - return 'ਸਵੇਰ'; - } else if (hour < 17) { - return 'ਦੁਪਹਿਰ'; - } else if (hour < 20) { - return 'ਸ਼ਾਮ'; - } else { - return 'ਰਾਤ'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + +/***/ }), +/* 146 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "config", function() { return config; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var _enable_super_gross_mode_that_will_cause_bad_things = false; +var config = { + Promise: undefined, + set useDeprecatedSynchronousErrorHandling(value) { + if (value) { + var error = /*@__PURE__*/ new Error(); + /*@__PURE__*/ console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack); } - }); + else if (_enable_super_gross_mode_that_will_cause_bad_things) { + /*@__PURE__*/ console.log('RxJS: Back to a better error behavior. Thank you. <3'); + } + _enable_super_gross_mode_that_will_cause_bad_things = value; + }, + get useDeprecatedSynchronousErrorHandling() { + return _enable_super_gross_mode_that_will_cause_bad_things; + }, +}; +//# sourceMappingURL=config.js.map - return paIn; -}))); +/***/ }), +/* 147 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hostReportError", function() { return hostReportError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function hostReportError(err) { + setTimeout(function () { throw err; }, 0); +} +//# sourceMappingURL=hostReportError.js.map /***/ }), -/* 131 */ -/***/ (function(module, exports, __webpack_require__) { +/* 148 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return Subscription; }); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(149); +/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(150); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(151); +/** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_UnsubscriptionError PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'), - monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); - function plural(n) { - return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); - } - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'ss': - return result + (plural(number) ? 'sekundy' : 'sekund'); - case 'm': - return withoutSuffix ? 'minuta' : 'minutę'; - case 'mm': - return result + (plural(number) ? 'minuty' : 'minut'); - case 'h': - return withoutSuffix ? 'godzina' : 'godzinę'; - case 'hh': - return result + (plural(number) ? 'godziny' : 'godzin'); - case 'MM': - return result + (plural(number) ? 'miesiące' : 'miesięcy'); - case 'yy': - return result + (plural(number) ? 'lata' : 'lat'); + +var Subscription = /*@__PURE__*/ (function () { + function Subscription(unsubscribe) { + this.closed = false; + this._parentOrParents = null; + this._subscriptions = null; + if (unsubscribe) { + this._unsubscribe = unsubscribe; } } - - var pl = moment.defineLocale('pl', { - months : function (momentToFormat, format) { - if (!momentToFormat) { - return monthsNominative; - } else if (format === '') { - // Hack: if format empty we know this is used to generate - // RegExp by moment. Give then back both valid forms of months - // in RegExp ready format. - return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; - } else if (/D MMMM/.test(format)) { - return monthsSubjective[momentToFormat.month()]; - } else { - return monthsNominative[momentToFormat.month()]; - } - }, - monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), - weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), - weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), - weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Dziś o] LT', - nextDay: '[Jutro o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[W niedzielę o] LT'; - - case 2: - return '[We wtorek o] LT'; - - case 3: - return '[W środę o] LT'; - - case 6: - return '[W sobotę o] LT'; - - default: - return '[W] dddd [o] LT'; + Subscription.prototype.unsubscribe = function () { + var errors; + if (this.closed) { + return; + } + var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; + this.closed = true; + this._parentOrParents = null; + this._subscriptions = null; + if (_parentOrParents instanceof Subscription) { + _parentOrParents.remove(this); + } + else if (_parentOrParents !== null) { + for (var index = 0; index < _parentOrParents.length; ++index) { + var parent_1 = _parentOrParents[index]; + parent_1.remove(this); + } + } + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(_unsubscribe)) { + try { + _unsubscribe.call(this); + } + catch (e) { + errors = e instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"] ? flattenUnsubscriptionErrors(e.errors) : [e]; + } + } + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(_subscriptions)) { + var index = -1; + var len = _subscriptions.length; + while (++index < len) { + var sub = _subscriptions[index]; + if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_1__["isObject"])(sub)) { + try { + sub.unsubscribe(); + } + catch (e) { + errors = errors || []; + if (e instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"]) { + errors = errors.concat(flattenUnsubscriptionErrors(e.errors)); + } + else { + errors.push(e); + } + } } - }, - lastDay: '[Wczoraj o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[W zeszłą niedzielę o] LT'; - case 3: - return '[W zeszłą środę o] LT'; - case 6: - return '[W zeszłą sobotę o] LT'; - default: - return '[W zeszły] dddd [o] LT'; + } + } + if (errors) { + throw new _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"](errors); + } + }; + Subscription.prototype.add = function (teardown) { + var subscription = teardown; + if (!teardown) { + return Subscription.EMPTY; + } + switch (typeof teardown) { + case 'function': + subscription = new Subscription(teardown); + case 'object': + if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') { + return subscription; } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : '%s temu', - s : 'kilka sekund', - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : '1 dzień', - dd : '%d dni', - M : 'miesiąc', - MM : translate, - y : 'rok', - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + else if (this.closed) { + subscription.unsubscribe(); + return subscription; + } + else if (!(subscription instanceof Subscription)) { + var tmp = subscription; + subscription = new Subscription(); + subscription._subscriptions = [tmp]; + } + break; + default: { + throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); + } } - }); - - return pl; + var _parentOrParents = subscription._parentOrParents; + if (_parentOrParents === null) { + subscription._parentOrParents = this; + } + else if (_parentOrParents instanceof Subscription) { + if (_parentOrParents === this) { + return subscription; + } + subscription._parentOrParents = [_parentOrParents, this]; + } + else if (_parentOrParents.indexOf(this) === -1) { + _parentOrParents.push(this); + } + else { + return subscription; + } + var subscriptions = this._subscriptions; + if (subscriptions === null) { + this._subscriptions = [subscription]; + } + else { + subscriptions.push(subscription); + } + return subscription; + }; + Subscription.prototype.remove = function (subscription) { + var subscriptions = this._subscriptions; + if (subscriptions) { + var subscriptionIndex = subscriptions.indexOf(subscription); + if (subscriptionIndex !== -1) { + subscriptions.splice(subscriptionIndex, 1); + } + } + }; + Subscription.EMPTY = (function (empty) { + empty.closed = true; + return empty; + }(new Subscription())); + return Subscription; +}()); -}))); +function flattenUnsubscriptionErrors(errors) { + return errors.reduce(function (errs, err) { return errs.concat((err instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"]) ? err.errors : err); }, []); +} +//# sourceMappingURL=Subscription.js.map /***/ }), -/* 132 */ -/***/ (function(module, exports, __webpack_require__) { +/* 149 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArray", function() { return isArray; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var isArray = /*@__PURE__*/ (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })(); +//# sourceMappingURL=isArray.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 150 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var pt = moment.defineLocale('pt', { - months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), - weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), - weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY HH:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'segundos', - ss : '%d segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - dayOfMonthOrdinalParse: /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObject", function() { return isObject; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isObject(x) { + return x !== null && typeof x === 'object'; +} +//# sourceMappingURL=isObject.js.map - return pt; -}))); +/***/ }), +/* 151 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return UnsubscriptionError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var UnsubscriptionErrorImpl = /*@__PURE__*/ (function () { + function UnsubscriptionErrorImpl(errors) { + Error.call(this); + this.message = errors ? + errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n ') : ''; + this.name = 'UnsubscriptionError'; + this.errors = errors; + return this; + } + UnsubscriptionErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return UnsubscriptionErrorImpl; +})(); +var UnsubscriptionError = UnsubscriptionErrorImpl; +//# sourceMappingURL=UnsubscriptionError.js.map /***/ }), -/* 133 */ -/***/ (function(module, exports, __webpack_require__) { +/* 152 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rxSubscriber", function() { return rxSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$rxSubscriber", function() { return $$rxSubscriber; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var rxSubscriber = /*@__PURE__*/ (function () { + return typeof Symbol === 'function' + ? /*@__PURE__*/ Symbol('rxSubscriber') + : '@@rxSubscriber_' + /*@__PURE__*/ Math.random(); +})(); +var $$rxSubscriber = rxSubscriber; +//# sourceMappingURL=rxSubscriber.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 153 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var ptBr = moment.defineLocale('pt-br', { - months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), - weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), - weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'poucos segundos', - ss : '%d segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - dayOfMonthOrdinalParse: /\d{1,2}º/, - ordinal : '%dº' - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toSubscriber", function() { return toSubscriber; }); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(143); +/* harmony import */ var _symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(152); +/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); +/** PURE_IMPORTS_START _Subscriber,_symbol_rxSubscriber,_Observer PURE_IMPORTS_END */ - return ptBr; -}))); + +function toSubscriber(nextOrObserver, error, complete) { + if (nextOrObserver) { + if (nextOrObserver instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { + return nextOrObserver; + } + if (nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]]) { + return nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]](); + } + } + if (!nextOrObserver && !error && !complete) { + return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](_Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]); + } + return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](nextOrObserver, error, complete); +} +//# sourceMappingURL=toSubscriber.js.map /***/ }), -/* 134 */ -/***/ (function(module, exports, __webpack_require__) { +/* 154 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return observable; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var observable = /*@__PURE__*/ (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })(); +//# sourceMappingURL=observable.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 155 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': 'secunde', - 'mm': 'minute', - 'hh': 'ore', - 'dd': 'zile', - 'MM': 'luni', - 'yy': 'ani' - }, - separator = ' '; - if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { - separator = ' de '; - } - return number + separator + format[key]; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipeFromArray", function() { return pipeFromArray; }); +/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(156); +/** PURE_IMPORTS_START _noop PURE_IMPORTS_END */ + +function pipe() { + var fns = []; + for (var _i = 0; _i < arguments.length; _i++) { + fns[_i] = arguments[_i]; + } + return pipeFromArray(fns); +} +function pipeFromArray(fns) { + if (!fns) { + return _noop__WEBPACK_IMPORTED_MODULE_0__["noop"]; + } + if (fns.length === 1) { + return fns[0]; } + return function piped(input) { + return fns.reduce(function (prev, fn) { return fn(prev); }, input); + }; +} +//# sourceMappingURL=pipe.js.map - var ro = moment.defineLocale('ro', { - months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), - monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), - weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), - weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[azi la] LT', - nextDay: '[mâine la] LT', - nextWeek: 'dddd [la] LT', - lastDay: '[ieri la] LT', - lastWeek: '[fosta] dddd [la] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'peste %s', - past : '%s în urmă', - s : 'câteva secunde', - ss : relativeTimeWithPlural, - m : 'un minut', - mm : relativeTimeWithPlural, - h : 'o oră', - hh : relativeTimeWithPlural, - d : 'o zi', - dd : relativeTimeWithPlural, - M : 'o lună', - MM : relativeTimeWithPlural, - y : 'un an', - yy : relativeTimeWithPlural - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return ro; +/***/ }), +/* 156 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return noop; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function noop() { } +//# sourceMappingURL=noop.js.map /***/ }), -/* 135 */ -/***/ (function(module, exports, __webpack_require__) { +/* 157 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return ConnectableObservable; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "connectableObservableDescriptor", function() { return connectableObservableDescriptor; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(141); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(143); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(148); +/* harmony import */ var _operators_refCount__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(161); +/** PURE_IMPORTS_START tslib,_Subject,_Observable,_Subscriber,_Subscription,_operators_refCount PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', - 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', - 'hh': 'час_часа_часов', - 'dd': 'день_дня_дней', - 'MM': 'месяц_месяца_месяцев', - 'yy': 'год_года_лет' - }; - if (key === 'm') { - return withoutSuffix ? 'минута' : 'минуту'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; - - // http://new.gramota.ru/spravka/rules/139-prop : § 103 - // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 - // CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 - var ru = moment.defineLocale('ru', { - months : { - format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), - standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') - }, - monthsShort : { - // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? - format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), - standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') - }, - weekdays : { - standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), - format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), - isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ - }, - weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), - weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - - // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки - monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, - // копия предыдущего - monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, - // полные названия с падежами - monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, - // Выражение, которое соотвествует только сокращённым формам - monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., H:mm', - LLLL : 'dddd, D MMMM YYYY г., H:mm' - }, - calendar : { - sameDay: '[Сегодня, в] LT', - nextDay: '[Завтра, в] LT', - lastDay: '[Вчера, в] LT', - nextWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[В следующее] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В следующий] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В следующую] dddd, [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd, [в] LT'; - } else { - return '[В] dddd, [в] LT'; - } - } - }, - lastWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[В прошлое] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В прошлый] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В прошлую] dddd, [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd, [в] LT'; - } else { - return '[В] dddd, [в] LT'; - } - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'через %s', - past : '%s назад', - s : 'несколько секунд', - ss : relativeTimeWithPlural, - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'час', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'месяц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночи|утра|дня|вечера/i, - isPM : function (input) { - return /^(дня|вечера)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночи'; - } else if (hour < 12) { - return 'утра'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечера'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - return number + '-й'; - case 'D': - return number + '-го'; - case 'w': - case 'W': - return number + '-я'; - default: - return number; +var ConnectableObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableObservable, _super); + function ConnectableObservable(source, subjectFactory) { + var _this = _super.call(this) || this; + _this.source = source; + _this.subjectFactory = subjectFactory; + _this._refCount = 0; + _this._isComplete = false; + return _this; + } + ConnectableObservable.prototype._subscribe = function (subscriber) { + return this.getSubject().subscribe(subscriber); + }; + ConnectableObservable.prototype.getSubject = function () { + var subject = this._subject; + if (!subject || subject.isStopped) { + this._subject = this.subjectFactory(); + } + return this._subject; + }; + ConnectableObservable.prototype.connect = function () { + var connection = this._connection; + if (!connection) { + this._isComplete = false; + connection = this._connection = new _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"](); + connection.add(this.source + .subscribe(new ConnectableSubscriber(this.getSubject(), this))); + if (connection.closed) { + this._connection = null; + connection = _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"].EMPTY; } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. } - }); - - return ru; - -}))); - - -/***/ }), -/* 136 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var months = [ - 'جنوري', - 'فيبروري', - 'مارچ', - 'اپريل', - 'مئي', - 'جون', - 'جولاءِ', - 'آگسٽ', - 'سيپٽمبر', - 'آڪٽوبر', - 'نومبر', - 'ڊسمبر' - ]; - var days = [ - 'آچر', - 'سومر', - 'اڱارو', - 'اربع', - 'خميس', - 'جمع', - 'ڇنڇر' - ]; + return connection; + }; + ConnectableObservable.prototype.refCount = function () { + return Object(_operators_refCount__WEBPACK_IMPORTED_MODULE_5__["refCount"])()(this); + }; + return ConnectableObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); - var sd = moment.defineLocale('sd', { - months : months, - monthsShort : months, - weekdays : days, - weekdaysShort : days, - weekdaysMin : days, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd، D MMMM YYYY HH:mm' - }, - meridiemParse: /صبح|شام/, - isPM : function (input) { - return 'شام' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'صبح'; +var connectableObservableDescriptor = /*@__PURE__*/ (function () { + var connectableProto = ConnectableObservable.prototype; + return { + operator: { value: null }, + _refCount: { value: 0, writable: true }, + _subject: { value: null, writable: true }, + _connection: { value: null, writable: true }, + _subscribe: { value: connectableProto._subscribe }, + _isComplete: { value: connectableProto._isComplete, writable: true }, + getSubject: { value: connectableProto.getSubject }, + connect: { value: connectableProto.connect }, + refCount: { value: connectableProto.refCount } + }; +})(); +var ConnectableSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableSubscriber, _super); + function ConnectableSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; + } + ConnectableSubscriber.prototype._error = function (err) { + this._unsubscribe(); + _super.prototype._error.call(this, err); + }; + ConnectableSubscriber.prototype._complete = function () { + this.connectable._isComplete = true; + this._unsubscribe(); + _super.prototype._complete.call(this); + }; + ConnectableSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (connectable) { + this.connectable = null; + var connection = connectable._connection; + connectable._refCount = 0; + connectable._subject = null; + connectable._connection = null; + if (connection) { + connection.unsubscribe(); } - return 'شام'; - }, - calendar : { - sameDay : '[اڄ] LT', - nextDay : '[سڀاڻي] LT', - nextWeek : 'dddd [اڳين هفتي تي] LT', - lastDay : '[ڪالهه] LT', - lastWeek : '[گزريل هفتي] dddd [تي] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s پوء', - past : '%s اڳ', - s : 'چند سيڪنڊ', - ss : '%d سيڪنڊ', - m : 'هڪ منٽ', - mm : '%d منٽ', - h : 'هڪ ڪلاڪ', - hh : '%d ڪلاڪ', - d : 'هڪ ڏينهن', - dd : '%d ڏينهن', - M : 'هڪ مهينو', - MM : '%d مهينا', - y : 'هڪ سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. } - }); - - return sd; - -}))); + }; + return ConnectableSubscriber; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["SubjectSubscriber"])); +var RefCountOperator = /*@__PURE__*/ (function () { + function RefCountOperator(connectable) { + this.connectable = connectable; + } + RefCountOperator.prototype.call = function (subscriber, source) { + var connectable = this.connectable; + connectable._refCount++; + var refCounter = new RefCountSubscriber(subscriber, connectable); + var subscription = source.subscribe(refCounter); + if (!refCounter.closed) { + refCounter.connection = connectable.connect(); + } + return subscription; + }; + return RefCountOperator; +}()); +var RefCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); + function RefCountSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; + } + RefCountSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (!connectable) { + this.connection = null; + return; + } + this.connectable = null; + var refCount = connectable._refCount; + if (refCount <= 0) { + this.connection = null; + return; + } + connectable._refCount = refCount - 1; + if (refCount > 1) { + this.connection = null; + return; + } + var connection = this.connection; + var sharedConnection = connectable._connection; + this.connection = null; + if (sharedConnection && (!connection || sharedConnection === connection)) { + sharedConnection.unsubscribe(); + } + }; + return RefCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +//# sourceMappingURL=ConnectableObservable.js.map /***/ }), -/* 137 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - +/* 158 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var se = moment.defineLocale('se', { - months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), - monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), - weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), - weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), - weekdaysMin : 's_v_m_g_d_b_L'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'MMMM D. [b.] YYYY', - LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', - LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' - }, - calendar : { - sameDay: '[otne ti] LT', - nextDay: '[ihttin ti] LT', - nextWeek: 'dddd [ti] LT', - lastDay: '[ikte ti] LT', - lastWeek: '[ovddit] dddd [ti] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s geažes', - past : 'maŋit %s', - s : 'moadde sekunddat', - ss: '%d sekunddat', - m : 'okta minuhta', - mm : '%d minuhtat', - h : 'okta diimmu', - hh : '%d diimmut', - d : 'okta beaivi', - dd : '%d beaivvit', - M : 'okta mánnu', - MM : '%d mánut', - y : 'okta jahki', - yy : '%d jagit' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscriber", function() { return SubjectSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return Subject; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnonymousSubject", function() { return AnonymousSubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(141); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(148); +/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(159); +/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(160); +/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(152); +/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ - return se; -}))); -/***/ }), -/* 138 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +var SubjectSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscriber, _super); + function SubjectSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + return _this; + } + return SubjectSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); - /*jshint -W100*/ - var si = moment.defineLocale('si', { - months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), - monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), - weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), - weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), - weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'a h:mm', - LTS : 'a h:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY MMMM D', - LLL : 'YYYY MMMM D, a h:mm', - LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' - }, - calendar : { - sameDay : '[අද] LT[ට]', - nextDay : '[හෙට] LT[ට]', - nextWeek : 'dddd LT[ට]', - lastDay : '[ඊයේ] LT[ට]', - lastWeek : '[පසුගිය] dddd LT[ට]', - sameElse : 'L' - }, - relativeTime : { - future : '%sකින්', - past : '%sකට පෙර', - s : 'තත්පර කිහිපය', - ss : 'තත්පර %d', - m : 'මිනිත්තුව', - mm : 'මිනිත්තු %d', - h : 'පැය', - hh : 'පැය %d', - d : 'දිනය', - dd : 'දින %d', - M : 'මාසය', - MM : 'මාස %d', - y : 'වසර', - yy : 'වසර %d' - }, - dayOfMonthOrdinalParse: /\d{1,2} වැනි/, - ordinal : function (number) { - return number + ' වැනි'; - }, - meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, - isPM : function (input) { - return input === 'ප.ව.' || input === 'පස් වරු'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'ප.ව.' : 'පස් වරු'; - } else { - return isLower ? 'පෙ.ව.' : 'පෙර වරු'; +var Subject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subject, _super); + function Subject() { + var _this = _super.call(this) || this; + _this.observers = []; + _this.closed = false; + _this.isStopped = false; + _this.hasError = false; + _this.thrownError = null; + return _this; + } + Subject.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__["rxSubscriber"]] = function () { + return new SubjectSubscriber(this); + }; + Subject.prototype.lift = function (operator) { + var subject = new AnonymousSubject(this, this); + subject.operator = operator; + return subject; + }; + Subject.prototype.next = function (value) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + if (!this.isStopped) { + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].next(value); } } - }); + }; + Subject.prototype.error = function (err) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + this.hasError = true; + this.thrownError = err; + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].error(err); + } + this.observers.length = 0; + }; + Subject.prototype.complete = function () { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].complete(); + } + this.observers.length = 0; + }; + Subject.prototype.unsubscribe = function () { + this.isStopped = true; + this.closed = true; + this.observers = null; + }; + Subject.prototype._trySubscribe = function (subscriber) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + else { + return _super.prototype._trySubscribe.call(this, subscriber); + } + }; + Subject.prototype._subscribe = function (subscriber) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + else if (this.hasError) { + subscriber.error(this.thrownError); + return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + else if (this.isStopped) { + subscriber.complete(); + return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + else { + this.observers.push(subscriber); + return new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__["SubjectSubscription"](this, subscriber); + } + }; + Subject.prototype.asObservable = function () { + var observable = new _Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"](); + observable.source = this; + return observable; + }; + Subject.create = function (destination, source) { + return new AnonymousSubject(destination, source); + }; + return Subject; +}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); - return si; +var AnonymousSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnonymousSubject, _super); + function AnonymousSubject(destination, source) { + var _this = _super.call(this) || this; + _this.destination = destination; + _this.source = source; + return _this; + } + AnonymousSubject.prototype.next = function (value) { + var destination = this.destination; + if (destination && destination.next) { + destination.next(value); + } + }; + AnonymousSubject.prototype.error = function (err) { + var destination = this.destination; + if (destination && destination.error) { + this.destination.error(err); + } + }; + AnonymousSubject.prototype.complete = function () { + var destination = this.destination; + if (destination && destination.complete) { + this.destination.complete(); + } + }; + AnonymousSubject.prototype._subscribe = function (subscriber) { + var source = this.source; + if (source) { + return this.source.subscribe(subscriber); + } + else { + return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + }; + return AnonymousSubject; +}(Subject)); -}))); +//# sourceMappingURL=Subject.js.map /***/ }), -/* 139 */ -/***/ (function(module, exports, __webpack_require__) { +/* 159 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return ObjectUnsubscribedError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var ObjectUnsubscribedErrorImpl = /*@__PURE__*/ (function () { + function ObjectUnsubscribedErrorImpl() { + Error.call(this); + this.message = 'object unsubscribed'; + this.name = 'ObjectUnsubscribedError'; + return this; + } + ObjectUnsubscribedErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return ObjectUnsubscribedErrorImpl; +})(); +var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl; +//# sourceMappingURL=ObjectUnsubscribedError.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 160 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), - monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); - function plural(n) { - return (n > 1) && (n < 5); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscription", function() { return SubjectSubscription; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ + + +var SubjectSubscription = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscription, _super); + function SubjectSubscription(subject, subscriber) { + var _this = _super.call(this) || this; + _this.subject = subject; + _this.subscriber = subscriber; + _this.closed = false; + return _this; } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; - case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'sekundy' : 'sekúnd'); - } else { - return result + 'sekundami'; - } - break; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minúty' : 'minút'); - } else { - return result + 'minútami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodín'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dni' : 'dní'); - } else { - return result + 'dňami'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'mesiace' : 'mesiacov'); - } else { - return result + 'mesiacmi'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'rokov'); - } else { - return result + 'rokmi'; - } - break; + SubjectSubscription.prototype.unsubscribe = function () { + if (this.closed) { + return; } - } - - var sk = moment.defineLocale('sk', { - months : months, - monthsShort : monthsShort, - weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), - weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), - weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd D. MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[dnes o] LT', - nextDay: '[zajtra o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedeľu o] LT'; - case 1: - case 2: - return '[v] dddd [o] LT'; - case 3: - return '[v stredu o] LT'; - case 4: - return '[vo štvrtok o] LT'; - case 5: - return '[v piatok o] LT'; - case 6: - return '[v sobotu o] LT'; - } - }, - lastDay: '[včera o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulú nedeľu o] LT'; - case 1: - case 2: - return '[minulý] dddd [o] LT'; - case 3: - return '[minulú stredu o] LT'; - case 4: - case 5: - return '[minulý] dddd [o] LT'; - case 6: - return '[minulú sobotu o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pred %s', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + this.closed = true; + var subject = this.subject; + var observers = subject.observers; + this.subject = null; + if (!observers || observers.length === 0 || subject.isStopped || subject.closed) { + return; } - }); - - return sk; + var subscriberIndex = observers.indexOf(this.subscriber); + if (subscriberIndex !== -1) { + observers.splice(subscriberIndex, 1); + } + }; + return SubjectSubscription; +}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); -}))); +//# sourceMappingURL=SubjectSubscription.js.map /***/ }), -/* 140 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 161 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return refCount; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; - case 'ss': - if (number === 1) { - result += withoutSuffix ? 'sekundo' : 'sekundi'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah'; - } else { - result += 'sekund'; - } - return result; - case 'm': - return withoutSuffix ? 'ena minuta' : 'eno minuto'; - case 'mm': - if (number === 1) { - result += withoutSuffix ? 'minuta' : 'minuto'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'minute' : 'minutami'; - } else { - result += withoutSuffix || isFuture ? 'minut' : 'minutami'; - } - return result; - case 'h': - return withoutSuffix ? 'ena ura' : 'eno uro'; - case 'hh': - if (number === 1) { - result += withoutSuffix ? 'ura' : 'uro'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'uri' : 'urama'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'ure' : 'urami'; - } else { - result += withoutSuffix || isFuture ? 'ur' : 'urami'; - } - return result; - case 'd': - return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; - case 'dd': - if (number === 1) { - result += withoutSuffix || isFuture ? 'dan' : 'dnem'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; - } else { - result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; - } - return result; - case 'M': - return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; - case 'MM': - if (number === 1) { - result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; - } else { - result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; - } - return result; - case 'y': - return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; - case 'yy': - if (number === 1) { - result += withoutSuffix || isFuture ? 'leto' : 'letom'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'leti' : 'letoma'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'leta' : 'leti'; - } else { - result += withoutSuffix || isFuture ? 'let' : 'leti'; - } - return result; +function refCount() { + return function refCountOperatorFunction(source) { + return source.lift(new RefCountOperator(source)); + }; +} +var RefCountOperator = /*@__PURE__*/ (function () { + function RefCountOperator(connectable) { + this.connectable = connectable; + } + RefCountOperator.prototype.call = function (subscriber, source) { + var connectable = this.connectable; + connectable._refCount++; + var refCounter = new RefCountSubscriber(subscriber, connectable); + var subscription = source.subscribe(refCounter); + if (!refCounter.closed) { + refCounter.connection = connectable.connect(); } + return subscription; + }; + return RefCountOperator; +}()); +var RefCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); + function RefCountSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; } + RefCountSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (!connectable) { + this.connection = null; + return; + } + this.connectable = null; + var refCount = connectable._refCount; + if (refCount <= 0) { + this.connection = null; + return; + } + connectable._refCount = refCount - 1; + if (refCount > 1) { + this.connection = null; + return; + } + var connection = this.connection; + var sharedConnection = connectable._connection; + this.connection = null; + if (sharedConnection && (!connection || sharedConnection === connection)) { + sharedConnection.unsubscribe(); + } + }; + return RefCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=refCount.js.map - var sl = moment.defineLocale('sl', { - months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), - weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), - weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[danes ob] LT', - nextDay : '[jutri ob] LT', - nextWeek : function () { - switch (this.day()) { - case 0: - return '[v] [nedeljo] [ob] LT'; - case 3: - return '[v] [sredo] [ob] LT'; - case 6: - return '[v] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[v] dddd [ob] LT'; - } - }, - lastDay : '[včeraj ob] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - return '[prejšnjo] [nedeljo] [ob] LT'; - case 3: - return '[prejšnjo] [sredo] [ob] LT'; - case 6: - return '[prejšnjo] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prejšnji] dddd [ob] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'čez %s', - past : 'pred %s', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - - return sl; - -}))); +/***/ }), +/* 162 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return groupBy; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return GroupedObservable; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(148); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(141); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(158); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription,_Observable,_Subject PURE_IMPORTS_END */ -/***/ }), -/* 141 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var sq = moment.defineLocale('sq', { - months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), - monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), - weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), - weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), - weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), - weekdaysParseExact : true, - meridiemParse: /PD|MD/, - isPM: function (input) { - return input.charAt(0) === 'M'; - }, - meridiem : function (hours, minutes, isLower) { - return hours < 12 ? 'PD' : 'MD'; - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Sot në] LT', - nextDay : '[Nesër në] LT', - nextWeek : 'dddd [në] LT', - lastDay : '[Dje në] LT', - lastWeek : 'dddd [e kaluar në] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'në %s', - past : '%s më parë', - s : 'disa sekonda', - ss : '%d sekonda', - m : 'një minutë', - mm : '%d minuta', - h : 'një orë', - hh : '%d orë', - d : 'një ditë', - dd : '%d ditë', - M : 'një muaj', - MM : '%d muaj', - y : 'një vit', - yy : '%d vite' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) { + return function (source) { + return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector)); + }; +} +var GroupByOperator = /*@__PURE__*/ (function () { + function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) { + this.keySelector = keySelector; + this.elementSelector = elementSelector; + this.durationSelector = durationSelector; + this.subjectSelector = subjectSelector; + } + GroupByOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector)); + }; + return GroupByOperator; +}()); +var GroupBySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupBySubscriber, _super); + function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) { + var _this = _super.call(this, destination) || this; + _this.keySelector = keySelector; + _this.elementSelector = elementSelector; + _this.durationSelector = durationSelector; + _this.subjectSelector = subjectSelector; + _this.groups = null; + _this.attemptedToUnsubscribe = false; + _this.count = 0; + return _this; + } + GroupBySubscriber.prototype._next = function (value) { + var key; + try { + key = this.keySelector(value); } - }); - - return sq; + catch (err) { + this.error(err); + return; + } + this._group(value, key); + }; + GroupBySubscriber.prototype._group = function (value, key) { + var groups = this.groups; + if (!groups) { + groups = this.groups = new Map(); + } + var group = groups.get(key); + var element; + if (this.elementSelector) { + try { + element = this.elementSelector(value); + } + catch (err) { + this.error(err); + } + } + else { + element = value; + } + if (!group) { + group = (this.subjectSelector ? this.subjectSelector() : new _Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]()); + groups.set(key, group); + var groupedObservable = new GroupedObservable(key, group, this); + this.destination.next(groupedObservable); + if (this.durationSelector) { + var duration = void 0; + try { + duration = this.durationSelector(new GroupedObservable(key, group)); + } + catch (err) { + this.error(err); + return; + } + this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this))); + } + } + if (!group.closed) { + group.next(element); + } + }; + GroupBySubscriber.prototype._error = function (err) { + var groups = this.groups; + if (groups) { + groups.forEach(function (group, key) { + group.error(err); + }); + groups.clear(); + } + this.destination.error(err); + }; + GroupBySubscriber.prototype._complete = function () { + var groups = this.groups; + if (groups) { + groups.forEach(function (group, key) { + group.complete(); + }); + groups.clear(); + } + this.destination.complete(); + }; + GroupBySubscriber.prototype.removeGroup = function (key) { + this.groups.delete(key); + }; + GroupBySubscriber.prototype.unsubscribe = function () { + if (!this.closed) { + this.attemptedToUnsubscribe = true; + if (this.count === 0) { + _super.prototype.unsubscribe.call(this); + } + } + }; + return GroupBySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var GroupDurationSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupDurationSubscriber, _super); + function GroupDurationSubscriber(key, group, parent) { + var _this = _super.call(this, group) || this; + _this.key = key; + _this.group = group; + _this.parent = parent; + return _this; + } + GroupDurationSubscriber.prototype._next = function (value) { + this.complete(); + }; + GroupDurationSubscriber.prototype._unsubscribe = function () { + var _a = this, parent = _a.parent, key = _a.key; + this.key = this.parent = null; + if (parent) { + parent.removeGroup(key); + } + }; + return GroupDurationSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var GroupedObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupedObservable, _super); + function GroupedObservable(key, groupSubject, refCountSubscription) { + var _this = _super.call(this) || this; + _this.key = key; + _this.groupSubject = groupSubject; + _this.refCountSubscription = refCountSubscription; + return _this; + } + GroupedObservable.prototype._subscribe = function (subscriber) { + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); + var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject; + if (refCountSubscription && !refCountSubscription.closed) { + subscription.add(new InnerRefCountSubscription(refCountSubscription)); + } + subscription.add(groupSubject.subscribe(subscriber)); + return subscription; + }; + return GroupedObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"])); -}))); +var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerRefCountSubscription, _super); + function InnerRefCountSubscription(parent) { + var _this = _super.call(this) || this; + _this.parent = parent; + parent.count++; + return _this; + } + InnerRefCountSubscription.prototype.unsubscribe = function () { + var parent = this.parent; + if (!parent.closed && !this.closed) { + _super.prototype.unsubscribe.call(this); + parent.count -= 1; + if (parent.count === 0 && parent.attemptedToUnsubscribe) { + parent.unsubscribe(); + } + } + }; + return InnerRefCountSubscription; +}(_Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"])); +//# sourceMappingURL=groupBy.js.map /***/ }), -/* 142 */ -/***/ (function(module, exports, __webpack_require__) { +/* 163 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return BehaviorSubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(159); +/** PURE_IMPORTS_START tslib,_Subject,_util_ObjectUnsubscribedError PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var translator = { - words: { //Different grammatical cases - ss: ['sekunda', 'sekunde', 'sekundi'], - m: ['jedan minut', 'jedne minute'], - mm: ['minut', 'minute', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mesec', 'meseca', 'meseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); +var BehaviorSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BehaviorSubject, _super); + function BehaviorSubject(_value) { + var _this = _super.call(this) || this; + _this._value = _value; + return _this; + } + Object.defineProperty(BehaviorSubject.prototype, "value", { + get: function () { + return this.getValue(); }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } + enumerable: true, + configurable: true + }); + BehaviorSubject.prototype._subscribe = function (subscriber) { + var subscription = _super.prototype._subscribe.call(this, subscriber); + if (subscription && !subscription.closed) { + subscriber.next(this._value); } + return subscription; }; - - var sr = moment.defineLocale('sr', { - months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), - weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'), - weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sutra u] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedelju] [u] LT'; - case 3: - return '[u] [sredu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juče u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[prošle] [nedelje] [u] LT', - '[prošlog] [ponedeljka] [u] LT', - '[prošlog] [utorka] [u] LT', - '[prošle] [srede] [u] LT', - '[prošlog] [četvrtka] [u] LT', - '[prošlog] [petka] [u] LT', - '[prošle] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pre %s', - s : 'nekoliko sekundi', - ss : translator.translate, - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + BehaviorSubject.prototype.getValue = function () { + if (this.hasError) { + throw this.thrownError; } - }); - - return sr; + else if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__["ObjectUnsubscribedError"](); + } + else { + return this._value; + } + }; + BehaviorSubject.prototype.next = function (value) { + _super.prototype.next.call(this, this._value = value); + }; + return BehaviorSubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -}))); +//# sourceMappingURL=BehaviorSubject.js.map /***/ }), -/* 143 */ -/***/ (function(module, exports, __webpack_require__) { +/* 164 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return ReplaySubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(165); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(148); +/* harmony import */ var _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(172); +/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(159); +/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(160); +/** PURE_IMPORTS_START tslib,_Subject,_scheduler_queue,_Subscription,_operators_observeOn,_util_ObjectUnsubscribedError,_SubjectSubscription PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var translator = { - words: { //Different grammatical cases - ss: ['секунда', 'секунде', 'секунди'], - m: ['један минут', 'једне минуте'], - mm: ['минут', 'минуте', 'минута'], - h: ['један сат', 'једног сата'], - hh: ['сат', 'сата', 'сати'], - dd: ['дан', 'дана', 'дана'], - MM: ['месец', 'месеца', 'месеци'], - yy: ['година', 'године', 'година'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } + + + + +var ReplaySubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ReplaySubject, _super); + function ReplaySubject(bufferSize, windowTime, scheduler) { + if (bufferSize === void 0) { + bufferSize = Number.POSITIVE_INFINITY; + } + if (windowTime === void 0) { + windowTime = Number.POSITIVE_INFINITY; + } + var _this = _super.call(this) || this; + _this.scheduler = scheduler; + _this._events = []; + _this._infiniteTimeWindow = false; + _this._bufferSize = bufferSize < 1 ? 1 : bufferSize; + _this._windowTime = windowTime < 1 ? 1 : windowTime; + if (windowTime === Number.POSITIVE_INFINITY) { + _this._infiniteTimeWindow = true; + _this.next = _this.nextInfiniteTimeWindow; + } + else { + _this.next = _this.nextTimeWindow; + } + return _this; + } + ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) { + var _events = this._events; + _events.push(value); + if (_events.length > this._bufferSize) { + _events.shift(); } + _super.prototype.next.call(this, value); }; - - var srCyrl = moment.defineLocale('sr-cyrl', { - months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), - monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), - monthsParseExact: true, - weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), - weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), - weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[данас у] LT', - nextDay: '[сутра у] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[у] [недељу] [у] LT'; - case 3: - return '[у] [среду] [у] LT'; - case 6: - return '[у] [суботу] [у] LT'; - case 1: - case 2: - case 4: - case 5: - return '[у] dddd [у] LT'; - } - }, - lastDay : '[јуче у] LT', - lastWeek : function () { - var lastWeekDays = [ - '[прошле] [недеље] [у] LT', - '[прошлог] [понедељка] [у] LT', - '[прошлог] [уторка] [у] LT', - '[прошле] [среде] [у] LT', - '[прошлог] [четвртка] [у] LT', - '[прошлог] [петка] [у] LT', - '[прошле] [суботе] [у] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'за %s', - past : 'пре %s', - s : 'неколико секунди', - ss : translator.translate, - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'дан', - dd : translator.translate, - M : 'месец', - MM : translator.translate, - y : 'годину', - yy : translator.translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + ReplaySubject.prototype.nextTimeWindow = function (value) { + this._events.push(new ReplayEvent(this._getNow(), value)); + this._trimBufferThenGetEvents(); + _super.prototype.next.call(this, value); + }; + ReplaySubject.prototype._subscribe = function (subscriber) { + var _infiniteTimeWindow = this._infiniteTimeWindow; + var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents(); + var scheduler = this.scheduler; + var len = _events.length; + var subscription; + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__["ObjectUnsubscribedError"](); } - }); - - return srCyrl; + else if (this.isStopped || this.hasError) { + subscription = _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + else { + this.observers.push(subscriber); + subscription = new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__["SubjectSubscription"](this, subscriber); + } + if (scheduler) { + subscriber.add(subscriber = new _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__["ObserveOnSubscriber"](subscriber, scheduler)); + } + if (_infiniteTimeWindow) { + for (var i = 0; i < len && !subscriber.closed; i++) { + subscriber.next(_events[i]); + } + } + else { + for (var i = 0; i < len && !subscriber.closed; i++) { + subscriber.next(_events[i].value); + } + } + if (this.hasError) { + subscriber.error(this.thrownError); + } + else if (this.isStopped) { + subscriber.complete(); + } + return subscription; + }; + ReplaySubject.prototype._getNow = function () { + return (this.scheduler || _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__["queue"]).now(); + }; + ReplaySubject.prototype._trimBufferThenGetEvents = function () { + var now = this._getNow(); + var _bufferSize = this._bufferSize; + var _windowTime = this._windowTime; + var _events = this._events; + var eventsCount = _events.length; + var spliceCount = 0; + while (spliceCount < eventsCount) { + if ((now - _events[spliceCount].time) < _windowTime) { + break; + } + spliceCount++; + } + if (eventsCount > _bufferSize) { + spliceCount = Math.max(spliceCount, eventsCount - _bufferSize); + } + if (spliceCount > 0) { + _events.splice(0, spliceCount); + } + return _events; + }; + return ReplaySubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -}))); +var ReplayEvent = /*@__PURE__*/ (function () { + function ReplayEvent(time, value) { + this.time = time; + this.value = value; + } + return ReplayEvent; +}()); +//# sourceMappingURL=ReplaySubject.js.map /***/ }), -/* 144 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - +/* 165 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var ss = moment.defineLocale('ss', { - months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), - monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), - weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), - weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), - weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Namuhla nga] LT', - nextDay : '[Kusasa nga] LT', - nextWeek : 'dddd [nga] LT', - lastDay : '[Itolo nga] LT', - lastWeek : 'dddd [leliphelile] [nga] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'nga %s', - past : 'wenteka nga %s', - s : 'emizuzwana lomcane', - ss : '%d mzuzwana', - m : 'umzuzu', - mm : '%d emizuzu', - h : 'lihora', - hh : '%d emahora', - d : 'lilanga', - dd : '%d emalanga', - M : 'inyanga', - MM : '%d tinyanga', - y : 'umnyaka', - yy : '%d iminyaka' - }, - meridiemParse: /ekuseni|emini|entsambama|ebusuku/, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'ekuseni'; - } else if (hours < 15) { - return 'emini'; - } else if (hours < 19) { - return 'entsambama'; - } else { - return 'ebusuku'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ekuseni') { - return hour; - } else if (meridiem === 'emini') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { - if (hour === 0) { - return 0; - } - return hour + 12; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}/, - ordinal : '%d', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queue", function() { return queue; }); +/* harmony import */ var _QueueAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(166); +/* harmony import */ var _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(169); +/** PURE_IMPORTS_START _QueueAction,_QueueScheduler PURE_IMPORTS_END */ - return ss; -}))); +var queue = /*@__PURE__*/ new _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__["QueueScheduler"](_QueueAction__WEBPACK_IMPORTED_MODULE_0__["QueueAction"]); +//# sourceMappingURL=queue.js.map /***/ }), -/* 145 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 166 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueAction", function() { return QueueAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(167); +/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ - var sv = moment.defineLocale('sv', { - months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), - weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), - weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [kl.] HH:mm', - LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd D MMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Idag] LT', - nextDay: '[Imorgon] LT', - lastDay: '[Igår] LT', - nextWeek: '[På] dddd LT', - lastWeek: '[I] dddd[s] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'för %s sedan', - s : 'några sekunder', - ss : '%d sekunder', - m : 'en minut', - mm : '%d minuter', - h : 'en timme', - hh : '%d timmar', - d : 'en dag', - dd : '%d dagar', - M : 'en månad', - MM : '%d månader', - y : 'ett år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}(e|a)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'e' : - (b === 1) ? 'a' : - (b === 2) ? 'a' : - (b === 3) ? 'e' : 'e'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +var QueueAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueAction, _super); + function QueueAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + return _this; + } + QueueAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; } - }); - - return sv; + if (delay > 0) { + return _super.prototype.schedule.call(this, state, delay); + } + this.delay = delay; + this.state = state; + this.scheduler.flush(this); + return this; + }; + QueueAction.prototype.execute = function (state, delay) { + return (delay > 0 || this.closed) ? + _super.prototype.execute.call(this, state, delay) : + this._execute(state, delay); + }; + QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + } + return scheduler.flush(this); + }; + return QueueAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); -}))); +//# sourceMappingURL=QueueAction.js.map /***/ }), -/* 146 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 167 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncAction", function() { return AsyncAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(168); +/** PURE_IMPORTS_START tslib,_Action PURE_IMPORTS_END */ - var sw = moment.defineLocale('sw', { - months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), - weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), - weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[leo saa] LT', - nextDay : '[kesho saa] LT', - nextWeek : '[wiki ijayo] dddd [saat] LT', - lastDay : '[jana] LT', - lastWeek : '[wiki iliyopita] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s baadaye', - past : 'tokea %s', - s : 'hivi punde', - ss : 'sekunde %d', - m : 'dakika moja', - mm : 'dakika %d', - h : 'saa limoja', - hh : 'masaa %d', - d : 'siku moja', - dd : 'masiku %d', - M : 'mwezi mmoja', - MM : 'miezi %d', - y : 'mwaka mmoja', - yy : 'miaka %d' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. +var AsyncAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncAction, _super); + function AsyncAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + _this.pending = false; + return _this; + } + AsyncAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; } - }); - - return sw; + if (this.closed) { + return this; + } + this.state = state; + var id = this.id; + var scheduler = this.scheduler; + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, delay); + } + this.pending = true; + this.delay = delay; + this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); + return this; + }; + AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + return setInterval(scheduler.flush.bind(scheduler, this), delay); + }; + AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if (delay !== null && this.delay === delay && this.pending === false) { + return id; + } + clearInterval(id); + return undefined; + }; + AsyncAction.prototype.execute = function (state, delay) { + if (this.closed) { + return new Error('executing a cancelled action'); + } + this.pending = false; + var error = this._execute(state, delay); + if (error) { + return error; + } + else if (this.pending === false && this.id != null) { + this.id = this.recycleAsyncId(this.scheduler, this.id, null); + } + }; + AsyncAction.prototype._execute = function (state, delay) { + var errored = false; + var errorValue = undefined; + try { + this.work(state); + } + catch (e) { + errored = true; + errorValue = !!e && e || new Error(e); + } + if (errored) { + this.unsubscribe(); + return errorValue; + } + }; + AsyncAction.prototype._unsubscribe = function () { + var id = this.id; + var scheduler = this.scheduler; + var actions = scheduler.actions; + var index = actions.indexOf(this); + this.work = null; + this.state = null; + this.pending = false; + this.scheduler = null; + if (index !== -1) { + actions.splice(index, 1); + } + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, null); + } + this.delay = null; + }; + return AsyncAction; +}(_Action__WEBPACK_IMPORTED_MODULE_1__["Action"])); -}))); +//# sourceMappingURL=AsyncAction.js.map /***/ }), -/* 147 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 168 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Action", function() { return Action; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ - var symbolMap = { - '1': '௧', - '2': '௨', - '3': '௩', - '4': '௪', - '5': '௫', - '6': '௬', - '7': '௭', - '8': '௮', - '9': '௯', - '0': '௦' - }, numberMap = { - '௧': '1', - '௨': '2', - '௩': '3', - '௪': '4', - '௫': '5', - '௬': '6', - '௭': '7', - '௮': '8', - '௯': '9', - '௦': '0' +var Action = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Action, _super); + function Action(scheduler, work) { + return _super.call(this) || this; + } + Action.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; + } + return this; }; + return Action; +}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); - var ta = moment.defineLocale('ta', { - months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), - monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), - weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), - weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'), - weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, HH:mm', - LLLL : 'dddd, D MMMM YYYY, HH:mm' - }, - calendar : { - sameDay : '[இன்று] LT', - nextDay : '[நாளை] LT', - nextWeek : 'dddd, LT', - lastDay : '[நேற்று] LT', - lastWeek : '[கடந்த வாரம்] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s இல்', - past : '%s முன்', - s : 'ஒரு சில விநாடிகள்', - ss : '%d விநாடிகள்', - m : 'ஒரு நிமிடம்', - mm : '%d நிமிடங்கள்', - h : 'ஒரு மணி நேரம்', - hh : '%d மணி நேரம்', - d : 'ஒரு நாள்', - dd : '%d நாட்கள்', - M : 'ஒரு மாதம்', - MM : '%d மாதங்கள்', - y : 'ஒரு வருடம்', - yy : '%d ஆண்டுகள்' - }, - dayOfMonthOrdinalParse: /\d{1,2}வது/, - ordinal : function (number) { - return number + 'வது'; - }, - preparse: function (string) { - return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // refer http://ta.wikipedia.org/s/1er1 - meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, - meridiem : function (hour, minute, isLower) { - if (hour < 2) { - return ' யாமம்'; - } else if (hour < 6) { - return ' வைகறை'; // வைகறை - } else if (hour < 10) { - return ' காலை'; // காலை - } else if (hour < 14) { - return ' நண்பகல்'; // நண்பகல் - } else if (hour < 18) { - return ' எற்பாடு'; // எற்பாடு - } else if (hour < 22) { - return ' மாலை'; // மாலை - } else { - return ' யாமம்'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'யாமம்') { - return hour < 2 ? hour : hour + 12; - } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { - return hour; - } else if (meridiem === 'நண்பகல்') { - return hour >= 10 ? hour : hour + 12; - } else { - return hour + 12; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. - } - }); +//# sourceMappingURL=Action.js.map - return ta; -}))); +/***/ }), +/* 169 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueScheduler", function() { return QueueScheduler; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ -/***/ }), -/* 148 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration +var QueueScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueScheduler, _super); + function QueueScheduler() { + return _super !== null && _super.apply(this, arguments) || this; + } + return QueueScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +//# sourceMappingURL=QueueScheduler.js.map - var te = moment.defineLocale('te', { - months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), - monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), - monthsParseExact : true, - weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'), - weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'), - weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' - }, - calendar : { - sameDay : '[నేడు] LT', - nextDay : '[రేపు] LT', - nextWeek : 'dddd, LT', - lastDay : '[నిన్న] LT', - lastWeek : '[గత] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s లో', - past : '%s క్రితం', - s : 'కొన్ని క్షణాలు', - ss : '%d సెకన్లు', - m : 'ఒక నిమిషం', - mm : '%d నిమిషాలు', - h : 'ఒక గంట', - hh : '%d గంటలు', - d : 'ఒక రోజు', - dd : '%d రోజులు', - M : 'ఒక నెల', - MM : '%d నెలలు', - y : 'ఒక సంవత్సరం', - yy : '%d సంవత్సరాలు' - }, - dayOfMonthOrdinalParse : /\d{1,2}వ/, - ordinal : '%dవ', - meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; +/***/ }), +/* 170 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncScheduler", function() { return AsyncScheduler; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Scheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); +/** PURE_IMPORTS_START tslib,_Scheduler PURE_IMPORTS_END */ + + +var AsyncScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncScheduler, _super); + function AsyncScheduler(SchedulerAction, now) { + if (now === void 0) { + now = _Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"].now; + } + var _this = _super.call(this, SchedulerAction, function () { + if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) { + return AsyncScheduler.delegate.now(); } - if (meridiem === 'రాత్రి') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ఉదయం') { - return hour; - } else if (meridiem === 'మధ్యాహ్నం') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'సాయంత్రం') { - return hour + 12; + else { + return now(); } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'రాత్రి'; - } else if (hour < 10) { - return 'ఉదయం'; - } else if (hour < 17) { - return 'మధ్యాహ్నం'; - } else if (hour < 20) { - return 'సాయంత్రం'; - } else { - return 'రాత్రి'; + }) || this; + _this.actions = []; + _this.active = false; + _this.scheduled = undefined; + return _this; + } + AsyncScheduler.prototype.schedule = function (work, delay, state) { + if (delay === void 0) { + delay = 0; + } + if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) { + return AsyncScheduler.delegate.schedule(work, delay, state); + } + else { + return _super.prototype.schedule.call(this, work, delay, state); + } + }; + AsyncScheduler.prototype.flush = function (action) { + var actions = this.actions; + if (this.active) { + actions.push(action); + return; + } + var error; + this.active = true; + do { + if (error = action.execute(action.state, action.delay)) { + break; } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + } while (action = actions.shift()); + this.active = false; + if (error) { + while (action = actions.shift()) { + action.unsubscribe(); + } + throw error; } - }); + }; + return AsyncScheduler; +}(_Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"])); - return te; +//# sourceMappingURL=AsyncScheduler.js.map -}))); + +/***/ }), +/* 171 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return Scheduler; }); +var Scheduler = /*@__PURE__*/ (function () { + function Scheduler(SchedulerAction, now) { + if (now === void 0) { + now = Scheduler.now; + } + this.SchedulerAction = SchedulerAction; + this.now = now; + } + Scheduler.prototype.schedule = function (work, delay, state) { + if (delay === void 0) { + delay = 0; + } + return new this.SchedulerAction(this, work).schedule(state, delay); + }; + Scheduler.now = function () { return Date.now(); }; + return Scheduler; +}()); + +//# sourceMappingURL=Scheduler.js.map /***/ }), -/* 149 */ -/***/ (function(module, exports, __webpack_require__) { +/* 172 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return observeOn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnOperator", function() { return ObserveOnOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnSubscriber", function() { return ObserveOnSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnMessage", function() { return ObserveOnMessage; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); +/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var tet = moment.defineLocale('tet', { - months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'), - weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'), - weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Ohin iha] LT', - nextDay: '[Aban iha] LT', - nextWeek: 'dddd [iha] LT', - lastDay: '[Horiseik iha] LT', - lastWeek: 'dddd [semana kotuk] [iha] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'iha %s', - past : '%s liuba', - s : 'minutu balun', - ss : 'minutu %d', - m : 'minutu ida', - mm : 'minutu %d', - h : 'oras ida', - hh : 'oras %d', - d : 'loron ida', - dd : 'loron %d', - M : 'fulan ida', - MM : 'fulan %d', - y : 'tinan ida', - yy : 'tinan %d' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +function observeOn(scheduler, delay) { + if (delay === void 0) { + delay = 0; + } + return function observeOnOperatorFunction(source) { + return source.lift(new ObserveOnOperator(scheduler, delay)); + }; +} +var ObserveOnOperator = /*@__PURE__*/ (function () { + function ObserveOnOperator(scheduler, delay) { + if (delay === void 0) { + delay = 0; } - }); + this.scheduler = scheduler; + this.delay = delay; + } + ObserveOnOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); + }; + return ObserveOnOperator; +}()); - return tet; +var ObserveOnSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ObserveOnSubscriber, _super); + function ObserveOnSubscriber(destination, scheduler, delay) { + if (delay === void 0) { + delay = 0; + } + var _this = _super.call(this, destination) || this; + _this.scheduler = scheduler; + _this.delay = delay; + return _this; + } + ObserveOnSubscriber.dispatch = function (arg) { + var notification = arg.notification, destination = arg.destination; + notification.observe(destination); + this.unsubscribe(); + }; + ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { + var destination = this.destination; + destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination))); + }; + ObserveOnSubscriber.prototype._next = function (value) { + this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); + }; + ObserveOnSubscriber.prototype._error = function (err) { + this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); + this.unsubscribe(); + }; + ObserveOnSubscriber.prototype._complete = function () { + this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); + this.unsubscribe(); + }; + return ObserveOnSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -}))); +var ObserveOnMessage = /*@__PURE__*/ (function () { + function ObserveOnMessage(notification, destination) { + this.notification = notification; + this.destination = destination; + } + return ObserveOnMessage; +}()); + +//# sourceMappingURL=observeOn.js.map /***/ }), -/* 150 */ -/***/ (function(module, exports, __webpack_require__) { +/* 173 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return NotificationKind; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return Notification; }); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(174); +/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(175); +/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(180); +/** PURE_IMPORTS_START _observable_empty,_observable_of,_observable_throwError PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var suffixes = { - 0: '-ум', - 1: '-ум', - 2: '-юм', - 3: '-юм', - 4: '-ум', - 5: '-ум', - 6: '-ум', - 7: '-ум', - 8: '-ум', - 9: '-ум', - 10: '-ум', - 12: '-ум', - 13: '-ум', - 20: '-ум', - 30: '-юм', - 40: '-ум', - 50: '-ум', - 60: '-ум', - 70: '-ум', - 80: '-ум', - 90: '-ум', - 100: '-ум' +var NotificationKind; +/*@__PURE__*/ (function (NotificationKind) { + NotificationKind["NEXT"] = "N"; + NotificationKind["ERROR"] = "E"; + NotificationKind["COMPLETE"] = "C"; +})(NotificationKind || (NotificationKind = {})); +var Notification = /*@__PURE__*/ (function () { + function Notification(kind, value, error) { + this.kind = kind; + this.value = value; + this.error = error; + this.hasValue = kind === 'N'; + } + Notification.prototype.observe = function (observer) { + switch (this.kind) { + case 'N': + return observer.next && observer.next(this.value); + case 'E': + return observer.error && observer.error(this.error); + case 'C': + return observer.complete && observer.complete(); + } }; - - var tg = moment.defineLocale('tg', { - months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), - monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'), - weekdaysShort : 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'), - weekdaysMin : 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Имрӯз соати] LT', - nextDay : '[Пагоҳ соати] LT', - lastDay : '[Дирӯз соати] LT', - nextWeek : 'dddd[и] [ҳафтаи оянда соати] LT', - lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'баъди %s', - past : '%s пеш', - s : 'якчанд сония', - m : 'як дақиқа', - mm : '%d дақиқа', - h : 'як соат', - hh : '%d соат', - d : 'як рӯз', - dd : '%d рӯз', - M : 'як моҳ', - MM : '%d моҳ', - y : 'як сол', - yy : '%d сол' - }, - meridiemParse: /шаб|субҳ|рӯз|бегоҳ/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'шаб') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'субҳ') { - return hour; - } else if (meridiem === 'рӯз') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'бегоҳ') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'шаб'; - } else if (hour < 11) { - return 'субҳ'; - } else if (hour < 16) { - return 'рӯз'; - } else if (hour < 19) { - return 'бегоҳ'; - } else { - return 'шаб'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/, - ordinal: function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes[number] || suffixes[a] || suffixes[b]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1th is the first week of the year. + Notification.prototype.do = function (next, error, complete) { + var kind = this.kind; + switch (kind) { + case 'N': + return next && next(this.value); + case 'E': + return error && error(this.error); + case 'C': + return complete && complete(); } - }); + }; + Notification.prototype.accept = function (nextOrObserver, error, complete) { + if (nextOrObserver && typeof nextOrObserver.next === 'function') { + return this.observe(nextOrObserver); + } + else { + return this.do(nextOrObserver, error, complete); + } + }; + Notification.prototype.toObservable = function () { + var kind = this.kind; + switch (kind) { + case 'N': + return Object(_observable_of__WEBPACK_IMPORTED_MODULE_1__["of"])(this.value); + case 'E': + return Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_2__["throwError"])(this.error); + case 'C': + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_0__["empty"])(); + } + throw new Error('unexpected notification kind value'); + }; + Notification.createNext = function (value) { + if (typeof value !== 'undefined') { + return new Notification('N', value); + } + return Notification.undefinedValueNotification; + }; + Notification.createError = function (err) { + return new Notification('E', undefined, err); + }; + Notification.createComplete = function () { + return Notification.completeNotification; + }; + Notification.completeNotification = new Notification('C'); + Notification.undefinedValueNotification = new Notification('N', undefined); + return Notification; +}()); - return tg; +//# sourceMappingURL=Notification.js.map -}))); + +/***/ }), +/* 174 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return EMPTY; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ + +var EMPTY = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.complete(); }); +function empty(scheduler) { + return scheduler ? emptyScheduled(scheduler) : EMPTY; +} +function emptyScheduled(scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); }); +} +//# sourceMappingURL=empty.js.map /***/ }), -/* 151 */ -/***/ (function(module, exports, __webpack_require__) { +/* 175 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "of", function() { return of; }); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(176); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(179); +/** PURE_IMPORTS_START _util_isScheduler,_fromArray,_scheduled_scheduleArray PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var th = moment.defineLocale('th', { - months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), - monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), - monthsParseExact: true, - weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), - weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference - weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY เวลา H:mm', - LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm' - }, - meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, - isPM: function (input) { - return input === 'หลังเที่ยง'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ก่อนเที่ยง'; - } else { - return 'หลังเที่ยง'; - } - }, - calendar : { - sameDay : '[วันนี้ เวลา] LT', - nextDay : '[พรุ่งนี้ เวลา] LT', - nextWeek : 'dddd[หน้า เวลา] LT', - lastDay : '[เมื่อวานนี้ เวลา] LT', - lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'อีก %s', - past : '%sที่แล้ว', - s : 'ไม่กี่วินาที', - ss : '%d วินาที', - m : '1 นาที', - mm : '%d นาที', - h : '1 ชั่วโมง', - hh : '%d ชั่วโมง', - d : '1 วัน', - dd : '%d วัน', - M : '1 เดือน', - MM : '%d เดือน', - y : '1 ปี', - yy : '%d ปี' - } - }); +function of() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var scheduler = args[args.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_0__["isScheduler"])(scheduler)) { + args.pop(); + return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(args, scheduler); + } + else { + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(args); + } +} +//# sourceMappingURL=of.js.map - return th; -}))); +/***/ }), +/* 176 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isScheduler", function() { return isScheduler; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isScheduler(value) { + return value && typeof value.schedule === 'function'; +} +//# sourceMappingURL=isScheduler.js.map /***/ }), -/* 152 */ -/***/ (function(module, exports, __webpack_require__) { +/* 177 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromArray", function() { return fromArray; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); +/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(179); +/** PURE_IMPORTS_START _Observable,_util_subscribeToArray,_scheduled_scheduleArray PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var tlPh = moment.defineLocale('tl-ph', { - months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), - monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), - weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), - weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), - weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'MM/D/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY HH:mm', - LLLL : 'dddd, MMMM DD, YYYY HH:mm' - }, - calendar : { - sameDay: 'LT [ngayong araw]', - nextDay: '[Bukas ng] LT', - nextWeek: 'LT [sa susunod na] dddd', - lastDay: 'LT [kahapon]', - lastWeek: 'LT [noong nakaraang] dddd', - sameElse: 'L' - }, - relativeTime : { - future : 'sa loob ng %s', - past : '%s ang nakalipas', - s : 'ilang segundo', - ss : '%d segundo', - m : 'isang minuto', - mm : '%d minuto', - h : 'isang oras', - hh : '%d oras', - d : 'isang araw', - dd : '%d araw', - M : 'isang buwan', - MM : '%d buwan', - y : 'isang taon', - yy : '%d taon' - }, - dayOfMonthOrdinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +function fromArray(input, scheduler) { + if (!scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__["subscribeToArray"])(input)); + } + else { + return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); + } +} +//# sourceMappingURL=fromArray.js.map - return tlPh; -}))); +/***/ }), +/* 178 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToArray", function() { return subscribeToArray; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var subscribeToArray = function (array) { + return function (subscriber) { + for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) { + subscriber.next(array[i]); + } + subscriber.complete(); + }; +}; +//# sourceMappingURL=subscribeToArray.js.map /***/ }), -/* 153 */ -/***/ (function(module, exports, __webpack_require__) { +/* 179 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleArray", function() { return scheduleArray; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; + +function scheduleArray(input, scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var i = 0; + sub.add(scheduler.schedule(function () { + if (i === input.length) { + subscriber.complete(); + return; + } + subscriber.next(input[i++]); + if (!subscriber.closed) { + sub.add(this.schedule()); + } + })); + return sub; + }); +} +//# sourceMappingURL=scheduleArray.js.map - var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); +/***/ }), +/* 180 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - function translateFuture(output) { - var time = output; - time = (output.indexOf('jaj') !== -1) ? - time.slice(0, -3) + 'leS' : - (output.indexOf('jar') !== -1) ? - time.slice(0, -3) + 'waQ' : - (output.indexOf('DIS') !== -1) ? - time.slice(0, -3) + 'nem' : - time + ' pIq'; - return time; - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return throwError; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ - function translatePast(output) { - var time = output; - time = (output.indexOf('jaj') !== -1) ? - time.slice(0, -3) + 'Hu’' : - (output.indexOf('jar') !== -1) ? - time.slice(0, -3) + 'wen' : - (output.indexOf('DIS') !== -1) ? - time.slice(0, -3) + 'ben' : - time + ' ret'; - return time; +function throwError(error, scheduler) { + if (!scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.error(error); }); } - - function translate(number, withoutSuffix, string, isFuture) { - var numberNoun = numberAsNoun(number); - switch (string) { - case 'ss': - return numberNoun + ' lup'; - case 'mm': - return numberNoun + ' tup'; - case 'hh': - return numberNoun + ' rep'; - case 'dd': - return numberNoun + ' jaj'; - case 'MM': - return numberNoun + ' jar'; - case 'yy': - return numberNoun + ' DIS'; - } + else { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); }); } +} +function dispatch(_a) { + var error = _a.error, subscriber = _a.subscriber; + subscriber.error(error); +} +//# sourceMappingURL=throwError.js.map - function numberAsNoun(number) { - var hundred = Math.floor((number % 1000) / 100), - ten = Math.floor((number % 100) / 10), - one = number % 10, - word = ''; - if (hundred > 0) { - word += numbersNouns[hundred] + 'vatlh'; + +/***/ }), +/* 181 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return AsyncSubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(148); +/** PURE_IMPORTS_START tslib,_Subject,_Subscription PURE_IMPORTS_END */ + + + +var AsyncSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncSubject, _super); + function AsyncSubject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.value = null; + _this.hasNext = false; + _this.hasCompleted = false; + return _this; + } + AsyncSubject.prototype._subscribe = function (subscriber) { + if (this.hasError) { + subscriber.error(this.thrownError); + return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; } - if (ten > 0) { - word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; + else if (this.hasCompleted && this.hasNext) { + subscriber.next(this.value); + subscriber.complete(); + return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; } - if (one > 0) { - word += ((word !== '') ? ' ' : '') + numbersNouns[one]; + return _super.prototype._subscribe.call(this, subscriber); + }; + AsyncSubject.prototype.next = function (value) { + if (!this.hasCompleted) { + this.value = value; + this.hasNext = true; } - return (word === '') ? 'pagh' : word; - } - - var tlh = moment.defineLocale('tlh', { - months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), - monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), - monthsParseExact : true, - weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[DaHjaj] LT', - nextDay: '[wa’leS] LT', - nextWeek: 'LLL', - lastDay: '[wa’Hu’] LT', - lastWeek: 'LLL', - sameElse: 'L' - }, - relativeTime : { - future : translateFuture, - past : translatePast, - s : 'puS lup', - ss : translate, - m : 'wa’ tup', - mm : translate, - h : 'wa’ rep', - hh : translate, - d : 'wa’ jaj', - dd : translate, - M : 'wa’ jar', - MM : translate, - y : 'wa’ DIS', - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + }; + AsyncSubject.prototype.error = function (error) { + if (!this.hasCompleted) { + _super.prototype.error.call(this, error); } - }); - - return tlh; + }; + AsyncSubject.prototype.complete = function () { + this.hasCompleted = true; + if (this.hasNext) { + _super.prototype.next.call(this, this.value); + } + _super.prototype.complete.call(this); + }; + return AsyncSubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -}))); +//# sourceMappingURL=AsyncSubject.js.map /***/ }), -/* 154 */ -/***/ (function(module, exports, __webpack_require__) { +/* 182 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asap", function() { return asap; }); +/* harmony import */ var _AsapAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(183); +/* harmony import */ var _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(185); +/** PURE_IMPORTS_START _AsapAction,_AsapScheduler PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var suffixes = { - 1: '\'inci', - 5: '\'inci', - 8: '\'inci', - 70: '\'inci', - 80: '\'inci', - 2: '\'nci', - 7: '\'nci', - 20: '\'nci', - 50: '\'nci', - 3: '\'üncü', - 4: '\'üncü', - 100: '\'üncü', - 6: '\'ncı', - 9: '\'uncu', - 10: '\'uncu', - 30: '\'uncu', - 60: '\'ıncı', - 90: '\'ıncı' - }; +var asap = /*@__PURE__*/ new _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__["AsapScheduler"](_AsapAction__WEBPACK_IMPORTED_MODULE_0__["AsapAction"]); +//# sourceMappingURL=asap.js.map - var tr = moment.defineLocale('tr', { - months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), - monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), - weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), - weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), - weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[yarın saat] LT', - nextWeek : '[gelecek] dddd [saat] LT', - lastDay : '[dün] LT', - lastWeek : '[geçen] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s önce', - s : 'birkaç saniye', - ss : '%d saniye', - m : 'bir dakika', - mm : '%d dakika', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir yıl', - yy : '%d yıl' - }, - ordinal: function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'Do': - case 'DD': - return number; - default: - if (number === 0) { // special case for zero - return number + '\'ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return tr; +/***/ }), +/* 183 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapAction", function() { return AsapAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_Immediate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(184); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(167); +/** PURE_IMPORTS_START tslib,_util_Immediate,_AsyncAction PURE_IMPORTS_END */ + + + +var AsapAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapAction, _super); + function AsapAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + return _this; + } + AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if (delay !== null && delay > 0) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + } + scheduler.actions.push(this); + return scheduler.scheduled || (scheduler.scheduled = _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].setImmediate(scheduler.flush.bind(scheduler, null))); + }; + AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); + } + if (scheduler.actions.length === 0) { + _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].clearImmediate(id); + scheduler.scheduled = undefined; + } + return undefined; + }; + return AsapAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_2__["AsyncAction"])); + +//# sourceMappingURL=AsapAction.js.map /***/ }), -/* 155 */ -/***/ (function(module, exports, __webpack_require__) { +/* 184 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Immediate", function() { return Immediate; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var nextHandle = 1; +var tasksByHandle = {}; +function runIfPresent(handle) { + var cb = tasksByHandle[handle]; + if (cb) { + cb(); + } +} +var Immediate = { + setImmediate: function (cb) { + var handle = nextHandle++; + tasksByHandle[handle] = cb; + Promise.resolve().then(function () { return runIfPresent(handle); }); + return handle; + }, + clearImmediate: function (handle) { + delete tasksByHandle[handle]; + }, +}; +//# sourceMappingURL=Immediate.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 185 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapScheduler", function() { return AsapScheduler; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ - // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. - // This is currently too difficult (maybe even impossible) to add. - var tzl = moment.defineLocale('tzl', { - months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), - monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), - weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), - weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), - weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM [dallas] YYYY', - LLL : 'D. MMMM [dallas] YYYY HH.mm', - LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' - }, - meridiemParse: /d\'o|d\'a/i, - isPM : function (input) { - return 'd\'o' === input.toLowerCase(); - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'd\'o' : 'D\'O'; - } else { - return isLower ? 'd\'a' : 'D\'A'; + +var AsapScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapScheduler, _super); + function AsapScheduler() { + return _super !== null && _super.apply(this, arguments) || this; + } + AsapScheduler.prototype.flush = function (action) { + this.active = true; + this.scheduled = undefined; + var actions = this.actions; + var error; + var index = -1; + var count = actions.length; + action = action || actions.shift(); + do { + if (error = action.execute(action.state, action.delay)) { + break; } - }, - calendar : { - sameDay : '[oxhi à] LT', - nextDay : '[demà à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[ieiri à] LT', - lastWeek : '[sür el] dddd [lasteu à] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'osprei %s', - past : 'ja%s', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + } while (++index < count && (action = actions.shift())); + this.active = false; + if (error) { + while (++index < count && (action = actions.shift())) { + action.unsubscribe(); + } + throw error; } - }); + }; + return AsapScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's': ['viensas secunds', '\'iensas secunds'], - 'ss': [number + ' secunds', '' + number + ' secunds'], - 'm': ['\'n míut', '\'iens míut'], - 'mm': [number + ' míuts', '' + number + ' míuts'], - 'h': ['\'n þora', '\'iensa þora'], - 'hh': [number + ' þoras', '' + number + ' þoras'], - 'd': ['\'n ziua', '\'iensa ziua'], - 'dd': [number + ' ziuas', '' + number + ' ziuas'], - 'M': ['\'n mes', '\'iens mes'], - 'MM': [number + ' mesen', '' + number + ' mesen'], - 'y': ['\'n ar', '\'iens ar'], - 'yy': [number + ' ars', '' + number + ' ars'] - }; - return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); - } +//# sourceMappingURL=AsapScheduler.js.map - return tzl; -}))); +/***/ }), +/* 186 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "async", function() { return async; }); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(167); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/** PURE_IMPORTS_START _AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ -/***/ }), -/* 156 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration +var async = /*@__PURE__*/ new _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"](_AsyncAction__WEBPACK_IMPORTED_MODULE_0__["AsyncAction"]); +//# sourceMappingURL=async.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 187 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var tzm = moment.defineLocale('tzm', { - months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), - monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), - weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[ⴰⵙⴷⵅ ⴴ] LT', - nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', - nextWeek: 'dddd [ⴴ] LT', - lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', - lastWeek: 'dddd [ⴴ] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s', - past : 'ⵢⴰⵏ %s', - s : 'ⵉⵎⵉⴽ', - ss : '%d ⵉⵎⵉⴽ', - m : 'ⵎⵉⵏⵓⴺ', - mm : '%d ⵎⵉⵏⵓⴺ', - h : 'ⵙⴰⵄⴰ', - hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ', - d : 'ⴰⵙⵙ', - dd : '%d oⵙⵙⴰⵏ', - M : 'ⴰⵢoⵓⵔ', - MM : '%d ⵉⵢⵢⵉⵔⵏ', - y : 'ⴰⵙⴳⴰⵙ', - yy : '%d ⵉⵙⴳⴰⵙⵏ' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. - } - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animationFrame", function() { return animationFrame; }); +/* harmony import */ var _AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(188); +/* harmony import */ var _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(189); +/** PURE_IMPORTS_START _AnimationFrameAction,_AnimationFrameScheduler PURE_IMPORTS_END */ - return tzm; -}))); +var animationFrame = /*@__PURE__*/ new _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__["AnimationFrameScheduler"](_AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__["AnimationFrameAction"]); +//# sourceMappingURL=animationFrame.js.map /***/ }), -/* 157 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 188 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameAction", function() { return AnimationFrameAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(167); +/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ - var tzmLatn = moment.defineLocale('tzm-latn', { - months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[asdkh g] LT', - nextDay: '[aska g] LT', - nextWeek: 'dddd [g] LT', - lastDay: '[assant g] LT', - lastWeek: 'dddd [g] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dadkh s yan %s', - past : 'yan %s', - s : 'imik', - ss : '%d imik', - m : 'minuḍ', - mm : '%d minuḍ', - h : 'saɛa', - hh : '%d tassaɛin', - d : 'ass', - dd : '%d ossan', - M : 'ayowr', - MM : '%d iyyirn', - y : 'asgas', - yy : '%d isgasn' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. +var AnimationFrameAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameAction, _super); + function AnimationFrameAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + return _this; + } + AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; } - }); - - return tzmLatn; + if (delay !== null && delay > 0) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + } + scheduler.actions.push(this); + return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); })); + }; + AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); + } + if (scheduler.actions.length === 0) { + cancelAnimationFrame(id); + scheduler.scheduled = undefined; + } + return undefined; + }; + return AnimationFrameAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); -}))); +//# sourceMappingURL=AnimationFrameAction.js.map /***/ }), -/* 158 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js language configuration +/* 189 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameScheduler", function() { return AnimationFrameScheduler; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ - var ugCn = moment.defineLocale('ug-cn', { - months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( - '_' - ), - monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( - '_' - ), - weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split( - '_' - ), - weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), - weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'YYYY-MM-DD', - LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى', - LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', - LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm' - }, - meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; +var AnimationFrameScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameScheduler, _super); + function AnimationFrameScheduler() { + return _super !== null && _super.apply(this, arguments) || this; + } + AnimationFrameScheduler.prototype.flush = function (action) { + this.active = true; + this.scheduled = undefined; + var actions = this.actions; + var error; + var index = -1; + var count = actions.length; + action = action || actions.shift(); + do { + if (error = action.execute(action.state, action.delay)) { + break; } - if ( - meridiem === 'يېرىم كېچە' || - meridiem === 'سەھەر' || - meridiem === 'چۈشتىن بۇرۇن' - ) { - return hour; - } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') { - return hour + 12; - } else { - return hour >= 11 ? hour : hour + 12; + } while (++index < count && (action = actions.shift())); + this.active = false; + if (error) { + while (++index < count && (action = actions.shift())) { + action.unsubscribe(); } - }, - meridiem: function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return 'يېرىم كېچە'; - } else if (hm < 900) { - return 'سەھەر'; - } else if (hm < 1130) { - return 'چۈشتىن بۇرۇن'; - } else if (hm < 1230) { - return 'چۈش'; - } else if (hm < 1800) { - return 'چۈشتىن كېيىن'; - } else { - return 'كەچ'; - } - }, - calendar: { - sameDay: '[بۈگۈن سائەت] LT', - nextDay: '[ئەتە سائەت] LT', - nextWeek: '[كېلەركى] dddd [سائەت] LT', - lastDay: '[تۆنۈگۈن] LT', - lastWeek: '[ئالدىنقى] dddd [سائەت] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%s كېيىن', - past: '%s بۇرۇن', - s: 'نەچچە سېكونت', - ss: '%d سېكونت', - m: 'بىر مىنۇت', - mm: '%d مىنۇت', - h: 'بىر سائەت', - hh: '%d سائەت', - d: 'بىر كۈن', - dd: '%d كۈن', - M: 'بىر ئاي', - MM: '%d ئاي', - y: 'بىر يىل', - yy: '%d يىل' - }, - - dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/, - ordinal: function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '-كۈنى'; - case 'w': - case 'W': - return number + '-ھەپتە'; - default: - return number; - } - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week: { - // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 - dow: 1, // Monday is the first day of the week. - doy: 7 // The week that contains Jan 1st is the first week of the year. + throw error; } - }); - - return ugCn; + }; + return AnimationFrameScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); -}))); +//# sourceMappingURL=AnimationFrameScheduler.js.map /***/ }), -/* 159 */ -/***/ (function(module, exports, __webpack_require__) { +/* 190 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return VirtualTimeScheduler; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return VirtualAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(167); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); +/** PURE_IMPORTS_START tslib,_AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд', - 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин', - 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин', - 'dd': 'день_дні_днів', - 'MM': 'місяць_місяці_місяців', - 'yy': 'рік_роки_років' - }; - if (key === 'm') { - return withoutSuffix ? 'хвилина' : 'хвилину'; - } - else if (key === 'h') { - return withoutSuffix ? 'година' : 'годину'; +var VirtualTimeScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualTimeScheduler, _super); + function VirtualTimeScheduler(SchedulerAction, maxFrames) { + if (SchedulerAction === void 0) { + SchedulerAction = VirtualAction; } - else { - return number + ' ' + plural(format[key], +number); + if (maxFrames === void 0) { + maxFrames = Number.POSITIVE_INFINITY; } + var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this; + _this.maxFrames = maxFrames; + _this.frame = 0; + _this.index = -1; + return _this; } - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), - 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), - 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') - }; - - if (m === true) { - return weekdays['nominative'].slice(1, 7).concat(weekdays['nominative'].slice(0, 1)); + VirtualTimeScheduler.prototype.flush = function () { + var _a = this, actions = _a.actions, maxFrames = _a.maxFrames; + var error, action; + while ((action = actions[0]) && action.delay <= maxFrames) { + actions.shift(); + this.frame = action.delay; + if (error = action.execute(action.state, action.delay)) { + break; + } } - if (!m) { - return weekdays['nominative']; + if (error) { + while (action = actions.shift()) { + action.unsubscribe(); + } + throw error; } + }; + VirtualTimeScheduler.frameTimeFactor = 10; + return VirtualTimeScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__["AsyncScheduler"])); - var nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? - 'accusative' : - ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? - 'genitive' : - 'nominative'); - return weekdays[nounCase][m.day()]; - } - function processHoursFunction(str) { - return function () { - return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; - }; +var VirtualAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualAction, _super); + function VirtualAction(scheduler, work, index) { + if (index === void 0) { + index = scheduler.index += 1; + } + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + _this.index = index; + _this.active = true; + _this.index = scheduler.index = index; + return _this; } - - var uk = moment.defineLocale('uk', { - months : { - 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), - 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') - }, - monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY р.', - LLL : 'D MMMM YYYY р., HH:mm', - LLLL : 'dddd, D MMMM YYYY р., HH:mm' - }, - calendar : { - sameDay: processHoursFunction('[Сьогодні '), - nextDay: processHoursFunction('[Завтра '), - lastDay: processHoursFunction('[Вчора '), - nextWeek: processHoursFunction('[У] dddd ['), - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return processHoursFunction('[Минулої] dddd [').call(this); - case 1: - case 2: - case 4: - return processHoursFunction('[Минулого] dddd [').call(this); - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'за %s', - past : '%s тому', - s : 'декілька секунд', - ss : relativeTimeWithPlural, - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'годину', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'місяць', - MM : relativeTimeWithPlural, - y : 'рік', - yy : relativeTimeWithPlural - }, - // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason - meridiemParse: /ночі|ранку|дня|вечора/, - isPM: function (input) { - return /^(дня|вечора)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночі'; - } else if (hour < 12) { - return 'ранку'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечора'; + VirtualAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; + } + if (!this.id) { + return _super.prototype.schedule.call(this, state, delay); + } + this.active = false; + var action = new VirtualAction(this.scheduler, this.work); + this.add(action); + return action.schedule(state, delay); + }; + VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + this.delay = scheduler.frame + delay; + var actions = scheduler.actions; + actions.push(this); + actions.sort(VirtualAction.sortActions); + return true; + }; + VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + return undefined; + }; + VirtualAction.prototype._execute = function (state, delay) { + if (this.active === true) { + return _super.prototype._execute.call(this, state, delay); + } + }; + VirtualAction.sortActions = function (a, b) { + if (a.delay === b.delay) { + if (a.index === b.index) { + return 0; } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return number + '-й'; - case 'D': - return number + '-го'; - default: - return number; + else if (a.index > b.index) { + return 1; + } + else { + return -1; } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. } - }); - - return uk; + else if (a.delay > b.delay) { + return 1; + } + else { + return -1; + } + }; + return VirtualAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); -}))); +//# sourceMappingURL=VirtualTimeScheduler.js.map /***/ }), -/* 160 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* 191 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function identity(x) { + return x; +} +//# sourceMappingURL=identity.js.map - var months = [ - 'جنوری', - 'فروری', - 'مارچ', - 'اپریل', - 'مئی', - 'جون', - 'جولائی', - 'اگست', - 'ستمبر', - 'اکتوبر', - 'نومبر', - 'دسمبر' - ]; - var days = [ - 'اتوار', - 'پیر', - 'منگل', - 'بدھ', - 'جمعرات', - 'جمعہ', - 'ہفتہ' - ]; - var ur = moment.defineLocale('ur', { - months : months, - monthsShort : months, - weekdays : days, - weekdaysShort : days, - weekdaysMin : days, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd، D MMMM YYYY HH:mm' - }, - meridiemParse: /صبح|شام/, - isPM : function (input) { - return 'شام' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'صبح'; - } - return 'شام'; - }, - calendar : { - sameDay : '[آج بوقت] LT', - nextDay : '[کل بوقت] LT', - nextWeek : 'dddd [بوقت] LT', - lastDay : '[گذشتہ روز بوقت] LT', - lastWeek : '[گذشتہ] dddd [بوقت] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s بعد', - past : '%s قبل', - s : 'چند سیکنڈ', - ss : '%d سیکنڈ', - m : 'ایک منٹ', - mm : '%d منٹ', - h : 'ایک گھنٹہ', - hh : '%d گھنٹے', - d : 'ایک دن', - dd : '%d دن', - M : 'ایک ماہ', - MM : '%d ماہ', - y : 'ایک سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +/***/ }), +/* 192 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return ur; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return isObservable; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ -}))); +function isObservable(obj) { + return !!obj && (obj instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"] || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function')); +} +//# sourceMappingURL=isObservable.js.map /***/ }), -/* 161 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* 193 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return ArgumentOutOfRangeError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var ArgumentOutOfRangeErrorImpl = /*@__PURE__*/ (function () { + function ArgumentOutOfRangeErrorImpl() { + Error.call(this); + this.message = 'argument out of range'; + this.name = 'ArgumentOutOfRangeError'; + return this; + } + ArgumentOutOfRangeErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return ArgumentOutOfRangeErrorImpl; +})(); +var ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl; +//# sourceMappingURL=ArgumentOutOfRangeError.js.map - var uz = moment.defineLocale('uz', { - months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), - monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), - weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), - weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'D MMMM YYYY, dddd HH:mm' - }, - calendar : { - sameDay : '[Бугун соат] LT [да]', - nextDay : '[Эртага] LT [да]', - nextWeek : 'dddd [куни соат] LT [да]', - lastDay : '[Кеча соат] LT [да]', - lastWeek : '[Утган] dddd [куни соат] LT [да]', - sameElse : 'L' - }, - relativeTime : { - future : 'Якин %s ичида', - past : 'Бир неча %s олдин', - s : 'фурсат', - ss : '%d фурсат', - m : 'бир дакика', - mm : '%d дакика', - h : 'бир соат', - hh : '%d соат', - d : 'бир кун', - dd : '%d кун', - M : 'бир ой', - MM : '%d ой', - y : 'бир йил', - yy : '%d йил' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 4th is the first week of the year. - } - }); - return uz; +/***/ }), +/* 194 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return EmptyError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var EmptyErrorImpl = /*@__PURE__*/ (function () { + function EmptyErrorImpl() { + Error.call(this); + this.message = 'no elements in sequence'; + this.name = 'EmptyError'; + return this; + } + EmptyErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return EmptyErrorImpl; +})(); +var EmptyError = EmptyErrorImpl; +//# sourceMappingURL=EmptyError.js.map /***/ }), -/* 162 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* 195 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return TimeoutError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var TimeoutErrorImpl = /*@__PURE__*/ (function () { + function TimeoutErrorImpl() { + Error.call(this); + this.message = 'Timeout has occurred'; + this.name = 'TimeoutError'; + return this; + } + TimeoutErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return TimeoutErrorImpl; +})(); +var TimeoutError = TimeoutErrorImpl; +//# sourceMappingURL=TimeoutError.js.map - var uzLatn = moment.defineLocale('uz-latn', { - months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'), - monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'), - weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'), - weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'), - weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'D MMMM YYYY, dddd HH:mm' - }, - calendar : { - sameDay : '[Bugun soat] LT [da]', - nextDay : '[Ertaga] LT [da]', - nextWeek : 'dddd [kuni soat] LT [da]', - lastDay : '[Kecha soat] LT [da]', - lastWeek : '[O\'tgan] dddd [kuni soat] LT [da]', - sameElse : 'L' - }, - relativeTime : { - future : 'Yaqin %s ichida', - past : 'Bir necha %s oldin', - s : 'soniya', - ss : '%d soniya', - m : 'bir daqiqa', - mm : '%d daqiqa', - h : 'bir soat', - hh : '%d soat', - d : 'bir kun', - dd : '%d kun', - M : 'bir oy', - MM : '%d oy', - y : 'bir yil', - yy : '%d yil' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return uzLatn; +/***/ }), +/* 196 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return bindCallback; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(181); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(197); +/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(142); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(149); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(176); +/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isArray,_util_isScheduler PURE_IMPORTS_END */ -/***/ }), -/* 163 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var vi = moment.defineLocale('vi', { - months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), - monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), - monthsParseExact : true, - weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), - weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysParseExact : true, - meridiemParse: /sa|ch/i, - isPM : function (input) { - return /^ch$/i.test(input); - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'sa' : 'SA'; - } else { - return isLower ? 'ch' : 'CH'; +function bindCallback(callbackFunc, resultSelector, scheduler) { + if (resultSelector) { + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(resultSelector)) { + scheduler = resultSelector; + } + else { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_4__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); + }; + } + } + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var context = this; + var subject; + var params = { + context: context, + subject: subject, + callbackFunc: callbackFunc, + scheduler: scheduler, + }; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + if (!scheduler) { + if (!subject) { + subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); + subject.complete(); + }; + try { + callbackFunc.apply(context, args.concat([handler])); + } + catch (err) { + if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { + subject.error(err); + } + else { + console.warn(err); + } + } + } + return subject.subscribe(subscriber); } - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [năm] YYYY', - LLL : 'D MMMM [năm] YYYY HH:mm', - LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', - l : 'DD/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd, D MMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Hôm nay lúc] LT', - nextDay: '[Ngày mai lúc] LT', - nextWeek: 'dddd [tuần tới lúc] LT', - lastDay: '[Hôm qua lúc] LT', - lastWeek: 'dddd [tuần rồi lúc] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s tới', - past : '%s trước', - s : 'vài giây', - ss : '%d giây' , - m : 'một phút', - mm : '%d phút', - h : 'một giờ', - hh : '%d giờ', - d : 'một ngày', - dd : '%d ngày', - M : 'một tháng', - MM : '%d tháng', - y : 'một năm', - yy : '%d năm' - }, - dayOfMonthOrdinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + else { + var state = { + args: args, subscriber: subscriber, params: params, + }; + return scheduler.schedule(dispatch, 0, state); + } + }); + }; +} +function dispatch(state) { + var _this = this; + var self = this; + var args = state.args, subscriber = state.subscriber, params = state.params; + var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler; + var subject = params.subject; + if (!subject) { + subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; + _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); + }; + try { + callbackFunc.apply(context, args.concat([handler])); } - }); - - return vi; - -}))); + catch (err) { + subject.error(err); + } + } + this.add(subject.subscribe(subscriber)); +} +function dispatchNext(state) { + var value = state.value, subject = state.subject; + subject.next(value); + subject.complete(); +} +function dispatchError(state) { + var err = state.err, subject = state.subject; + subject.error(err); +} +//# sourceMappingURL=bindCallback.js.map /***/ }), -/* 164 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 197 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MapOperator", function() { return MapOperator; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - var xPseudo = moment.defineLocale('x-pseudo', { - months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), - monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), - monthsParseExact : true, - weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), - weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), - weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[T~ódá~ý át] LT', - nextDay : '[T~ómó~rró~w át] LT', - nextWeek : 'dddd [át] LT', - lastDay : '[Ý~ést~érdá~ý át] LT', - lastWeek : '[L~ást] dddd [át] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'í~ñ %s', - past : '%s á~gó', - s : 'á ~féw ~sécó~ñds', - ss : '%d s~écóñ~ds', - m : 'á ~míñ~úté', - mm : '%d m~íñú~tés', - h : 'á~ñ hó~úr', - hh : '%d h~óúrs', - d : 'á ~dáý', - dd : '%d d~áýs', - M : 'á ~móñ~th', - MM : '%d m~óñt~hs', - y : 'á ~ýéár', - yy : '%d ý~éárs' - }, - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +function map(project, thisArg) { + return function mapOperation(source) { + if (typeof project !== 'function') { + throw new TypeError('argument is not a function. Are you looking for `mapTo()`?'); } - }); - - return xPseudo; + return source.lift(new MapOperator(project, thisArg)); + }; +} +var MapOperator = /*@__PURE__*/ (function () { + function MapOperator(project, thisArg) { + this.project = project; + this.thisArg = thisArg; + } + MapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg)); + }; + return MapOperator; +}()); -}))); +var MapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapSubscriber, _super); + function MapSubscriber(destination, project, thisArg) { + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.count = 0; + _this.thisArg = thisArg || _this; + return _this; + } + MapSubscriber.prototype._next = function (value) { + var result; + try { + result = this.project.call(this.thisArg, value, this.count++); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + return MapSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=map.js.map /***/ }), -/* 165 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var yo = moment.defineLocale('yo', { - months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), - monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), - weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), - weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), - weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Ònì ni] LT', - nextDay : '[Ọ̀la ni] LT', - nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', - lastDay : '[Àna ni] LT', - lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ní %s', - past : '%s kọjá', - s : 'ìsẹjú aayá die', - ss :'aayá %d', - m : 'ìsẹjú kan', - mm : 'ìsẹjú %d', - h : 'wákati kan', - hh : 'wákati %d', - d : 'ọjọ́ kan', - dd : 'ọjọ́ %d', - M : 'osù kan', - MM : 'osù %d', - y : 'ọdún kan', - yy : 'ọdún %d' - }, - dayOfMonthOrdinalParse : /ọjọ́\s\d{1,2}/, - ordinal : 'ọjọ́ %d', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return yo; +/* 198 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return bindNodeCallback; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(181); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(197); +/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(142); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(176); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(149); +/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isScheduler,_util_isArray PURE_IMPORTS_END */ -/***/ }), -/* 166 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var zhCn = moment.defineLocale('zh-cn', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日Ah点mm分', - LLLL : 'YYYY年M月D日ddddAh点mm分', - l : 'YYYY/M/D', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日dddd HH:mm' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; +function bindNodeCallback(callbackFunc, resultSelector, scheduler) { + if (resultSelector) { + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_4__["isScheduler"])(resultSelector)) { + scheduler = resultSelector; + } + else { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_5__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); + }; + } + } + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var params = { + subject: undefined, + args: args, + callbackFunc: callbackFunc, + scheduler: scheduler, + context: this, + }; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var context = params.context; + var subject = params.subject; + if (!scheduler) { + if (!subject) { + subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + var err = innerArgs.shift(); + if (err) { + subject.error(err); + return; + } + subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); + subject.complete(); + }; + try { + callbackFunc.apply(context, args.concat([handler])); + } + catch (err) { + if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { + subject.error(err); + } + else { + console.warn(err); + } + } + } + return subject.subscribe(subscriber); } - if (meridiem === '凌晨' || meridiem === '早上' || - meridiem === '上午') { - return hour; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } else { - // '中午' - return hour >= 11 ? hour : hour + 12; + else { + return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context }); } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; + }); + }; +} +function dispatch(state) { + var _this = this; + var params = state.params, subscriber = state.subscriber, context = state.context; + var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler; + var subject = params.subject; + if (!subject) { + subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '日'; - case 'M': - return number + '月'; - case 'w': - case 'W': - return number + '周'; - default: - return number; + var err = innerArgs.shift(); + if (err) { + _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); } - }, - relativeTime : { - future : '%s内', - past : '%s前', - s : '几秒', - ss : '%d 秒', - m : '1 分钟', - mm : '%d 分钟', - h : '1 小时', - hh : '%d 小时', - d : '1 天', - dd : '%d 天', - M : '1 个月', - MM : '%d 个月', - y : '1 年', - yy : '%d 年' - }, - week : { - // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + else { + var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; + _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); + } + }; + try { + callbackFunc.apply(context, args.concat([handler])); } - }); - - return zhCn; - -}))); + catch (err) { + this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); + } + } + this.add(subject.subscribe(subscriber)); +} +function dispatchNext(arg) { + var value = arg.value, subject = arg.subject; + subject.next(value); + subject.complete(); +} +function dispatchError(arg) { + var err = arg.err, subject = arg.subject; + subject.error(err); +} +//# sourceMappingURL=bindNodeCallback.js.map /***/ }), -/* 167 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var zhHk = moment.defineLocale('zh-hk', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日 HH:mm', - LLLL : 'YYYY年M月D日dddd HH:mm', - l : 'YYYY/M/D', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日dddd HH:mm' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { - return hour; - } else if (meridiem === '中午') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + '日'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; - } - }, - relativeTime : { - future : '%s內', - past : '%s前', - s : '幾秒', - ss : '%d 秒', - m : '1 分鐘', - mm : '%d 分鐘', - h : '1 小時', - hh : '%d 小時', - d : '1 天', - dd : '%d 天', - M : '1 個月', - MM : '%d 個月', - y : '1 年', - yy : '%d 年' - } - }); +/* 199 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return zhHk; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestOperator", function() { return CombineLatestOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestSubscriber", function() { return CombineLatestSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(176); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(149); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(177); +/** PURE_IMPORTS_START tslib,_util_isScheduler,_util_isArray,_OuterSubscriber,_util_subscribeToResult,_fromArray PURE_IMPORTS_END */ -}))); -/***/ }), -/* 168 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +var NONE = {}; +function combineLatest() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + var resultSelector = null; + var scheduler = null; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(observables[observables.length - 1])) { + scheduler = observables.pop(); + } + if (typeof observables[observables.length - 1] === 'function') { + resultSelector = observables.pop(); + } + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(observables[0])) { + observables = observables[0]; + } + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_5__["fromArray"])(observables, scheduler).lift(new CombineLatestOperator(resultSelector)); +} +var CombineLatestOperator = /*@__PURE__*/ (function () { + function CombineLatestOperator(resultSelector) { + this.resultSelector = resultSelector; + } + CombineLatestOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector)); + }; + return CombineLatestOperator; +}()); - var zhTw = moment.defineLocale('zh-tw', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日 HH:mm', - LLLL : 'YYYY年M月D日dddd HH:mm', - l : 'YYYY/M/D', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日dddd HH:mm' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { - return hour; - } else if (meridiem === '中午') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; +var CombineLatestSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CombineLatestSubscriber, _super); + function CombineLatestSubscriber(destination, resultSelector) { + var _this = _super.call(this, destination) || this; + _this.resultSelector = resultSelector; + _this.active = 0; + _this.values = []; + _this.observables = []; + return _this; + } + CombineLatestSubscriber.prototype._next = function (observable) { + this.values.push(NONE); + this.observables.push(observable); + }; + CombineLatestSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { + this.destination.complete(); + } + else { + this.active = len; + this.toRespond = len; + for (var i = 0; i < len; i++) { + var observable = observables[i]; + this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i)); } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; + } + }; + CombineLatestSubscriber.prototype.notifyComplete = function (unused) { + if ((this.active -= 1) === 0) { + this.destination.complete(); + } + }; + CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var values = this.values; + var oldVal = values[outerIndex]; + var toRespond = !this.toRespond + ? 0 + : oldVal === NONE ? --this.toRespond : this.toRespond; + values[outerIndex] = innerValue; + if (toRespond === 0) { + if (this.resultSelector) { + this._tryResultSelector(values); } - }, - calendar : { - sameDay : '[今天] LT', - nextDay : '[明天] LT', - nextWeek : '[下]dddd LT', - lastDay : '[昨天] LT', - lastWeek : '[上]dddd LT', - sameElse : 'L' - }, - dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + '日'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; + else { + this.destination.next(values.slice()); } - }, - relativeTime : { - future : '%s內', - past : '%s前', - s : '幾秒', - ss : '%d 秒', - m : '1 分鐘', - mm : '%d 分鐘', - h : '1 小時', - hh : '%d 小時', - d : '1 天', - dd : '%d 天', - M : '1 個月', - MM : '%d 個月', - y : '1 年', - yy : '%d 年' } - }); - - return zhTw; + }; + CombineLatestSubscriber.prototype._tryResultSelector = function (values) { + var result; + try { + result = this.resultSelector.apply(this, values); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + return CombineLatestSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -}))); +//# sourceMappingURL=combineLatest.js.map /***/ }), -/* 169 */ +/* 200 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return _internal_Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]; }); - -/* harmony import */ var _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__["ConnectableObservable"]; }); - -/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(191); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__["GroupedObservable"]; }); - -/* harmony import */ var _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(183); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__["observable"]; }); - -/* harmony import */ var _internal_Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(187); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return _internal_Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]; }); - -/* harmony import */ var _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(192); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__["BehaviorSubject"]; }); - -/* harmony import */ var _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(193); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__["ReplaySubject"]; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OuterSubscriber", function() { return OuterSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -/* harmony import */ var _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(210); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__["AsyncSubject"]; }); -/* harmony import */ var _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(211); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asapScheduler", function() { return _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__["asap"]; }); +var OuterSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OuterSubscriber, _super); + function OuterSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; + } + OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + OuterSubscriber.prototype.notifyError = function (error, innerSub) { + this.destination.error(error); + }; + OuterSubscriber.prototype.notifyComplete = function (innerSub) { + this.destination.complete(); + }; + return OuterSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -/* harmony import */ var _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(215); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asyncScheduler", function() { return _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__["async"]; }); +//# sourceMappingURL=OuterSubscriber.js.map -/* harmony import */ var _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(194); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "queueScheduler", function() { return _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__["queue"]; }); -/* harmony import */ var _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(216); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "animationFrameScheduler", function() { return _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__["animationFrame"]; }); +/***/ }), +/* 201 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(219); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualTimeScheduler"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToResult", function() { return subscribeToResult; }); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(202); +/* harmony import */ var _subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(141); +/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo,_Observable PURE_IMPORTS_END */ -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualAction"]; }); -/* harmony import */ var _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(200); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__["Scheduler"]; }); -/* harmony import */ var _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(177); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__["Subscription"]; }); +function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { + if (destination === void 0) { + destination = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__["InnerSubscriber"](outerSubscriber, outerValue, outerIndex); + } + if (destination.closed) { + return undefined; + } + if (result instanceof _Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"]) { + return result.subscribe(destination); + } + return Object(_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(result)(destination); +} +//# sourceMappingURL=subscribeToResult.js.map -/* harmony import */ var _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(172); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__["Subscriber"]; }); -/* harmony import */ var _internal_Notification__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(202); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["Notification"]; }); +/***/ }), +/* 202 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["NotificationKind"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InnerSubscriber", function() { return InnerSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -/* harmony import */ var _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(184); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__["pipe"]; }); -/* harmony import */ var _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(185); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__["noop"]; }); +var InnerSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerSubscriber, _super); + function InnerSubscriber(parent, outerValue, outerIndex) { + var _this = _super.call(this) || this; + _this.parent = parent; + _this.outerValue = outerValue; + _this.outerIndex = outerIndex; + _this.index = 0; + return _this; + } + InnerSubscriber.prototype._next = function (value) { + this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this); + }; + InnerSubscriber.prototype._error = function (error) { + this.parent.notifyError(error, this); + this.unsubscribe(); + }; + InnerSubscriber.prototype._complete = function () { + this.parent.notifyComplete(this); + this.unsubscribe(); + }; + return InnerSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -/* harmony import */ var _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(220); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__["identity"]; }); +//# sourceMappingURL=InnerSubscriber.js.map -/* harmony import */ var _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(221); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__["isObservable"]; }); -/* harmony import */ var _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(222); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__["ArgumentOutOfRangeError"]; }); +/***/ }), +/* 203 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(223); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__["EmptyError"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeTo", function() { return subscribeTo; }); +/* harmony import */ var _subscribeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); +/* harmony import */ var _subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(204); +/* harmony import */ var _subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(205); +/* harmony import */ var _subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(207); +/* harmony import */ var _isArrayLike__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(208); +/* harmony import */ var _isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(209); +/* harmony import */ var _isObject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(150); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(206); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(154); +/** PURE_IMPORTS_START _subscribeToArray,_subscribeToPromise,_subscribeToIterable,_subscribeToObservable,_isArrayLike,_isPromise,_isObject,_symbol_iterator,_symbol_observable PURE_IMPORTS_END */ -/* harmony import */ var _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(188); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__["ObjectUnsubscribedError"]; }); -/* harmony import */ var _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(180); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__["UnsubscriptionError"]; }); -/* harmony import */ var _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(224); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__["TimeoutError"]; }); -/* harmony import */ var _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(225); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__["bindCallback"]; }); -/* harmony import */ var _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(227); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__["bindNodeCallback"]; }); -/* harmony import */ var _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(228); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__["combineLatest"]; }); -/* harmony import */ var _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(239); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__["concat"]; }); -/* harmony import */ var _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(250); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__["defer"]; }); -/* harmony import */ var _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(203); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["empty"]; }); - -/* harmony import */ var _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(251); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__["forkJoin"]; }); - -/* harmony import */ var _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(243); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "from", function() { return _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__["from"]; }); - -/* harmony import */ var _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(252); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__["fromEvent"]; }); - -/* harmony import */ var _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(253); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__["fromEventPattern"]; }); - -/* harmony import */ var _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(254); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__["generate"]; }); - -/* harmony import */ var _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(255); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__["iif"]; }); - -/* harmony import */ var _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(256); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__["interval"]; }); - -/* harmony import */ var _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(258); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__["merge"]; }); - -/* harmony import */ var _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(259); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "never", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["never"]; }); - -/* harmony import */ var _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(204); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "of", function() { return _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__["of"]; }); - -/* harmony import */ var _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(260); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__["onErrorResumeNext"]; }); - -/* harmony import */ var _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(261); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__["pairs"]; }); - -/* harmony import */ var _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(262); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__["partition"]; }); +var subscribeTo = function (result) { + if (!!result && typeof result[_symbol_observable__WEBPACK_IMPORTED_MODULE_8__["observable"]] === 'function') { + return Object(_subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__["subscribeToObservable"])(result); + } + else if (Object(_isArrayLike__WEBPACK_IMPORTED_MODULE_4__["isArrayLike"])(result)) { + return Object(_subscribeToArray__WEBPACK_IMPORTED_MODULE_0__["subscribeToArray"])(result); + } + else if (Object(_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(result)) { + return Object(_subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__["subscribeToPromise"])(result); + } + else if (!!result && typeof result[_symbol_iterator__WEBPACK_IMPORTED_MODULE_7__["iterator"]] === 'function') { + return Object(_subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__["subscribeToIterable"])(result); + } + else { + var value = Object(_isObject__WEBPACK_IMPORTED_MODULE_6__["isObject"])(result) ? 'an invalid object' : "'" + result + "'"; + var msg = "You provided " + value + " where a stream was expected." + + ' You can provide an Observable, Promise, Array, or Iterable.'; + throw new TypeError(msg); + } +}; +//# sourceMappingURL=subscribeTo.js.map -/* harmony import */ var _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(265); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__["race"]; }); -/* harmony import */ var _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(266); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__["range"]; }); +/***/ }), +/* 204 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(209); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__["throwError"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToPromise", function() { return subscribeToPromise; }); +/* harmony import */ var _hostReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(147); +/** PURE_IMPORTS_START _hostReportError PURE_IMPORTS_END */ -/* harmony import */ var _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(267); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__["timer"]; }); +var subscribeToPromise = function (promise) { + return function (subscriber) { + promise.then(function (value) { + if (!subscriber.closed) { + subscriber.next(value); + subscriber.complete(); + } + }, function (err) { return subscriber.error(err); }) + .then(null, _hostReportError__WEBPACK_IMPORTED_MODULE_0__["hostReportError"]); + return subscriber; + }; +}; +//# sourceMappingURL=subscribeToPromise.js.map -/* harmony import */ var _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(268); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "using", function() { return _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__["using"]; }); -/* harmony import */ var _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(269); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__["zip"]; }); +/***/ }), +/* 205 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(244); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__["scheduled"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToIterable", function() { return subscribeToIterable; }); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(206); +/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["EMPTY"]; }); +var subscribeToIterable = function (iterable) { + return function (subscriber) { + var iterator = iterable[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]](); + do { + var item = iterator.next(); + if (item.done) { + subscriber.complete(); + break; + } + subscriber.next(item.value); + if (subscriber.closed) { + break; + } + } while (true); + if (typeof iterator.return === 'function') { + subscriber.add(function () { + if (iterator.return) { + iterator.return(); + } + }); + } + return subscriber; + }; +}; +//# sourceMappingURL=subscribeToIterable.js.map -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["NEVER"]; }); -/* harmony import */ var _internal_config__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(175); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "config", function() { return _internal_config__WEBPACK_IMPORTED_MODULE_52__["config"]; }); +/***/ }), +/* 206 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSymbolIterator", function() { return getSymbolIterator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iterator", function() { return iterator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$iterator", function() { return $$iterator; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ +function getSymbolIterator() { + if (typeof Symbol !== 'function' || !Symbol.iterator) { + return '@@iterator'; + } + return Symbol.iterator; +} +var iterator = /*@__PURE__*/ getSymbolIterator(); +var $$iterator = iterator; +//# sourceMappingURL=iterator.js.map +/***/ }), +/* 207 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToObservable", function() { return subscribeToObservable; }); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(154); +/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ +var subscribeToObservable = function (obj) { + return function (subscriber) { + var obs = obj[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]](); + if (typeof obs.subscribe !== 'function') { + throw new TypeError('Provided object does not correctly implement Symbol.observable'); + } + else { + return obs.subscribe(subscriber); + } + }; +}; +//# sourceMappingURL=subscribeToObservable.js.map +/***/ }), +/* 208 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArrayLike", function() { return isArrayLike; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; }); +//# sourceMappingURL=isArrayLike.js.map +/***/ }), +/* 209 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPromise", function() { return isPromise; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isPromise(value) { + return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; +} +//# sourceMappingURL=isPromise.js.map +/***/ }), +/* 210 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony import */ var _of__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(175); +/* harmony import */ var _operators_concatAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(211); +/** PURE_IMPORTS_START _of,_operators_concatAll PURE_IMPORTS_END */ +function concat() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return Object(_operators_concatAll__WEBPACK_IMPORTED_MODULE_1__["concatAll"])()(_of__WEBPACK_IMPORTED_MODULE_0__["of"].apply(void 0, observables)); +} +//# sourceMappingURL=concat.js.map +/***/ }), +/* 211 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return concatAll; }); +/* harmony import */ var _mergeAll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(212); +/** PURE_IMPORTS_START _mergeAll PURE_IMPORTS_END */ +function concatAll() { + return Object(_mergeAll__WEBPACK_IMPORTED_MODULE_0__["mergeAll"])(1); +} +//# sourceMappingURL=concatAll.js.map +/***/ }), +/* 212 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return mergeAll; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(213); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(191); +/** PURE_IMPORTS_START _mergeMap,_util_identity PURE_IMPORTS_END */ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//# sourceMappingURL=index.js.map +function mergeAll(concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"], concurrent); +} +//# sourceMappingURL=mergeAll.js.map /***/ }), -/* 170 */ +/* 213 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return Observable; }); -/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(171); -/* harmony import */ var _util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(182); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); -/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(184); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(175); -/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return mergeMap; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapOperator", function() { return MergeMapOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapSubscriber", function() { return MergeMapSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(201); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(202); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(197); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(214); +/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber,_map,_observable_from PURE_IMPORTS_END */ -var Observable = /*@__PURE__*/ (function () { - function Observable(subscribe) { - this._isScalar = false; - if (subscribe) { - this._subscribe = subscribe; + +function mergeMap(project, resultSelector, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } + if (typeof resultSelector === 'function') { + return function (source) { return source.pipe(mergeMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); }; + } + else if (typeof resultSelector === 'number') { + concurrent = resultSelector; + } + return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); }; +} +var MergeMapOperator = /*@__PURE__*/ (function () { + function MergeMapOperator(project, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } + this.project = project; + this.concurrent = concurrent; } - Observable.prototype.lift = function (operator) { - var observable = new Observable(); - observable.source = this; - observable.operator = operator; - return observable; + MergeMapOperator.prototype.call = function (observer, source) { + return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent)); }; - Observable.prototype.subscribe = function (observerOrNext, error, complete) { - var operator = this.operator; - var sink = Object(_util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__["toSubscriber"])(observerOrNext, error, complete); - if (operator) { - sink.add(operator.call(sink, this.source)); + return MergeMapOperator; +}()); + +var MergeMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeMapSubscriber, _super); + function MergeMapSubscriber(destination, project, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - else { - sink.add(this.source || (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ? - this._subscribe(sink) : - this._trySubscribe(sink)); + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.concurrent = concurrent; + _this.hasCompleted = false; + _this.buffer = []; + _this.active = 0; + _this.index = 0; + return _this; + } + MergeMapSubscriber.prototype._next = function (value) { + if (this.active < this.concurrent) { + this._tryNext(value); } - if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { - if (sink.syncErrorThrowable) { - sink.syncErrorThrowable = false; - if (sink.syncErrorThrown) { - throw sink.syncErrorValue; - } - } + else { + this.buffer.push(value); } - return sink; }; - Observable.prototype._trySubscribe = function (sink) { + MergeMapSubscriber.prototype._tryNext = function (value) { + var result; + var index = this.index++; try { - return this._subscribe(sink); + result = this.project(value, index); } catch (err) { - if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { - sink.syncErrorThrown = true; - sink.syncErrorValue = err; - } - if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_0__["canReportError"])(sink)) { - sink.error(err); - } - else { - console.warn(err); - } + this.destination.error(err); + return; } + this.active++; + this._innerSub(result, value, index); }; - Observable.prototype.forEach = function (next, promiseCtor) { - var _this = this; - promiseCtor = getPromiseCtor(promiseCtor); - return new promiseCtor(function (resolve, reject) { - var subscription; - subscription = _this.subscribe(function (value) { - try { - next(value); - } - catch (err) { - reject(err); - if (subscription) { - subscription.unsubscribe(); - } - } - }, reject, resolve); - }); + MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); }; - Observable.prototype._subscribe = function (subscriber) { - var source = this.source; - return source && source.subscribe(subscriber); + MergeMapSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.active === 0 && this.buffer.length === 0) { + this.destination.complete(); + } + this.unsubscribe(); }; - Observable.prototype[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]] = function () { - return this; + MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); }; - Observable.prototype.pipe = function () { - var operations = []; - for (var _i = 0; _i < arguments.length; _i++) { - operations[_i] = arguments[_i]; + MergeMapSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; + this.remove(innerSub); + this.active--; + if (buffer.length > 0) { + this._next(buffer.shift()); } - if (operations.length === 0) { - return this; + else if (this.active === 0 && this.hasCompleted) { + this.destination.complete(); } - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipeFromArray"])(operations)(this); - }; - Observable.prototype.toPromise = function (promiseCtor) { - var _this = this; - promiseCtor = getPromiseCtor(promiseCtor); - return new promiseCtor(function (resolve, reject) { - var value; - _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); }); - }); - }; - Observable.create = function (subscribe) { - return new Observable(subscribe); }; - return Observable; -}()); + return MergeMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -function getPromiseCtor(promiseCtor) { - if (!promiseCtor) { - promiseCtor = _config__WEBPACK_IMPORTED_MODULE_4__["config"].Promise || Promise; +//# sourceMappingURL=mergeMap.js.map + + +/***/ }), +/* 214 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "from", function() { return from; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); +/* harmony import */ var _scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); +/** PURE_IMPORTS_START _Observable,_util_subscribeTo,_scheduled_scheduled PURE_IMPORTS_END */ + + + +function from(input, scheduler) { + if (!scheduler) { + if (input instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { + return input; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(input)); } - if (!promiseCtor) { - throw new Error('no Promise impl found'); + else { + return Object(_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__["scheduled"])(input, scheduler); } - return promiseCtor; } -//# sourceMappingURL=Observable.js.map +//# sourceMappingURL=from.js.map /***/ }), -/* 171 */ +/* 215 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canReportError", function() { return canReportError; }); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(172); -/** PURE_IMPORTS_START _Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return scheduled; }); +/* harmony import */ var _scheduleObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(216); +/* harmony import */ var _schedulePromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(217); +/* harmony import */ var _scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(179); +/* harmony import */ var _scheduleIterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(218); +/* harmony import */ var _util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(219); +/* harmony import */ var _util_isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(209); +/* harmony import */ var _util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(208); +/* harmony import */ var _util_isIterable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(220); +/** PURE_IMPORTS_START _scheduleObservable,_schedulePromise,_scheduleArray,_scheduleIterable,_util_isInteropObservable,_util_isPromise,_util_isArrayLike,_util_isIterable PURE_IMPORTS_END */ -function canReportError(observer) { - while (observer) { - var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped; - if (closed_1 || isStopped) { - return false; + + + + + + + +function scheduled(input, scheduler) { + if (input != null) { + if (Object(_util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__["isInteropObservable"])(input)) { + return Object(_scheduleObservable__WEBPACK_IMPORTED_MODULE_0__["scheduleObservable"])(input, scheduler); } - else if (destination && destination instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { - observer = destination; + else if (Object(_util_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(input)) { + return Object(_schedulePromise__WEBPACK_IMPORTED_MODULE_1__["schedulePromise"])(input, scheduler); } - else { - observer = null; + else if (Object(_util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__["isArrayLike"])(input)) { + return Object(_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); + } + else if (Object(_util_isIterable__WEBPACK_IMPORTED_MODULE_7__["isIterable"])(input) || typeof input === 'string') { + return Object(_scheduleIterable__WEBPACK_IMPORTED_MODULE_3__["scheduleIterable"])(input, scheduler); } } - return true; + throw new TypeError((input !== null && typeof input || input) + ' is not observable'); } -//# sourceMappingURL=canReportError.js.map +//# sourceMappingURL=scheduled.js.map /***/ }), -/* 172 */ +/* 216 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return Subscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SafeSubscriber", function() { return SafeSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(173); -/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); -/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(181); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(175); -/* harmony import */ var _util_hostReportError__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(176); -/** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleObservable", function() { return scheduleObservable; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(154); +/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_observable PURE_IMPORTS_END */ +function scheduleObservable(input, scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + sub.add(scheduler.schedule(function () { + var observable = input[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]](); + sub.add(observable.subscribe({ + next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); }, + error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); }, + complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); }, + })); + })); + return sub; + }); +} +//# sourceMappingURL=scheduleObservable.js.map +/***/ }), +/* 217 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "schedulePromise", function() { return schedulePromise; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ -var Subscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subscriber, _super); - function Subscriber(destinationOrNext, error, complete) { - var _this = _super.call(this) || this; - _this.syncErrorValue = null; - _this.syncErrorThrown = false; - _this.syncErrorThrowable = false; - _this.isStopped = false; - switch (arguments.length) { - case 0: - _this.destination = _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]; - break; - case 1: - if (!destinationOrNext) { - _this.destination = _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]; - break; - } - if (typeof destinationOrNext === 'object') { - if (destinationOrNext instanceof Subscriber) { - _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable; - _this.destination = destinationOrNext; - destinationOrNext.add(_this); - } - else { - _this.syncErrorThrowable = true; - _this.destination = new SafeSubscriber(_this, destinationOrNext); - } - break; - } - default: - _this.syncErrorThrowable = true; - _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete); - break; - } - return _this; - } - Subscriber.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__["rxSubscriber"]] = function () { return this; }; - Subscriber.create = function (next, error, complete) { - var subscriber = new Subscriber(next, error, complete); - subscriber.syncErrorThrowable = false; - return subscriber; - }; - Subscriber.prototype.next = function (value) { - if (!this.isStopped) { - this._next(value); - } - }; - Subscriber.prototype.error = function (err) { - if (!this.isStopped) { - this.isStopped = true; - this._error(err); - } - }; - Subscriber.prototype.complete = function () { - if (!this.isStopped) { - this.isStopped = true; - this._complete(); - } - }; - Subscriber.prototype.unsubscribe = function () { - if (this.closed) { - return; - } - this.isStopped = true; - _super.prototype.unsubscribe.call(this); - }; - Subscriber.prototype._next = function (value) { - this.destination.next(value); - }; - Subscriber.prototype._error = function (err) { - this.destination.error(err); - this.unsubscribe(); - }; - Subscriber.prototype._complete = function () { - this.destination.complete(); - this.unsubscribe(); - }; - Subscriber.prototype._unsubscribeAndRecycle = function () { - var _parentOrParents = this._parentOrParents; - this._parentOrParents = null; - this.unsubscribe(); - this.closed = false; - this.isStopped = false; - this._parentOrParents = _parentOrParents; - return this; - }; - return Subscriber; -}(_Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"])); -var SafeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SafeSubscriber, _super); - function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) { - var _this = _super.call(this) || this; - _this._parentSubscriber = _parentSubscriber; - var next; - var context = _this; - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__["isFunction"])(observerOrNext)) { - next = observerOrNext; - } - else if (observerOrNext) { - next = observerOrNext.next; - error = observerOrNext.error; - complete = observerOrNext.complete; - if (observerOrNext !== _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]) { - context = Object.create(observerOrNext); - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__["isFunction"])(context.unsubscribe)) { - _this.add(context.unsubscribe.bind(context)); - } - context.unsubscribe = _this.unsubscribe.bind(_this); - } - } - _this._context = context; - _this._next = next; - _this._error = error; - _this._complete = complete; - return _this; +function schedulePromise(input, scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + sub.add(scheduler.schedule(function () { + return input.then(function (value) { + sub.add(scheduler.schedule(function () { + subscriber.next(value); + sub.add(scheduler.schedule(function () { return subscriber.complete(); })); + })); + }, function (err) { + sub.add(scheduler.schedule(function () { return subscriber.error(err); })); + }); + })); + return sub; + }); +} +//# sourceMappingURL=schedulePromise.js.map + + +/***/ }), +/* 218 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleIterable", function() { return scheduleIterable; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(206); +/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_iterator PURE_IMPORTS_END */ + + + +function scheduleIterable(input, scheduler) { + if (!input) { + throw new Error('Iterable cannot be null'); } - SafeSubscriber.prototype.next = function (value) { - if (!this.isStopped && this._next) { - var _parentSubscriber = this._parentSubscriber; - if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { - this.__tryOrUnsub(this._next, value); - } - else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) { - this.unsubscribe(); - } - } - }; - SafeSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var _parentSubscriber = this._parentSubscriber; - var useDeprecatedSynchronousErrorHandling = _config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling; - if (this._error) { - if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { - this.__tryOrUnsub(this._error, err); - this.unsubscribe(); - } - else { - this.__tryOrSetError(_parentSubscriber, this._error, err); - this.unsubscribe(); - } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var iterator; + sub.add(function () { + if (iterator && typeof iterator.return === 'function') { + iterator.return(); } - else if (!_parentSubscriber.syncErrorThrowable) { - this.unsubscribe(); - if (useDeprecatedSynchronousErrorHandling) { - throw err; + }); + sub.add(scheduler.schedule(function () { + iterator = input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__["iterator"]](); + sub.add(scheduler.schedule(function () { + if (subscriber.closed) { + return; } - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); - } - else { - if (useDeprecatedSynchronousErrorHandling) { - _parentSubscriber.syncErrorValue = err; - _parentSubscriber.syncErrorThrown = true; + var value; + var done; + try { + var result = iterator.next(); + value = result.value; + done = result.done; } - else { - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + catch (err) { + subscriber.error(err); + return; } - this.unsubscribe(); - } - } - }; - SafeSubscriber.prototype.complete = function () { - var _this = this; - if (!this.isStopped) { - var _parentSubscriber = this._parentSubscriber; - if (this._complete) { - var wrappedComplete = function () { return _this._complete.call(_this._context); }; - if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { - this.__tryOrUnsub(wrappedComplete); - this.unsubscribe(); + if (done) { + subscriber.complete(); } else { - this.__tryOrSetError(_parentSubscriber, wrappedComplete); - this.unsubscribe(); + subscriber.next(value); + this.schedule(); } - } - else { - this.unsubscribe(); - } - } - }; - SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) { - try { - fn.call(this._context, value); - } - catch (err) { - this.unsubscribe(); - if (_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { - throw err; - } - else { - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); - } - } - }; - SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) { - if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { - throw new Error('bad call'); - } - try { - fn.call(this._context, value); - } - catch (err) { - if (_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { - parent.syncErrorValue = err; - parent.syncErrorThrown = true; - return true; - } - else { - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); - return true; - } - } - return false; - }; - SafeSubscriber.prototype._unsubscribe = function () { - var _parentSubscriber = this._parentSubscriber; - this._context = null; - this._parentSubscriber = null; - _parentSubscriber.unsubscribe(); - }; - return SafeSubscriber; -}(Subscriber)); + })); + })); + return sub; + }); +} +//# sourceMappingURL=scheduleIterable.js.map -//# sourceMappingURL=Subscriber.js.map + +/***/ }), +/* 219 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInteropObservable", function() { return isInteropObservable; }); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(154); +/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ + +function isInteropObservable(input) { + return input && typeof input[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]] === 'function'; +} +//# sourceMappingURL=isInteropObservable.js.map /***/ }), -/* 173 */ +/* 220 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFunction", function() { return isFunction; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isFunction(x) { - return typeof x === 'function'; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIterable", function() { return isIterable; }); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(206); +/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ + +function isIterable(input) { + return input && typeof input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]] === 'function'; } -//# sourceMappingURL=isFunction.js.map +//# sourceMappingURL=isIterable.js.map /***/ }), -/* 174 */ +/* 221 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(175); -/* harmony import */ var _util_hostReportError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(176); -/** PURE_IMPORTS_START _config,_util_hostReportError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return defer; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); +/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ -var empty = { - closed: true, - next: function (value) { }, - error: function (err) { - if (_config__WEBPACK_IMPORTED_MODULE_0__["config"].useDeprecatedSynchronousErrorHandling) { - throw err; + +function defer(observableFactory) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var input; + try { + input = observableFactory(); } - else { - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_1__["hostReportError"])(err); + catch (err) { + subscriber.error(err); + return undefined; } - }, - complete: function () { } -}; -//# sourceMappingURL=Observer.js.map + var source = input ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(input) : Object(_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); + return source.subscribe(subscriber); + }); +} +//# sourceMappingURL=defer.js.map /***/ }), -/* 175 */ +/* 222 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "config", function() { return config; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var _enable_super_gross_mode_that_will_cause_bad_things = false; -var config = { - Promise: undefined, - set useDeprecatedSynchronousErrorHandling(value) { - if (value) { - var error = /*@__PURE__*/ new Error(); - /*@__PURE__*/ console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return forkJoin; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(149); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(197); +/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(150); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(214); +/** PURE_IMPORTS_START _Observable,_util_isArray,_operators_map,_util_isObject,_from PURE_IMPORTS_END */ + + + + + +function forkJoin() { + var sources = []; + for (var _i = 0; _i < arguments.length; _i++) { + sources[_i] = arguments[_i]; + } + if (sources.length === 1) { + var first_1 = sources[0]; + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(first_1)) { + return forkJoinInternal(first_1, null); } - else if (_enable_super_gross_mode_that_will_cause_bad_things) { - /*@__PURE__*/ console.log('RxJS: Back to a better error behavior. Thank you. <3'); + if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_3__["isObject"])(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) { + var keys = Object.keys(first_1); + return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys); } - _enable_super_gross_mode_that_will_cause_bad_things = value; - }, - get useDeprecatedSynchronousErrorHandling() { - return _enable_super_gross_mode_that_will_cause_bad_things; - }, -}; -//# sourceMappingURL=config.js.map + } + if (typeof sources[sources.length - 1] === 'function') { + var resultSelector_1 = sources.pop(); + sources = (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(sources[0])) ? sources[0] : sources; + return forkJoinInternal(sources, null).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return resultSelector_1.apply(void 0, args); })); + } + return forkJoinInternal(sources, null); +} +function forkJoinInternal(sources, keys) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var len = sources.length; + if (len === 0) { + subscriber.complete(); + return; + } + var values = new Array(len); + var completed = 0; + var emitted = 0; + var _loop_1 = function (i) { + var source = Object(_from__WEBPACK_IMPORTED_MODULE_4__["from"])(sources[i]); + var hasValue = false; + subscriber.add(source.subscribe({ + next: function (value) { + if (!hasValue) { + hasValue = true; + emitted++; + } + values[i] = value; + }, + error: function (err) { return subscriber.error(err); }, + complete: function () { + completed++; + if (completed === len || !hasValue) { + if (emitted === len) { + subscriber.next(keys ? + keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) : + values); + } + subscriber.complete(); + } + } + })); + }; + for (var i = 0; i < len; i++) { + _loop_1(i); + } + }); +} +//# sourceMappingURL=forkJoin.js.map /***/ }), -/* 176 */ +/* 223 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hostReportError", function() { return hostReportError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function hostReportError(err) { - setTimeout(function () { throw err; }, 0); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return fromEvent; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(149); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(197); +/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ + + + + +var toString = /*@__PURE__*/ (function () { return Object.prototype.toString; })(); +function fromEvent(target, eventName, options, resultSelector) { + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(options)) { + resultSelector = options; + options = undefined; + } + if (resultSelector) { + return fromEvent(target, eventName, options).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + function handler(e) { + if (arguments.length > 1) { + subscriber.next(Array.prototype.slice.call(arguments)); + } + else { + subscriber.next(e); + } + } + setupSubscription(target, eventName, handler, subscriber, options); + }); } -//# sourceMappingURL=hostReportError.js.map +function setupSubscription(sourceObj, eventName, handler, subscriber, options) { + var unsubscribe; + if (isEventTarget(sourceObj)) { + var source_1 = sourceObj; + sourceObj.addEventListener(eventName, handler, options); + unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); }; + } + else if (isJQueryStyleEventEmitter(sourceObj)) { + var source_2 = sourceObj; + sourceObj.on(eventName, handler); + unsubscribe = function () { return source_2.off(eventName, handler); }; + } + else if (isNodeStyleEventEmitter(sourceObj)) { + var source_3 = sourceObj; + sourceObj.addListener(eventName, handler); + unsubscribe = function () { return source_3.removeListener(eventName, handler); }; + } + else if (sourceObj && sourceObj.length) { + for (var i = 0, len = sourceObj.length; i < len; i++) { + setupSubscription(sourceObj[i], eventName, handler, subscriber, options); + } + } + else { + throw new TypeError('Invalid event target'); + } + subscriber.add(unsubscribe); +} +function isNodeStyleEventEmitter(sourceObj) { + return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function'; +} +function isJQueryStyleEventEmitter(sourceObj) { + return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function'; +} +function isEventTarget(sourceObj) { + return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function'; +} +//# sourceMappingURL=fromEvent.js.map /***/ }), -/* 177 */ +/* 224 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return Subscription; }); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(179); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); -/* harmony import */ var _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(180); -/** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_UnsubscriptionError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return fromEventPattern; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(149); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(197); +/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ -var Subscription = /*@__PURE__*/ (function () { - function Subscription(unsubscribe) { - this.closed = false; - this._parentOrParents = null; - this._subscriptions = null; - if (unsubscribe) { - this._unsubscribe = unsubscribe; - } +function fromEventPattern(addHandler, removeHandler, resultSelector) { + if (resultSelector) { + return fromEventPattern(addHandler, removeHandler).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); } - Subscription.prototype.unsubscribe = function () { - var errors; - if (this.closed) { - return; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var handler = function () { + var e = []; + for (var _i = 0; _i < arguments.length; _i++) { + e[_i] = arguments[_i]; + } + return subscriber.next(e.length === 1 ? e[0] : e); + }; + var retValue; + try { + retValue = addHandler(handler); } - var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; - this.closed = true; - this._parentOrParents = null; - this._subscriptions = null; - if (_parentOrParents instanceof Subscription) { - _parentOrParents.remove(this); - } - else if (_parentOrParents !== null) { - for (var index = 0; index < _parentOrParents.length; ++index) { - var parent_1 = _parentOrParents[index]; - parent_1.remove(this); - } - } - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(_unsubscribe)) { - try { - _unsubscribe.call(this); - } - catch (e) { - errors = e instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"] ? flattenUnsubscriptionErrors(e.errors) : [e]; - } - } - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(_subscriptions)) { - var index = -1; - var len = _subscriptions.length; - while (++index < len) { - var sub = _subscriptions[index]; - if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_1__["isObject"])(sub)) { - try { - sub.unsubscribe(); - } - catch (e) { - errors = errors || []; - if (e instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"]) { - errors = errors.concat(flattenUnsubscriptionErrors(e.errors)); - } - else { - errors.push(e); - } - } - } - } + catch (err) { + subscriber.error(err); + return undefined; } - if (errors) { - throw new _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"](errors); + if (!Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(removeHandler)) { + return undefined; } - }; - Subscription.prototype.add = function (teardown) { - var subscription = teardown; - if (!teardown) { - return Subscription.EMPTY; + return function () { return removeHandler(handler, retValue); }; + }); +} +//# sourceMappingURL=fromEventPattern.js.map + + +/***/ }), +/* 225 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return generate; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(191); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(176); +/** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */ + + + +function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) { + var resultSelector; + var initialState; + if (arguments.length == 1) { + var options = initialStateOrOptions; + initialState = options.initialState; + condition = options.condition; + iterate = options.iterate; + resultSelector = options.resultSelector || _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; + scheduler = options.scheduler; + } + else if (resultSelectorOrObservable === undefined || Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_2__["isScheduler"])(resultSelectorOrObservable)) { + initialState = initialStateOrOptions; + resultSelector = _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; + scheduler = resultSelectorOrObservable; + } + else { + initialState = initialStateOrOptions; + resultSelector = resultSelectorOrObservable; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var state = initialState; + if (scheduler) { + return scheduler.schedule(dispatch, 0, { + subscriber: subscriber, + iterate: iterate, + condition: condition, + resultSelector: resultSelector, + state: state + }); } - switch (typeof teardown) { - case 'function': - subscription = new Subscription(teardown); - case 'object': - if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') { - return subscription; + do { + if (condition) { + var conditionResult = void 0; + try { + conditionResult = condition(state); } - else if (this.closed) { - subscription.unsubscribe(); - return subscription; + catch (err) { + subscriber.error(err); + return undefined; } - else if (!(subscription instanceof Subscription)) { - var tmp = subscription; - subscription = new Subscription(); - subscription._subscriptions = [tmp]; + if (!conditionResult) { + subscriber.complete(); + break; } + } + var value = void 0; + try { + value = resultSelector(state); + } + catch (err) { + subscriber.error(err); + return undefined; + } + subscriber.next(value); + if (subscriber.closed) { break; - default: { - throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); } - } - var _parentOrParents = subscription._parentOrParents; - if (_parentOrParents === null) { - subscription._parentOrParents = this; - } - else if (_parentOrParents instanceof Subscription) { - if (_parentOrParents === this) { - return subscription; + try { + state = iterate(state); } - subscription._parentOrParents = [_parentOrParents, this]; + catch (err) { + subscriber.error(err); + return undefined; + } + } while (true); + return undefined; + }); +} +function dispatch(state) { + var subscriber = state.subscriber, condition = state.condition; + if (subscriber.closed) { + return undefined; + } + if (state.needIterate) { + try { + state.state = state.iterate(state.state); } - else if (_parentOrParents.indexOf(this) === -1) { - _parentOrParents.push(this); + catch (err) { + subscriber.error(err); + return undefined; } - else { - return subscription; + } + else { + state.needIterate = true; + } + if (condition) { + var conditionResult = void 0; + try { + conditionResult = condition(state.state); } - var subscriptions = this._subscriptions; - if (subscriptions === null) { - this._subscriptions = [subscription]; + catch (err) { + subscriber.error(err); + return undefined; } - else { - subscriptions.push(subscription); + if (!conditionResult) { + subscriber.complete(); + return undefined; } - return subscription; - }; - Subscription.prototype.remove = function (subscription) { - var subscriptions = this._subscriptions; - if (subscriptions) { - var subscriptionIndex = subscriptions.indexOf(subscription); - if (subscriptionIndex !== -1) { - subscriptions.splice(subscriptionIndex, 1); - } + if (subscriber.closed) { + return undefined; } - }; - Subscription.EMPTY = (function (empty) { - empty.closed = true; - return empty; - }(new Subscription())); - return Subscription; -}()); - -function flattenUnsubscriptionErrors(errors) { - return errors.reduce(function (errs, err) { return errs.concat((err instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"]) ? err.errors : err); }, []); + } + var value; + try { + value = state.resultSelector(state.state); + } + catch (err) { + subscriber.error(err); + return undefined; + } + if (subscriber.closed) { + return undefined; + } + subscriber.next(value); + if (subscriber.closed) { + return undefined; + } + return this.schedule(state); } -//# sourceMappingURL=Subscription.js.map +//# sourceMappingURL=generate.js.map /***/ }), -/* 178 */ +/* 226 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArray", function() { return isArray; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var isArray = /*@__PURE__*/ (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })(); -//# sourceMappingURL=isArray.js.map - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return iif; }); +/* harmony import */ var _defer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(221); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(174); +/** PURE_IMPORTS_START _defer,_empty PURE_IMPORTS_END */ -/***/ }), -/* 179 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObject", function() { return isObject; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isObject(x) { - return x !== null && typeof x === 'object'; +function iif(condition, trueResult, falseResult) { + if (trueResult === void 0) { + trueResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; + } + if (falseResult === void 0) { + falseResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; + } + return Object(_defer__WEBPACK_IMPORTED_MODULE_0__["defer"])(function () { return condition() ? trueResult : falseResult; }); } -//# sourceMappingURL=isObject.js.map +//# sourceMappingURL=iif.js.map /***/ }), -/* 180 */ +/* 227 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return UnsubscriptionError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var UnsubscriptionErrorImpl = /*@__PURE__*/ (function () { - function UnsubscriptionErrorImpl(errors) { - Error.call(this); - this.message = errors ? - errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n ') : ''; - this.name = 'UnsubscriptionError'; - this.errors = errors; - return this; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return interval; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(228); +/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric PURE_IMPORTS_END */ + + + +function interval(period, scheduler) { + if (period === void 0) { + period = 0; } - UnsubscriptionErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return UnsubscriptionErrorImpl; -})(); -var UnsubscriptionError = UnsubscriptionErrorImpl; -//# sourceMappingURL=UnsubscriptionError.js.map + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(period) || period < 0) { + period = 0; + } + if (!scheduler || typeof scheduler.schedule !== 'function') { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period })); + return subscriber; + }); +} +function dispatch(state) { + var subscriber = state.subscriber, counter = state.counter, period = state.period; + subscriber.next(counter); + this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period); +} +//# sourceMappingURL=interval.js.map /***/ }), -/* 181 */ +/* 228 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rxSubscriber", function() { return rxSubscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$rxSubscriber", function() { return $$rxSubscriber; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var rxSubscriber = /*@__PURE__*/ (function () { - return typeof Symbol === 'function' - ? /*@__PURE__*/ Symbol('rxSubscriber') - : '@@rxSubscriber_' + /*@__PURE__*/ Math.random(); -})(); -var $$rxSubscriber = rxSubscriber; -//# sourceMappingURL=rxSubscriber.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNumeric", function() { return isNumeric; }); +/* harmony import */ var _isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(149); +/** PURE_IMPORTS_START _isArray PURE_IMPORTS_END */ + +function isNumeric(val) { + return !Object(_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(val) && (val - parseFloat(val) + 1) >= 0; +} +//# sourceMappingURL=isNumeric.js.map /***/ }), -/* 182 */ +/* 229 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toSubscriber", function() { return toSubscriber; }); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(172); -/* harmony import */ var _symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(181); -/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); -/** PURE_IMPORTS_START _Subscriber,_symbol_rxSubscriber,_Observer PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(176); +/* harmony import */ var _operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(212); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); +/** PURE_IMPORTS_START _Observable,_util_isScheduler,_operators_mergeAll,_fromArray PURE_IMPORTS_END */ -function toSubscriber(nextOrObserver, error, complete) { - if (nextOrObserver) { - if (nextOrObserver instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { - return nextOrObserver; - } - if (nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]]) { - return nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]](); + +function merge() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + var concurrent = Number.POSITIVE_INFINITY; + var scheduler = null; + var last = observables[observables.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(last)) { + scheduler = observables.pop(); + if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') { + concurrent = observables.pop(); } } - if (!nextOrObserver && !error && !complete) { - return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](_Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]); + else if (typeof last === 'number') { + concurrent = observables.pop(); } - return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](nextOrObserver, error, complete); + if (scheduler === null && observables.length === 1 && observables[0] instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { + return observables[0]; + } + return Object(_operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__["mergeAll"])(concurrent)(Object(_fromArray__WEBPACK_IMPORTED_MODULE_3__["fromArray"])(observables, scheduler)); } -//# sourceMappingURL=toSubscriber.js.map +//# sourceMappingURL=merge.js.map /***/ }), -/* 183 */ +/* 230 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return observable; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var observable = /*@__PURE__*/ (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })(); -//# sourceMappingURL=observable.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return NEVER; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "never", function() { return never; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(156); +/** PURE_IMPORTS_START _Observable,_util_noop PURE_IMPORTS_END */ + + +var NEVER = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](_util_noop__WEBPACK_IMPORTED_MODULE_1__["noop"]); +function never() { + return NEVER; +} +//# sourceMappingURL=never.js.map /***/ }), -/* 184 */ +/* 231 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipeFromArray", function() { return pipeFromArray; }); -/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(185); -/** PURE_IMPORTS_START _noop PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(149); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(174); +/** PURE_IMPORTS_START _Observable,_from,_util_isArray,_empty PURE_IMPORTS_END */ -function pipe() { - var fns = []; + + + +function onErrorResumeNext() { + var sources = []; for (var _i = 0; _i < arguments.length; _i++) { - fns[_i] = arguments[_i]; + sources[_i] = arguments[_i]; } - return pipeFromArray(fns); -} -function pipeFromArray(fns) { - if (!fns) { - return _noop__WEBPACK_IMPORTED_MODULE_0__["noop"]; + if (sources.length === 0) { + return _empty__WEBPACK_IMPORTED_MODULE_3__["EMPTY"]; } - if (fns.length === 1) { - return fns[0]; + var first = sources[0], remainder = sources.slice(1); + if (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(first)) { + return onErrorResumeNext.apply(void 0, first); } - return function piped(input) { - return fns.reduce(function (prev, fn) { return fn(prev); }, input); - }; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); }; + return Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(first).subscribe({ + next: function (value) { subscriber.next(value); }, + error: subNext, + complete: subNext, + }); + }); } -//# sourceMappingURL=pipe.js.map +//# sourceMappingURL=onErrorResumeNext.js.map /***/ }), -/* 185 */ +/* 232 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return noop; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function noop() { } -//# sourceMappingURL=noop.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return pairs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ + + +function pairs(obj, scheduler) { + if (!scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var keys = Object.keys(obj); + for (var i = 0; i < keys.length && !subscriber.closed; i++) { + var key = keys[i]; + if (obj.hasOwnProperty(key)) { + subscriber.next([key, obj[key]]); + } + } + subscriber.complete(); + }); + } + else { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var keys = Object.keys(obj); + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj })); + return subscription; + }); + } +} +function dispatch(state) { + var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj; + if (!subscriber.closed) { + if (index < keys.length) { + var key = keys[index]; + subscriber.next([key, obj[key]]); + subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj })); + } + else { + subscriber.complete(); + } + } +} +//# sourceMappingURL=pairs.js.map /***/ }), -/* 186 */ +/* 233 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return ConnectableObservable; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "connectableObservableDescriptor", function() { return connectableObservableDescriptor; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(177); -/* harmony import */ var _operators_refCount__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(190); -/** PURE_IMPORTS_START tslib,_Subject,_Observable,_Subscriber,_Subscription,_operators_refCount PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); +/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(234); +/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); +/* harmony import */ var _operators_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(235); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(141); +/** PURE_IMPORTS_START _util_not,_util_subscribeTo,_operators_filter,_Observable PURE_IMPORTS_END */ +function partition(source, predicate, thisArg) { + return [ + Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(predicate, thisArg)(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))), + Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))) + ]; +} +//# sourceMappingURL=partition.js.map -var ConnectableObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableObservable, _super); - function ConnectableObservable(source, subjectFactory) { - var _this = _super.call(this) || this; - _this.source = source; - _this.subjectFactory = subjectFactory; - _this._refCount = 0; - _this._isComplete = false; - return _this; +/***/ }), +/* 234 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "not", function() { return not; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function not(pred, thisArg) { + function notPred() { + return !(notPred.pred.apply(notPred.thisArg, arguments)); } - ConnectableObservable.prototype._subscribe = function (subscriber) { - return this.getSubject().subscribe(subscriber); - }; - ConnectableObservable.prototype.getSubject = function () { - var subject = this._subject; - if (!subject || subject.isStopped) { - this._subject = this.subjectFactory(); - } - return this._subject; - }; - ConnectableObservable.prototype.connect = function () { - var connection = this._connection; - if (!connection) { - this._isComplete = false; - connection = this._connection = new _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"](); - connection.add(this.source - .subscribe(new ConnectableSubscriber(this.getSubject(), this))); - if (connection.closed) { - this._connection = null; - connection = _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"].EMPTY; - } - } - return connection; - }; - ConnectableObservable.prototype.refCount = function () { - return Object(_operators_refCount__WEBPACK_IMPORTED_MODULE_5__["refCount"])()(this); - }; - return ConnectableObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); + notPred.pred = pred; + notPred.thisArg = thisArg; + return notPred; +} +//# sourceMappingURL=not.js.map -var connectableObservableDescriptor = /*@__PURE__*/ (function () { - var connectableProto = ConnectableObservable.prototype; - return { - operator: { value: null }, - _refCount: { value: 0, writable: true }, - _subject: { value: null, writable: true }, - _connection: { value: null, writable: true }, - _subscribe: { value: connectableProto._subscribe }, - _isComplete: { value: connectableProto._isComplete, writable: true }, - getSubject: { value: connectableProto.getSubject }, - connect: { value: connectableProto.connect }, - refCount: { value: connectableProto.refCount } - }; -})(); -var ConnectableSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableSubscriber, _super); - function ConnectableSubscriber(destination, connectable) { - var _this = _super.call(this, destination) || this; - _this.connectable = connectable; - return _this; - } - ConnectableSubscriber.prototype._error = function (err) { - this._unsubscribe(); - _super.prototype._error.call(this, err); - }; - ConnectableSubscriber.prototype._complete = function () { - this.connectable._isComplete = true; - this._unsubscribe(); - _super.prototype._complete.call(this); - }; - ConnectableSubscriber.prototype._unsubscribe = function () { - var connectable = this.connectable; - if (connectable) { - this.connectable = null; - var connection = connectable._connection; - connectable._refCount = 0; - connectable._subject = null; - connectable._connection = null; - if (connection) { - connection.unsubscribe(); - } - } + +/***/ }), +/* 235 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return filter; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function filter(predicate, thisArg) { + return function filterOperatorFunction(source) { + return source.lift(new FilterOperator(predicate, thisArg)); }; - return ConnectableSubscriber; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["SubjectSubscriber"])); -var RefCountOperator = /*@__PURE__*/ (function () { - function RefCountOperator(connectable) { - this.connectable = connectable; +} +var FilterOperator = /*@__PURE__*/ (function () { + function FilterOperator(predicate, thisArg) { + this.predicate = predicate; + this.thisArg = thisArg; } - RefCountOperator.prototype.call = function (subscriber, source) { - var connectable = this.connectable; - connectable._refCount++; - var refCounter = new RefCountSubscriber(subscriber, connectable); - var subscription = source.subscribe(refCounter); - if (!refCounter.closed) { - refCounter.connection = connectable.connect(); - } - return subscription; + FilterOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); }; - return RefCountOperator; + return FilterOperator; }()); -var RefCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); - function RefCountSubscriber(destination, connectable) { +var FilterSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FilterSubscriber, _super); + function FilterSubscriber(destination, predicate, thisArg) { var _this = _super.call(this, destination) || this; - _this.connectable = connectable; + _this.predicate = predicate; + _this.thisArg = thisArg; + _this.count = 0; return _this; } - RefCountSubscriber.prototype._unsubscribe = function () { - var connectable = this.connectable; - if (!connectable) { - this.connection = null; - return; - } - this.connectable = null; - var refCount = connectable._refCount; - if (refCount <= 0) { - this.connection = null; - return; + FilterSubscriber.prototype._next = function (value) { + var result; + try { + result = this.predicate.call(this.thisArg, value, this.count++); } - connectable._refCount = refCount - 1; - if (refCount > 1) { - this.connection = null; + catch (err) { + this.destination.error(err); return; } - var connection = this.connection; - var sharedConnection = connectable._connection; - this.connection = null; - if (sharedConnection && (!connection || sharedConnection === connection)) { - sharedConnection.unsubscribe(); + if (result) { + this.destination.next(value); } }; - return RefCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -//# sourceMappingURL=ConnectableObservable.js.map + return FilterSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=filter.js.map /***/ }), -/* 187 */ +/* 236 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscriber", function() { return SubjectSubscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return Subject; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnonymousSubject", function() { return AnonymousSubject; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); -/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(188); -/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(189); -/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(181); -/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceOperator", function() { return RaceOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceSubscriber", function() { return RaceSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(149); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_util_isArray,_fromArray,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -var SubjectSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscriber, _super); - function SubjectSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - return _this; - } - return SubjectSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -var Subject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subject, _super); - function Subject() { - var _this = _super.call(this) || this; - _this.observers = []; - _this.closed = false; - _this.isStopped = false; - _this.hasError = false; - _this.thrownError = null; - return _this; +function race() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - Subject.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__["rxSubscriber"]] = function () { - return new SubjectSubscriber(this); - }; - Subject.prototype.lift = function (operator) { - var subject = new AnonymousSubject(this, this); - subject.operator = operator; - return subject; - }; - Subject.prototype.next = function (value) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - if (!this.isStopped) { - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].next(value); - } - } - }; - Subject.prototype.error = function (err) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - this.hasError = true; - this.thrownError = err; - this.isStopped = true; - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].error(err); - } - this.observers.length = 0; - }; - Subject.prototype.complete = function () { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - this.isStopped = true; - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].complete(); - } - this.observers.length = 0; - }; - Subject.prototype.unsubscribe = function () { - this.isStopped = true; - this.closed = true; - this.observers = null; - }; - Subject.prototype._trySubscribe = function (subscriber) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - else { - return _super.prototype._trySubscribe.call(this, subscriber); - } - }; - Subject.prototype._subscribe = function (subscriber) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - else if (this.hasError) { - subscriber.error(this.thrownError); - return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; - } - else if (this.isStopped) { - subscriber.complete(); - return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + if (observables.length === 1) { + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(observables[0])) { + observables = observables[0]; } else { - this.observers.push(subscriber); - return new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__["SubjectSubscription"](this, subscriber); + return observables[0]; } + } + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_2__["fromArray"])(observables, undefined).lift(new RaceOperator()); +} +var RaceOperator = /*@__PURE__*/ (function () { + function RaceOperator() { + } + RaceOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RaceSubscriber(subscriber)); }; - Subject.prototype.asObservable = function () { - var observable = new _Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"](); - observable.source = this; - return observable; - }; - Subject.create = function (destination, source) { - return new AnonymousSubject(destination, source); - }; - return Subject; -}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); + return RaceOperator; +}()); -var AnonymousSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnonymousSubject, _super); - function AnonymousSubject(destination, source) { - var _this = _super.call(this) || this; - _this.destination = destination; - _this.source = source; +var RaceSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RaceSubscriber, _super); + function RaceSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.hasFirst = false; + _this.observables = []; + _this.subscriptions = []; return _this; } - AnonymousSubject.prototype.next = function (value) { - var destination = this.destination; - if (destination && destination.next) { - destination.next(value); - } - }; - AnonymousSubject.prototype.error = function (err) { - var destination = this.destination; - if (destination && destination.error) { - this.destination.error(err); - } + RaceSubscriber.prototype._next = function (observable) { + this.observables.push(observable); }; - AnonymousSubject.prototype.complete = function () { - var destination = this.destination; - if (destination && destination.complete) { + RaceSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { this.destination.complete(); } - }; - AnonymousSubject.prototype._subscribe = function (subscriber) { - var source = this.source; - if (source) { - return this.source.subscribe(subscriber); - } else { - return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + for (var i = 0; i < len && !this.hasFirst; i++) { + var observable = observables[i]; + var subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i); + if (this.subscriptions) { + this.subscriptions.push(subscription); + } + this.add(subscription); + } + this.observables = null; } }; - return AnonymousSubject; -}(Subject)); + RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + if (!this.hasFirst) { + this.hasFirst = true; + for (var i = 0; i < this.subscriptions.length; i++) { + if (i !== outerIndex) { + var subscription = this.subscriptions[i]; + subscription.unsubscribe(); + this.remove(subscription); + } + } + this.subscriptions = null; + } + this.destination.next(innerValue); + }; + return RaceSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=Subject.js.map +//# sourceMappingURL=race.js.map /***/ }), -/* 188 */ +/* 237 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return ObjectUnsubscribedError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var ObjectUnsubscribedErrorImpl = /*@__PURE__*/ (function () { - function ObjectUnsubscribedErrorImpl() { - Error.call(this); - this.message = 'object unsubscribed'; - this.name = 'ObjectUnsubscribedError'; - return this; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "range", function() { return range; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ + +function range(start, count, scheduler) { + if (start === void 0) { + start = 0; } - ObjectUnsubscribedErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return ObjectUnsubscribedErrorImpl; -})(); -var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl; -//# sourceMappingURL=ObjectUnsubscribedError.js.map + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + if (count === undefined) { + count = start; + start = 0; + } + var index = 0; + var current = start; + if (scheduler) { + return scheduler.schedule(dispatch, 0, { + index: index, count: count, start: start, subscriber: subscriber + }); + } + else { + do { + if (index++ >= count) { + subscriber.complete(); + break; + } + subscriber.next(current++); + if (subscriber.closed) { + break; + } + } while (true); + } + return undefined; + }); +} +function dispatch(state) { + var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber; + if (index >= count) { + subscriber.complete(); + return; + } + subscriber.next(start); + if (subscriber.closed) { + return; + } + state.index = index + 1; + state.start = start + 1; + this.schedule(state); +} +//# sourceMappingURL=range.js.map /***/ }), -/* 189 */ +/* 238 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscription", function() { return SubjectSubscription; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return timer; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(228); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(176); +/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ -var SubjectSubscription = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscription, _super); - function SubjectSubscription(subject, subscriber) { - var _this = _super.call(this) || this; - _this.subject = subject; - _this.subscriber = subscriber; - _this.closed = false; - return _this; - } - SubjectSubscription.prototype.unsubscribe = function () { - if (this.closed) { - return; - } - this.closed = true; - var subject = this.subject; - var observers = subject.observers; - this.subject = null; - if (!observers || observers.length === 0 || subject.isStopped || subject.closed) { - return; - } - var subscriberIndex = observers.indexOf(this.subscriber); - if (subscriberIndex !== -1) { - observers.splice(subscriberIndex, 1); - } - }; - return SubjectSubscription; -}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); -//# sourceMappingURL=SubjectSubscription.js.map + +function timer(dueTime, periodOrScheduler, scheduler) { + if (dueTime === void 0) { + dueTime = 0; + } + var period = -1; + if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(periodOrScheduler)) { + period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler); + } + else if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(periodOrScheduler)) { + scheduler = periodOrScheduler; + } + if (!Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(scheduler)) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var due = Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(dueTime) + ? dueTime + : (+dueTime - scheduler.now()); + return scheduler.schedule(dispatch, due, { + index: 0, period: period, subscriber: subscriber + }); + }); +} +function dispatch(state) { + var index = state.index, period = state.period, subscriber = state.subscriber; + subscriber.next(index); + if (subscriber.closed) { + return; + } + else if (period === -1) { + return subscriber.complete(); + } + state.index = index + 1; + this.schedule(state, period); +} +//# sourceMappingURL=timer.js.map /***/ }), -/* 190 */ +/* 239 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return refCount; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "using", function() { return using; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); +/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ -function refCount() { - return function refCountOperatorFunction(source) { - return source.lift(new RefCountOperator(source)); - }; -} -var RefCountOperator = /*@__PURE__*/ (function () { - function RefCountOperator(connectable) { - this.connectable = connectable; - } - RefCountOperator.prototype.call = function (subscriber, source) { - var connectable = this.connectable; - connectable._refCount++; - var refCounter = new RefCountSubscriber(subscriber, connectable); - var subscription = source.subscribe(refCounter); - if (!refCounter.closed) { - refCounter.connection = connectable.connect(); + +function using(resourceFactory, observableFactory) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var resource; + try { + resource = resourceFactory(); } - return subscription; - }; - return RefCountOperator; -}()); -var RefCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); - function RefCountSubscriber(destination, connectable) { - var _this = _super.call(this, destination) || this; - _this.connectable = connectable; - return _this; - } - RefCountSubscriber.prototype._unsubscribe = function () { - var connectable = this.connectable; - if (!connectable) { - this.connection = null; - return; - } - this.connectable = null; - var refCount = connectable._refCount; - if (refCount <= 0) { - this.connection = null; - return; + catch (err) { + subscriber.error(err); + return undefined; } - connectable._refCount = refCount - 1; - if (refCount > 1) { - this.connection = null; - return; + var result; + try { + result = observableFactory(resource); } - var connection = this.connection; - var sharedConnection = connectable._connection; - this.connection = null; - if (sharedConnection && (!connection || sharedConnection === connection)) { - sharedConnection.unsubscribe(); + catch (err) { + subscriber.error(err); + return undefined; } - }; - return RefCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=refCount.js.map + var source = result ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(result) : _empty__WEBPACK_IMPORTED_MODULE_2__["EMPTY"]; + var subscription = source.subscribe(subscriber); + return function () { + subscription.unsubscribe(); + if (resource) { + resource.unsubscribe(); + } + }; + }); +} +//# sourceMappingURL=using.js.map /***/ }), -/* 191 */ +/* 240 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return groupBy; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return GroupedObservable; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(170); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(187); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription,_Observable,_Subject PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipOperator", function() { return ZipOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipSubscriber", function() { return ZipSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(149); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(143); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(201); +/* harmony import */ var _internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(206); +/** PURE_IMPORTS_START tslib,_fromArray,_util_isArray,_Subscriber,_OuterSubscriber,_util_subscribeToResult,_.._internal_symbol_iterator PURE_IMPORTS_END */ -function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) { - return function (source) { - return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector)); - }; + + +function zip() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + var resultSelector = observables[observables.length - 1]; + if (typeof resultSelector === 'function') { + observables.pop(); + } + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(observables, undefined).lift(new ZipOperator(resultSelector)); } -var GroupByOperator = /*@__PURE__*/ (function () { - function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) { - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.durationSelector = durationSelector; - this.subjectSelector = subjectSelector; +var ZipOperator = /*@__PURE__*/ (function () { + function ZipOperator(resultSelector) { + this.resultSelector = resultSelector; } - GroupByOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector)); + ZipOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector)); }; - return GroupByOperator; + return ZipOperator; }()); -var GroupBySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupBySubscriber, _super); - function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) { + +var ZipSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipSubscriber, _super); + function ZipSubscriber(destination, resultSelector, values) { + if (values === void 0) { + values = Object.create(null); + } var _this = _super.call(this, destination) || this; - _this.keySelector = keySelector; - _this.elementSelector = elementSelector; - _this.durationSelector = durationSelector; - _this.subjectSelector = subjectSelector; - _this.groups = null; - _this.attemptedToUnsubscribe = false; - _this.count = 0; + _this.iterators = []; + _this.active = 0; + _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null; + _this.values = values; return _this; } - GroupBySubscriber.prototype._next = function (value) { - var key; - try { - key = this.keySelector(value); + ZipSubscriber.prototype._next = function (value) { + var iterators = this.iterators; + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(value)) { + iterators.push(new StaticArrayIterator(value)); } - catch (err) { - this.error(err); - return; + else if (typeof value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] === 'function') { + iterators.push(new StaticIterator(value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]]())); + } + else { + iterators.push(new ZipBufferIterator(this.destination, this, value)); } - this._group(value, key); }; - GroupBySubscriber.prototype._group = function (value, key) { - var groups = this.groups; - if (!groups) { - groups = this.groups = new Map(); + ZipSubscriber.prototype._complete = function () { + var iterators = this.iterators; + var len = iterators.length; + this.unsubscribe(); + if (len === 0) { + this.destination.complete(); + return; } - var group = groups.get(key); - var element; - if (this.elementSelector) { - try { - element = this.elementSelector(value); + this.active = len; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + if (iterator.stillUnsubscribed) { + var destination = this.destination; + destination.add(iterator.subscribe(iterator, i)); } - catch (err) { - this.error(err); + else { + this.active--; } } - else { - element = value; + }; + ZipSubscriber.prototype.notifyInactive = function () { + this.active--; + if (this.active === 0) { + this.destination.complete(); } - if (!group) { - group = (this.subjectSelector ? this.subjectSelector() : new _Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]()); - groups.set(key, group); - var groupedObservable = new GroupedObservable(key, group, this); - this.destination.next(groupedObservable); - if (this.durationSelector) { - var duration = void 0; - try { - duration = this.durationSelector(new GroupedObservable(key, group)); - } - catch (err) { - this.error(err); - return; - } - this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this))); + }; + ZipSubscriber.prototype.checkIterators = function () { + var iterators = this.iterators; + var len = iterators.length; + var destination = this.destination; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) { + return; } } - if (!group.closed) { - group.next(element); + var shouldComplete = false; + var args = []; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + var result = iterator.next(); + if (iterator.hasCompleted()) { + shouldComplete = true; + } + if (result.done) { + destination.complete(); + return; + } + args.push(result.value); } - }; - GroupBySubscriber.prototype._error = function (err) { - var groups = this.groups; - if (groups) { - groups.forEach(function (group, key) { - group.error(err); - }); - groups.clear(); + if (this.resultSelector) { + this._tryresultSelector(args); } - this.destination.error(err); - }; - GroupBySubscriber.prototype._complete = function () { - var groups = this.groups; - if (groups) { - groups.forEach(function (group, key) { - group.complete(); - }); - groups.clear(); + else { + destination.next(args); + } + if (shouldComplete) { + destination.complete(); } - this.destination.complete(); - }; - GroupBySubscriber.prototype.removeGroup = function (key) { - this.groups.delete(key); }; - GroupBySubscriber.prototype.unsubscribe = function () { - if (!this.closed) { - this.attemptedToUnsubscribe = true; - if (this.count === 0) { - _super.prototype.unsubscribe.call(this); - } + ZipSubscriber.prototype._tryresultSelector = function (args) { + var result; + try { + result = this.resultSelector.apply(this, args); + } + catch (err) { + this.destination.error(err); + return; } + this.destination.next(result); }; - return GroupBySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var GroupDurationSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupDurationSubscriber, _super); - function GroupDurationSubscriber(key, group, parent) { - var _this = _super.call(this, group) || this; - _this.key = key; - _this.group = group; - _this.parent = parent; - return _this; + return ZipSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); + +var StaticIterator = /*@__PURE__*/ (function () { + function StaticIterator(iterator) { + this.iterator = iterator; + this.nextResult = iterator.next(); } - GroupDurationSubscriber.prototype._next = function (value) { - this.complete(); + StaticIterator.prototype.hasValue = function () { + return true; }; - GroupDurationSubscriber.prototype._unsubscribe = function () { - var _a = this, parent = _a.parent, key = _a.key; - this.key = this.parent = null; - if (parent) { - parent.removeGroup(key); - } + StaticIterator.prototype.next = function () { + var result = this.nextResult; + this.nextResult = this.iterator.next(); + return result; }; - return GroupDurationSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var GroupedObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupedObservable, _super); - function GroupedObservable(key, groupSubject, refCountSubscription) { - var _this = _super.call(this) || this; - _this.key = key; - _this.groupSubject = groupSubject; - _this.refCountSubscription = refCountSubscription; - return _this; + StaticIterator.prototype.hasCompleted = function () { + var nextResult = this.nextResult; + return nextResult && nextResult.done; + }; + return StaticIterator; +}()); +var StaticArrayIterator = /*@__PURE__*/ (function () { + function StaticArrayIterator(array) { + this.array = array; + this.index = 0; + this.length = 0; + this.length = array.length; } - GroupedObservable.prototype._subscribe = function (subscriber) { - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); - var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject; - if (refCountSubscription && !refCountSubscription.closed) { - subscription.add(new InnerRefCountSubscription(refCountSubscription)); - } - subscription.add(groupSubject.subscribe(subscriber)); - return subscription; + StaticArrayIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { + return this; }; - return GroupedObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"])); - -var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerRefCountSubscription, _super); - function InnerRefCountSubscription(parent) { - var _this = _super.call(this) || this; + StaticArrayIterator.prototype.next = function (value) { + var i = this.index++; + var array = this.array; + return i < this.length ? { value: array[i], done: false } : { value: null, done: true }; + }; + StaticArrayIterator.prototype.hasValue = function () { + return this.array.length > this.index; + }; + StaticArrayIterator.prototype.hasCompleted = function () { + return this.array.length === this.index; + }; + return StaticArrayIterator; +}()); +var ZipBufferIterator = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipBufferIterator, _super); + function ZipBufferIterator(destination, parent, observable) { + var _this = _super.call(this, destination) || this; _this.parent = parent; - parent.count++; + _this.observable = observable; + _this.stillUnsubscribed = true; + _this.buffer = []; + _this.isComplete = false; return _this; } - InnerRefCountSubscription.prototype.unsubscribe = function () { - var parent = this.parent; - if (!parent.closed && !this.closed) { - _super.prototype.unsubscribe.call(this); - parent.count -= 1; - if (parent.count === 0 && parent.attemptedToUnsubscribe) { - parent.unsubscribe(); - } + ZipBufferIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { + return this; + }; + ZipBufferIterator.prototype.next = function () { + var buffer = this.buffer; + if (buffer.length === 0 && this.isComplete) { + return { value: null, done: true }; + } + else { + return { value: buffer.shift(), done: false }; } }; - return InnerRefCountSubscription; -}(_Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"])); -//# sourceMappingURL=groupBy.js.map + ZipBufferIterator.prototype.hasValue = function () { + return this.buffer.length > 0; + }; + ZipBufferIterator.prototype.hasCompleted = function () { + return this.buffer.length === 0 && this.isComplete; + }; + ZipBufferIterator.prototype.notifyComplete = function () { + if (this.buffer.length > 0) { + this.isComplete = true; + this.parent.notifyInactive(); + } + else { + this.destination.complete(); + } + }; + ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.buffer.push(innerValue); + this.parent.checkIterators(); + }; + ZipBufferIterator.prototype.subscribe = function (value, index) { + return Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, this.observable, this, index); + }; + return ZipBufferIterator; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__["OuterSubscriber"])); +//# sourceMappingURL=zip.js.map /***/ }), -/* 192 */ +/* 241 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return BehaviorSubject; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(188); -/** PURE_IMPORTS_START tslib,_Subject,_util_ObjectUnsubscribedError PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__["audit"]; }); +/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__["auditTime"]; }); +/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(244); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__["buffer"]; }); -var BehaviorSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BehaviorSubject, _super); - function BehaviorSubject(_value) { - var _this = _super.call(this) || this; - _this._value = _value; - return _this; - } - Object.defineProperty(BehaviorSubject.prototype, "value", { - get: function () { - return this.getValue(); - }, - enumerable: true, - configurable: true - }); - BehaviorSubject.prototype._subscribe = function (subscriber) { - var subscription = _super.prototype._subscribe.call(this, subscriber); - if (subscription && !subscription.closed) { - subscriber.next(this._value); - } - return subscription; - }; - BehaviorSubject.prototype.getValue = function () { - if (this.hasError) { - throw this.thrownError; - } - else if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__["ObjectUnsubscribedError"](); - } - else { - return this._value; - } - }; - BehaviorSubject.prototype.next = function (value) { - _super.prototype.next.call(this, this._value = value); - }; - return BehaviorSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); +/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(245); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__["bufferCount"]; }); -//# sourceMappingURL=BehaviorSubject.js.map +/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(246); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__["bufferTime"]; }); +/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(247); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__["bufferToggle"]; }); -/***/ }), -/* 193 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(248); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__["bufferWhen"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return ReplaySubject; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(194); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); -/* harmony import */ var _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); -/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(188); -/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(189); -/** PURE_IMPORTS_START tslib,_Subject,_scheduler_queue,_Subscription,_operators_observeOn,_util_ObjectUnsubscribedError,_SubjectSubscription PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(249); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__["catchError"]; }); +/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(250); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__["combineAll"]; }); +/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(251); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__["combineLatest"]; }); +/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(252); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__["concat"]; }); +/* harmony import */ var _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(211); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__["concatAll"]; }); +/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(253); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__["concatMap"]; }); +/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(254); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__["concatMapTo"]; }); -var ReplaySubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ReplaySubject, _super); - function ReplaySubject(bufferSize, windowTime, scheduler) { - if (bufferSize === void 0) { - bufferSize = Number.POSITIVE_INFINITY; - } - if (windowTime === void 0) { - windowTime = Number.POSITIVE_INFINITY; - } - var _this = _super.call(this) || this; - _this.scheduler = scheduler; - _this._events = []; - _this._infiniteTimeWindow = false; - _this._bufferSize = bufferSize < 1 ? 1 : bufferSize; - _this._windowTime = windowTime < 1 ? 1 : windowTime; - if (windowTime === Number.POSITIVE_INFINITY) { - _this._infiniteTimeWindow = true; - _this.next = _this.nextInfiniteTimeWindow; - } - else { - _this.next = _this.nextTimeWindow; - } - return _this; - } - ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) { - var _events = this._events; - _events.push(value); - if (_events.length > this._bufferSize) { - _events.shift(); - } - _super.prototype.next.call(this, value); - }; - ReplaySubject.prototype.nextTimeWindow = function (value) { - this._events.push(new ReplayEvent(this._getNow(), value)); - this._trimBufferThenGetEvents(); - _super.prototype.next.call(this, value); - }; - ReplaySubject.prototype._subscribe = function (subscriber) { - var _infiniteTimeWindow = this._infiniteTimeWindow; - var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents(); - var scheduler = this.scheduler; - var len = _events.length; - var subscription; - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__["ObjectUnsubscribedError"](); - } - else if (this.isStopped || this.hasError) { - subscription = _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; - } - else { - this.observers.push(subscriber); - subscription = new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__["SubjectSubscription"](this, subscriber); - } - if (scheduler) { - subscriber.add(subscriber = new _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__["ObserveOnSubscriber"](subscriber, scheduler)); - } - if (_infiniteTimeWindow) { - for (var i = 0; i < len && !subscriber.closed; i++) { - subscriber.next(_events[i]); - } - } - else { - for (var i = 0; i < len && !subscriber.closed; i++) { - subscriber.next(_events[i].value); - } - } - if (this.hasError) { - subscriber.error(this.thrownError); - } - else if (this.isStopped) { - subscriber.complete(); - } - return subscription; - }; - ReplaySubject.prototype._getNow = function () { - return (this.scheduler || _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__["queue"]).now(); - }; - ReplaySubject.prototype._trimBufferThenGetEvents = function () { - var now = this._getNow(); - var _bufferSize = this._bufferSize; - var _windowTime = this._windowTime; - var _events = this._events; - var eventsCount = _events.length; - var spliceCount = 0; - while (spliceCount < eventsCount) { - if ((now - _events[spliceCount].time) < _windowTime) { - break; - } - spliceCount++; - } - if (eventsCount > _bufferSize) { - spliceCount = Math.max(spliceCount, eventsCount - _bufferSize); - } - if (spliceCount > 0) { - _events.splice(0, spliceCount); - } - return _events; - }; - return ReplaySubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); +/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(255); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "count", function() { return _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__["count"]; }); -var ReplayEvent = /*@__PURE__*/ (function () { - function ReplayEvent(time, value) { - this.time = time; - this.value = value; - } - return ReplayEvent; -}()); -//# sourceMappingURL=ReplaySubject.js.map +/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(256); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__["debounce"]; }); +/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(257); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__["debounceTime"]; }); -/***/ }), -/* 194 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(258); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__["defaultIfEmpty"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queue", function() { return queue; }); -/* harmony import */ var _QueueAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(195); -/* harmony import */ var _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(198); -/** PURE_IMPORTS_START _QueueAction,_QueueScheduler PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(259); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__["delay"]; }); +/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(261); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__["delayWhen"]; }); -var queue = /*@__PURE__*/ new _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__["QueueScheduler"](_QueueAction__WEBPACK_IMPORTED_MODULE_0__["QueueAction"]); -//# sourceMappingURL=queue.js.map +/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(262); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__["dematerialize"]; }); +/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(263); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__["distinct"]; }); -/***/ }), -/* 195 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(264); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__["distinctUntilChanged"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueAction", function() { return QueueAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(196); -/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(265); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__["distinctUntilKeyChanged"]; }); +/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(266); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__["elementAt"]; }); -var QueueAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueAction, _super); - function QueueAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - return _this; - } - QueueAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay > 0) { - return _super.prototype.schedule.call(this, state, delay); - } - this.delay = delay; - this.state = state; - this.scheduler.flush(this); - return this; - }; - QueueAction.prototype.execute = function (state, delay) { - return (delay > 0 || this.closed) ? - _super.prototype.execute.call(this, state, delay) : - this._execute(state, delay); - }; - QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); - } - return scheduler.flush(this); - }; - return QueueAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); +/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(269); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__["endWith"]; }); -//# sourceMappingURL=QueueAction.js.map +/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(270); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "every", function() { return _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__["every"]; }); +/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(271); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__["exhaust"]; }); -/***/ }), -/* 196 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(272); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__["exhaustMap"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncAction", function() { return AsyncAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(197); -/** PURE_IMPORTS_START tslib,_Action PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(273); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__["expand"]; }); +/* harmony import */ var _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(235); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__["filter"]; }); -var AsyncAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncAction, _super); - function AsyncAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - _this.pending = false; - return _this; - } - AsyncAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - if (this.closed) { - return this; - } - this.state = state; - var id = this.id; - var scheduler = this.scheduler; - if (id != null) { - this.id = this.recycleAsyncId(scheduler, id, delay); - } - this.pending = true; - this.delay = delay; - this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); - return this; - }; - AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - return setInterval(scheduler.flush.bind(scheduler, this), delay); - }; - AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay !== null && this.delay === delay && this.pending === false) { - return id; - } - clearInterval(id); - return undefined; - }; - AsyncAction.prototype.execute = function (state, delay) { - if (this.closed) { - return new Error('executing a cancelled action'); - } - this.pending = false; - var error = this._execute(state, delay); - if (error) { - return error; - } - else if (this.pending === false && this.id != null) { - this.id = this.recycleAsyncId(this.scheduler, this.id, null); - } - }; - AsyncAction.prototype._execute = function (state, delay) { - var errored = false; - var errorValue = undefined; - try { - this.work(state); - } - catch (e) { - errored = true; - errorValue = !!e && e || new Error(e); - } - if (errored) { - this.unsubscribe(); - return errorValue; - } - }; - AsyncAction.prototype._unsubscribe = function () { - var id = this.id; - var scheduler = this.scheduler; - var actions = scheduler.actions; - var index = actions.indexOf(this); - this.work = null; - this.state = null; - this.pending = false; - this.scheduler = null; - if (index !== -1) { - actions.splice(index, 1); - } - if (id != null) { - this.id = this.recycleAsyncId(scheduler, id, null); - } - this.delay = null; - }; - return AsyncAction; -}(_Action__WEBPACK_IMPORTED_MODULE_1__["Action"])); +/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(274); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__["finalize"]; }); -//# sourceMappingURL=AsyncAction.js.map +/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(275); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "find", function() { return _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__["find"]; }); +/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(276); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__["findIndex"]; }); -/***/ }), -/* 197 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(277); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__["first"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Action", function() { return Action; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(162); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__["groupBy"]; }); +/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(278); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__["ignoreElements"]; }); -var Action = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Action, _super); - function Action(scheduler, work) { - return _super.call(this) || this; - } - Action.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - return this; - }; - return Action; -}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); +/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(279); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__["isEmpty"]; }); -//# sourceMappingURL=Action.js.map +/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(280); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__["last"]; }); +/* harmony import */ var _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(197); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__["map"]; }); -/***/ }), -/* 198 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(282); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__["mapTo"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueScheduler", function() { return QueueScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(283); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__["materialize"]; }); +/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(284); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__["max"]; }); -var QueueScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueScheduler, _super); - function QueueScheduler() { - return _super !== null && _super.apply(this, arguments) || this; - } - return QueueScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); +/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(287); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__["merge"]; }); -//# sourceMappingURL=QueueScheduler.js.map +/* harmony import */ var _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(212); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__["mergeAll"]; }); +/* harmony import */ var _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(213); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -/***/ }), -/* 199 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncScheduler", function() { return AsyncScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Scheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); -/** PURE_IMPORTS_START tslib,_Scheduler PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(288); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); +/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(289); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); -var AsyncScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncScheduler, _super); - function AsyncScheduler(SchedulerAction, now) { - if (now === void 0) { - now = _Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"].now; - } - var _this = _super.call(this, SchedulerAction, function () { - if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) { - return AsyncScheduler.delegate.now(); - } - else { - return now(); - } - }) || this; - _this.actions = []; - _this.active = false; - _this.scheduled = undefined; - return _this; - } - AsyncScheduler.prototype.schedule = function (work, delay, state) { - if (delay === void 0) { - delay = 0; - } - if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) { - return AsyncScheduler.delegate.schedule(work, delay, state); - } - else { - return _super.prototype.schedule.call(this, work, delay, state); - } - }; - AsyncScheduler.prototype.flush = function (action) { - var actions = this.actions; - if (this.active) { - actions.push(action); - return; - } - var error; - this.active = true; - do { - if (error = action.execute(action.state, action.delay)) { - break; - } - } while (action = actions.shift()); - this.active = false; - if (error) { - while (action = actions.shift()) { - action.unsubscribe(); - } - throw error; - } - }; - return AsyncScheduler; -}(_Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"])); +/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(290); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); -//# sourceMappingURL=AsyncScheduler.js.map +/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(291); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); +/* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(172); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); -/***/ }), -/* 200 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(292); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return Scheduler; }); -var Scheduler = /*@__PURE__*/ (function () { - function Scheduler(SchedulerAction, now) { - if (now === void 0) { - now = Scheduler.now; - } - this.SchedulerAction = SchedulerAction; - this.now = now; - } - Scheduler.prototype.schedule = function (work, delay, state) { - if (delay === void 0) { - delay = 0; - } - return new this.SchedulerAction(this, work).schedule(state, delay); - }; - Scheduler.now = function () { return Date.now(); }; - return Scheduler; -}()); +/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(293); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); -//# sourceMappingURL=Scheduler.js.map +/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(294); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); +/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(295); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); -/***/ }), -/* 201 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(296); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return observeOn; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnOperator", function() { return ObserveOnOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnSubscriber", function() { return ObserveOnSubscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnMessage", function() { return ObserveOnMessage; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(297); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); +/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(298); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); +/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(299); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); -function observeOn(scheduler, delay) { - if (delay === void 0) { - delay = 0; - } - return function observeOnOperatorFunction(source) { - return source.lift(new ObserveOnOperator(scheduler, delay)); - }; -} -var ObserveOnOperator = /*@__PURE__*/ (function () { - function ObserveOnOperator(scheduler, delay) { - if (delay === void 0) { - delay = 0; - } - this.scheduler = scheduler; - this.delay = delay; - } - ObserveOnOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); - }; - return ObserveOnOperator; -}()); +/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(300); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); -var ObserveOnSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ObserveOnSubscriber, _super); - function ObserveOnSubscriber(destination, scheduler, delay) { - if (delay === void 0) { - delay = 0; - } - var _this = _super.call(this, destination) || this; - _this.scheduler = scheduler; - _this.delay = delay; - return _this; - } - ObserveOnSubscriber.dispatch = function (arg) { - var notification = arg.notification, destination = arg.destination; - notification.observe(destination); - this.unsubscribe(); - }; - ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { - var destination = this.destination; - destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination))); - }; - ObserveOnSubscriber.prototype._next = function (value) { - this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); - }; - ObserveOnSubscriber.prototype._error = function (err) { - this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); - this.unsubscribe(); - }; - ObserveOnSubscriber.prototype._complete = function () { - this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); - this.unsubscribe(); - }; - return ObserveOnSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(285); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); -var ObserveOnMessage = /*@__PURE__*/ (function () { - function ObserveOnMessage(notification, destination) { - this.notification = notification; - this.destination = destination; - } - return ObserveOnMessage; -}()); +/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(301); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); -//# sourceMappingURL=observeOn.js.map +/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(302); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); +/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(303); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); -/***/ }), -/* 202 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(304); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return NotificationKind; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return Notification; }); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(203); -/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(204); -/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(209); -/** PURE_IMPORTS_START _observable_empty,_observable_of,_observable_throwError PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(161); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); +/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(305); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); +/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(306); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); -var NotificationKind; -/*@__PURE__*/ (function (NotificationKind) { - NotificationKind["NEXT"] = "N"; - NotificationKind["ERROR"] = "E"; - NotificationKind["COMPLETE"] = "C"; -})(NotificationKind || (NotificationKind = {})); -var Notification = /*@__PURE__*/ (function () { - function Notification(kind, value, error) { - this.kind = kind; - this.value = value; - this.error = error; - this.hasValue = kind === 'N'; - } - Notification.prototype.observe = function (observer) { - switch (this.kind) { - case 'N': - return observer.next && observer.next(this.value); - case 'E': - return observer.error && observer.error(this.error); - case 'C': - return observer.complete && observer.complete(); - } - }; - Notification.prototype.do = function (next, error, complete) { - var kind = this.kind; - switch (kind) { - case 'N': - return next && next(this.value); - case 'E': - return error && error(this.error); - case 'C': - return complete && complete(); - } - }; - Notification.prototype.accept = function (nextOrObserver, error, complete) { - if (nextOrObserver && typeof nextOrObserver.next === 'function') { - return this.observe(nextOrObserver); - } - else { - return this.do(nextOrObserver, error, complete); - } - }; - Notification.prototype.toObservable = function () { - var kind = this.kind; - switch (kind) { - case 'N': - return Object(_observable_of__WEBPACK_IMPORTED_MODULE_1__["of"])(this.value); - case 'E': - return Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_2__["throwError"])(this.error); - case 'C': - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_0__["empty"])(); - } - throw new Error('unexpected notification kind value'); - }; - Notification.createNext = function (value) { - if (typeof value !== 'undefined') { - return new Notification('N', value); - } - return Notification.undefinedValueNotification; - }; - Notification.createError = function (err) { - return new Notification('E', undefined, err); - }; - Notification.createComplete = function () { - return Notification.completeNotification; - }; - Notification.completeNotification = new Notification('C'); - Notification.undefinedValueNotification = new Notification('N', undefined); - return Notification; -}()); +/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(286); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); -//# sourceMappingURL=Notification.js.map +/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(307); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); +/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(308); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); -/***/ }), -/* 203 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(309); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return EMPTY; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(310); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); -var EMPTY = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.complete(); }); -function empty(scheduler) { - return scheduler ? emptyScheduled(scheduler) : EMPTY; -} -function emptyScheduled(scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); }); -} -//# sourceMappingURL=empty.js.map +/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(311); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); +/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(312); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); -/***/ }), -/* 204 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(313); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "of", function() { return of; }); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(205); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); -/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(208); -/** PURE_IMPORTS_START _util_isScheduler,_fromArray,_scheduled_scheduleArray PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(314); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); +/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(315); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); +/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(316); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); -function of() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var scheduler = args[args.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_0__["isScheduler"])(scheduler)) { - args.pop(); - return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(args, scheduler); - } - else { - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(args); - } -} -//# sourceMappingURL=of.js.map +/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(318); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); +/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(319); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); -/***/ }), -/* 205 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(320); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isScheduler", function() { return isScheduler; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isScheduler(value) { - return value && typeof value.schedule === 'function'; -} -//# sourceMappingURL=isScheduler.js.map +/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(268); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); +/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(281); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); -/***/ }), -/* 206 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(321); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromArray", function() { return fromArray; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(207); -/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(208); -/** PURE_IMPORTS_START _Observable,_util_subscribeToArray,_scheduled_scheduleArray PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(322); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); +/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(323); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); +/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(324); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); -function fromArray(input, scheduler) { - if (!scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__["subscribeToArray"])(input)); - } - else { - return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); - } -} -//# sourceMappingURL=fromArray.js.map +/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(325); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); +/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(267); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); -/***/ }), -/* 207 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(326); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); + +/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(327); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); + +/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(328); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); + +/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(329); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); + +/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(330); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); + +/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(331); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); + +/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(332); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); + +/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(333); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); + +/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(334); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); + +/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(335); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); + +/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(336); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); + +/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(337); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); + +/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(338); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToArray", function() { return subscribeToArray; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ -var subscribeToArray = function (array) { - return function (subscriber) { - for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) { - subscriber.next(array[i]); - } - subscriber.complete(); - }; -}; -//# sourceMappingURL=subscribeToArray.js.map -/***/ }), -/* 208 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleArray", function() { return scheduleArray; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ -function scheduleArray(input, scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var i = 0; - sub.add(scheduler.schedule(function () { - if (i === input.length) { - subscriber.complete(); - return; - } - subscriber.next(input[i++]); - if (!subscriber.closed) { - sub.add(this.schedule()); - } - })); - return sub; - }); -} -//# sourceMappingURL=scheduleArray.js.map -/***/ }), -/* 209 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return throwError; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ -function throwError(error, scheduler) { - if (!scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.error(error); }); - } - else { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); }); - } -} -function dispatch(_a) { - var error = _a.error, subscriber = _a.subscriber; - subscriber.error(error); -} -//# sourceMappingURL=throwError.js.map -/***/ }), -/* 210 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return AsyncSubject; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subject,_Subscription PURE_IMPORTS_END */ -var AsyncSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncSubject, _super); - function AsyncSubject() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.value = null; - _this.hasNext = false; - _this.hasCompleted = false; - return _this; - } - AsyncSubject.prototype._subscribe = function (subscriber) { - if (this.hasError) { - subscriber.error(this.thrownError); - return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; - } - else if (this.hasCompleted && this.hasNext) { - subscriber.next(this.value); - subscriber.complete(); - return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; - } - return _super.prototype._subscribe.call(this, subscriber); - }; - AsyncSubject.prototype.next = function (value) { - if (!this.hasCompleted) { - this.value = value; - this.hasNext = true; - } - }; - AsyncSubject.prototype.error = function (error) { - if (!this.hasCompleted) { - _super.prototype.error.call(this, error); - } - }; - AsyncSubject.prototype.complete = function () { - this.hasCompleted = true; - if (this.hasNext) { - _super.prototype.next.call(this, this.value); - } - _super.prototype.complete.call(this); - }; - return AsyncSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -//# sourceMappingURL=AsyncSubject.js.map -/***/ }), -/* 211 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asap", function() { return asap; }); -/* harmony import */ var _AsapAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(212); -/* harmony import */ var _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); -/** PURE_IMPORTS_START _AsapAction,_AsapScheduler PURE_IMPORTS_END */ -var asap = /*@__PURE__*/ new _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__["AsapScheduler"](_AsapAction__WEBPACK_IMPORTED_MODULE_0__["AsapAction"]); -//# sourceMappingURL=asap.js.map -/***/ }), -/* 212 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapAction", function() { return AsapAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_Immediate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(213); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(196); -/** PURE_IMPORTS_START tslib,_util_Immediate,_AsyncAction PURE_IMPORTS_END */ -var AsapAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapAction, _super); - function AsapAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - return _this; - } - AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay !== null && delay > 0) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); - } - scheduler.actions.push(this); - return scheduler.scheduled || (scheduler.scheduled = _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].setImmediate(scheduler.flush.bind(scheduler, null))); - }; - AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); - } - if (scheduler.actions.length === 0) { - _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].clearImmediate(id); - scheduler.scheduled = undefined; - } - return undefined; - }; - return AsapAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_2__["AsyncAction"])); -//# sourceMappingURL=AsapAction.js.map -/***/ }), -/* 213 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Immediate", function() { return Immediate; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var nextHandle = 1; -var tasksByHandle = {}; -function runIfPresent(handle) { - var cb = tasksByHandle[handle]; - if (cb) { - cb(); - } -} -var Immediate = { - setImmediate: function (cb) { - var handle = nextHandle++; - tasksByHandle[handle] = cb; - Promise.resolve().then(function () { return runIfPresent(handle); }); - return handle; - }, - clearImmediate: function (handle) { - delete tasksByHandle[handle]; - }, -}; -//# sourceMappingURL=Immediate.js.map -/***/ }), -/* 214 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapScheduler", function() { return AsapScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ -var AsapScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapScheduler, _super); - function AsapScheduler() { - return _super !== null && _super.apply(this, arguments) || this; - } - AsapScheduler.prototype.flush = function (action) { - this.active = true; - this.scheduled = undefined; - var actions = this.actions; - var error; - var index = -1; - var count = actions.length; - action = action || actions.shift(); - do { - if (error = action.execute(action.state, action.delay)) { - break; - } - } while (++index < count && (action = actions.shift())); - this.active = false; - if (error) { - while (++index < count && (action = actions.shift())) { - action.unsubscribe(); - } - throw error; - } - }; - return AsapScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); -//# sourceMappingURL=AsapScheduler.js.map -/***/ }), -/* 215 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "async", function() { return async; }); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(196); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/** PURE_IMPORTS_START _AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ -var async = /*@__PURE__*/ new _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"](_AsyncAction__WEBPACK_IMPORTED_MODULE_0__["AsyncAction"]); -//# sourceMappingURL=async.js.map -/***/ }), -/* 216 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animationFrame", function() { return animationFrame; }); -/* harmony import */ var _AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(217); -/* harmony import */ var _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(218); -/** PURE_IMPORTS_START _AnimationFrameAction,_AnimationFrameScheduler PURE_IMPORTS_END */ -var animationFrame = /*@__PURE__*/ new _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__["AnimationFrameScheduler"](_AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__["AnimationFrameAction"]); -//# sourceMappingURL=animationFrame.js.map -/***/ }), -/* 217 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameAction", function() { return AnimationFrameAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(196); -/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ -var AnimationFrameAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameAction, _super); - function AnimationFrameAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - return _this; - } - AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay !== null && delay > 0) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); - } - scheduler.actions.push(this); - return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); })); - }; - AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); - } - if (scheduler.actions.length === 0) { - cancelAnimationFrame(id); - scheduler.scheduled = undefined; - } - return undefined; - }; - return AnimationFrameAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); -//# sourceMappingURL=AnimationFrameAction.js.map -/***/ }), -/* 218 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameScheduler", function() { return AnimationFrameScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ -var AnimationFrameScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameScheduler, _super); - function AnimationFrameScheduler() { - return _super !== null && _super.apply(this, arguments) || this; - } - AnimationFrameScheduler.prototype.flush = function (action) { - this.active = true; - this.scheduled = undefined; - var actions = this.actions; - var error; - var index = -1; - var count = actions.length; - action = action || actions.shift(); - do { - if (error = action.execute(action.state, action.delay)) { - break; - } - } while (++index < count && (action = actions.shift())); - this.active = false; - if (error) { - while (++index < count && (action = actions.shift())) { - action.unsubscribe(); - } - throw error; - } - }; - return AnimationFrameScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); -//# sourceMappingURL=AnimationFrameScheduler.js.map + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//# sourceMappingURL=index.js.map /***/ }), -/* 219 */ +/* 242 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return VirtualTimeScheduler; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return VirtualAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(196); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return audit; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -var VirtualTimeScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualTimeScheduler, _super); - function VirtualTimeScheduler(SchedulerAction, maxFrames) { - if (SchedulerAction === void 0) { - SchedulerAction = VirtualAction; - } - if (maxFrames === void 0) { - maxFrames = Number.POSITIVE_INFINITY; - } - var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this; - _this.maxFrames = maxFrames; - _this.frame = 0; - _this.index = -1; - return _this; +function audit(durationSelector) { + return function auditOperatorFunction(source) { + return source.lift(new AuditOperator(durationSelector)); + }; +} +var AuditOperator = /*@__PURE__*/ (function () { + function AuditOperator(durationSelector) { + this.durationSelector = durationSelector; } - VirtualTimeScheduler.prototype.flush = function () { - var _a = this, actions = _a.actions, maxFrames = _a.maxFrames; - var error, action; - while ((action = actions[0]) && action.delay <= maxFrames) { - actions.shift(); - this.frame = action.delay; - if (error = action.execute(action.state, action.delay)) { - break; - } - } - if (error) { - while (action = actions.shift()) { - action.unsubscribe(); - } - throw error; - } + AuditOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector)); }; - VirtualTimeScheduler.frameTimeFactor = 10; - return VirtualTimeScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__["AsyncScheduler"])); - -var VirtualAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualAction, _super); - function VirtualAction(scheduler, work, index) { - if (index === void 0) { - index = scheduler.index += 1; - } - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - _this.index = index; - _this.active = true; - _this.index = scheduler.index = index; + return AuditOperator; +}()); +var AuditSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AuditSubscriber, _super); + function AuditSubscriber(destination, durationSelector) { + var _this = _super.call(this, destination) || this; + _this.durationSelector = durationSelector; + _this.hasValue = false; return _this; } - VirtualAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - if (!this.id) { - return _super.prototype.schedule.call(this, state, delay); - } - this.active = false; - var action = new VirtualAction(this.scheduler, this.work); - this.add(action); - return action.schedule(state, delay); - }; - VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - this.delay = scheduler.frame + delay; - var actions = scheduler.actions; - actions.push(this); - actions.sort(VirtualAction.sortActions); - return true; - }; - VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - return undefined; - }; - VirtualAction.prototype._execute = function (state, delay) { - if (this.active === true) { - return _super.prototype._execute.call(this, state, delay); - } - }; - VirtualAction.sortActions = function (a, b) { - if (a.delay === b.delay) { - if (a.index === b.index) { - return 0; + AuditSubscriber.prototype._next = function (value) { + this.value = value; + this.hasValue = true; + if (!this.throttled) { + var duration = void 0; + try { + var durationSelector = this.durationSelector; + duration = durationSelector(value); } - else if (a.index > b.index) { - return 1; + catch (err) { + return this.destination.error(err); + } + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); + if (!innerSubscription || innerSubscription.closed) { + this.clearThrottle(); } else { - return -1; + this.add(this.throttled = innerSubscription); } } - else if (a.delay > b.delay) { - return 1; + }; + AuditSubscriber.prototype.clearThrottle = function () { + var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled; + if (throttled) { + this.remove(throttled); + this.throttled = null; + throttled.unsubscribe(); } - else { - return -1; + if (hasValue) { + this.value = null; + this.hasValue = false; + this.destination.next(value); } }; - return VirtualAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); - -//# sourceMappingURL=VirtualTimeScheduler.js.map + AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { + this.clearThrottle(); + }; + AuditSubscriber.prototype.notifyComplete = function () { + this.clearThrottle(); + }; + return AuditSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=audit.js.map /***/ }), -/* 220 */ +/* 243 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function identity(x) { - return x; -} -//# sourceMappingURL=identity.js.map - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(242); +/* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(238); +/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ -/***/ }), -/* 221 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return isObservable; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ -function isObservable(obj) { - return !!obj && (obj instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"] || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function')); +function auditTime(duration, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return Object(_audit__WEBPACK_IMPORTED_MODULE_1__["audit"])(function () { return Object(_observable_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(duration, scheduler); }); } -//# sourceMappingURL=isObservable.js.map +//# sourceMappingURL=auditTime.js.map /***/ }), -/* 222 */ +/* 244 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return ArgumentOutOfRangeError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var ArgumentOutOfRangeErrorImpl = /*@__PURE__*/ (function () { - function ArgumentOutOfRangeErrorImpl() { - Error.call(this); - this.message = 'argument out of range'; - this.name = 'ArgumentOutOfRangeError'; - return this; - } - ArgumentOutOfRangeErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return ArgumentOutOfRangeErrorImpl; -})(); -var ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl; -//# sourceMappingURL=ArgumentOutOfRangeError.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return buffer; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -/***/ }), -/* 223 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return EmptyError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var EmptyErrorImpl = /*@__PURE__*/ (function () { - function EmptyErrorImpl() { - Error.call(this); - this.message = 'no elements in sequence'; - this.name = 'EmptyError'; - return this; +function buffer(closingNotifier) { + return function bufferOperatorFunction(source) { + return source.lift(new BufferOperator(closingNotifier)); + }; +} +var BufferOperator = /*@__PURE__*/ (function () { + function BufferOperator(closingNotifier) { + this.closingNotifier = closingNotifier; } - EmptyErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return EmptyErrorImpl; -})(); -var EmptyError = EmptyErrorImpl; -//# sourceMappingURL=EmptyError.js.map - - -/***/ }), -/* 224 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return TimeoutError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var TimeoutErrorImpl = /*@__PURE__*/ (function () { - function TimeoutErrorImpl() { - Error.call(this); - this.message = 'Timeout has occurred'; - this.name = 'TimeoutError'; - return this; + BufferOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); + }; + return BufferOperator; +}()); +var BufferSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSubscriber, _super); + function BufferSubscriber(destination, closingNotifier) { + var _this = _super.call(this, destination) || this; + _this.buffer = []; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, closingNotifier)); + return _this; } - TimeoutErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return TimeoutErrorImpl; -})(); -var TimeoutError = TimeoutErrorImpl; -//# sourceMappingURL=TimeoutError.js.map + BufferSubscriber.prototype._next = function (value) { + this.buffer.push(value); + }; + BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var buffer = this.buffer; + this.buffer = []; + this.destination.next(buffer); + }; + return BufferSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=buffer.js.map /***/ }), -/* 225 */ +/* 245 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return bindCallback; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(210); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(226); -/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(178); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(205); -/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isArray,_util_isScheduler PURE_IMPORTS_END */ - - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return bufferCount; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function bindCallback(callbackFunc, resultSelector, scheduler) { - if (resultSelector) { - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(resultSelector)) { - scheduler = resultSelector; - } - else { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_4__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - }; - } +function bufferCount(bufferSize, startBufferEvery) { + if (startBufferEvery === void 0) { + startBufferEvery = null; } - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var context = this; - var subject; - var params = { - context: context, - subject: subject, - callbackFunc: callbackFunc, - scheduler: scheduler, - }; - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - if (!scheduler) { - if (!subject) { - subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); - subject.complete(); - }; - try { - callbackFunc.apply(context, args.concat([handler])); - } - catch (err) { - if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { - subject.error(err); - } - else { - console.warn(err); - } - } - } - return subject.subscribe(subscriber); - } - else { - var state = { - args: args, subscriber: subscriber, params: params, - }; - return scheduler.schedule(dispatch, 0, state); - } - }); + return function bufferCountOperatorFunction(source) { + return source.lift(new BufferCountOperator(bufferSize, startBufferEvery)); }; } -function dispatch(state) { - var _this = this; - var self = this; - var args = state.args, subscriber = state.subscriber, params = state.params; - var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler; - var subject = params.subject; - if (!subject) { - subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; - _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); - }; - try { - callbackFunc.apply(context, args.concat([handler])); +var BufferCountOperator = /*@__PURE__*/ (function () { + function BufferCountOperator(bufferSize, startBufferEvery) { + this.bufferSize = bufferSize; + this.startBufferEvery = startBufferEvery; + if (!startBufferEvery || bufferSize === startBufferEvery) { + this.subscriberClass = BufferCountSubscriber; } - catch (err) { - subject.error(err); + else { + this.subscriberClass = BufferSkipCountSubscriber; } } - this.add(subject.subscribe(subscriber)); -} -function dispatchNext(state) { - var value = state.value, subject = state.subject; - subject.next(value); - subject.complete(); -} -function dispatchError(state) { - var err = state.err, subject = state.subject; - subject.error(err); -} -//# sourceMappingURL=bindCallback.js.map - - -/***/ }), -/* 226 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MapOperator", function() { return MapOperator; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -function map(project, thisArg) { - return function mapOperation(source) { - if (typeof project !== 'function') { - throw new TypeError('argument is not a function. Are you looking for `mapTo()`?'); - } - return source.lift(new MapOperator(project, thisArg)); + BufferCountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); }; -} -var MapOperator = /*@__PURE__*/ (function () { - function MapOperator(project, thisArg) { - this.project = project; - this.thisArg = thisArg; + return BufferCountOperator; +}()); +var BufferCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferCountSubscriber, _super); + function BufferCountSubscriber(destination, bufferSize) { + var _this = _super.call(this, destination) || this; + _this.bufferSize = bufferSize; + _this.buffer = []; + return _this; } - MapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg)); + BufferCountSubscriber.prototype._next = function (value) { + var buffer = this.buffer; + buffer.push(value); + if (buffer.length == this.bufferSize) { + this.destination.next(buffer); + this.buffer = []; + } }; - return MapOperator; -}()); - -var MapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapSubscriber, _super); - function MapSubscriber(destination, project, thisArg) { + BufferCountSubscriber.prototype._complete = function () { + var buffer = this.buffer; + if (buffer.length > 0) { + this.destination.next(buffer); + } + _super.prototype._complete.call(this); + }; + return BufferCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSkipCountSubscriber, _super); + function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) { var _this = _super.call(this, destination) || this; - _this.project = project; + _this.bufferSize = bufferSize; + _this.startBufferEvery = startBufferEvery; + _this.buffers = []; _this.count = 0; - _this.thisArg = thisArg || _this; return _this; } - MapSubscriber.prototype._next = function (value) { - var result; - try { - result = this.project.call(this.thisArg, value, this.count++); + BufferSkipCountSubscriber.prototype._next = function (value) { + var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count; + this.count++; + if (count % startBufferEvery === 0) { + buffers.push([]); } - catch (err) { - this.destination.error(err); - return; + for (var i = buffers.length; i--;) { + var buffer = buffers[i]; + buffer.push(value); + if (buffer.length === bufferSize) { + buffers.splice(i, 1); + this.destination.next(buffer); + } } - this.destination.next(result); }; - return MapSubscriber; + BufferSkipCountSubscriber.prototype._complete = function () { + var _a = this, buffers = _a.buffers, destination = _a.destination; + while (buffers.length > 0) { + var buffer = buffers.shift(); + if (buffer.length > 0) { + destination.next(buffer); + } + } + _super.prototype._complete.call(this); + }; + return BufferSkipCountSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=map.js.map +//# sourceMappingURL=bufferCount.js.map /***/ }), -/* 227 */ +/* 246 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return bindNodeCallback; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(210); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(226); -/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(205); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(178); -/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isScheduler,_util_isArray PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return bufferTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(176); +/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */ -function bindNodeCallback(callbackFunc, resultSelector, scheduler) { - if (resultSelector) { - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_4__["isScheduler"])(resultSelector)) { - scheduler = resultSelector; - } - else { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_5__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - }; - } +function bufferTime(bufferTimeSpan) { + var length = arguments.length; + var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(arguments[arguments.length - 1])) { + scheduler = arguments[arguments.length - 1]; + length--; } - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var params = { - subject: undefined, - args: args, - callbackFunc: callbackFunc, - scheduler: scheduler, - context: this, - }; - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var context = params.context; - var subject = params.subject; - if (!scheduler) { - if (!subject) { - subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - var err = innerArgs.shift(); - if (err) { - subject.error(err); - return; - } - subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); - subject.complete(); - }; - try { - callbackFunc.apply(context, args.concat([handler])); - } - catch (err) { - if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { - subject.error(err); - } - else { - console.warn(err); - } - } - } - return subject.subscribe(subscriber); - } - else { - return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context }); - } - }); + var bufferCreationInterval = null; + if (length >= 2) { + bufferCreationInterval = arguments[1]; + } + var maxBufferSize = Number.POSITIVE_INFINITY; + if (length >= 3) { + maxBufferSize = arguments[2]; + } + return function bufferTimeOperatorFunction(source) { + return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler)); }; } -function dispatch(state) { - var _this = this; - var params = state.params, subscriber = state.subscriber, context = state.context; - var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler; - var subject = params.subject; - if (!subject) { - subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - var err = innerArgs.shift(); - if (err) { - _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); - } - else { - var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; - _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); +var BufferTimeOperator = /*@__PURE__*/ (function () { + function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { + this.bufferTimeSpan = bufferTimeSpan; + this.bufferCreationInterval = bufferCreationInterval; + this.maxBufferSize = maxBufferSize; + this.scheduler = scheduler; + } + BufferTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler)); + }; + return BufferTimeOperator; +}()); +var Context = /*@__PURE__*/ (function () { + function Context() { + this.buffer = []; + } + return Context; +}()); +var BufferTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferTimeSubscriber, _super); + function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { + var _this = _super.call(this, destination) || this; + _this.bufferTimeSpan = bufferTimeSpan; + _this.bufferCreationInterval = bufferCreationInterval; + _this.maxBufferSize = maxBufferSize; + _this.scheduler = scheduler; + _this.contexts = []; + var context = _this.openContext(); + _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0; + if (_this.timespanOnly) { + var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan }; + _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); + } + else { + var closeState = { subscriber: _this, context: context }; + var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler }; + _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState)); + _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState)); + } + return _this; + } + BufferTimeSubscriber.prototype._next = function (value) { + var contexts = this.contexts; + var len = contexts.length; + var filledBufferContext; + for (var i = 0; i < len; i++) { + var context_1 = contexts[i]; + var buffer = context_1.buffer; + buffer.push(value); + if (buffer.length == this.maxBufferSize) { + filledBufferContext = context_1; } - }; - try { - callbackFunc.apply(context, args.concat([handler])); } - catch (err) { - this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); + if (filledBufferContext) { + this.onBufferFull(filledBufferContext); + } + }; + BufferTimeSubscriber.prototype._error = function (err) { + this.contexts.length = 0; + _super.prototype._error.call(this, err); + }; + BufferTimeSubscriber.prototype._complete = function () { + var _a = this, contexts = _a.contexts, destination = _a.destination; + while (contexts.length > 0) { + var context_2 = contexts.shift(); + destination.next(context_2.buffer); + } + _super.prototype._complete.call(this); + }; + BufferTimeSubscriber.prototype._unsubscribe = function () { + this.contexts = null; + }; + BufferTimeSubscriber.prototype.onBufferFull = function (context) { + this.closeContext(context); + var closeAction = context.closeAction; + closeAction.unsubscribe(); + this.remove(closeAction); + if (!this.closed && this.timespanOnly) { + context = this.openContext(); + var bufferTimeSpan = this.bufferTimeSpan; + var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan }; + this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); + } + }; + BufferTimeSubscriber.prototype.openContext = function () { + var context = new Context(); + this.contexts.push(context); + return context; + }; + BufferTimeSubscriber.prototype.closeContext = function (context) { + this.destination.next(context.buffer); + var contexts = this.contexts; + var spliceIndex = contexts ? contexts.indexOf(context) : -1; + if (spliceIndex >= 0) { + contexts.splice(contexts.indexOf(context), 1); } + }; + return BufferTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); +function dispatchBufferTimeSpanOnly(state) { + var subscriber = state.subscriber; + var prevContext = state.context; + if (prevContext) { + subscriber.closeContext(prevContext); + } + if (!subscriber.closed) { + state.context = subscriber.openContext(); + state.context.closeAction = this.schedule(state, state.bufferTimeSpan); } - this.add(subject.subscribe(subscriber)); } -function dispatchNext(arg) { - var value = arg.value, subject = arg.subject; - subject.next(value); - subject.complete(); +function dispatchBufferCreation(state) { + var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler; + var context = subscriber.openContext(); + var action = this; + if (!subscriber.closed) { + subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context })); + action.schedule(state, bufferCreationInterval); + } } -function dispatchError(arg) { - var err = arg.err, subject = arg.subject; - subject.error(err); +function dispatchBufferClose(arg) { + var subscriber = arg.subscriber, context = arg.context; + subscriber.closeContext(context); } -//# sourceMappingURL=bindNodeCallback.js.map +//# sourceMappingURL=bufferTime.js.map /***/ }), -/* 228 */ +/* 247 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestOperator", function() { return CombineLatestOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestSubscriber", function() { return CombineLatestSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(205); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(206); -/** PURE_IMPORTS_START tslib,_util_isScheduler,_util_isArray,_OuterSubscriber,_util_subscribeToResult,_fromArray PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return bufferToggle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */ -var NONE = {}; -function combineLatest() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var resultSelector = null; - var scheduler = null; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(observables[observables.length - 1])) { - scheduler = observables.pop(); - } - if (typeof observables[observables.length - 1] === 'function') { - resultSelector = observables.pop(); - } - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(observables[0])) { - observables = observables[0]; - } - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_5__["fromArray"])(observables, scheduler).lift(new CombineLatestOperator(resultSelector)); +function bufferToggle(openings, closingSelector) { + return function bufferToggleOperatorFunction(source) { + return source.lift(new BufferToggleOperator(openings, closingSelector)); + }; } -var CombineLatestOperator = /*@__PURE__*/ (function () { - function CombineLatestOperator(resultSelector) { - this.resultSelector = resultSelector; +var BufferToggleOperator = /*@__PURE__*/ (function () { + function BufferToggleOperator(openings, closingSelector) { + this.openings = openings; + this.closingSelector = closingSelector; } - CombineLatestOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector)); + BufferToggleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector)); }; - return CombineLatestOperator; + return BufferToggleOperator; }()); - -var CombineLatestSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CombineLatestSubscriber, _super); - function CombineLatestSubscriber(destination, resultSelector) { +var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferToggleSubscriber, _super); + function BufferToggleSubscriber(destination, openings, closingSelector) { var _this = _super.call(this, destination) || this; - _this.resultSelector = resultSelector; - _this.active = 0; - _this.values = []; - _this.observables = []; + _this.openings = openings; + _this.closingSelector = closingSelector; + _this.contexts = []; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, openings)); return _this; } - CombineLatestSubscriber.prototype._next = function (observable) { - this.values.push(NONE); - this.observables.push(observable); - }; - CombineLatestSubscriber.prototype._complete = function () { - var observables = this.observables; - var len = observables.length; - if (len === 0) { - this.destination.complete(); - } - else { - this.active = len; - this.toRespond = len; - for (var i = 0; i < len; i++) { - var observable = observables[i]; - this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i)); - } + BufferToggleSubscriber.prototype._next = function (value) { + var contexts = this.contexts; + var len = contexts.length; + for (var i = 0; i < len; i++) { + contexts[i].buffer.push(value); } }; - CombineLatestSubscriber.prototype.notifyComplete = function (unused) { - if ((this.active -= 1) === 0) { - this.destination.complete(); + BufferToggleSubscriber.prototype._error = function (err) { + var contexts = this.contexts; + while (contexts.length > 0) { + var context_1 = contexts.shift(); + context_1.subscription.unsubscribe(); + context_1.buffer = null; + context_1.subscription = null; } + this.contexts = null; + _super.prototype._error.call(this, err); }; - CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var values = this.values; - var oldVal = values[outerIndex]; - var toRespond = !this.toRespond - ? 0 - : oldVal === NONE ? --this.toRespond : this.toRespond; - values[outerIndex] = innerValue; - if (toRespond === 0) { - if (this.resultSelector) { - this._tryResultSelector(values); - } - else { - this.destination.next(values.slice()); - } + BufferToggleSubscriber.prototype._complete = function () { + var contexts = this.contexts; + while (contexts.length > 0) { + var context_2 = contexts.shift(); + this.destination.next(context_2.buffer); + context_2.subscription.unsubscribe(); + context_2.buffer = null; + context_2.subscription = null; } + this.contexts = null; + _super.prototype._complete.call(this); }; - CombineLatestSubscriber.prototype._tryResultSelector = function (values) { - var result; + BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue); + }; + BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) { + this.closeBuffer(innerSub.context); + }; + BufferToggleSubscriber.prototype.openBuffer = function (value) { try { - result = this.resultSelector.apply(this, values); + var closingSelector = this.closingSelector; + var closingNotifier = closingSelector.call(this, value); + if (closingNotifier) { + this.trySubscribe(closingNotifier); + } } catch (err) { - this.destination.error(err); - return; + this._error(err); } - this.destination.next(result); }; - return CombineLatestSubscriber; + BufferToggleSubscriber.prototype.closeBuffer = function (context) { + var contexts = this.contexts; + if (contexts && context) { + var buffer = context.buffer, subscription = context.subscription; + this.destination.next(buffer); + contexts.splice(contexts.indexOf(context), 1); + this.remove(subscription); + subscription.unsubscribe(); + } + }; + BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) { + var contexts = this.contexts; + var buffer = []; + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var context = { buffer: buffer, subscription: subscription }; + contexts.push(context); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, closingNotifier, context); + if (!innerSubscription || innerSubscription.closed) { + this.closeBuffer(context); + } + else { + innerSubscription.context = context; + this.add(innerSubscription); + subscription.add(innerSubscription); + } + }; + return BufferToggleSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); - -//# sourceMappingURL=combineLatest.js.map +//# sourceMappingURL=bufferToggle.js.map /***/ }), -/* 229 */ +/* 248 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OuterSubscriber", function() { return OuterSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return bufferWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -var OuterSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OuterSubscriber, _super); - function OuterSubscriber() { - return _super !== null && _super.apply(this, arguments) || this; + + +function bufferWhen(closingSelector) { + return function (source) { + return source.lift(new BufferWhenOperator(closingSelector)); + }; +} +var BufferWhenOperator = /*@__PURE__*/ (function () { + function BufferWhenOperator(closingSelector) { + this.closingSelector = closingSelector; } - OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); + BufferWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); }; - OuterSubscriber.prototype.notifyError = function (error, innerSub) { - this.destination.error(error); + return BufferWhenOperator; +}()); +var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferWhenSubscriber, _super); + function BufferWhenSubscriber(destination, closingSelector) { + var _this = _super.call(this, destination) || this; + _this.closingSelector = closingSelector; + _this.subscribing = false; + _this.openBuffer(); + return _this; + } + BufferWhenSubscriber.prototype._next = function (value) { + this.buffer.push(value); }; - OuterSubscriber.prototype.notifyComplete = function (innerSub) { - this.destination.complete(); + BufferWhenSubscriber.prototype._complete = function () { + var buffer = this.buffer; + if (buffer) { + this.destination.next(buffer); + } + _super.prototype._complete.call(this); }; - return OuterSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -//# sourceMappingURL=OuterSubscriber.js.map + BufferWhenSubscriber.prototype._unsubscribe = function () { + this.buffer = null; + this.subscribing = false; + }; + BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openBuffer(); + }; + BufferWhenSubscriber.prototype.notifyComplete = function () { + if (this.subscribing) { + this.complete(); + } + else { + this.openBuffer(); + } + }; + BufferWhenSubscriber.prototype.openBuffer = function () { + var closingSubscription = this.closingSubscription; + if (closingSubscription) { + this.remove(closingSubscription); + closingSubscription.unsubscribe(); + } + var buffer = this.buffer; + if (this.buffer) { + this.destination.next(buffer); + } + this.buffer = []; + var closingNotifier; + try { + var closingSelector = this.closingSelector; + closingNotifier = closingSelector(); + } + catch (err) { + return this.error(err); + } + closingSubscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + this.closingSubscription = closingSubscription; + this.add(closingSubscription); + this.subscribing = true; + closingSubscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); + this.subscribing = false; + }; + return BufferWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=bufferWhen.js.map /***/ }), -/* 230 */ +/* 249 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToResult", function() { return subscribeToResult; }); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(231); -/* harmony import */ var _subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); -/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo,_Observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return catchError; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { - if (destination === void 0) { - destination = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__["InnerSubscriber"](outerSubscriber, outerValue, outerIndex); - } - if (destination.closed) { - return undefined; + +function catchError(selector) { + return function catchErrorOperatorFunction(source) { + var operator = new CatchOperator(selector); + var caught = source.lift(operator); + return (operator.caught = caught); + }; +} +var CatchOperator = /*@__PURE__*/ (function () { + function CatchOperator(selector) { + this.selector = selector; } - if (result instanceof _Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"]) { - return result.subscribe(destination); + CatchOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); + }; + return CatchOperator; +}()); +var CatchSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CatchSubscriber, _super); + function CatchSubscriber(destination, selector, caught) { + var _this = _super.call(this, destination) || this; + _this.selector = selector; + _this.caught = caught; + return _this; } - return Object(_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(result)(destination); -} -//# sourceMappingURL=subscribeToResult.js.map + CatchSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var result = void 0; + try { + result = this.selector(err, this.caught); + } + catch (err2) { + _super.prototype.error.call(this, err2); + return; + } + this._unsubscribeAndRecycle(); + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + this.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, undefined, undefined, innerSubscriber); + } + }; + return CatchSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=catchError.js.map /***/ }), -/* 231 */ +/* 250 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InnerSubscriber", function() { return InnerSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return combineAll; }); +/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(199); +/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */ - -var InnerSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerSubscriber, _super); - function InnerSubscriber(parent, outerValue, outerIndex) { - var _this = _super.call(this) || this; - _this.parent = parent; - _this.outerValue = outerValue; - _this.outerIndex = outerIndex; - _this.index = 0; - return _this; - } - InnerSubscriber.prototype._next = function (value) { - this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this); - }; - InnerSubscriber.prototype._error = function (error) { - this.parent.notifyError(error, this); - this.unsubscribe(); - }; - InnerSubscriber.prototype._complete = function () { - this.parent.notifyComplete(this); - this.unsubscribe(); - }; - return InnerSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -//# sourceMappingURL=InnerSubscriber.js.map +function combineAll(project) { + return function (source) { return source.lift(new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__["CombineLatestOperator"](project)); }; +} +//# sourceMappingURL=combineAll.js.map /***/ }), -/* 232 */ +/* 251 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeTo", function() { return subscribeTo; }); -/* harmony import */ var _subscribeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(207); -/* harmony import */ var _subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(233); -/* harmony import */ var _subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(234); -/* harmony import */ var _subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(236); -/* harmony import */ var _isArrayLike__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(237); -/* harmony import */ var _isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(238); -/* harmony import */ var _isObject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(179); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(235); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(183); -/** PURE_IMPORTS_START _subscribeToArray,_subscribeToPromise,_subscribeToIterable,_subscribeToObservable,_isArrayLike,_isPromise,_isObject,_symbol_iterator,_symbol_observable PURE_IMPORTS_END */ - - - - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(149); +/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(214); +/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */ -var subscribeTo = function (result) { - if (!!result && typeof result[_symbol_observable__WEBPACK_IMPORTED_MODULE_8__["observable"]] === 'function') { - return Object(_subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__["subscribeToObservable"])(result); - } - else if (Object(_isArrayLike__WEBPACK_IMPORTED_MODULE_4__["isArrayLike"])(result)) { - return Object(_subscribeToArray__WEBPACK_IMPORTED_MODULE_0__["subscribeToArray"])(result); - } - else if (Object(_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(result)) { - return Object(_subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__["subscribeToPromise"])(result); +var none = {}; +function combineLatest() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - else if (!!result && typeof result[_symbol_iterator__WEBPACK_IMPORTED_MODULE_7__["iterator"]] === 'function') { - return Object(_subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__["subscribeToIterable"])(result); + var project = null; + if (typeof observables[observables.length - 1] === 'function') { + project = observables.pop(); } - else { - var value = Object(_isObject__WEBPACK_IMPORTED_MODULE_6__["isObject"])(result) ? 'an invalid object' : "'" + result + "'"; - var msg = "You provided " + value + " where a stream was expected." - + ' You can provide an Observable, Promise, Array, or Iterable.'; - throw new TypeError(msg); + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { + observables = observables[0].slice(); } -}; -//# sourceMappingURL=subscribeTo.js.map + return function (source) { return source.lift.call(Object(_observable_from__WEBPACK_IMPORTED_MODULE_2__["from"])([source].concat(observables)), new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__["CombineLatestOperator"](project)); }; +} +//# sourceMappingURL=combineLatest.js.map /***/ }), -/* 233 */ +/* 252 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToPromise", function() { return subscribeToPromise; }); -/* harmony import */ var _hostReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(176); -/** PURE_IMPORTS_START _hostReportError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(210); +/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */ -var subscribeToPromise = function (promise) { - return function (subscriber) { - promise.then(function (value) { - if (!subscriber.closed) { - subscriber.next(value); - subscriber.complete(); - } - }, function (err) { return subscriber.error(err); }) - .then(null, _hostReportError__WEBPACK_IMPORTED_MODULE_0__["hostReportError"]); - return subscriber; - }; -}; -//# sourceMappingURL=subscribeToPromise.js.map +function concat() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return function (source) { return source.lift.call(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"].apply(void 0, [source].concat(observables))); }; +} +//# sourceMappingURL=concat.js.map /***/ }), -/* 234 */ +/* 253 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToIterable", function() { return subscribeToIterable; }); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); -/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return concatMap; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(213); +/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ -var subscribeToIterable = function (iterable) { - return function (subscriber) { - var iterator = iterable[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]](); - do { - var item = iterator.next(); - if (item.done) { - subscriber.complete(); - break; - } - subscriber.next(item.value); - if (subscriber.closed) { - break; - } - } while (true); - if (typeof iterator.return === 'function') { - subscriber.add(function () { - if (iterator.return) { - iterator.return(); - } - }); - } - return subscriber; - }; -}; -//# sourceMappingURL=subscribeToIterable.js.map +function concatMap(project, resultSelector) { + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(project, resultSelector, 1); +} +//# sourceMappingURL=concatMap.js.map /***/ }), -/* 235 */ +/* 254 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSymbolIterator", function() { return getSymbolIterator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iterator", function() { return iterator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$iterator", function() { return $$iterator; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function getSymbolIterator() { - if (typeof Symbol !== 'function' || !Symbol.iterator) { - return '@@iterator'; - } - return Symbol.iterator; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); +/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(253); +/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ + +function concatMapTo(innerObservable, resultSelector) { + return Object(_concatMap__WEBPACK_IMPORTED_MODULE_0__["concatMap"])(function () { return innerObservable; }, resultSelector); } -var iterator = /*@__PURE__*/ getSymbolIterator(); -var $$iterator = iterator; -//# sourceMappingURL=iterator.js.map +//# sourceMappingURL=concatMapTo.js.map /***/ }), -/* 236 */ +/* 255 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToObservable", function() { return subscribeToObservable; }); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(183); -/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "count", function() { return count; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -var subscribeToObservable = function (obj) { - return function (subscriber) { - var obs = obj[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]](); - if (typeof obs.subscribe !== 'function') { - throw new TypeError('Provided object does not correctly implement Symbol.observable'); + +function count(predicate) { + return function (source) { return source.lift(new CountOperator(predicate, source)); }; +} +var CountOperator = /*@__PURE__*/ (function () { + function CountOperator(predicate, source) { + this.predicate = predicate; + this.source = source; + } + CountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source)); + }; + return CountOperator; +}()); +var CountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountSubscriber, _super); + function CountSubscriber(destination, predicate, source) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.source = source; + _this.count = 0; + _this.index = 0; + return _this; + } + CountSubscriber.prototype._next = function (value) { + if (this.predicate) { + this._tryPredicate(value); } else { - return obs.subscribe(subscriber); + this.count++; } }; -}; -//# sourceMappingURL=subscribeToObservable.js.map + CountSubscriber.prototype._tryPredicate = function (value) { + var result; + try { + result = this.predicate(value, this.index++, this.source); + } + catch (err) { + this.destination.error(err); + return; + } + if (result) { + this.count++; + } + }; + CountSubscriber.prototype._complete = function () { + this.destination.next(this.count); + this.destination.complete(); + }; + return CountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=count.js.map /***/ }), -/* 237 */ +/* 256 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArrayLike", function() { return isArrayLike; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; }); -//# sourceMappingURL=isArrayLike.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return debounce; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -/***/ }), -/* 238 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPromise", function() { return isPromise; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isPromise(value) { - return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; +function debounce(durationSelector) { + return function (source) { return source.lift(new DebounceOperator(durationSelector)); }; } -//# sourceMappingURL=isPromise.js.map +var DebounceOperator = /*@__PURE__*/ (function () { + function DebounceOperator(durationSelector) { + this.durationSelector = durationSelector; + } + DebounceOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector)); + }; + return DebounceOperator; +}()); +var DebounceSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceSubscriber, _super); + function DebounceSubscriber(destination, durationSelector) { + var _this = _super.call(this, destination) || this; + _this.durationSelector = durationSelector; + _this.hasValue = false; + _this.durationSubscription = null; + return _this; + } + DebounceSubscriber.prototype._next = function (value) { + try { + var result = this.durationSelector.call(this, value); + if (result) { + this._tryNext(value, result); + } + } + catch (err) { + this.destination.error(err); + } + }; + DebounceSubscriber.prototype._complete = function () { + this.emitValue(); + this.destination.complete(); + }; + DebounceSubscriber.prototype._tryNext = function (value, duration) { + var subscription = this.durationSubscription; + this.value = value; + this.hasValue = true; + if (subscription) { + subscription.unsubscribe(); + this.remove(subscription); + } + subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); + if (subscription && !subscription.closed) { + this.add(this.durationSubscription = subscription); + } + }; + DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.emitValue(); + }; + DebounceSubscriber.prototype.notifyComplete = function () { + this.emitValue(); + }; + DebounceSubscriber.prototype.emitValue = function () { + if (this.hasValue) { + var value = this.value; + var subscription = this.durationSubscription; + if (subscription) { + this.durationSubscription = null; + subscription.unsubscribe(); + this.remove(subscription); + } + this.value = null; + this.hasValue = false; + _super.prototype._next.call(this, value); + } + }; + return DebounceSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=debounce.js.map /***/ }), -/* 239 */ +/* 257 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); -/* harmony import */ var _of__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(204); -/* harmony import */ var _operators_concatAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(240); -/** PURE_IMPORTS_START _of,_operators_concatAll PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return debounceTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(186); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ -function concat() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; + +function debounceTime(dueTime, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; } - return Object(_operators_concatAll__WEBPACK_IMPORTED_MODULE_1__["concatAll"])()(_of__WEBPACK_IMPORTED_MODULE_0__["of"].apply(void 0, observables)); + return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); }; } -//# sourceMappingURL=concat.js.map - - -/***/ }), -/* 240 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return concatAll; }); -/* harmony import */ var _mergeAll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(241); -/** PURE_IMPORTS_START _mergeAll PURE_IMPORTS_END */ - -function concatAll() { - return Object(_mergeAll__WEBPACK_IMPORTED_MODULE_0__["mergeAll"])(1); +var DebounceTimeOperator = /*@__PURE__*/ (function () { + function DebounceTimeOperator(dueTime, scheduler) { + this.dueTime = dueTime; + this.scheduler = scheduler; + } + DebounceTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); + }; + return DebounceTimeOperator; +}()); +var DebounceTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceTimeSubscriber, _super); + function DebounceTimeSubscriber(destination, dueTime, scheduler) { + var _this = _super.call(this, destination) || this; + _this.dueTime = dueTime; + _this.scheduler = scheduler; + _this.debouncedSubscription = null; + _this.lastValue = null; + _this.hasValue = false; + return _this; + } + DebounceTimeSubscriber.prototype._next = function (value) { + this.clearDebounce(); + this.lastValue = value; + this.hasValue = true; + this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this)); + }; + DebounceTimeSubscriber.prototype._complete = function () { + this.debouncedNext(); + this.destination.complete(); + }; + DebounceTimeSubscriber.prototype.debouncedNext = function () { + this.clearDebounce(); + if (this.hasValue) { + var lastValue = this.lastValue; + this.lastValue = null; + this.hasValue = false; + this.destination.next(lastValue); + } + }; + DebounceTimeSubscriber.prototype.clearDebounce = function () { + var debouncedSubscription = this.debouncedSubscription; + if (debouncedSubscription !== null) { + this.remove(debouncedSubscription); + debouncedSubscription.unsubscribe(); + this.debouncedSubscription = null; + } + }; + return DebounceTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNext(subscriber) { + subscriber.debouncedNext(); } -//# sourceMappingURL=concatAll.js.map +//# sourceMappingURL=debounceTime.js.map /***/ }), -/* 241 */ +/* 258 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return mergeAll; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(220); -/** PURE_IMPORTS_START _mergeMap,_util_identity PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return defaultIfEmpty; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function mergeAll(concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; +function defaultIfEmpty(defaultValue) { + if (defaultValue === void 0) { + defaultValue = null; } - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"], concurrent); + return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); }; } -//# sourceMappingURL=mergeAll.js.map +var DefaultIfEmptyOperator = /*@__PURE__*/ (function () { + function DefaultIfEmptyOperator(defaultValue) { + this.defaultValue = defaultValue; + } + DefaultIfEmptyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue)); + }; + return DefaultIfEmptyOperator; +}()); +var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DefaultIfEmptySubscriber, _super); + function DefaultIfEmptySubscriber(destination, defaultValue) { + var _this = _super.call(this, destination) || this; + _this.defaultValue = defaultValue; + _this.isEmpty = true; + return _this; + } + DefaultIfEmptySubscriber.prototype._next = function (value) { + this.isEmpty = false; + this.destination.next(value); + }; + DefaultIfEmptySubscriber.prototype._complete = function () { + if (this.isEmpty) { + this.destination.next(this.defaultValue); + } + this.destination.complete(); + }; + return DefaultIfEmptySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=defaultIfEmpty.js.map /***/ }), -/* 242 */ +/* 259 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return mergeMap; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapOperator", function() { return MergeMapOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapSubscriber", function() { return MergeMapSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(230); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(231); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(226); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); -/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber,_map,_observable_from PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(260); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(143); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(173); +/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ -function mergeMap(project, resultSelector, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - if (typeof resultSelector === 'function') { - return function (source) { return source.pipe(mergeMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); }; - } - else if (typeof resultSelector === 'number') { - concurrent = resultSelector; +function delay(delay, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; } - return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); }; + var absoluteDelay = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(delay); + var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay); + return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); }; } -var MergeMapOperator = /*@__PURE__*/ (function () { - function MergeMapOperator(project, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - this.project = project; - this.concurrent = concurrent; +var DelayOperator = /*@__PURE__*/ (function () { + function DelayOperator(delay, scheduler) { + this.delay = delay; + this.scheduler = scheduler; } - MergeMapOperator.prototype.call = function (observer, source) { - return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent)); + DelayOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); }; - return MergeMapOperator; + return DelayOperator; }()); - -var MergeMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeMapSubscriber, _super); - function MergeMapSubscriber(destination, project, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } +var DelaySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelaySubscriber, _super); + function DelaySubscriber(destination, delay, scheduler) { var _this = _super.call(this, destination) || this; - _this.project = project; - _this.concurrent = concurrent; - _this.hasCompleted = false; - _this.buffer = []; - _this.active = 0; - _this.index = 0; + _this.delay = delay; + _this.scheduler = scheduler; + _this.queue = []; + _this.active = false; + _this.errored = false; return _this; } - MergeMapSubscriber.prototype._next = function (value) { - if (this.active < this.concurrent) { - this._tryNext(value); + DelaySubscriber.dispatch = function (state) { + var source = state.source; + var queue = source.queue; + var scheduler = state.scheduler; + var destination = state.destination; + while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) { + queue.shift().notification.observe(destination); + } + if (queue.length > 0) { + var delay_1 = Math.max(0, queue[0].time - scheduler.now()); + this.schedule(state, delay_1); } else { - this.buffer.push(value); + this.unsubscribe(); + source.active = false; } }; - MergeMapSubscriber.prototype._tryNext = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (err) { - this.destination.error(err); + DelaySubscriber.prototype._schedule = function (scheduler) { + this.active = true; + var destination = this.destination; + destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { + source: this, destination: this.destination, scheduler: scheduler + })); + }; + DelaySubscriber.prototype.scheduleNotification = function (notification) { + if (this.errored === true) { return; } - this.active++; - this._innerSub(result, value, index); + var scheduler = this.scheduler; + var message = new DelayMessage(scheduler.now() + this.delay, notification); + this.queue.push(message); + if (this.active === false) { + this._schedule(scheduler); + } }; - MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); + DelaySubscriber.prototype._next = function (value) { + this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createNext(value)); }; - MergeMapSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - this.destination.complete(); - } + DelaySubscriber.prototype._error = function (err) { + this.errored = true; + this.queue = []; + this.destination.error(err); this.unsubscribe(); }; - MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); - }; - MergeMapSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - this.remove(innerSub); - this.active--; - if (buffer.length > 0) { - this._next(buffer.shift()); - } - else if (this.active === 0 && this.hasCompleted) { - this.destination.complete(); - } + DelaySubscriber.prototype._complete = function () { + this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createComplete()); + this.unsubscribe(); }; - return MergeMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); - -//# sourceMappingURL=mergeMap.js.map + return DelaySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +var DelayMessage = /*@__PURE__*/ (function () { + function DelayMessage(time, notification) { + this.time = time; + this.notification = notification; + } + return DelayMessage; +}()); +//# sourceMappingURL=delay.js.map /***/ }), -/* 243 */ +/* 260 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "from", function() { return from; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); -/* harmony import */ var _scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(244); -/** PURE_IMPORTS_START _Observable,_util_subscribeTo,_scheduled_scheduled PURE_IMPORTS_END */ - - - -function from(input, scheduler) { - if (!scheduler) { - if (input instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { - return input; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(input)); - } - else { - return Object(_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__["scheduled"])(input, scheduler); - } +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return isDate; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isDate(value) { + return value instanceof Date && !isNaN(+value); } -//# sourceMappingURL=from.js.map +//# sourceMappingURL=isDate.js.map /***/ }), -/* 244 */ +/* 261 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return scheduled; }); -/* harmony import */ var _scheduleObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(245); -/* harmony import */ var _schedulePromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(246); -/* harmony import */ var _scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(208); -/* harmony import */ var _scheduleIterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(247); -/* harmony import */ var _util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(248); -/* harmony import */ var _util_isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(238); -/* harmony import */ var _util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(237); -/* harmony import */ var _util_isIterable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(249); -/** PURE_IMPORTS_START _scheduleObservable,_schedulePromise,_scheduleArray,_scheduleIterable,_util_isInteropObservable,_util_isPromise,_util_isArrayLike,_util_isIterable PURE_IMPORTS_END */ - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return delayWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(141); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function scheduled(input, scheduler) { - if (input != null) { - if (Object(_util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__["isInteropObservable"])(input)) { - return Object(_scheduleObservable__WEBPACK_IMPORTED_MODULE_0__["scheduleObservable"])(input, scheduler); +function delayWhen(delayDurationSelector, subscriptionDelay) { + if (subscriptionDelay) { + return function (source) { + return new SubscriptionDelayObservable(source, subscriptionDelay) + .lift(new DelayWhenOperator(delayDurationSelector)); + }; + } + return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); }; +} +var DelayWhenOperator = /*@__PURE__*/ (function () { + function DelayWhenOperator(delayDurationSelector) { + this.delayDurationSelector = delayDurationSelector; + } + DelayWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector)); + }; + return DelayWhenOperator; +}()); +var DelayWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelayWhenSubscriber, _super); + function DelayWhenSubscriber(destination, delayDurationSelector) { + var _this = _super.call(this, destination) || this; + _this.delayDurationSelector = delayDurationSelector; + _this.completed = false; + _this.delayNotifierSubscriptions = []; + _this.index = 0; + return _this; + } + DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(outerValue); + this.removeSubscription(innerSub); + this.tryComplete(); + }; + DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); + }; + DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) { + var value = this.removeSubscription(innerSub); + if (value) { + this.destination.next(value); } - else if (Object(_util_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(input)) { - return Object(_schedulePromise__WEBPACK_IMPORTED_MODULE_1__["schedulePromise"])(input, scheduler); + this.tryComplete(); + }; + DelayWhenSubscriber.prototype._next = function (value) { + var index = this.index++; + try { + var delayNotifier = this.delayDurationSelector(value, index); + if (delayNotifier) { + this.tryDelay(delayNotifier, value); + } } - else if (Object(_util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__["isArrayLike"])(input)) { - return Object(_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); + catch (err) { + this.destination.error(err); } - else if (Object(_util_isIterable__WEBPACK_IMPORTED_MODULE_7__["isIterable"])(input) || typeof input === 'string') { - return Object(_scheduleIterable__WEBPACK_IMPORTED_MODULE_3__["scheduleIterable"])(input, scheduler); + }; + DelayWhenSubscriber.prototype._complete = function () { + this.completed = true; + this.tryComplete(); + this.unsubscribe(); + }; + DelayWhenSubscriber.prototype.removeSubscription = function (subscription) { + subscription.unsubscribe(); + var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription); + if (subscriptionIdx !== -1) { + this.delayNotifierSubscriptions.splice(subscriptionIdx, 1); + } + return subscription.outerValue; + }; + DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) { + var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, delayNotifier, value); + if (notifierSubscription && !notifierSubscription.closed) { + var destination = this.destination; + destination.add(notifierSubscription); + this.delayNotifierSubscriptions.push(notifierSubscription); + } + }; + DelayWhenSubscriber.prototype.tryComplete = function () { + if (this.completed && this.delayNotifierSubscriptions.length === 0) { + this.destination.complete(); } + }; + return DelayWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +var SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelayObservable, _super); + function SubscriptionDelayObservable(source, subscriptionDelay) { + var _this = _super.call(this) || this; + _this.source = source; + _this.subscriptionDelay = subscriptionDelay; + return _this; } - throw new TypeError((input !== null && typeof input || input) + ' is not observable'); -} -//# sourceMappingURL=scheduled.js.map + SubscriptionDelayObservable.prototype._subscribe = function (subscriber) { + this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source)); + }; + return SubscriptionDelayObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); +var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelaySubscriber, _super); + function SubscriptionDelaySubscriber(parent, source) { + var _this = _super.call(this) || this; + _this.parent = parent; + _this.source = source; + _this.sourceSubscribed = false; + return _this; + } + SubscriptionDelaySubscriber.prototype._next = function (unused) { + this.subscribeToSource(); + }; + SubscriptionDelaySubscriber.prototype._error = function (err) { + this.unsubscribe(); + this.parent.error(err); + }; + SubscriptionDelaySubscriber.prototype._complete = function () { + this.unsubscribe(); + this.subscribeToSource(); + }; + SubscriptionDelaySubscriber.prototype.subscribeToSource = function () { + if (!this.sourceSubscribed) { + this.sourceSubscribed = true; + this.unsubscribe(); + this.source.subscribe(this.parent); + } + }; + return SubscriptionDelaySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=delayWhen.js.map /***/ }), -/* 245 */ +/* 262 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleObservable", function() { return scheduleObservable; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); -/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_observable PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return dematerialize; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function scheduleObservable(input, scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - sub.add(scheduler.schedule(function () { - var observable = input[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]](); - sub.add(observable.subscribe({ - next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); }, - error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); }, - complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); }, - })); - })); - return sub; - }); +function dematerialize() { + return function dematerializeOperatorFunction(source) { + return source.lift(new DeMaterializeOperator()); + }; } -//# sourceMappingURL=scheduleObservable.js.map +var DeMaterializeOperator = /*@__PURE__*/ (function () { + function DeMaterializeOperator() { + } + DeMaterializeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DeMaterializeSubscriber(subscriber)); + }; + return DeMaterializeOperator; +}()); +var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DeMaterializeSubscriber, _super); + function DeMaterializeSubscriber(destination) { + return _super.call(this, destination) || this; + } + DeMaterializeSubscriber.prototype._next = function (value) { + value.observe(this.destination); + }; + return DeMaterializeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=dematerialize.js.map /***/ }), -/* 246 */ +/* 263 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "schedulePromise", function() { return schedulePromise; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return distinct; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DistinctSubscriber", function() { return DistinctSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function schedulePromise(input, scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - sub.add(scheduler.schedule(function () { - return input.then(function (value) { - sub.add(scheduler.schedule(function () { - subscriber.next(value); - sub.add(scheduler.schedule(function () { return subscriber.complete(); })); - })); - }, function (err) { - sub.add(scheduler.schedule(function () { return subscriber.error(err); })); - }); - })); - return sub; - }); + +function distinct(keySelector, flushes) { + return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); }; } -//# sourceMappingURL=schedulePromise.js.map +var DistinctOperator = /*@__PURE__*/ (function () { + function DistinctOperator(keySelector, flushes) { + this.keySelector = keySelector; + this.flushes = flushes; + } + DistinctOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes)); + }; + return DistinctOperator; +}()); +var DistinctSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctSubscriber, _super); + function DistinctSubscriber(destination, keySelector, flushes) { + var _this = _super.call(this, destination) || this; + _this.keySelector = keySelector; + _this.values = new Set(); + if (flushes) { + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, flushes)); + } + return _this; + } + DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values.clear(); + }; + DistinctSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); + }; + DistinctSubscriber.prototype._next = function (value) { + if (this.keySelector) { + this._useKeySelector(value); + } + else { + this._finalizeNext(value, value); + } + }; + DistinctSubscriber.prototype._useKeySelector = function (value) { + var key; + var destination = this.destination; + try { + key = this.keySelector(value); + } + catch (err) { + destination.error(err); + return; + } + this._finalizeNext(key, value); + }; + DistinctSubscriber.prototype._finalizeNext = function (key, value) { + var values = this.values; + if (!values.has(key)) { + values.add(key); + this.destination.next(value); + } + }; + return DistinctSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); + +//# sourceMappingURL=distinct.js.map /***/ }), -/* 247 */ +/* 264 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleIterable", function() { return scheduleIterable; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(235); -/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_iterator PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return distinctUntilChanged; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function scheduleIterable(input, scheduler) { - if (!input) { - throw new Error('Iterable cannot be null'); +function distinctUntilChanged(compare, keySelector) { + return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; +} +var DistinctUntilChangedOperator = /*@__PURE__*/ (function () { + function DistinctUntilChangedOperator(compare, keySelector) { + this.compare = compare; + this.keySelector = keySelector; } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var iterator; - sub.add(function () { - if (iterator && typeof iterator.return === 'function') { - iterator.return(); + DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); + }; + return DistinctUntilChangedOperator; +}()); +var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctUntilChangedSubscriber, _super); + function DistinctUntilChangedSubscriber(destination, compare, keySelector) { + var _this = _super.call(this, destination) || this; + _this.keySelector = keySelector; + _this.hasKey = false; + if (typeof compare === 'function') { + _this.compare = compare; + } + return _this; + } + DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { + return x === y; + }; + DistinctUntilChangedSubscriber.prototype._next = function (value) { + var key; + try { + var keySelector = this.keySelector; + key = keySelector ? keySelector(value) : value; + } + catch (err) { + return this.destination.error(err); + } + var result = false; + if (this.hasKey) { + try { + var compare = this.compare; + result = compare(this.key, key); } - }); - sub.add(scheduler.schedule(function () { - iterator = input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__["iterator"]](); - sub.add(scheduler.schedule(function () { - if (subscriber.closed) { - return; - } - var value; - var done; - try { - var result = iterator.next(); - value = result.value; - done = result.done; - } - catch (err) { - subscriber.error(err); - return; - } - if (done) { - subscriber.complete(); - } - else { - subscriber.next(value); - this.schedule(); - } - })); - })); - return sub; - }); -} -//# sourceMappingURL=scheduleIterable.js.map + catch (err) { + return this.destination.error(err); + } + } + else { + this.hasKey = true; + } + if (!result) { + this.key = key; + this.destination.next(value); + } + }; + return DistinctUntilChangedSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=distinctUntilChanged.js.map /***/ }), -/* 248 */ +/* 265 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInteropObservable", function() { return isInteropObservable; }); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(183); -/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); +/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(264); +/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ -function isInteropObservable(input) { - return input && typeof input[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]] === 'function'; +function distinctUntilKeyChanged(key, compare) { + return Object(_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__["distinctUntilChanged"])(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; }); } -//# sourceMappingURL=isInteropObservable.js.map +//# sourceMappingURL=distinctUntilKeyChanged.js.map /***/ }), -/* 249 */ +/* 266 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIterable", function() { return isIterable; }); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); -/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; }); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(267); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(258); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(268); +/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ -function isIterable(input) { - return input && typeof input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]] === 'function'; + + + + +function elementAt(index, defaultValue) { + if (index < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); + } + var hasDefaultValue = arguments.length >= 2; + return function (source) { + return source.pipe(Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return i === index; }), Object(_take__WEBPACK_IMPORTED_MODULE_4__["take"])(1), hasDefaultValue + ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) + : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__["throwIfEmpty"])(function () { return new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); })); + }; } -//# sourceMappingURL=isIterable.js.map +//# sourceMappingURL=elementAt.js.map /***/ }), -/* 250 */ +/* 267 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return defer; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(203); -/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return throwIfEmpty; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(194); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_util_EmptyError,_Subscriber PURE_IMPORTS_END */ -function defer(observableFactory) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var input; - try { - input = observableFactory(); +function throwIfEmpty(errorFactory) { + if (errorFactory === void 0) { + errorFactory = defaultErrorFactory; + } + return function (source) { + return source.lift(new ThrowIfEmptyOperator(errorFactory)); + }; +} +var ThrowIfEmptyOperator = /*@__PURE__*/ (function () { + function ThrowIfEmptyOperator(errorFactory) { + this.errorFactory = errorFactory; + } + ThrowIfEmptyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory)); + }; + return ThrowIfEmptyOperator; +}()); +var ThrowIfEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrowIfEmptySubscriber, _super); + function ThrowIfEmptySubscriber(destination, errorFactory) { + var _this = _super.call(this, destination) || this; + _this.errorFactory = errorFactory; + _this.hasValue = false; + return _this; + } + ThrowIfEmptySubscriber.prototype._next = function (value) { + this.hasValue = true; + this.destination.next(value); + }; + ThrowIfEmptySubscriber.prototype._complete = function () { + if (!this.hasValue) { + var err = void 0; + try { + err = this.errorFactory(); + } + catch (e) { + err = e; + } + this.destination.error(err); } - catch (err) { - subscriber.error(err); - return undefined; + else { + return this.destination.complete(); } - var source = input ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(input) : Object(_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); - return source.subscribe(subscriber); - }); + }; + return ThrowIfEmptySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); +function defaultErrorFactory() { + return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__["EmptyError"](); } -//# sourceMappingURL=defer.js.map +//# sourceMappingURL=throwIfEmpty.js.map /***/ }), -/* 251 */ +/* 268 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return forkJoin; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(226); -/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(179); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(243); -/** PURE_IMPORTS_START _Observable,_util_isArray,_operators_map,_util_isObject,_from PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "take", function() { return take; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(193); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(174); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ -function forkJoin() { - var sources = []; - for (var _i = 0; _i < arguments.length; _i++) { - sources[_i] = arguments[_i]; - } - if (sources.length === 1) { - var first_1 = sources[0]; - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(first_1)) { - return forkJoinInternal(first_1, null); +function take(count) { + return function (source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); } - if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_3__["isObject"])(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) { - var keys = Object.keys(first_1); - return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys); + else { + return source.lift(new TakeOperator(count)); } - } - if (typeof sources[sources.length - 1] === 'function') { - var resultSelector_1 = sources.pop(); - sources = (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(sources[0])) ? sources[0] : sources; - return forkJoinInternal(sources, null).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return resultSelector_1.apply(void 0, args); })); - } - return forkJoinInternal(sources, null); + }; } -function forkJoinInternal(sources, keys) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var len = sources.length; - if (len === 0) { - subscriber.complete(); - return; +var TakeOperator = /*@__PURE__*/ (function () { + function TakeOperator(total) { + this.total = total; + if (this.total < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; } - var values = new Array(len); - var completed = 0; - var emitted = 0; - var _loop_1 = function (i) { - var source = Object(_from__WEBPACK_IMPORTED_MODULE_4__["from"])(sources[i]); - var hasValue = false; - subscriber.add(source.subscribe({ - next: function (value) { - if (!hasValue) { - hasValue = true; - emitted++; - } - values[i] = value; - }, - error: function (err) { return subscriber.error(err); }, - complete: function () { - completed++; - if (completed === len || !hasValue) { - if (emitted === len) { - subscriber.next(keys ? - keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) : - values); - } - subscriber.complete(); - } - } - })); - }; - for (var i = 0; i < len; i++) { - _loop_1(i); + } + TakeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeSubscriber(subscriber, this.total)); + }; + return TakeOperator; +}()); +var TakeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeSubscriber, _super); + function TakeSubscriber(destination, total) { + var _this = _super.call(this, destination) || this; + _this.total = total; + _this.count = 0; + return _this; + } + TakeSubscriber.prototype._next = function (value) { + var total = this.total; + var count = ++this.count; + if (count <= total) { + this.destination.next(value); + if (count === total) { + this.destination.complete(); + this.unsubscribe(); + } } - }); -} -//# sourceMappingURL=forkJoin.js.map + }; + return TakeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=take.js.map /***/ }), -/* 252 */ +/* 269 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return fromEvent; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(226); -/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return endWith; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(210); +/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(175); +/** PURE_IMPORTS_START _observable_concat,_observable_of PURE_IMPORTS_END */ -var toString = /*@__PURE__*/ (function () { return Object.prototype.toString; })(); -function fromEvent(target, eventName, options, resultSelector) { - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(options)) { - resultSelector = options; - options = undefined; - } - if (resultSelector) { - return fromEvent(target, eventName, options).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - function handler(e) { - if (arguments.length > 1) { - subscriber.next(Array.prototype.slice.call(arguments)); - } - else { - subscriber.next(e); - } - } - setupSubscription(target, eventName, handler, subscriber, options); - }); -} -function setupSubscription(sourceObj, eventName, handler, subscriber, options) { - var unsubscribe; - if (isEventTarget(sourceObj)) { - var source_1 = sourceObj; - sourceObj.addEventListener(eventName, handler, options); - unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); }; - } - else if (isJQueryStyleEventEmitter(sourceObj)) { - var source_2 = sourceObj; - sourceObj.on(eventName, handler); - unsubscribe = function () { return source_2.off(eventName, handler); }; - } - else if (isNodeStyleEventEmitter(sourceObj)) { - var source_3 = sourceObj; - sourceObj.addListener(eventName, handler); - unsubscribe = function () { return source_3.removeListener(eventName, handler); }; - } - else if (sourceObj && sourceObj.length) { - for (var i = 0, len = sourceObj.length; i < len; i++) { - setupSubscription(sourceObj[i], eventName, handler, subscriber, options); - } - } - else { - throw new TypeError('Invalid event target'); +function endWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; } - subscriber.add(unsubscribe); -} -function isNodeStyleEventEmitter(sourceObj) { - return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function'; -} -function isJQueryStyleEventEmitter(sourceObj) { - return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function'; -} -function isEventTarget(sourceObj) { - return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function'; + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(source, _observable_of__WEBPACK_IMPORTED_MODULE_1__["of"].apply(void 0, array)); }; } -//# sourceMappingURL=fromEvent.js.map +//# sourceMappingURL=endWith.js.map /***/ }), -/* 253 */ +/* 270 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return fromEventPattern; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(226); -/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function fromEventPattern(addHandler, removeHandler, resultSelector) { - if (resultSelector) { - return fromEventPattern(addHandler, removeHandler).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); +function every(predicate, thisArg) { + return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); }; +} +var EveryOperator = /*@__PURE__*/ (function () { + function EveryOperator(predicate, thisArg, source) { + this.predicate = predicate; + this.thisArg = thisArg; + this.source = source; } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var handler = function () { - var e = []; - for (var _i = 0; _i < arguments.length; _i++) { - e[_i] = arguments[_i]; - } - return subscriber.next(e.length === 1 ? e[0] : e); - }; - var retValue; + EveryOperator.prototype.call = function (observer, source) { + return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source)); + }; + return EveryOperator; +}()); +var EverySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](EverySubscriber, _super); + function EverySubscriber(destination, predicate, thisArg, source) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.thisArg = thisArg; + _this.source = source; + _this.index = 0; + _this.thisArg = thisArg || _this; + return _this; + } + EverySubscriber.prototype.notifyComplete = function (everyValueMatch) { + this.destination.next(everyValueMatch); + this.destination.complete(); + }; + EverySubscriber.prototype._next = function (value) { + var result = false; try { - retValue = addHandler(handler); + result = this.predicate.call(this.thisArg, value, this.index++, this.source); } catch (err) { - subscriber.error(err); - return undefined; + this.destination.error(err); + return; } - if (!Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(removeHandler)) { - return undefined; + if (!result) { + this.notifyComplete(false); } - return function () { return removeHandler(handler, retValue); }; - }); -} -//# sourceMappingURL=fromEventPattern.js.map + }; + EverySubscriber.prototype._complete = function () { + this.notifyComplete(true); + }; + return EverySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=every.js.map /***/ }), -/* 254 */ +/* 271 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return generate; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(220); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(205); -/** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return exhaust; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) { - var resultSelector; - var initialState; - if (arguments.length == 1) { - var options = initialStateOrOptions; - initialState = options.initialState; - condition = options.condition; - iterate = options.iterate; - resultSelector = options.resultSelector || _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; - scheduler = options.scheduler; - } - else if (resultSelectorOrObservable === undefined || Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_2__["isScheduler"])(resultSelectorOrObservable)) { - initialState = initialStateOrOptions; - resultSelector = _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; - scheduler = resultSelectorOrObservable; - } - else { - initialState = initialStateOrOptions; - resultSelector = resultSelectorOrObservable; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var state = initialState; - if (scheduler) { - return scheduler.schedule(dispatch, 0, { - subscriber: subscriber, - iterate: iterate, - condition: condition, - resultSelector: resultSelector, - state: state - }); - } - do { - if (condition) { - var conditionResult = void 0; - try { - conditionResult = condition(state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - if (!conditionResult) { - subscriber.complete(); - break; - } - } - var value = void 0; - try { - value = resultSelector(state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - subscriber.next(value); - if (subscriber.closed) { - break; - } - try { - state = iterate(state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - } while (true); - return undefined; - }); +function exhaust() { + return function (source) { return source.lift(new SwitchFirstOperator()); }; } -function dispatch(state) { - var subscriber = state.subscriber, condition = state.condition; - if (subscriber.closed) { - return undefined; - } - if (state.needIterate) { - try { - state.state = state.iterate(state.state); - } - catch (err) { - subscriber.error(err); - return undefined; - } +var SwitchFirstOperator = /*@__PURE__*/ (function () { + function SwitchFirstOperator() { } - else { - state.needIterate = true; + SwitchFirstOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SwitchFirstSubscriber(subscriber)); + }; + return SwitchFirstOperator; +}()); +var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchFirstSubscriber, _super); + function SwitchFirstSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.hasCompleted = false; + _this.hasSubscription = false; + return _this; } - if (condition) { - var conditionResult = void 0; - try { - conditionResult = condition(state.state); - } - catch (err) { - subscriber.error(err); - return undefined; + SwitchFirstSubscriber.prototype._next = function (value) { + if (!this.hasSubscription) { + this.hasSubscription = true; + this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, value)); } - if (!conditionResult) { - subscriber.complete(); - return undefined; + }; + SwitchFirstSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (!this.hasSubscription) { + this.destination.complete(); } - if (subscriber.closed) { - return undefined; + }; + SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) { + this.remove(innerSub); + this.hasSubscription = false; + if (this.hasCompleted) { + this.destination.complete(); } - } - var value; - try { - value = state.resultSelector(state.state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - if (subscriber.closed) { - return undefined; - } - subscriber.next(value); - if (subscriber.closed) { - return undefined; - } - return this.schedule(state); -} -//# sourceMappingURL=generate.js.map + }; + return SwitchFirstSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=exhaust.js.map /***/ }), -/* 255 */ +/* 272 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return iif; }); -/* harmony import */ var _defer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(250); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); -/** PURE_IMPORTS_START _defer,_empty PURE_IMPORTS_END */ - - -function iif(condition, trueResult, falseResult) { - if (trueResult === void 0) { - trueResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; - } - if (falseResult === void 0) { - falseResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; - } - return Object(_defer__WEBPACK_IMPORTED_MODULE_0__["defer"])(function () { return condition() ? trueResult : falseResult; }); -} -//# sourceMappingURL=iif.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return exhaustMap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(197); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(214); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ -/***/ }), -/* 256 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return interval; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(257); -/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric PURE_IMPORTS_END */ -function interval(period, scheduler) { - if (period === void 0) { - period = 0; +function exhaustMap(project, resultSelector) { + if (resultSelector) { + return function (source) { return source.pipe(exhaustMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; } - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + return function (source) { + return source.lift(new ExhaustMapOperator(project)); + }; +} +var ExhaustMapOperator = /*@__PURE__*/ (function () { + function ExhaustMapOperator(project) { + this.project = project; } - if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(period) || period < 0) { - period = 0; + ExhaustMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project)); + }; + return ExhaustMapOperator; +}()); +var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExhaustMapSubscriber, _super); + function ExhaustMapSubscriber(destination, project) { + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.hasSubscription = false; + _this.hasCompleted = false; + _this.index = 0; + return _this; } - if (!scheduler || typeof scheduler.schedule !== 'function') { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period })); - return subscriber; - }); -} -function dispatch(state) { - var subscriber = state.subscriber, counter = state.counter, period = state.period; - subscriber.next(counter); - this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period); -} -//# sourceMappingURL=interval.js.map - - -/***/ }), -/* 257 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNumeric", function() { return isNumeric; }); -/* harmony import */ var _isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/** PURE_IMPORTS_START _isArray PURE_IMPORTS_END */ - -function isNumeric(val) { - return !Object(_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(val) && (val - parseFloat(val) + 1) >= 0; -} -//# sourceMappingURL=isNumeric.js.map + ExhaustMapSubscriber.prototype._next = function (value) { + if (!this.hasSubscription) { + this.tryNext(value); + } + }; + ExhaustMapSubscriber.prototype.tryNext = function (value) { + var result; + var index = this.index++; + try { + result = this.project(value, index); + } + catch (err) { + this.destination.error(err); + return; + } + this.hasSubscription = true; + this._innerSub(result, value, index); + }; + ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); + }; + ExhaustMapSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (!this.hasSubscription) { + this.destination.complete(); + } + this.unsubscribe(); + }; + ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + ExhaustMapSubscriber.prototype.notifyError = function (err) { + this.destination.error(err); + }; + ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) { + var destination = this.destination; + destination.remove(innerSub); + this.hasSubscription = false; + if (this.hasCompleted) { + this.destination.complete(); + } + }; + return ExhaustMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=exhaustMap.js.map /***/ }), -/* 258 */ +/* 273 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(205); -/* harmony import */ var _operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(241); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(206); -/** PURE_IMPORTS_START _Observable,_util_isScheduler,_operators_mergeAll,_fromArray PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return expand; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandOperator", function() { return ExpandOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandSubscriber", function() { return ExpandSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function merge() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; +function expand(project, concurrent, scheduler) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - var concurrent = Number.POSITIVE_INFINITY; - var scheduler = null; - var last = observables[observables.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(last)) { - scheduler = observables.pop(); - if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') { - concurrent = observables.pop(); - } + if (scheduler === void 0) { + scheduler = undefined; } - else if (typeof last === 'number') { - concurrent = observables.pop(); + concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent; + return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); }; +} +var ExpandOperator = /*@__PURE__*/ (function () { + function ExpandOperator(project, concurrent, scheduler) { + this.project = project; + this.concurrent = concurrent; + this.scheduler = scheduler; } - if (scheduler === null && observables.length === 1 && observables[0] instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { - return observables[0]; + ExpandOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); + }; + return ExpandOperator; +}()); + +var ExpandSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExpandSubscriber, _super); + function ExpandSubscriber(destination, project, concurrent, scheduler) { + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.concurrent = concurrent; + _this.scheduler = scheduler; + _this.index = 0; + _this.active = 0; + _this.hasCompleted = false; + if (concurrent < Number.POSITIVE_INFINITY) { + _this.buffer = []; + } + return _this; } - return Object(_operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__["mergeAll"])(concurrent)(Object(_fromArray__WEBPACK_IMPORTED_MODULE_3__["fromArray"])(observables, scheduler)); -} -//# sourceMappingURL=merge.js.map + ExpandSubscriber.dispatch = function (arg) { + var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; + subscriber.subscribeToProjection(result, value, index); + }; + ExpandSubscriber.prototype._next = function (value) { + var destination = this.destination; + if (destination.closed) { + this._complete(); + return; + } + var index = this.index++; + if (this.active < this.concurrent) { + destination.next(value); + try { + var project = this.project; + var result = project(value, index); + if (!this.scheduler) { + this.subscribeToProjection(result, value, index); + } + else { + var state = { subscriber: this, result: result, value: value, index: index }; + var destination_1 = this.destination; + destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); + } + } + catch (e) { + destination.error(e); + } + } + else { + this.buffer.push(value); + } + }; + ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { + this.active++; + var destination = this.destination; + destination.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, result, value, index)); + }; + ExpandSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); + } + this.unsubscribe(); + }; + ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this._next(innerValue); + }; + ExpandSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; + var destination = this.destination; + destination.remove(innerSub); + this.active--; + if (buffer && buffer.length > 0) { + this._next(buffer.shift()); + } + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); + } + }; + return ExpandSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); + +//# sourceMappingURL=expand.js.map /***/ }), -/* 259 */ +/* 274 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return NEVER; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "never", function() { return never; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(185); -/** PURE_IMPORTS_START _Observable,_util_noop PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return finalize; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(148); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */ -var NEVER = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](_util_noop__WEBPACK_IMPORTED_MODULE_1__["noop"]); -function never() { - return NEVER; + +function finalize(callback) { + return function (source) { return source.lift(new FinallyOperator(callback)); }; } -//# sourceMappingURL=never.js.map +var FinallyOperator = /*@__PURE__*/ (function () { + function FinallyOperator(callback) { + this.callback = callback; + } + FinallyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new FinallySubscriber(subscriber, this.callback)); + }; + return FinallyOperator; +}()); +var FinallySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FinallySubscriber, _super); + function FinallySubscriber(destination, callback) { + var _this = _super.call(this, destination) || this; + _this.add(new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](callback)); + return _this; + } + return FinallySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=finalize.js.map /***/ }), -/* 260 */ +/* 275 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(203); -/** PURE_IMPORTS_START _Observable,_from,_util_isArray,_empty PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueOperator", function() { return FindValueOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueSubscriber", function() { return FindValueSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function onErrorResumeNext() { - var sources = []; - for (var _i = 0; _i < arguments.length; _i++) { - sources[_i] = arguments[_i]; +function find(predicate, thisArg) { + if (typeof predicate !== 'function') { + throw new TypeError('predicate is not a function'); } - if (sources.length === 0) { - return _empty__WEBPACK_IMPORTED_MODULE_3__["EMPTY"]; + return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); }; +} +var FindValueOperator = /*@__PURE__*/ (function () { + function FindValueOperator(predicate, source, yieldIndex, thisArg) { + this.predicate = predicate; + this.source = source; + this.yieldIndex = yieldIndex; + this.thisArg = thisArg; } - var first = sources[0], remainder = sources.slice(1); - if (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(first)) { - return onErrorResumeNext.apply(void 0, first); + FindValueOperator.prototype.call = function (observer, source) { + return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg)); + }; + return FindValueOperator; +}()); + +var FindValueSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FindValueSubscriber, _super); + function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.source = source; + _this.yieldIndex = yieldIndex; + _this.thisArg = thisArg; + _this.index = 0; + return _this; } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); }; - return Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(first).subscribe({ - next: function (value) { subscriber.next(value); }, - error: subNext, - complete: subNext, - }); - }); -} -//# sourceMappingURL=onErrorResumeNext.js.map + FindValueSubscriber.prototype.notifyComplete = function (value) { + var destination = this.destination; + destination.next(value); + destination.complete(); + this.unsubscribe(); + }; + FindValueSubscriber.prototype._next = function (value) { + var _a = this, predicate = _a.predicate, thisArg = _a.thisArg; + var index = this.index++; + try { + var result = predicate.call(thisArg || this, value, index, this.source); + if (result) { + this.notifyComplete(this.yieldIndex ? index : value); + } + } + catch (err) { + this.destination.error(err); + } + }; + FindValueSubscriber.prototype._complete = function () { + this.notifyComplete(this.yieldIndex ? -1 : undefined); + }; + return FindValueSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); + +//# sourceMappingURL=find.js.map /***/ }), -/* 261 */ +/* 276 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return pairs; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); +/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(275); +/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ -function pairs(obj, scheduler) { - if (!scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var keys = Object.keys(obj); - for (var i = 0; i < keys.length && !subscriber.closed; i++) { - var key = keys[i]; - if (obj.hasOwnProperty(key)) { - subscriber.next([key, obj[key]]); - } - } - subscriber.complete(); - }); - } - else { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var keys = Object.keys(obj); - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj })); - return subscription; - }); - } -} -function dispatch(state) { - var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj; - if (!subscriber.closed) { - if (index < keys.length) { - var key = keys[index]; - subscriber.next([key, obj[key]]); - subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj })); - } - else { - subscriber.complete(); - } - } +function findIndex(predicate, thisArg) { + return function (source) { return source.lift(new _operators_find__WEBPACK_IMPORTED_MODULE_0__["FindValueOperator"](predicate, source, true, thisArg)); }; } -//# sourceMappingURL=pairs.js.map +//# sourceMappingURL=findIndex.js.map /***/ }), -/* 262 */ +/* 277 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); -/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(263); -/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); -/* harmony import */ var _operators_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(264); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(170); -/** PURE_IMPORTS_START _util_not,_util_subscribeTo,_operators_filter,_Observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "first", function() { return first; }); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(194); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(268); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(258); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(267); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(191); +/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ -function partition(source, predicate, thisArg) { - return [ - Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(predicate, thisArg)(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))), - Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))) - ]; + + +function first(predicate, defaultValue) { + var hasDefaultValue = arguments.length >= 2; + return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_take__WEBPACK_IMPORTED_MODULE_2__["take"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; } -//# sourceMappingURL=partition.js.map +//# sourceMappingURL=first.js.map /***/ }), -/* 263 */ +/* 278 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "not", function() { return not; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function not(pred, thisArg) { - function notPred() { - return !(notPred.pred.apply(notPred.thisArg, arguments)); - } - notPred.pred = pred; - notPred.thisArg = thisArg; - return notPred; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return ignoreElements; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function ignoreElements() { + return function ignoreElementsOperatorFunction(source) { + return source.lift(new IgnoreElementsOperator()); + }; } -//# sourceMappingURL=not.js.map +var IgnoreElementsOperator = /*@__PURE__*/ (function () { + function IgnoreElementsOperator() { + } + IgnoreElementsOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new IgnoreElementsSubscriber(subscriber)); + }; + return IgnoreElementsOperator; +}()); +var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IgnoreElementsSubscriber, _super); + function IgnoreElementsSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; + } + IgnoreElementsSubscriber.prototype._next = function (unused) { + }; + return IgnoreElementsSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=ignoreElements.js.map /***/ }), -/* 264 */ +/* 279 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return filter; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return isEmpty; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function filter(predicate, thisArg) { - return function filterOperatorFunction(source) { - return source.lift(new FilterOperator(predicate, thisArg)); - }; +function isEmpty() { + return function (source) { return source.lift(new IsEmptyOperator()); }; } -var FilterOperator = /*@__PURE__*/ (function () { - function FilterOperator(predicate, thisArg) { - this.predicate = predicate; - this.thisArg = thisArg; +var IsEmptyOperator = /*@__PURE__*/ (function () { + function IsEmptyOperator() { } - FilterOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); + IsEmptyOperator.prototype.call = function (observer, source) { + return source.subscribe(new IsEmptySubscriber(observer)); }; - return FilterOperator; + return IsEmptyOperator; }()); -var FilterSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FilterSubscriber, _super); - function FilterSubscriber(destination, predicate, thisArg) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.thisArg = thisArg; - _this.count = 0; - return _this; +var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IsEmptySubscriber, _super); + function IsEmptySubscriber(destination) { + return _super.call(this, destination) || this; } - FilterSubscriber.prototype._next = function (value) { - var result; - try { - result = this.predicate.call(this.thisArg, value, this.count++); - } - catch (err) { - this.destination.error(err); - return; - } - if (result) { - this.destination.next(value); - } + IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) { + var destination = this.destination; + destination.next(isEmpty); + destination.complete(); }; - return FilterSubscriber; + IsEmptySubscriber.prototype._next = function (value) { + this.notifyComplete(false); + }; + IsEmptySubscriber.prototype._complete = function () { + this.notifyComplete(true); + }; + return IsEmptySubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=filter.js.map +//# sourceMappingURL=isEmpty.js.map /***/ }), -/* 265 */ +/* 280 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceOperator", function() { return RaceOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceSubscriber", function() { return RaceSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(206); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_util_isArray,_fromArray,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(194); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(281); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(267); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(258); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(191); +/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ -function race() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - if (observables.length === 1) { - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(observables[0])) { - observables = observables[0]; - } - else { - return observables[0]; - } - } - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_2__["fromArray"])(observables, undefined).lift(new RaceOperator()); -} -var RaceOperator = /*@__PURE__*/ (function () { - function RaceOperator() { - } - RaceOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RaceSubscriber(subscriber)); - }; - return RaceOperator; -}()); -var RaceSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RaceSubscriber, _super); - function RaceSubscriber(destination) { +function last(predicate, defaultValue) { + var hasDefaultValue = arguments.length >= 2; + return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_takeLast__WEBPACK_IMPORTED_MODULE_2__["takeLast"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; +} +//# sourceMappingURL=last.js.map + + +/***/ }), +/* 281 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return takeLast; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(193); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(174); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ + + + + +function takeLast(count) { + return function takeLastOperatorFunction(source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); + } + else { + return source.lift(new TakeLastOperator(count)); + } + }; +} +var TakeLastOperator = /*@__PURE__*/ (function () { + function TakeLastOperator(total) { + this.total = total; + if (this.total < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; + } + } + TakeLastOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeLastSubscriber(subscriber, this.total)); + }; + return TakeLastOperator; +}()); +var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeLastSubscriber, _super); + function TakeLastSubscriber(destination, total) { var _this = _super.call(this, destination) || this; - _this.hasFirst = false; - _this.observables = []; - _this.subscriptions = []; + _this.total = total; + _this.ring = new Array(); + _this.count = 0; return _this; } - RaceSubscriber.prototype._next = function (observable) { - this.observables.push(observable); - }; - RaceSubscriber.prototype._complete = function () { - var observables = this.observables; - var len = observables.length; - if (len === 0) { - this.destination.complete(); + TakeLastSubscriber.prototype._next = function (value) { + var ring = this.ring; + var total = this.total; + var count = this.count++; + if (ring.length < total) { + ring.push(value); } else { - for (var i = 0; i < len && !this.hasFirst; i++) { - var observable = observables[i]; - var subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i); - if (this.subscriptions) { - this.subscriptions.push(subscription); - } - this.add(subscription); - } - this.observables = null; + var index = count % total; + ring[index] = value; } }; - RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (!this.hasFirst) { - this.hasFirst = true; - for (var i = 0; i < this.subscriptions.length; i++) { - if (i !== outerIndex) { - var subscription = this.subscriptions[i]; - subscription.unsubscribe(); - this.remove(subscription); - } + TakeLastSubscriber.prototype._complete = function () { + var destination = this.destination; + var count = this.count; + if (count > 0) { + var total = this.count >= this.total ? this.total : this.count; + var ring = this.ring; + for (var i = 0; i < total; i++) { + var idx = (count++) % total; + destination.next(ring[idx]); } - this.subscriptions = null; } - this.destination.next(innerValue); + destination.complete(); }; - return RaceSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); - -//# sourceMappingURL=race.js.map + return TakeLastSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=takeLast.js.map /***/ }), -/* 266 */ +/* 282 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "range", function() { return range; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return mapTo; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function range(start, count, scheduler) { - if (start === void 0) { - start = 0; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - if (count === undefined) { - count = start; - start = 0; - } - var index = 0; - var current = start; - if (scheduler) { - return scheduler.schedule(dispatch, 0, { - index: index, count: count, start: start, subscriber: subscriber - }); - } - else { - do { - if (index++ >= count) { - subscriber.complete(); - break; - } - subscriber.next(current++); - if (subscriber.closed) { - break; - } - } while (true); - } - return undefined; - }); + +function mapTo(value) { + return function (source) { return source.lift(new MapToOperator(value)); }; } -function dispatch(state) { - var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber; - if (index >= count) { - subscriber.complete(); - return; +var MapToOperator = /*@__PURE__*/ (function () { + function MapToOperator(value) { + this.value = value; } - subscriber.next(start); - if (subscriber.closed) { - return; + MapToOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MapToSubscriber(subscriber, this.value)); + }; + return MapToOperator; +}()); +var MapToSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapToSubscriber, _super); + function MapToSubscriber(destination, value) { + var _this = _super.call(this, destination) || this; + _this.value = value; + return _this; } - state.index = index + 1; - state.start = start + 1; - this.schedule(state); -} -//# sourceMappingURL=range.js.map + MapToSubscriber.prototype._next = function (x) { + this.destination.next(this.value); + }; + return MapToSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=mapTo.js.map /***/ }), -/* 267 */ +/* 283 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return timer; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(257); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(205); -/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return materialize; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); +/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ -function timer(dueTime, periodOrScheduler, scheduler) { - if (dueTime === void 0) { - dueTime = 0; - } - var period = -1; - if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(periodOrScheduler)) { - period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler); - } - else if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(periodOrScheduler)) { - scheduler = periodOrScheduler; - } - if (!Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(scheduler)) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var due = Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(dueTime) - ? dueTime - : (+dueTime - scheduler.now()); - return scheduler.schedule(dispatch, due, { - index: 0, period: period, subscriber: subscriber - }); - }); +function materialize() { + return function materializeOperatorFunction(source) { + return source.lift(new MaterializeOperator()); + }; } -function dispatch(state) { - var index = state.index, period = state.period, subscriber = state.subscriber; - subscriber.next(index); - if (subscriber.closed) { - return; +var MaterializeOperator = /*@__PURE__*/ (function () { + function MaterializeOperator() { } - else if (period === -1) { - return subscriber.complete(); + MaterializeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MaterializeSubscriber(subscriber)); + }; + return MaterializeOperator; +}()); +var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MaterializeSubscriber, _super); + function MaterializeSubscriber(destination) { + return _super.call(this, destination) || this; } - state.index = index + 1; - this.schedule(state, period); + MaterializeSubscriber.prototype._next = function (value) { + this.destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); + }; + MaterializeSubscriber.prototype._error = function (err) { + var destination = this.destination; + destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); + destination.complete(); + }; + MaterializeSubscriber.prototype._complete = function () { + var destination = this.destination; + destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); + destination.complete(); + }; + return MaterializeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=materialize.js.map + + +/***/ }), +/* 284 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(285); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ + +function max(comparer) { + var max = (typeof comparer === 'function') + ? function (x, y) { return comparer(x, y) > 0 ? x : y; } + : function (x, y) { return x > y ? x : y; }; + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(max); } -//# sourceMappingURL=timer.js.map +//# sourceMappingURL=max.js.map /***/ }), -/* 268 */ +/* 285 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "using", function() { return using; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(203); -/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(286); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(281); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(258); +/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(155); +/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ -function using(resourceFactory, observableFactory) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var resource; - try { - resource = resourceFactory(); + +function reduce(accumulator, seed) { + if (arguments.length >= 2) { + return function reduceOperatorFunctionWithSeed(source) { + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(accumulator, seed), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1), Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__["defaultIfEmpty"])(seed))(source); + }; + } + return function reduceOperatorFunction(source) { + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(function (acc, value, index) { return accumulator(acc, value, index + 1); }), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1))(source); + }; +} +//# sourceMappingURL=reduce.js.map + + +/***/ }), +/* 286 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return scan; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function scan(accumulator, seed) { + var hasSeed = false; + if (arguments.length >= 2) { + hasSeed = true; + } + return function scanOperatorFunction(source) { + return source.lift(new ScanOperator(accumulator, seed, hasSeed)); + }; +} +var ScanOperator = /*@__PURE__*/ (function () { + function ScanOperator(accumulator, seed, hasSeed) { + if (hasSeed === void 0) { + hasSeed = false; } - catch (err) { - subscriber.error(err); - return undefined; + this.accumulator = accumulator; + this.seed = seed; + this.hasSeed = hasSeed; + } + ScanOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); + }; + return ScanOperator; +}()); +var ScanSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ScanSubscriber, _super); + function ScanSubscriber(destination, accumulator, _seed, hasSeed) { + var _this = _super.call(this, destination) || this; + _this.accumulator = accumulator; + _this._seed = _seed; + _this.hasSeed = hasSeed; + _this.index = 0; + return _this; + } + Object.defineProperty(ScanSubscriber.prototype, "seed", { + get: function () { + return this._seed; + }, + set: function (value) { + this.hasSeed = true; + this._seed = value; + }, + enumerable: true, + configurable: true + }); + ScanSubscriber.prototype._next = function (value) { + if (!this.hasSeed) { + this.seed = value; + this.destination.next(value); + } + else { + return this._tryNext(value); } + }; + ScanSubscriber.prototype._tryNext = function (value) { + var index = this.index++; var result; try { - result = observableFactory(resource); + result = this.accumulator(this.seed, value, index); } catch (err) { - subscriber.error(err); - return undefined; + this.destination.error(err); } - var source = result ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(result) : _empty__WEBPACK_IMPORTED_MODULE_2__["EMPTY"]; - var subscription = source.subscribe(subscriber); - return function () { - subscription.unsubscribe(); - if (resource) { - resource.unsubscribe(); - } - }; - }); + this.seed = result; + this.destination.next(result); + }; + return ScanSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=scan.js.map + + +/***/ }), +/* 287 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); +/* harmony import */ var _observable_merge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(229); +/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */ + +function merge() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }; } -//# sourceMappingURL=using.js.map +//# sourceMappingURL=merge.js.map /***/ }), -/* 269 */ +/* 288 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipOperator", function() { return ZipOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipSubscriber", function() { return ZipSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(230); -/* harmony import */ var _internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(235); -/** PURE_IMPORTS_START tslib,_fromArray,_util_isArray,_Subscriber,_OuterSubscriber,_util_subscribeToResult,_.._internal_symbol_iterator PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return mergeMapTo; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(213); +/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ + +function mergeMapTo(innerObservable, resultSelector, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } + if (typeof resultSelector === 'function') { + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, resultSelector, concurrent); + } + if (typeof resultSelector === 'number') { + concurrent = resultSelector; + } + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, concurrent); +} +//# sourceMappingURL=mergeMapTo.js.map +/***/ }), +/* 289 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return mergeScan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanOperator", function() { return MergeScanOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanSubscriber", function() { return MergeScanSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(201); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(202); +/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */ -function zip() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var resultSelector = observables[observables.length - 1]; - if (typeof resultSelector === 'function') { - observables.pop(); +function mergeScan(accumulator, seed, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(observables, undefined).lift(new ZipOperator(resultSelector)); + return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); }; } -var ZipOperator = /*@__PURE__*/ (function () { - function ZipOperator(resultSelector) { - this.resultSelector = resultSelector; +var MergeScanOperator = /*@__PURE__*/ (function () { + function MergeScanOperator(accumulator, seed, concurrent) { + this.accumulator = accumulator; + this.seed = seed; + this.concurrent = concurrent; } - ZipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector)); + MergeScanOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent)); }; - return ZipOperator; + return MergeScanOperator; }()); -var ZipSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipSubscriber, _super); - function ZipSubscriber(destination, resultSelector, values) { - if (values === void 0) { - values = Object.create(null); - } +var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeScanSubscriber, _super); + function MergeScanSubscriber(destination, accumulator, acc, concurrent) { var _this = _super.call(this, destination) || this; - _this.iterators = []; + _this.accumulator = accumulator; + _this.acc = acc; + _this.concurrent = concurrent; + _this.hasValue = false; + _this.hasCompleted = false; + _this.buffer = []; _this.active = 0; - _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null; - _this.values = values; + _this.index = 0; return _this; } - ZipSubscriber.prototype._next = function (value) { - var iterators = this.iterators; - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(value)) { - iterators.push(new StaticArrayIterator(value)); - } - else if (typeof value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] === 'function') { - iterators.push(new StaticIterator(value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]]())); + MergeScanSubscriber.prototype._next = function (value) { + if (this.active < this.concurrent) { + var index = this.index++; + var destination = this.destination; + var ish = void 0; + try { + var accumulator = this.accumulator; + ish = accumulator(this.acc, value, index); + } + catch (e) { + return destination.error(e); + } + this.active++; + this._innerSub(ish, value, index); } else { - iterators.push(new ZipBufferIterator(this.destination, this, value)); + this.buffer.push(value); } }; - ZipSubscriber.prototype._complete = function () { - var iterators = this.iterators; - var len = iterators.length; - this.unsubscribe(); - if (len === 0) { + MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); + }; + MergeScanSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.active === 0 && this.buffer.length === 0) { + if (this.hasValue === false) { + this.destination.next(this.acc); + } this.destination.complete(); - return; - } - this.active = len; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - if (iterator.stillUnsubscribed) { - var destination = this.destination; - destination.add(iterator.subscribe(iterator, i)); - } - else { - this.active--; - } } + this.unsubscribe(); }; - ZipSubscriber.prototype.notifyInactive = function () { - this.active--; - if (this.active === 0) { - this.destination.complete(); - } + MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var destination = this.destination; + this.acc = innerValue; + this.hasValue = true; + destination.next(innerValue); }; - ZipSubscriber.prototype.checkIterators = function () { - var iterators = this.iterators; - var len = iterators.length; + MergeScanSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; var destination = this.destination; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) { - return; - } + destination.remove(innerSub); + this.active--; + if (buffer.length > 0) { + this._next(buffer.shift()); } - var shouldComplete = false; - var args = []; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - var result = iterator.next(); - if (iterator.hasCompleted()) { - shouldComplete = true; - } - if (result.done) { - destination.complete(); - return; + else if (this.active === 0 && this.hasCompleted) { + if (this.hasValue === false) { + this.destination.next(this.acc); } - args.push(result.value); + this.destination.complete(); } - if (this.resultSelector) { - this._tryresultSelector(args); + }; + return MergeScanSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); + +//# sourceMappingURL=mergeScan.js.map + + +/***/ }), +/* 290 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(285); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ + +function min(comparer) { + var min = (typeof comparer === 'function') + ? function (x, y) { return comparer(x, y) < 0 ? x : y; } + : function (x, y) { return x < y ? x : y; }; + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(min); +} +//# sourceMappingURL=min.js.map + + +/***/ }), +/* 291 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return multicast; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MulticastOperator", function() { return MulticastOperator; }); +/* harmony import */ var _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(157); +/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */ + +function multicast(subjectOrSubjectFactory, selector) { + return function multicastOperatorFunction(source) { + var subjectFactory; + if (typeof subjectOrSubjectFactory === 'function') { + subjectFactory = subjectOrSubjectFactory; } else { - destination.next(args); - } - if (shouldComplete) { - destination.complete(); - } - }; - ZipSubscriber.prototype._tryresultSelector = function (args) { - var result; - try { - result = this.resultSelector.apply(this, args); + subjectFactory = function subjectFactory() { + return subjectOrSubjectFactory; + }; } - catch (err) { - this.destination.error(err); - return; + if (typeof selector === 'function') { + return source.lift(new MulticastOperator(subjectFactory, selector)); } - this.destination.next(result); + var connectable = Object.create(source, _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__["connectableObservableDescriptor"]); + connectable.source = source; + connectable.subjectFactory = subjectFactory; + return connectable; }; - return ZipSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); - -var StaticIterator = /*@__PURE__*/ (function () { - function StaticIterator(iterator) { - this.iterator = iterator; - this.nextResult = iterator.next(); +} +var MulticastOperator = /*@__PURE__*/ (function () { + function MulticastOperator(subjectFactory, selector) { + this.subjectFactory = subjectFactory; + this.selector = selector; } - StaticIterator.prototype.hasValue = function () { - return true; - }; - StaticIterator.prototype.next = function () { - var result = this.nextResult; - this.nextResult = this.iterator.next(); - return result; - }; - StaticIterator.prototype.hasCompleted = function () { - var nextResult = this.nextResult; - return nextResult && nextResult.done; + MulticastOperator.prototype.call = function (subscriber, source) { + var selector = this.selector; + var subject = this.subjectFactory(); + var subscription = selector(subject).subscribe(subscriber); + subscription.add(source.subscribe(subject)); + return subscription; }; - return StaticIterator; + return MulticastOperator; }()); -var StaticArrayIterator = /*@__PURE__*/ (function () { - function StaticArrayIterator(array) { - this.array = array; - this.index = 0; - this.length = 0; - this.length = array.length; + +//# sourceMappingURL=multicast.js.map + + +/***/ }), +/* 292 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNextStatic", function() { return onErrorResumeNextStatic; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(149); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + + + + + + +function onErrorResumeNext() { + var nextSources = []; + for (var _i = 0; _i < arguments.length; _i++) { + nextSources[_i] = arguments[_i]; } - StaticArrayIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { - return this; - }; - StaticArrayIterator.prototype.next = function (value) { - var i = this.index++; - var array = this.array; - return i < this.length ? { value: array[i], done: false } : { value: null, done: true }; - }; - StaticArrayIterator.prototype.hasValue = function () { - return this.array.length > this.index; - }; - StaticArrayIterator.prototype.hasCompleted = function () { - return this.array.length === this.index; + if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { + nextSources = nextSources[0]; + } + return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); }; +} +function onErrorResumeNextStatic() { + var nextSources = []; + for (var _i = 0; _i < arguments.length; _i++) { + nextSources[_i] = arguments[_i]; + } + var source = null; + if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { + nextSources = nextSources[0]; + } + source = nextSources.shift(); + return Object(_observable_from__WEBPACK_IMPORTED_MODULE_1__["from"])(source, null).lift(new OnErrorResumeNextOperator(nextSources)); +} +var OnErrorResumeNextOperator = /*@__PURE__*/ (function () { + function OnErrorResumeNextOperator(nextSources) { + this.nextSources = nextSources; + } + OnErrorResumeNextOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources)); }; - return StaticArrayIterator; + return OnErrorResumeNextOperator; }()); -var ZipBufferIterator = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipBufferIterator, _super); - function ZipBufferIterator(destination, parent, observable) { +var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OnErrorResumeNextSubscriber, _super); + function OnErrorResumeNextSubscriber(destination, nextSources) { var _this = _super.call(this, destination) || this; - _this.parent = parent; - _this.observable = observable; - _this.stillUnsubscribed = true; - _this.buffer = []; - _this.isComplete = false; + _this.destination = destination; + _this.nextSources = nextSources; return _this; } - ZipBufferIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { - return this; + OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) { + this.subscribeToNextSource(); }; - ZipBufferIterator.prototype.next = function () { - var buffer = this.buffer; - if (buffer.length === 0 && this.isComplete) { - return { value: null, done: true }; - } - else { - return { value: buffer.shift(), done: false }; - } + OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) { + this.subscribeToNextSource(); }; - ZipBufferIterator.prototype.hasValue = function () { - return this.buffer.length > 0; + OnErrorResumeNextSubscriber.prototype._error = function (err) { + this.subscribeToNextSource(); + this.unsubscribe(); }; - ZipBufferIterator.prototype.hasCompleted = function () { - return this.buffer.length === 0 && this.isComplete; + OnErrorResumeNextSubscriber.prototype._complete = function () { + this.subscribeToNextSource(); + this.unsubscribe(); }; - ZipBufferIterator.prototype.notifyComplete = function () { - if (this.buffer.length > 0) { - this.isComplete = true; - this.parent.notifyInactive(); + OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () { + var next = this.nextSources.shift(); + if (!!next) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, next, undefined, undefined, innerSubscriber); } else { this.destination.complete(); } }; - ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.buffer.push(innerValue); - this.parent.checkIterators(); - }; - ZipBufferIterator.prototype.subscribe = function (value, index) { - return Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, this.observable, this, index); - }; - return ZipBufferIterator; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__["OuterSubscriber"])); -//# sourceMappingURL=zip.js.map + return OnErrorResumeNextSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=onErrorResumeNext.js.map /***/ }), -/* 270 */ +/* 293 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(271); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__["audit"]; }); - -/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(272); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__["auditTime"]; }); - -/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(273); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__["buffer"]; }); - -/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(274); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__["bufferCount"]; }); - -/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(275); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__["bufferTime"]; }); - -/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(276); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__["bufferToggle"]; }); - -/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(277); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__["bufferWhen"]; }); - -/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(278); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__["catchError"]; }); - -/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(279); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__["combineAll"]; }); - -/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(280); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__["combineLatest"]; }); - -/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(281); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__["concat"]; }); - -/* harmony import */ var _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(240); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__["concatAll"]; }); - -/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(282); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__["concatMap"]; }); - -/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(283); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__["concatMapTo"]; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return pairwise; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(284); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "count", function() { return _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__["count"]; }); -/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(285); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__["debounce"]; }); +function pairwise() { + return function (source) { return source.lift(new PairwiseOperator()); }; +} +var PairwiseOperator = /*@__PURE__*/ (function () { + function PairwiseOperator() { + } + PairwiseOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new PairwiseSubscriber(subscriber)); + }; + return PairwiseOperator; +}()); +var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](PairwiseSubscriber, _super); + function PairwiseSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.hasPrev = false; + return _this; + } + PairwiseSubscriber.prototype._next = function (value) { + var pair; + if (this.hasPrev) { + pair = [this.prev, value]; + } + else { + this.hasPrev = true; + } + this.prev = value; + if (pair) { + this.destination.next(pair); + } + }; + return PairwiseSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=pairwise.js.map -/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(286); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__["debounceTime"]; }); -/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(287); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__["defaultIfEmpty"]; }); +/***/ }), +/* 294 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(288); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__["delay"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); +/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(234); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(290); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__["delayWhen"]; }); -/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(291); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__["dematerialize"]; }); +function partition(predicate, thisArg) { + return function (source) { + return [ + Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(predicate, thisArg)(source), + Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(source) + ]; + }; +} +//# sourceMappingURL=partition.js.map -/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(292); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__["distinct"]; }); -/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(293); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__["distinctUntilChanged"]; }); +/***/ }), +/* 295 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(294); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__["distinctUntilKeyChanged"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return pluck; }); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(197); +/** PURE_IMPORTS_START _map PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(295); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__["elementAt"]; }); +function pluck() { + var properties = []; + for (var _i = 0; _i < arguments.length; _i++) { + properties[_i] = arguments[_i]; + } + var length = properties.length; + if (length === 0) { + throw new Error('list of properties cannot be empty.'); + } + return function (source) { return Object(_map__WEBPACK_IMPORTED_MODULE_0__["map"])(plucker(properties, length))(source); }; +} +function plucker(props, length) { + var mapper = function (x) { + var currentProp = x; + for (var i = 0; i < length; i++) { + var p = currentProp[props[i]]; + if (typeof p !== 'undefined') { + currentProp = p; + } + else { + return undefined; + } + } + return currentProp; + }; + return mapper; +} +//# sourceMappingURL=pluck.js.map -/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(298); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__["endWith"]; }); -/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(299); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "every", function() { return _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__["every"]; }); +/***/ }), +/* 296 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(300); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__["exhaust"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(158); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(291); +/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(301); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__["exhaustMap"]; }); -/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(302); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__["expand"]; }); +function publish(selector) { + return selector ? + Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"](); }, selector) : + Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"]()); +} +//# sourceMappingURL=publish.js.map -/* harmony import */ var _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(264); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__["filter"]; }); -/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(303); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__["finalize"]; }); +/***/ }), +/* 297 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(304); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "find", function() { return _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__["find"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); +/* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(163); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(291); +/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(305); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__["findIndex"]; }); -/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(306); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__["first"]; }); +function publishBehavior(value) { + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__["BehaviorSubject"](value))(source); }; +} +//# sourceMappingURL=publishBehavior.js.map -/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(191); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__["groupBy"]; }); -/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(307); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__["ignoreElements"]; }); +/***/ }), +/* 298 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(308); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__["isEmpty"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(181); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(291); +/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(309); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__["last"]; }); -/* harmony import */ var _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(226); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__["map"]; }); +function publishLast() { + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__["AsyncSubject"]())(source); }; +} +//# sourceMappingURL=publishLast.js.map -/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(311); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__["mapTo"]; }); -/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(312); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__["materialize"]; }); +/***/ }), +/* 299 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(313); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__["max"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; }); +/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(164); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(291); +/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(316); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__["merge"]; }); -/* harmony import */ var _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(241); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__["mergeAll"]; }); +function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { + if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { + scheduler = selectorOrScheduler; + } + var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; + var subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return subject; }, selector)(source); }; +} +//# sourceMappingURL=publishReplay.js.map -/* harmony import */ var _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(242); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); +/***/ }), +/* 300 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(317); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(149); +/* harmony import */ var _observable_race__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(236); +/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(318); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); -/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(319); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); +function race() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return function raceOperatorFunction(source) { + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { + observables = observables[0]; + } + return source.lift.call(_observable_race__WEBPACK_IMPORTED_MODULE_1__["race"].apply(void 0, [source].concat(observables))); + }; +} +//# sourceMappingURL=race.js.map -/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(320); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); -/* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(201); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); +/***/ }), +/* 301 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(321); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); +/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(322); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); -/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(323); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); -/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(324); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); - -/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(325); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); - -/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(326); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); - -/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(327); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); - -/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(328); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); - -/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(329); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); - -/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(314); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); - -/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(330); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); - -/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(331); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); - -/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(332); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); - -/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(333); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); - -/* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(190); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); - -/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(334); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); - -/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(335); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); - -/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(315); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); - -/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(336); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); - -/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(337); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); - -/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(338); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); - -/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(339); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); - -/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(340); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); - -/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(341); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); - -/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(342); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); - -/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(343); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); - -/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(344); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); - -/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(345); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); - -/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(347); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); - -/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(348); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); - -/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(349); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); - -/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(297); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); - -/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(310); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); - -/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(350); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); - -/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(351); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); - -/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(352); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); - -/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(353); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); - -/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(354); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); - -/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(296); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); - -/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(355); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); - -/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(356); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); - -/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(357); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); - -/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(358); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); - -/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(359); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); - -/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(360); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); - -/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(361); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); - -/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(362); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); - -/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(363); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); - -/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(364); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); - -/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(365); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); - -/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(366); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); - -/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(367); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); - -/** PURE_IMPORTS_START PURE_IMPORTS_END */ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//# sourceMappingURL=index.js.map +function repeat(count) { + if (count === void 0) { + count = -1; + } + return function (source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); + } + else if (count < 0) { + return source.lift(new RepeatOperator(-1, source)); + } + else { + return source.lift(new RepeatOperator(count - 1, source)); + } + }; +} +var RepeatOperator = /*@__PURE__*/ (function () { + function RepeatOperator(count, source) { + this.count = count; + this.source = source; + } + RepeatOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source)); + }; + return RepeatOperator; +}()); +var RepeatSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatSubscriber, _super); + function RepeatSubscriber(destination, count, source) { + var _this = _super.call(this, destination) || this; + _this.count = count; + _this.source = source; + return _this; + } + RepeatSubscriber.prototype.complete = function () { + if (!this.isStopped) { + var _a = this, source = _a.source, count = _a.count; + if (count === 0) { + return _super.prototype.complete.call(this); + } + else if (count > -1) { + this.count = count - 1; + } + source.subscribe(this._unsubscribeAndRecycle()); + } + }; + return RepeatSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=repeat.js.map /***/ }), -/* 271 */ +/* 302 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return audit; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return repeatWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function audit(durationSelector) { - return function auditOperatorFunction(source) { - return source.lift(new AuditOperator(durationSelector)); - }; + +function repeatWhen(notifier) { + return function (source) { return source.lift(new RepeatWhenOperator(notifier)); }; } -var AuditOperator = /*@__PURE__*/ (function () { - function AuditOperator(durationSelector) { - this.durationSelector = durationSelector; +var RepeatWhenOperator = /*@__PURE__*/ (function () { + function RepeatWhenOperator(notifier) { + this.notifier = notifier; } - AuditOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector)); + RepeatWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source)); }; - return AuditOperator; + return RepeatWhenOperator; }()); -var AuditSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AuditSubscriber, _super); - function AuditSubscriber(destination, durationSelector) { +var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatWhenSubscriber, _super); + function RepeatWhenSubscriber(destination, notifier, source) { var _this = _super.call(this, destination) || this; - _this.durationSelector = durationSelector; - _this.hasValue = false; + _this.notifier = notifier; + _this.source = source; + _this.sourceIsBeingSubscribedTo = true; return _this; } - AuditSubscriber.prototype._next = function (value) { - this.value = value; - this.hasValue = true; - if (!this.throttled) { - var duration = void 0; - try { - var durationSelector = this.durationSelector; - duration = durationSelector(value); - } - catch (err) { - return this.destination.error(err); - } - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); - if (!innerSubscription || innerSubscription.closed) { - this.clearThrottle(); + RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.sourceIsBeingSubscribedTo = true; + this.source.subscribe(this); + }; + RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) { + if (this.sourceIsBeingSubscribedTo === false) { + return _super.prototype.complete.call(this); + } + }; + RepeatWhenSubscriber.prototype.complete = function () { + this.sourceIsBeingSubscribedTo = false; + if (!this.isStopped) { + if (!this.retries) { + this.subscribeToRetries(); } - else { - this.add(this.throttled = innerSubscription); + if (!this.retriesSubscription || this.retriesSubscription.closed) { + return _super.prototype.complete.call(this); } + this._unsubscribeAndRecycle(); + this.notifications.next(); } }; - AuditSubscriber.prototype.clearThrottle = function () { - var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled; - if (throttled) { - this.remove(throttled); - this.throttled = null; - throttled.unsubscribe(); + RepeatWhenSubscriber.prototype._unsubscribe = function () { + var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription; + if (notifications) { + notifications.unsubscribe(); + this.notifications = null; } - if (hasValue) { - this.value = null; - this.hasValue = false; - this.destination.next(value); + if (retriesSubscription) { + retriesSubscription.unsubscribe(); + this.retriesSubscription = null; } + this.retries = null; }; - AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { - this.clearThrottle(); + RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () { + var _unsubscribe = this._unsubscribe; + this._unsubscribe = null; + _super.prototype._unsubscribeAndRecycle.call(this); + this._unsubscribe = _unsubscribe; + return this; }; - AuditSubscriber.prototype.notifyComplete = function () { - this.clearThrottle(); + RepeatWhenSubscriber.prototype.subscribeToRetries = function () { + this.notifications = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + var retries; + try { + var notifier = this.notifier; + retries = notifier(this.notifications); + } + catch (e) { + return _super.prototype.complete.call(this); + } + this.retries = retries; + this.retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); }; - return AuditSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=audit.js.map + return RepeatWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=repeatWhen.js.map /***/ }), -/* 272 */ +/* 303 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); -/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(271); -/* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(267); -/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return retry; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function auditTime(duration, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; +function retry(count) { + if (count === void 0) { + count = -1; } - return Object(_audit__WEBPACK_IMPORTED_MODULE_1__["audit"])(function () { return Object(_observable_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(duration, scheduler); }); -} -//# sourceMappingURL=auditTime.js.map - - -/***/ }), -/* 273 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return buffer; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - -function buffer(closingNotifier) { - return function bufferOperatorFunction(source) { - return source.lift(new BufferOperator(closingNotifier)); - }; + return function (source) { return source.lift(new RetryOperator(count, source)); }; } -var BufferOperator = /*@__PURE__*/ (function () { - function BufferOperator(closingNotifier) { - this.closingNotifier = closingNotifier; +var RetryOperator = /*@__PURE__*/ (function () { + function RetryOperator(count, source) { + this.count = count; + this.source = source; } - BufferOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); + RetryOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source)); }; - return BufferOperator; + return RetryOperator; }()); -var BufferSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSubscriber, _super); - function BufferSubscriber(destination, closingNotifier) { +var RetrySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetrySubscriber, _super); + function RetrySubscriber(destination, count, source) { var _this = _super.call(this, destination) || this; - _this.buffer = []; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, closingNotifier)); + _this.count = count; + _this.source = source; return _this; } - BufferSubscriber.prototype._next = function (value) { - this.buffer.push(value); - }; - BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var buffer = this.buffer; - this.buffer = []; - this.destination.next(buffer); + RetrySubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var _a = this, source = _a.source, count = _a.count; + if (count === 0) { + return _super.prototype.error.call(this, err); + } + else if (count > -1) { + this.count = count - 1; + } + source.subscribe(this._unsubscribeAndRecycle()); + } }; - return BufferSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=buffer.js.map + return RetrySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=retry.js.map /***/ }), -/* 274 */ +/* 304 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return bufferCount; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return retryWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function bufferCount(bufferSize, startBufferEvery) { - if (startBufferEvery === void 0) { - startBufferEvery = null; - } - return function bufferCountOperatorFunction(source) { - return source.lift(new BufferCountOperator(bufferSize, startBufferEvery)); - }; + + +function retryWhen(notifier) { + return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); }; } -var BufferCountOperator = /*@__PURE__*/ (function () { - function BufferCountOperator(bufferSize, startBufferEvery) { - this.bufferSize = bufferSize; - this.startBufferEvery = startBufferEvery; - if (!startBufferEvery || bufferSize === startBufferEvery) { - this.subscriberClass = BufferCountSubscriber; - } - else { - this.subscriberClass = BufferSkipCountSubscriber; - } +var RetryWhenOperator = /*@__PURE__*/ (function () { + function RetryWhenOperator(notifier, source) { + this.notifier = notifier; + this.source = source; } - BufferCountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); + RetryWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source)); }; - return BufferCountOperator; + return RetryWhenOperator; }()); -var BufferCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferCountSubscriber, _super); - function BufferCountSubscriber(destination, bufferSize) { +var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetryWhenSubscriber, _super); + function RetryWhenSubscriber(destination, notifier, source) { var _this = _super.call(this, destination) || this; - _this.bufferSize = bufferSize; - _this.buffer = []; + _this.notifier = notifier; + _this.source = source; return _this; } - BufferCountSubscriber.prototype._next = function (value) { - var buffer = this.buffer; - buffer.push(value); - if (buffer.length == this.bufferSize) { - this.destination.next(buffer); - this.buffer = []; - } - }; - BufferCountSubscriber.prototype._complete = function () { - var buffer = this.buffer; - if (buffer.length > 0) { - this.destination.next(buffer); - } - _super.prototype._complete.call(this); - }; - return BufferCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSkipCountSubscriber, _super); - function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) { - var _this = _super.call(this, destination) || this; - _this.bufferSize = bufferSize; - _this.startBufferEvery = startBufferEvery; - _this.buffers = []; - _this.count = 0; - return _this; - } - BufferSkipCountSubscriber.prototype._next = function (value) { - var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count; - this.count++; - if (count % startBufferEvery === 0) { - buffers.push([]); - } - for (var i = buffers.length; i--;) { - var buffer = buffers[i]; - buffer.push(value); - if (buffer.length === bufferSize) { - buffers.splice(i, 1); - this.destination.next(buffer); + RetryWhenSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var errors = this.errors; + var retries = this.retries; + var retriesSubscription = this.retriesSubscription; + if (!retries) { + errors = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + try { + var notifier = this.notifier; + retries = notifier(errors); + } + catch (e) { + return _super.prototype.error.call(this, e); + } + retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); } + else { + this.errors = null; + this.retriesSubscription = null; + } + this._unsubscribeAndRecycle(); + this.errors = errors; + this.retries = retries; + this.retriesSubscription = retriesSubscription; + errors.next(err); } }; - BufferSkipCountSubscriber.prototype._complete = function () { - var _a = this, buffers = _a.buffers, destination = _a.destination; - while (buffers.length > 0) { - var buffer = buffers.shift(); - if (buffer.length > 0) { - destination.next(buffer); - } + RetryWhenSubscriber.prototype._unsubscribe = function () { + var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription; + if (errors) { + errors.unsubscribe(); + this.errors = null; } - _super.prototype._complete.call(this); + if (retriesSubscription) { + retriesSubscription.unsubscribe(); + this.retriesSubscription = null; + } + this.retries = null; }; - return BufferSkipCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=bufferCount.js.map + RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var _unsubscribe = this._unsubscribe; + this._unsubscribe = null; + this._unsubscribeAndRecycle(); + this._unsubscribe = _unsubscribe; + this.source.subscribe(this); + }; + return RetryWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=retryWhen.js.map /***/ }), -/* 275 */ +/* 305 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return bufferTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(205); -/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return sample; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function bufferTime(bufferTimeSpan) { - var length = arguments.length; - var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(arguments[arguments.length - 1])) { - scheduler = arguments[arguments.length - 1]; - length--; - } - var bufferCreationInterval = null; - if (length >= 2) { - bufferCreationInterval = arguments[1]; - } - var maxBufferSize = Number.POSITIVE_INFINITY; - if (length >= 3) { - maxBufferSize = arguments[2]; - } - return function bufferTimeOperatorFunction(source) { - return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler)); - }; +function sample(notifier) { + return function (source) { return source.lift(new SampleOperator(notifier)); }; } -var BufferTimeOperator = /*@__PURE__*/ (function () { - function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { - this.bufferTimeSpan = bufferTimeSpan; - this.bufferCreationInterval = bufferCreationInterval; - this.maxBufferSize = maxBufferSize; - this.scheduler = scheduler; +var SampleOperator = /*@__PURE__*/ (function () { + function SampleOperator(notifier) { + this.notifier = notifier; } - BufferTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler)); + SampleOperator.prototype.call = function (subscriber, source) { + var sampleSubscriber = new SampleSubscriber(subscriber); + var subscription = source.subscribe(sampleSubscriber); + subscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(sampleSubscriber, this.notifier)); + return subscription; }; - return BufferTimeOperator; -}()); -var Context = /*@__PURE__*/ (function () { - function Context() { - this.buffer = []; - } - return Context; + return SampleOperator; }()); -var BufferTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferTimeSubscriber, _super); - function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { - var _this = _super.call(this, destination) || this; - _this.bufferTimeSpan = bufferTimeSpan; - _this.bufferCreationInterval = bufferCreationInterval; - _this.maxBufferSize = maxBufferSize; - _this.scheduler = scheduler; - _this.contexts = []; - var context = _this.openContext(); - _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0; - if (_this.timespanOnly) { - var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan }; - _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); - } - else { - var closeState = { subscriber: _this, context: context }; - var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler }; - _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState)); - _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState)); - } +var SampleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleSubscriber, _super); + function SampleSubscriber() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.hasValue = false; return _this; } - BufferTimeSubscriber.prototype._next = function (value) { - var contexts = this.contexts; - var len = contexts.length; - var filledBufferContext; - for (var i = 0; i < len; i++) { - var context_1 = contexts[i]; - var buffer = context_1.buffer; - buffer.push(value); - if (buffer.length == this.maxBufferSize) { - filledBufferContext = context_1; - } - } - if (filledBufferContext) { - this.onBufferFull(filledBufferContext); - } - }; - BufferTimeSubscriber.prototype._error = function (err) { - this.contexts.length = 0; - _super.prototype._error.call(this, err); - }; - BufferTimeSubscriber.prototype._complete = function () { - var _a = this, contexts = _a.contexts, destination = _a.destination; - while (contexts.length > 0) { - var context_2 = contexts.shift(); - destination.next(context_2.buffer); - } - _super.prototype._complete.call(this); - }; - BufferTimeSubscriber.prototype._unsubscribe = function () { - this.contexts = null; + SampleSubscriber.prototype._next = function (value) { + this.value = value; + this.hasValue = true; }; - BufferTimeSubscriber.prototype.onBufferFull = function (context) { - this.closeContext(context); - var closeAction = context.closeAction; - closeAction.unsubscribe(); - this.remove(closeAction); - if (!this.closed && this.timespanOnly) { - context = this.openContext(); - var bufferTimeSpan = this.bufferTimeSpan; - var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan }; - this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); - } + SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.emitValue(); }; - BufferTimeSubscriber.prototype.openContext = function () { - var context = new Context(); - this.contexts.push(context); - return context; + SampleSubscriber.prototype.notifyComplete = function () { + this.emitValue(); }; - BufferTimeSubscriber.prototype.closeContext = function (context) { - this.destination.next(context.buffer); - var contexts = this.contexts; - var spliceIndex = contexts ? contexts.indexOf(context) : -1; - if (spliceIndex >= 0) { - contexts.splice(contexts.indexOf(context), 1); + SampleSubscriber.prototype.emitValue = function () { + if (this.hasValue) { + this.hasValue = false; + this.destination.next(this.value); } }; - return BufferTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -function dispatchBufferTimeSpanOnly(state) { - var subscriber = state.subscriber; - var prevContext = state.context; - if (prevContext) { - subscriber.closeContext(prevContext); - } - if (!subscriber.closed) { - state.context = subscriber.openContext(); - state.context.closeAction = this.schedule(state, state.bufferTimeSpan); - } -} -function dispatchBufferCreation(state) { - var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler; - var context = subscriber.openContext(); - var action = this; - if (!subscriber.closed) { - subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context })); - action.schedule(state, bufferCreationInterval); - } -} -function dispatchBufferClose(arg) { - var subscriber = arg.subscriber, context = arg.context; - subscriber.closeContext(context); -} -//# sourceMappingURL=bufferTime.js.map + return SampleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=sample.js.map /***/ }), -/* 276 */ +/* 306 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return bufferToggle; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return sampleTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(186); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ -function bufferToggle(openings, closingSelector) { - return function bufferToggleOperatorFunction(source) { - return source.lift(new BufferToggleOperator(openings, closingSelector)); - }; +function sampleTime(period, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + } + return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); }; } -var BufferToggleOperator = /*@__PURE__*/ (function () { - function BufferToggleOperator(openings, closingSelector) { - this.openings = openings; - this.closingSelector = closingSelector; +var SampleTimeOperator = /*@__PURE__*/ (function () { + function SampleTimeOperator(period, scheduler) { + this.period = period; + this.scheduler = scheduler; } - BufferToggleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector)); + SampleTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler)); }; - return BufferToggleOperator; + return SampleTimeOperator; }()); -var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferToggleSubscriber, _super); - function BufferToggleSubscriber(destination, openings, closingSelector) { +var SampleTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleTimeSubscriber, _super); + function SampleTimeSubscriber(destination, period, scheduler) { var _this = _super.call(this, destination) || this; - _this.openings = openings; - _this.closingSelector = closingSelector; - _this.contexts = []; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, openings)); + _this.period = period; + _this.scheduler = scheduler; + _this.hasValue = false; + _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period })); return _this; } - BufferToggleSubscriber.prototype._next = function (value) { - var contexts = this.contexts; - var len = contexts.length; - for (var i = 0; i < len; i++) { - contexts[i].buffer.push(value); - } - }; - BufferToggleSubscriber.prototype._error = function (err) { - var contexts = this.contexts; - while (contexts.length > 0) { - var context_1 = contexts.shift(); - context_1.subscription.unsubscribe(); - context_1.buffer = null; - context_1.subscription = null; - } - this.contexts = null; - _super.prototype._error.call(this, err); - }; - BufferToggleSubscriber.prototype._complete = function () { - var contexts = this.contexts; - while (contexts.length > 0) { - var context_2 = contexts.shift(); - this.destination.next(context_2.buffer); - context_2.subscription.unsubscribe(); - context_2.buffer = null; - context_2.subscription = null; - } - this.contexts = null; - _super.prototype._complete.call(this); - }; - BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue); - }; - BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) { - this.closeBuffer(innerSub.context); - }; - BufferToggleSubscriber.prototype.openBuffer = function (value) { - try { - var closingSelector = this.closingSelector; - var closingNotifier = closingSelector.call(this, value); - if (closingNotifier) { - this.trySubscribe(closingNotifier); - } - } - catch (err) { - this._error(err); - } - }; - BufferToggleSubscriber.prototype.closeBuffer = function (context) { - var contexts = this.contexts; - if (contexts && context) { - var buffer = context.buffer, subscription = context.subscription; - this.destination.next(buffer); - contexts.splice(contexts.indexOf(context), 1); - this.remove(subscription); - subscription.unsubscribe(); - } + SampleTimeSubscriber.prototype._next = function (value) { + this.lastValue = value; + this.hasValue = true; }; - BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) { - var contexts = this.contexts; - var buffer = []; - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var context = { buffer: buffer, subscription: subscription }; - contexts.push(context); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, closingNotifier, context); - if (!innerSubscription || innerSubscription.closed) { - this.closeBuffer(context); - } - else { - innerSubscription.context = context; - this.add(innerSubscription); - subscription.add(innerSubscription); + SampleTimeSubscriber.prototype.notifyNext = function () { + if (this.hasValue) { + this.hasValue = false; + this.destination.next(this.lastValue); } }; - return BufferToggleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=bufferToggle.js.map + return SampleTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNotification(state) { + var subscriber = state.subscriber, period = state.period; + subscriber.notifyNext(); + this.schedule(state, period); +} +//# sourceMappingURL=sampleTime.js.map /***/ }), -/* 277 */ +/* 307 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return bufferWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return sequenceEqual; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualOperator", function() { return SequenceEqualOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualSubscriber", function() { return SequenceEqualSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function bufferWhen(closingSelector) { - return function (source) { - return source.lift(new BufferWhenOperator(closingSelector)); - }; +function sequenceEqual(compareTo, comparator) { + return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); }; } -var BufferWhenOperator = /*@__PURE__*/ (function () { - function BufferWhenOperator(closingSelector) { - this.closingSelector = closingSelector; +var SequenceEqualOperator = /*@__PURE__*/ (function () { + function SequenceEqualOperator(compareTo, comparator) { + this.compareTo = compareTo; + this.comparator = comparator; } - BufferWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); + SequenceEqualOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator)); }; - return BufferWhenOperator; + return SequenceEqualOperator; }()); -var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferWhenSubscriber, _super); - function BufferWhenSubscriber(destination, closingSelector) { + +var SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualSubscriber, _super); + function SequenceEqualSubscriber(destination, compareTo, comparator) { var _this = _super.call(this, destination) || this; - _this.closingSelector = closingSelector; - _this.subscribing = false; - _this.openBuffer(); + _this.compareTo = compareTo; + _this.comparator = comparator; + _this._a = []; + _this._b = []; + _this._oneComplete = false; + _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this))); return _this; } - BufferWhenSubscriber.prototype._next = function (value) { - this.buffer.push(value); + SequenceEqualSubscriber.prototype._next = function (value) { + if (this._oneComplete && this._b.length === 0) { + this.emit(false); + } + else { + this._a.push(value); + this.checkValues(); + } }; - BufferWhenSubscriber.prototype._complete = function () { - var buffer = this.buffer; - if (buffer) { - this.destination.next(buffer); + SequenceEqualSubscriber.prototype._complete = function () { + if (this._oneComplete) { + this.emit(this._a.length === 0 && this._b.length === 0); } - _super.prototype._complete.call(this); + else { + this._oneComplete = true; + } + this.unsubscribe(); }; - BufferWhenSubscriber.prototype._unsubscribe = function () { - this.buffer = null; - this.subscribing = false; + SequenceEqualSubscriber.prototype.checkValues = function () { + var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator; + while (_a.length > 0 && _b.length > 0) { + var a = _a.shift(); + var b = _b.shift(); + var areEqual = false; + try { + areEqual = comparator ? comparator(a, b) : a === b; + } + catch (e) { + this.destination.error(e); + } + if (!areEqual) { + this.emit(false); + } + } }; - BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openBuffer(); + SequenceEqualSubscriber.prototype.emit = function (value) { + var destination = this.destination; + destination.next(value); + destination.complete(); }; - BufferWhenSubscriber.prototype.notifyComplete = function () { - if (this.subscribing) { - this.complete(); + SequenceEqualSubscriber.prototype.nextB = function (value) { + if (this._oneComplete && this._a.length === 0) { + this.emit(false); } else { - this.openBuffer(); + this._b.push(value); + this.checkValues(); } }; - BufferWhenSubscriber.prototype.openBuffer = function () { - var closingSubscription = this.closingSubscription; - if (closingSubscription) { - this.remove(closingSubscription); - closingSubscription.unsubscribe(); - } - var buffer = this.buffer; - if (this.buffer) { - this.destination.next(buffer); - } - this.buffer = []; - var closingNotifier; - try { - var closingSelector = this.closingSelector; - closingNotifier = closingSelector(); + SequenceEqualSubscriber.prototype.completeB = function () { + if (this._oneComplete) { + this.emit(this._a.length === 0 && this._b.length === 0); } - catch (err) { - return this.error(err); + else { + this._oneComplete = true; } - closingSubscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - this.closingSubscription = closingSubscription; - this.add(closingSubscription); - this.subscribing = true; - closingSubscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); - this.subscribing = false; }; - return BufferWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=bufferWhen.js.map - - -/***/ }), -/* 278 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return catchError; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - + return SequenceEqualSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function catchError(selector) { - return function catchErrorOperatorFunction(source) { - var operator = new CatchOperator(selector); - var caught = source.lift(operator); - return (operator.caught = caught); - }; -} -var CatchOperator = /*@__PURE__*/ (function () { - function CatchOperator(selector) { - this.selector = selector; - } - CatchOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); - }; - return CatchOperator; -}()); -var CatchSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CatchSubscriber, _super); - function CatchSubscriber(destination, selector, caught) { +var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualCompareToSubscriber, _super); + function SequenceEqualCompareToSubscriber(destination, parent) { var _this = _super.call(this, destination) || this; - _this.selector = selector; - _this.caught = caught; + _this.parent = parent; return _this; } - CatchSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var result = void 0; - try { - result = this.selector(err, this.caught); - } - catch (err2) { - _super.prototype.error.call(this, err2); - return; - } - this._unsubscribeAndRecycle(); - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - this.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, undefined, undefined, innerSubscriber); - } + SequenceEqualCompareToSubscriber.prototype._next = function (value) { + this.parent.nextB(value); }; - return CatchSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=catchError.js.map - - -/***/ }), -/* 279 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return combineAll; }); -/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(228); -/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */ - -function combineAll(project) { - return function (source) { return source.lift(new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__["CombineLatestOperator"](project)); }; -} -//# sourceMappingURL=combineAll.js.map + SequenceEqualCompareToSubscriber.prototype._error = function (err) { + this.parent.error(err); + this.unsubscribe(); + }; + SequenceEqualCompareToSubscriber.prototype._complete = function () { + this.parent.completeB(); + this.unsubscribe(); + }; + return SequenceEqualCompareToSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=sequenceEqual.js.map /***/ }), -/* 280 */ +/* 308 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(228); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(243); -/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(291); +/* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(161); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(158); +/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ -var none = {}; -function combineLatest() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var project = null; - if (typeof observables[observables.length - 1] === 'function') { - project = observables.pop(); - } - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { - observables = observables[0].slice(); - } - return function (source) { return source.lift.call(Object(_observable_from__WEBPACK_IMPORTED_MODULE_2__["from"])([source].concat(observables)), new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__["CombineLatestOperator"](project)); }; +function shareSubjectFactory() { + return new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); } -//# sourceMappingURL=combineLatest.js.map +function share() { + return function (source) { return Object(_refCount__WEBPACK_IMPORTED_MODULE_1__["refCount"])()(Object(_multicast__WEBPACK_IMPORTED_MODULE_0__["multicast"])(shareSubjectFactory)(source)); }; +} +//# sourceMappingURL=share.js.map /***/ }), -/* 281 */ +/* 309 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239); -/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return shareReplay; }); +/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(164); +/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */ -function concat() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; +function shareReplay(configOrBufferSize, windowTime, scheduler) { + var config; + if (configOrBufferSize && typeof configOrBufferSize === 'object') { + config = configOrBufferSize; } - return function (source) { return source.lift.call(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"].apply(void 0, [source].concat(observables))); }; + else { + config = { + bufferSize: configOrBufferSize, + windowTime: windowTime, + refCount: false, + scheduler: scheduler + }; + } + return function (source) { return source.lift(shareReplayOperator(config)); }; } -//# sourceMappingURL=concat.js.map - - -/***/ }), -/* 282 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return concatMap; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); -/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ - -function concatMap(project, resultSelector) { - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(project, resultSelector, 1); +function shareReplayOperator(_a) { + var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler; + var subject; + var refCount = 0; + var subscription; + var hasError = false; + var isComplete = false; + return function shareReplayOperation(source) { + refCount++; + if (!subject || hasError) { + hasError = false; + subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); + subscription = source.subscribe({ + next: function (value) { subject.next(value); }, + error: function (err) { + hasError = true; + subject.error(err); + }, + complete: function () { + isComplete = true; + subject.complete(); + }, + }); + } + var innerSub = subject.subscribe(this); + this.add(function () { + refCount--; + innerSub.unsubscribe(); + if (subscription && !isComplete && useRefCount && refCount === 0) { + subscription.unsubscribe(); + subscription = undefined; + subject = undefined; + } + }); + }; } -//# sourceMappingURL=concatMap.js.map +//# sourceMappingURL=shareReplay.js.map /***/ }), -/* 283 */ +/* 310 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); -/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(282); -/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ - -function concatMapTo(innerObservable, resultSelector) { - return Object(_concatMap__WEBPACK_IMPORTED_MODULE_0__["concatMap"])(function () { return innerObservable; }, resultSelector); -} -//# sourceMappingURL=concatMapTo.js.map - - -/***/ }), -/* 284 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "single", function() { return single; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(194); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "count", function() { return count; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function count(predicate) { - return function (source) { return source.lift(new CountOperator(predicate, source)); }; +function single(predicate) { + return function (source) { return source.lift(new SingleOperator(predicate, source)); }; } -var CountOperator = /*@__PURE__*/ (function () { - function CountOperator(predicate, source) { +var SingleOperator = /*@__PURE__*/ (function () { + function SingleOperator(predicate, source) { this.predicate = predicate; this.source = source; } - CountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source)); + SingleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source)); }; - return CountOperator; + return SingleOperator; }()); -var CountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountSubscriber, _super); - function CountSubscriber(destination, predicate, source) { +var SingleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SingleSubscriber, _super); + function SingleSubscriber(destination, predicate, source) { var _this = _super.call(this, destination) || this; _this.predicate = predicate; _this.source = source; - _this.count = 0; + _this.seenValue = false; _this.index = 0; return _this; } - CountSubscriber.prototype._next = function (value) { + SingleSubscriber.prototype.applySingleValue = function (value) { + if (this.seenValue) { + this.destination.error('Sequence contains more than one element'); + } + else { + this.seenValue = true; + this.singleValue = value; + } + }; + SingleSubscriber.prototype._next = function (value) { + var index = this.index++; if (this.predicate) { - this._tryPredicate(value); + this.tryNext(value, index); } else { - this.count++; + this.applySingleValue(value); } }; - CountSubscriber.prototype._tryPredicate = function (value) { - var result; + SingleSubscriber.prototype.tryNext = function (value, index) { try { - result = this.predicate(value, this.index++, this.source); + if (this.predicate(value, index, this.source)) { + this.applySingleValue(value); + } } catch (err) { this.destination.error(err); - return; - } - if (result) { - this.count++; } }; - CountSubscriber.prototype._complete = function () { - this.destination.next(this.count); - this.destination.complete(); + SingleSubscriber.prototype._complete = function () { + var destination = this.destination; + if (this.index > 0) { + destination.next(this.seenValue ? this.singleValue : undefined); + destination.complete(); + } + else { + destination.error(new _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__["EmptyError"]); + } }; - return CountSubscriber; + return SingleSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=count.js.map +//# sourceMappingURL=single.js.map /***/ }), -/* 285 */ +/* 311 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return debounce; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return skip; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function debounce(durationSelector) { - return function (source) { return source.lift(new DebounceOperator(durationSelector)); }; +function skip(count) { + return function (source) { return source.lift(new SkipOperator(count)); }; } -var DebounceOperator = /*@__PURE__*/ (function () { - function DebounceOperator(durationSelector) { - this.durationSelector = durationSelector; +var SkipOperator = /*@__PURE__*/ (function () { + function SkipOperator(total) { + this.total = total; } - DebounceOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector)); + SkipOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SkipSubscriber(subscriber, this.total)); }; - return DebounceOperator; + return SkipOperator; }()); -var DebounceSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceSubscriber, _super); - function DebounceSubscriber(destination, durationSelector) { +var SkipSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipSubscriber, _super); + function SkipSubscriber(destination, total) { var _this = _super.call(this, destination) || this; - _this.durationSelector = durationSelector; - _this.hasValue = false; - _this.durationSubscription = null; + _this.total = total; + _this.count = 0; return _this; } - DebounceSubscriber.prototype._next = function (value) { - try { - var result = this.durationSelector.call(this, value); - if (result) { - this._tryNext(value, result); - } - } - catch (err) { - this.destination.error(err); - } - }; - DebounceSubscriber.prototype._complete = function () { - this.emitValue(); - this.destination.complete(); - }; - DebounceSubscriber.prototype._tryNext = function (value, duration) { - var subscription = this.durationSubscription; - this.value = value; - this.hasValue = true; - if (subscription) { - subscription.unsubscribe(); - this.remove(subscription); - } - subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); - if (subscription && !subscription.closed) { - this.add(this.durationSubscription = subscription); - } - }; - DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.emitValue(); - }; - DebounceSubscriber.prototype.notifyComplete = function () { - this.emitValue(); - }; - DebounceSubscriber.prototype.emitValue = function () { - if (this.hasValue) { - var value = this.value; - var subscription = this.durationSubscription; - if (subscription) { - this.durationSubscription = null; - subscription.unsubscribe(); - this.remove(subscription); - } - this.value = null; - this.hasValue = false; - _super.prototype._next.call(this, value); + SkipSubscriber.prototype._next = function (x) { + if (++this.count > this.total) { + this.destination.next(x); } }; - return DebounceSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=debounce.js.map + return SkipSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skip.js.map /***/ }), -/* 286 */ +/* 312 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return debounceTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return skipLast; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(193); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */ -function debounceTime(dueTime, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - } - return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); }; +function skipLast(count) { + return function (source) { return source.lift(new SkipLastOperator(count)); }; } -var DebounceTimeOperator = /*@__PURE__*/ (function () { - function DebounceTimeOperator(dueTime, scheduler) { - this.dueTime = dueTime; - this.scheduler = scheduler; +var SkipLastOperator = /*@__PURE__*/ (function () { + function SkipLastOperator(_skipCount) { + this._skipCount = _skipCount; + if (this._skipCount < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; + } } - DebounceTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); + SkipLastOperator.prototype.call = function (subscriber, source) { + if (this._skipCount === 0) { + return source.subscribe(new _Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"](subscriber)); + } + else { + return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount)); + } }; - return DebounceTimeOperator; + return SkipLastOperator; }()); -var DebounceTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceTimeSubscriber, _super); - function DebounceTimeSubscriber(destination, dueTime, scheduler) { +var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipLastSubscriber, _super); + function SkipLastSubscriber(destination, _skipCount) { var _this = _super.call(this, destination) || this; - _this.dueTime = dueTime; - _this.scheduler = scheduler; - _this.debouncedSubscription = null; - _this.lastValue = null; - _this.hasValue = false; + _this._skipCount = _skipCount; + _this._count = 0; + _this._ring = new Array(_skipCount); return _this; } - DebounceTimeSubscriber.prototype._next = function (value) { - this.clearDebounce(); - this.lastValue = value; - this.hasValue = true; - this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this)); - }; - DebounceTimeSubscriber.prototype._complete = function () { - this.debouncedNext(); - this.destination.complete(); - }; - DebounceTimeSubscriber.prototype.debouncedNext = function () { - this.clearDebounce(); - if (this.hasValue) { - var lastValue = this.lastValue; - this.lastValue = null; - this.hasValue = false; - this.destination.next(lastValue); + SkipLastSubscriber.prototype._next = function (value) { + var skipCount = this._skipCount; + var count = this._count++; + if (count < skipCount) { + this._ring[count] = value; } - }; - DebounceTimeSubscriber.prototype.clearDebounce = function () { - var debouncedSubscription = this.debouncedSubscription; - if (debouncedSubscription !== null) { - this.remove(debouncedSubscription); - debouncedSubscription.unsubscribe(); - this.debouncedSubscription = null; + else { + var currentIndex = count % skipCount; + var ring = this._ring; + var oldValue = ring[currentIndex]; + ring[currentIndex] = value; + this.destination.next(oldValue); } }; - return DebounceTimeSubscriber; + return SkipLastSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNext(subscriber) { - subscriber.debouncedNext(); -} -//# sourceMappingURL=debounceTime.js.map +//# sourceMappingURL=skipLast.js.map /***/ }), -/* 287 */ +/* 313 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return defaultIfEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return skipUntil; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function defaultIfEmpty(defaultValue) { - if (defaultValue === void 0) { - defaultValue = null; - } - return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); }; + + +function skipUntil(notifier) { + return function (source) { return source.lift(new SkipUntilOperator(notifier)); }; } -var DefaultIfEmptyOperator = /*@__PURE__*/ (function () { - function DefaultIfEmptyOperator(defaultValue) { - this.defaultValue = defaultValue; +var SkipUntilOperator = /*@__PURE__*/ (function () { + function SkipUntilOperator(notifier) { + this.notifier = notifier; } - DefaultIfEmptyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue)); + SkipUntilOperator.prototype.call = function (destination, source) { + return source.subscribe(new SkipUntilSubscriber(destination, this.notifier)); }; - return DefaultIfEmptyOperator; + return SkipUntilOperator; }()); -var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DefaultIfEmptySubscriber, _super); - function DefaultIfEmptySubscriber(destination, defaultValue) { +var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipUntilSubscriber, _super); + function SkipUntilSubscriber(destination, notifier) { var _this = _super.call(this, destination) || this; - _this.defaultValue = defaultValue; - _this.isEmpty = true; + _this.hasValue = false; + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](_this, undefined, undefined); + _this.add(innerSubscriber); + _this.innerSubscription = innerSubscriber; + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(_this, notifier, undefined, undefined, innerSubscriber); return _this; } - DefaultIfEmptySubscriber.prototype._next = function (value) { - this.isEmpty = false; - this.destination.next(value); + SkipUntilSubscriber.prototype._next = function (value) { + if (this.hasValue) { + _super.prototype._next.call(this, value); + } }; - DefaultIfEmptySubscriber.prototype._complete = function () { - if (this.isEmpty) { - this.destination.next(this.defaultValue); + SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.hasValue = true; + if (this.innerSubscription) { + this.innerSubscription.unsubscribe(); } - this.destination.complete(); }; - return DefaultIfEmptySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=defaultIfEmpty.js.map + SkipUntilSubscriber.prototype.notifyComplete = function () { + }; + return SkipUntilSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=skipUntil.js.map /***/ }), -/* 288 */ +/* 314 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(289); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return skipWhile; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + +function skipWhile(predicate) { + return function (source) { return source.lift(new SkipWhileOperator(predicate)); }; +} +var SkipWhileOperator = /*@__PURE__*/ (function () { + function SkipWhileOperator(predicate) { + this.predicate = predicate; + } + SkipWhileOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate)); + }; + return SkipWhileOperator; +}()); +var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipWhileSubscriber, _super); + function SkipWhileSubscriber(destination, predicate) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.skipping = true; + _this.index = 0; + return _this; + } + SkipWhileSubscriber.prototype._next = function (value) { + var destination = this.destination; + if (this.skipping) { + this.tryCallPredicate(value); + } + if (!this.skipping) { + destination.next(value); + } + }; + SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { + try { + var result = this.predicate(value, this.index++); + this.skipping = Boolean(result); + } + catch (err) { + this.destination.error(err); + } + }; + return SkipWhileSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skipWhile.js.map +/***/ }), +/* 315 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return startWith; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(210); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(176); +/** PURE_IMPORTS_START _observable_concat,_util_isScheduler PURE_IMPORTS_END */ -function delay(delay, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + +function startWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; + } + var scheduler = array[array.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(scheduler)) { + array.pop(); + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source, scheduler); }; + } + else { + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source); }; } - var absoluteDelay = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(delay); - var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay); - return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); }; } -var DelayOperator = /*@__PURE__*/ (function () { - function DelayOperator(delay, scheduler) { - this.delay = delay; +//# sourceMappingURL=startWith.js.map + + +/***/ }), +/* 316 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return subscribeOn; }); +/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(317); +/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ + +function subscribeOn(scheduler, delay) { + if (delay === void 0) { + delay = 0; + } + return function subscribeOnOperatorFunction(source) { + return source.lift(new SubscribeOnOperator(scheduler, delay)); + }; +} +var SubscribeOnOperator = /*@__PURE__*/ (function () { + function SubscribeOnOperator(scheduler, delay) { this.scheduler = scheduler; + this.delay = delay; } - DelayOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); + SubscribeOnOperator.prototype.call = function (subscriber, source) { + return new _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__["SubscribeOnObservable"](source, this.delay, this.scheduler).subscribe(subscriber); }; - return DelayOperator; + return SubscribeOnOperator; }()); -var DelaySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelaySubscriber, _super); - function DelaySubscriber(destination, delay, scheduler) { - var _this = _super.call(this, destination) || this; - _this.delay = delay; +//# sourceMappingURL=subscribeOn.js.map + + +/***/ }), +/* 317 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubscribeOnObservable", function() { return SubscribeOnObservable; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(141); +/* harmony import */ var _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(228); +/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */ + + + + +var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscribeOnObservable, _super); + function SubscribeOnObservable(source, delayTime, scheduler) { + if (delayTime === void 0) { + delayTime = 0; + } + if (scheduler === void 0) { + scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + } + var _this = _super.call(this) || this; + _this.source = source; + _this.delayTime = delayTime; _this.scheduler = scheduler; - _this.queue = []; - _this.active = false; - _this.errored = false; + if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_3__["isNumeric"])(delayTime) || delayTime < 0) { + _this.delayTime = 0; + } + if (!scheduler || typeof scheduler.schedule !== 'function') { + _this.scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + } return _this; } - DelaySubscriber.dispatch = function (state) { - var source = state.source; - var queue = source.queue; - var scheduler = state.scheduler; - var destination = state.destination; - while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) { - queue.shift().notification.observe(destination); - } - if (queue.length > 0) { - var delay_1 = Math.max(0, queue[0].time - scheduler.now()); - this.schedule(state, delay_1); + SubscribeOnObservable.create = function (source, delay, scheduler) { + if (delay === void 0) { + delay = 0; } - else { - this.unsubscribe(); - source.active = false; + if (scheduler === void 0) { + scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; } + return new SubscribeOnObservable(source, delay, scheduler); }; - DelaySubscriber.prototype._schedule = function (scheduler) { - this.active = true; - var destination = this.destination; - destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { - source: this, destination: this.destination, scheduler: scheduler - })); + SubscribeOnObservable.dispatch = function (arg) { + var source = arg.source, subscriber = arg.subscriber; + return this.add(source.subscribe(subscriber)); }; - DelaySubscriber.prototype.scheduleNotification = function (notification) { - if (this.errored === true) { - return; - } + SubscribeOnObservable.prototype._subscribe = function (subscriber) { + var delay = this.delayTime; + var source = this.source; var scheduler = this.scheduler; - var message = new DelayMessage(scheduler.now() + this.delay, notification); - this.queue.push(message); - if (this.active === false) { - this._schedule(scheduler); - } - }; - DelaySubscriber.prototype._next = function (value) { - this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createNext(value)); - }; - DelaySubscriber.prototype._error = function (err) { - this.errored = true; - this.queue = []; - this.destination.error(err); - this.unsubscribe(); - }; - DelaySubscriber.prototype._complete = function () { - this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createComplete()); - this.unsubscribe(); + return scheduler.schedule(SubscribeOnObservable.dispatch, delay, { + source: source, subscriber: subscriber + }); }; - return DelaySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -var DelayMessage = /*@__PURE__*/ (function () { - function DelayMessage(time, notification) { - this.time = time; - this.notification = notification; - } - return DelayMessage; -}()); -//# sourceMappingURL=delay.js.map + return SubscribeOnObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); + +//# sourceMappingURL=SubscribeOnObservable.js.map /***/ }), -/* 289 */ +/* 318 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return isDate; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isDate(value) { - return value instanceof Date && !isNaN(+value); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return switchAll; }); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(319); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(191); +/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ + + +function switchAll() { + return Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]); } -//# sourceMappingURL=isDate.js.map +//# sourceMappingURL=switchAll.js.map /***/ }), -/* 290 */ +/* 319 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return delayWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return switchMap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(197); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(214); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ -function delayWhen(delayDurationSelector, subscriptionDelay) { - if (subscriptionDelay) { - return function (source) { - return new SubscriptionDelayObservable(source, subscriptionDelay) - .lift(new DelayWhenOperator(delayDurationSelector)); - }; + +function switchMap(project, resultSelector) { + if (typeof resultSelector === 'function') { + return function (source) { return source.pipe(switchMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; } - return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); }; + return function (source) { return source.lift(new SwitchMapOperator(project)); }; } -var DelayWhenOperator = /*@__PURE__*/ (function () { - function DelayWhenOperator(delayDurationSelector) { - this.delayDurationSelector = delayDurationSelector; +var SwitchMapOperator = /*@__PURE__*/ (function () { + function SwitchMapOperator(project) { + this.project = project; } - DelayWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector)); + SwitchMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SwitchMapSubscriber(subscriber, this.project)); }; - return DelayWhenOperator; + return SwitchMapOperator; }()); -var DelayWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelayWhenSubscriber, _super); - function DelayWhenSubscriber(destination, delayDurationSelector) { +var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchMapSubscriber, _super); + function SwitchMapSubscriber(destination, project) { var _this = _super.call(this, destination) || this; - _this.delayDurationSelector = delayDurationSelector; - _this.completed = false; - _this.delayNotifierSubscriptions = []; + _this.project = project; _this.index = 0; return _this; } - DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(outerValue); - this.removeSubscription(innerSub); - this.tryComplete(); - }; - DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) { - var value = this.removeSubscription(innerSub); - if (value) { - this.destination.next(value); - } - this.tryComplete(); - }; - DelayWhenSubscriber.prototype._next = function (value) { + SwitchMapSubscriber.prototype._next = function (value) { + var result; var index = this.index++; try { - var delayNotifier = this.delayDurationSelector(value, index); - if (delayNotifier) { - this.tryDelay(delayNotifier, value); - } - } - catch (err) { - this.destination.error(err); + result = this.project(value, index); } - }; - DelayWhenSubscriber.prototype._complete = function () { - this.completed = true; - this.tryComplete(); - this.unsubscribe(); - }; - DelayWhenSubscriber.prototype.removeSubscription = function (subscription) { - subscription.unsubscribe(); - var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription); - if (subscriptionIdx !== -1) { - this.delayNotifierSubscriptions.splice(subscriptionIdx, 1); + catch (error) { + this.destination.error(error); + return; } - return subscription.outerValue; + this._innerSub(result, value, index); }; - DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) { - var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, delayNotifier, value); - if (notifierSubscription && !notifierSubscription.closed) { - var destination = this.destination; - destination.add(notifierSubscription); - this.delayNotifierSubscriptions.push(notifierSubscription); + SwitchMapSubscriber.prototype._innerSub = function (result, value, index) { + var innerSubscription = this.innerSubscription; + if (innerSubscription) { + innerSubscription.unsubscribe(); } + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + this.innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); }; - DelayWhenSubscriber.prototype.tryComplete = function () { - if (this.completed && this.delayNotifierSubscriptions.length === 0) { - this.destination.complete(); + SwitchMapSubscriber.prototype._complete = function () { + var innerSubscription = this.innerSubscription; + if (!innerSubscription || innerSubscription.closed) { + _super.prototype._complete.call(this); } - }; - return DelayWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -var SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelayObservable, _super); - function SubscriptionDelayObservable(source, subscriptionDelay) { - var _this = _super.call(this) || this; - _this.source = source; - _this.subscriptionDelay = subscriptionDelay; - return _this; - } - SubscriptionDelayObservable.prototype._subscribe = function (subscriber) { - this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source)); - }; - return SubscriptionDelayObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); -var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelaySubscriber, _super); - function SubscriptionDelaySubscriber(parent, source) { - var _this = _super.call(this) || this; - _this.parent = parent; - _this.source = source; - _this.sourceSubscribed = false; - return _this; - } - SubscriptionDelaySubscriber.prototype._next = function (unused) { - this.subscribeToSource(); - }; - SubscriptionDelaySubscriber.prototype._error = function (err) { this.unsubscribe(); - this.parent.error(err); }; - SubscriptionDelaySubscriber.prototype._complete = function () { - this.unsubscribe(); - this.subscribeToSource(); + SwitchMapSubscriber.prototype._unsubscribe = function () { + this.innerSubscription = null; }; - SubscriptionDelaySubscriber.prototype.subscribeToSource = function () { - if (!this.sourceSubscribed) { - this.sourceSubscribed = true; - this.unsubscribe(); - this.source.subscribe(this.parent); + SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) { + var destination = this.destination; + destination.remove(innerSub); + this.innerSubscription = null; + if (this.isStopped) { + _super.prototype._complete.call(this); } }; - return SubscriptionDelaySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=delayWhen.js.map + SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + return SwitchMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=switchMap.js.map /***/ }), -/* 291 */ +/* 320 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return dematerialize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return switchMapTo; }); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(319); +/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ -function dematerialize() { - return function dematerializeOperatorFunction(source) { - return source.lift(new DeMaterializeOperator()); - }; +function switchMapTo(innerObservable, resultSelector) { + return resultSelector ? Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }, resultSelector) : Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }); } -var DeMaterializeOperator = /*@__PURE__*/ (function () { - function DeMaterializeOperator() { - } - DeMaterializeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DeMaterializeSubscriber(subscriber)); - }; - return DeMaterializeOperator; -}()); -var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DeMaterializeSubscriber, _super); - function DeMaterializeSubscriber(destination) { - return _super.call(this, destination) || this; - } - DeMaterializeSubscriber.prototype._next = function (value) { - value.observe(this.destination); - }; - return DeMaterializeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=dematerialize.js.map +//# sourceMappingURL=switchMapTo.js.map /***/ }), -/* 292 */ +/* 321 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return distinct; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DistinctSubscriber", function() { return DistinctSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return takeUntil; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); /** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function distinct(keySelector, flushes) { - return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); }; +function takeUntil(notifier) { + return function (source) { return source.lift(new TakeUntilOperator(notifier)); }; } -var DistinctOperator = /*@__PURE__*/ (function () { - function DistinctOperator(keySelector, flushes) { - this.keySelector = keySelector; - this.flushes = flushes; +var TakeUntilOperator = /*@__PURE__*/ (function () { + function TakeUntilOperator(notifier) { + this.notifier = notifier; } - DistinctOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes)); + TakeUntilOperator.prototype.call = function (subscriber, source) { + var takeUntilSubscriber = new TakeUntilSubscriber(subscriber); + var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(takeUntilSubscriber, this.notifier); + if (notifierSubscription && !takeUntilSubscriber.seenValue) { + takeUntilSubscriber.add(notifierSubscription); + return source.subscribe(takeUntilSubscriber); + } + return takeUntilSubscriber; }; - return DistinctOperator; + return TakeUntilOperator; }()); -var DistinctSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctSubscriber, _super); - function DistinctSubscriber(destination, keySelector, flushes) { +var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeUntilSubscriber, _super); + function TakeUntilSubscriber(destination) { var _this = _super.call(this, destination) || this; - _this.keySelector = keySelector; - _this.values = new Set(); - if (flushes) { - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, flushes)); - } + _this.seenValue = false; return _this; } - DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values.clear(); - }; - DistinctSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - DistinctSubscriber.prototype._next = function (value) { - if (this.keySelector) { - this._useKeySelector(value); - } - else { - this._finalizeNext(value, value); - } - }; - DistinctSubscriber.prototype._useKeySelector = function (value) { - var key; - var destination = this.destination; - try { - key = this.keySelector(value); - } - catch (err) { - destination.error(err); - return; - } - this._finalizeNext(key, value); + TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.seenValue = true; + this.complete(); }; - DistinctSubscriber.prototype._finalizeNext = function (key, value) { - var values = this.values; - if (!values.has(key)) { - values.add(key); - this.destination.next(value); - } + TakeUntilSubscriber.prototype.notifyComplete = function () { }; - return DistinctSubscriber; + return TakeUntilSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); - -//# sourceMappingURL=distinct.js.map +//# sourceMappingURL=takeUntil.js.map /***/ }), -/* 293 */ +/* 322 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return distinctUntilChanged; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return takeWhile; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function distinctUntilChanged(compare, keySelector) { - return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; +function takeWhile(predicate, inclusive) { + if (inclusive === void 0) { + inclusive = false; + } + return function (source) { + return source.lift(new TakeWhileOperator(predicate, inclusive)); + }; } -var DistinctUntilChangedOperator = /*@__PURE__*/ (function () { - function DistinctUntilChangedOperator(compare, keySelector) { - this.compare = compare; - this.keySelector = keySelector; +var TakeWhileOperator = /*@__PURE__*/ (function () { + function TakeWhileOperator(predicate, inclusive) { + this.predicate = predicate; + this.inclusive = inclusive; } - DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); + TakeWhileOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive)); }; - return DistinctUntilChangedOperator; + return TakeWhileOperator; }()); -var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctUntilChangedSubscriber, _super); - function DistinctUntilChangedSubscriber(destination, compare, keySelector) { +var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeWhileSubscriber, _super); + function TakeWhileSubscriber(destination, predicate, inclusive) { var _this = _super.call(this, destination) || this; - _this.keySelector = keySelector; - _this.hasKey = false; - if (typeof compare === 'function') { - _this.compare = compare; - } + _this.predicate = predicate; + _this.inclusive = inclusive; + _this.index = 0; return _this; } - DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { - return x === y; - }; - DistinctUntilChangedSubscriber.prototype._next = function (value) { - var key; + TakeWhileSubscriber.prototype._next = function (value) { + var destination = this.destination; + var result; try { - var keySelector = this.keySelector; - key = keySelector ? keySelector(value) : value; + result = this.predicate(value, this.index++); } catch (err) { - return this.destination.error(err); + destination.error(err); + return; } - var result = false; - if (this.hasKey) { - try { - var compare = this.compare; - result = compare(this.key, key); - } - catch (err) { - return this.destination.error(err); - } + this.nextOrComplete(value, result); + }; + TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) { + var destination = this.destination; + if (Boolean(predicateResult)) { + destination.next(value); } else { - this.hasKey = true; - } - if (!result) { - this.key = key; - this.destination.next(value); + if (this.inclusive) { + destination.next(value); + } + destination.complete(); } }; - return DistinctUntilChangedSubscriber; + return TakeWhileSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=distinctUntilChanged.js.map - - -/***/ }), -/* 294 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); -/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(293); -/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ - -function distinctUntilKeyChanged(key, compare) { - return Object(_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__["distinctUntilChanged"])(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; }); -} -//# sourceMappingURL=distinctUntilKeyChanged.js.map +//# sourceMappingURL=takeWhile.js.map /***/ }), -/* 295 */ +/* 323 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; }); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(222); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(296); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(287); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(297); -/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ - - - - - -function elementAt(index, defaultValue) { - if (index < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); - } - var hasDefaultValue = arguments.length >= 2; - return function (source) { - return source.pipe(Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return i === index; }), Object(_take__WEBPACK_IMPORTED_MODULE_4__["take"])(1), hasDefaultValue - ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) - : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__["throwIfEmpty"])(function () { return new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); })); - }; -} -//# sourceMappingURL=elementAt.js.map - - -/***/ }), -/* 296 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return tap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(156); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return throwIfEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(223); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_util_EmptyError,_Subscriber PURE_IMPORTS_END */ -function throwIfEmpty(errorFactory) { - if (errorFactory === void 0) { - errorFactory = defaultErrorFactory; - } - return function (source) { - return source.lift(new ThrowIfEmptyOperator(errorFactory)); +function tap(nextOrObserver, error, complete) { + return function tapOperatorFunction(source) { + return source.lift(new DoOperator(nextOrObserver, error, complete)); }; } -var ThrowIfEmptyOperator = /*@__PURE__*/ (function () { - function ThrowIfEmptyOperator(errorFactory) { - this.errorFactory = errorFactory; +var DoOperator = /*@__PURE__*/ (function () { + function DoOperator(nextOrObserver, error, complete) { + this.nextOrObserver = nextOrObserver; + this.error = error; + this.complete = complete; } - ThrowIfEmptyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory)); + DoOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); }; - return ThrowIfEmptyOperator; + return DoOperator; }()); -var ThrowIfEmptySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrowIfEmptySubscriber, _super); - function ThrowIfEmptySubscriber(destination, errorFactory) { +var TapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TapSubscriber, _super); + function TapSubscriber(destination, observerOrNext, error, complete) { var _this = _super.call(this, destination) || this; - _this.errorFactory = errorFactory; - _this.hasValue = false; + _this._tapNext = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_3__["isFunction"])(observerOrNext)) { + _this._context = _this; + _this._tapNext = observerOrNext; + } + else if (observerOrNext) { + _this._context = observerOrNext; + _this._tapNext = observerOrNext.next || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = observerOrNext.error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = observerOrNext.complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + } return _this; } - ThrowIfEmptySubscriber.prototype._next = function (value) { - this.hasValue = true; - this.destination.next(value); - }; - ThrowIfEmptySubscriber.prototype._complete = function () { - if (!this.hasValue) { - var err = void 0; - try { - err = this.errorFactory(); - } - catch (e) { - err = e; - } - this.destination.error(err); + TapSubscriber.prototype._next = function (value) { + try { + this._tapNext.call(this._context, value); } - else { - return this.destination.complete(); + catch (err) { + this.destination.error(err); + return; } + this.destination.next(value); }; - return ThrowIfEmptySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -function defaultErrorFactory() { - return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__["EmptyError"](); -} -//# sourceMappingURL=throwIfEmpty.js.map - - -/***/ }), -/* 297 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "take", function() { return take; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(222); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(203); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ - - - - -function take(count) { - return function (source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); + TapSubscriber.prototype._error = function (err) { + try { + this._tapError.call(this._context, err); } - else { - return source.lift(new TakeOperator(count)); + catch (err) { + this.destination.error(err); + return; } + this.destination.error(err); }; -} -var TakeOperator = /*@__PURE__*/ (function () { - function TakeOperator(total) { - this.total = total; - if (this.total < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; + TapSubscriber.prototype._complete = function () { + try { + this._tapComplete.call(this._context); } - } - TakeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeSubscriber(subscriber, this.total)); - }; - return TakeOperator; -}()); -var TakeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeSubscriber, _super); - function TakeSubscriber(destination, total) { - var _this = _super.call(this, destination) || this; - _this.total = total; - _this.count = 0; - return _this; - } - TakeSubscriber.prototype._next = function (value) { - var total = this.total; - var count = ++this.count; - if (count <= total) { - this.destination.next(value); - if (count === total) { - this.destination.complete(); - this.unsubscribe(); - } + catch (err) { + this.destination.error(err); + return; } + return this.destination.complete(); }; - return TakeSubscriber; + return TapSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=take.js.map +//# sourceMappingURL=tap.js.map /***/ }), -/* 298 */ +/* 324 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return endWith; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239); -/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(204); -/** PURE_IMPORTS_START _observable_concat,_observable_of PURE_IMPORTS_END */ - - -function endWith() { - var array = []; - for (var _i = 0; _i < arguments.length; _i++) { - array[_i] = arguments[_i]; - } - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(source, _observable_of__WEBPACK_IMPORTED_MODULE_1__["of"].apply(void 0, array)); }; -} -//# sourceMappingURL=endWith.js.map - - -/***/ }), -/* 299 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultThrottleConfig", function() { return defaultThrottleConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return throttle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function every(predicate, thisArg) { - return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); }; +var defaultThrottleConfig = { + leading: true, + trailing: false +}; +function throttle(durationSelector, config) { + if (config === void 0) { + config = defaultThrottleConfig; + } + return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); }; } -var EveryOperator = /*@__PURE__*/ (function () { - function EveryOperator(predicate, thisArg, source) { - this.predicate = predicate; - this.thisArg = thisArg; - this.source = source; +var ThrottleOperator = /*@__PURE__*/ (function () { + function ThrottleOperator(durationSelector, leading, trailing) { + this.durationSelector = durationSelector; + this.leading = leading; + this.trailing = trailing; } - EveryOperator.prototype.call = function (observer, source) { - return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source)); + ThrottleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing)); }; - return EveryOperator; + return ThrottleOperator; }()); -var EverySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](EverySubscriber, _super); - function EverySubscriber(destination, predicate, thisArg, source) { +var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleSubscriber, _super); + function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) { var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.thisArg = thisArg; - _this.source = source; - _this.index = 0; - _this.thisArg = thisArg || _this; + _this.destination = destination; + _this.durationSelector = durationSelector; + _this._leading = _leading; + _this._trailing = _trailing; + _this._hasValue = false; return _this; } - EverySubscriber.prototype.notifyComplete = function (everyValueMatch) { - this.destination.next(everyValueMatch); - this.destination.complete(); + ThrottleSubscriber.prototype._next = function (value) { + this._hasValue = true; + this._sendValue = value; + if (!this._throttled) { + if (this._leading) { + this.send(); + } + else { + this.throttle(value); + } + } }; - EverySubscriber.prototype._next = function (value) { - var result = false; + ThrottleSubscriber.prototype.send = function () { + var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue; + if (_hasValue) { + this.destination.next(_sendValue); + this.throttle(_sendValue); + } + this._hasValue = false; + this._sendValue = null; + }; + ThrottleSubscriber.prototype.throttle = function (value) { + var duration = this.tryDurationSelector(value); + if (!!duration) { + this.add(this._throttled = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration)); + } + }; + ThrottleSubscriber.prototype.tryDurationSelector = function (value) { try { - result = this.predicate.call(this.thisArg, value, this.index++, this.source); + return this.durationSelector(value); } catch (err) { this.destination.error(err); - return; + return null; } - if (!result) { - this.notifyComplete(false); + }; + ThrottleSubscriber.prototype.throttlingDone = function () { + var _a = this, _throttled = _a._throttled, _trailing = _a._trailing; + if (_throttled) { + _throttled.unsubscribe(); + } + this._throttled = null; + if (_trailing) { + this.send(); } }; - EverySubscriber.prototype._complete = function () { - this.notifyComplete(true); + ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.throttlingDone(); }; - return EverySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=every.js.map + ThrottleSubscriber.prototype.notifyComplete = function () { + this.throttlingDone(); + }; + return ThrottleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=throttle.js.map /***/ }), -/* 300 */ +/* 325 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return exhaust; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return throttleTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(186); +/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(324); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ -function exhaust() { - return function (source) { return source.lift(new SwitchFirstOperator()); }; + +function throttleTime(duration, scheduler, config) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + } + if (config === void 0) { + config = _throttle__WEBPACK_IMPORTED_MODULE_3__["defaultThrottleConfig"]; + } + return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); }; } -var SwitchFirstOperator = /*@__PURE__*/ (function () { - function SwitchFirstOperator() { +var ThrottleTimeOperator = /*@__PURE__*/ (function () { + function ThrottleTimeOperator(duration, scheduler, leading, trailing) { + this.duration = duration; + this.scheduler = scheduler; + this.leading = leading; + this.trailing = trailing; } - SwitchFirstOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchFirstSubscriber(subscriber)); + ThrottleTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing)); }; - return SwitchFirstOperator; + return ThrottleTimeOperator; }()); -var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchFirstSubscriber, _super); - function SwitchFirstSubscriber(destination) { +var ThrottleTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleTimeSubscriber, _super); + function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) { var _this = _super.call(this, destination) || this; - _this.hasCompleted = false; - _this.hasSubscription = false; + _this.duration = duration; + _this.scheduler = scheduler; + _this.leading = leading; + _this.trailing = trailing; + _this._hasTrailingValue = false; + _this._trailingValue = null; return _this; } - SwitchFirstSubscriber.prototype._next = function (value) { - if (!this.hasSubscription) { - this.hasSubscription = true; - this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, value)); + ThrottleTimeSubscriber.prototype._next = function (value) { + if (this.throttled) { + if (this.trailing) { + this._trailingValue = value; + this._hasTrailingValue = true; + } + } + else { + this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this })); + if (this.leading) { + this.destination.next(value); + } + else if (this.trailing) { + this._trailingValue = value; + this._hasTrailingValue = true; + } } }; - SwitchFirstSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (!this.hasSubscription) { + ThrottleTimeSubscriber.prototype._complete = function () { + if (this._hasTrailingValue) { + this.destination.next(this._trailingValue); this.destination.complete(); } - }; - SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) { - this.remove(innerSub); - this.hasSubscription = false; - if (this.hasCompleted) { + else { this.destination.complete(); } }; - return SwitchFirstSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=exhaust.js.map + ThrottleTimeSubscriber.prototype.clearThrottle = function () { + var throttled = this.throttled; + if (throttled) { + if (this.trailing && this._hasTrailingValue) { + this.destination.next(this._trailingValue); + this._trailingValue = null; + this._hasTrailingValue = false; + } + throttled.unsubscribe(); + this.remove(throttled); + this.throttled = null; + } + }; + return ThrottleTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNext(arg) { + var subscriber = arg.subscriber; + subscriber.clearThrottle(); +} +//# sourceMappingURL=throttleTime.js.map /***/ }), -/* 301 */ +/* 326 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return exhaustMap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(226); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(286); +/* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(221); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(197); +/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ -function exhaustMap(project, resultSelector) { - if (resultSelector) { - return function (source) { return source.pipe(exhaustMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; - } - return function (source) { - return source.lift(new ExhaustMapOperator(project)); +function timeInterval(scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return function (source) { + return Object(_observable_defer__WEBPACK_IMPORTED_MODULE_2__["defer"])(function () { + return source.pipe(Object(_scan__WEBPACK_IMPORTED_MODULE_1__["scan"])(function (_a, value) { + var current = _a.current; + return ({ value: value, current: scheduler.now(), last: current }); + }, { current: scheduler.now(), value: undefined, last: undefined }), Object(_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (_a) { + var current = _a.current, last = _a.last, value = _a.value; + return new TimeInterval(value, current - last); + })); + }); }; } -var ExhaustMapOperator = /*@__PURE__*/ (function () { - function ExhaustMapOperator(project) { - this.project = project; +var TimeInterval = /*@__PURE__*/ (function () { + function TimeInterval(value, interval) { + this.value = value; + this.interval = interval; } - ExhaustMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project)); - }; - return ExhaustMapOperator; + return TimeInterval; }()); -var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExhaustMapSubscriber, _super); - function ExhaustMapSubscriber(destination, project) { - var _this = _super.call(this, destination) || this; - _this.project = project; - _this.hasSubscription = false; - _this.hasCompleted = false; - _this.index = 0; - return _this; - } - ExhaustMapSubscriber.prototype._next = function (value) { - if (!this.hasSubscription) { - this.tryNext(value); - } - }; - ExhaustMapSubscriber.prototype.tryNext = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (err) { - this.destination.error(err); - return; - } - this.hasSubscription = true; - this._innerSub(result, value, index); - }; - ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); - }; - ExhaustMapSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (!this.hasSubscription) { - this.destination.complete(); - } - this.unsubscribe(); - }; - ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); - }; - ExhaustMapSubscriber.prototype.notifyError = function (err) { - this.destination.error(err); - }; - ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) { - var destination = this.destination; - destination.remove(innerSub); - this.hasSubscription = false; - if (this.hasCompleted) { - this.destination.complete(); - } - }; - return ExhaustMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=exhaustMap.js.map + +//# sourceMappingURL=timeInterval.js.map /***/ }), -/* 302 */ +/* 327 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return expand; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandOperator", function() { return ExpandOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandSubscriber", function() { return ExpandSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return timeout; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(195); +/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(328); +/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(180); +/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ -function expand(project, concurrent, scheduler) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } + +function timeout(due, scheduler) { if (scheduler === void 0) { - scheduler = undefined; + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; } - concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent; - return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); }; + return Object(_timeoutWith__WEBPACK_IMPORTED_MODULE_2__["timeoutWith"])(due, Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_3__["throwError"])(new _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]()), scheduler); } -var ExpandOperator = /*@__PURE__*/ (function () { - function ExpandOperator(project, concurrent, scheduler) { - this.project = project; - this.concurrent = concurrent; - this.scheduler = scheduler; - } - ExpandOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); - }; - return ExpandOperator; -}()); - -var ExpandSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExpandSubscriber, _super); - function ExpandSubscriber(destination, project, concurrent, scheduler) { - var _this = _super.call(this, destination) || this; - _this.project = project; - _this.concurrent = concurrent; - _this.scheduler = scheduler; - _this.index = 0; - _this.active = 0; - _this.hasCompleted = false; - if (concurrent < Number.POSITIVE_INFINITY) { - _this.buffer = []; - } - return _this; - } - ExpandSubscriber.dispatch = function (arg) { - var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; - subscriber.subscribeToProjection(result, value, index); - }; - ExpandSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (destination.closed) { - this._complete(); - return; - } - var index = this.index++; - if (this.active < this.concurrent) { - destination.next(value); - try { - var project = this.project; - var result = project(value, index); - if (!this.scheduler) { - this.subscribeToProjection(result, value, index); - } - else { - var state = { subscriber: this, result: result, value: value, index: index }; - var destination_1 = this.destination; - destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); - } - } - catch (e) { - destination.error(e); - } - } - else { - this.buffer.push(value); - } - }; - ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { - this.active++; - var destination = this.destination; - destination.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, result, value, index)); - }; - ExpandSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); - } - this.unsubscribe(); - }; - ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this._next(innerValue); - }; - ExpandSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - var destination = this.destination; - destination.remove(innerSub); - this.active--; - if (buffer && buffer.length > 0) { - this._next(buffer.shift()); - } - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); - } - }; - return ExpandSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); - -//# sourceMappingURL=expand.js.map +//# sourceMappingURL=timeout.js.map /***/ }), -/* 303 */ +/* 328 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return finalize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */ - - - -function finalize(callback) { - return function (source) { return source.lift(new FinallyOperator(callback)); }; -} -var FinallyOperator = /*@__PURE__*/ (function () { - function FinallyOperator(callback) { - this.callback = callback; - } - FinallyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FinallySubscriber(subscriber, this.callback)); - }; - return FinallyOperator; -}()); -var FinallySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FinallySubscriber, _super); - function FinallySubscriber(destination, callback) { - var _this = _super.call(this, destination) || this; - _this.add(new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](callback)); - return _this; - } - return FinallySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=finalize.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return timeoutWith; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(260); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -/***/ }), -/* 304 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueOperator", function() { return FindValueOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueSubscriber", function() { return FindValueSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function find(predicate, thisArg) { - if (typeof predicate !== 'function') { - throw new TypeError('predicate is not a function'); +function timeoutWith(due, withObservable, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; } - return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); }; + return function (source) { + var absoluteTimeout = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(due); + var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due); + return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler)); + }; } -var FindValueOperator = /*@__PURE__*/ (function () { - function FindValueOperator(predicate, source, yieldIndex, thisArg) { - this.predicate = predicate; - this.source = source; - this.yieldIndex = yieldIndex; - this.thisArg = thisArg; +var TimeoutWithOperator = /*@__PURE__*/ (function () { + function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) { + this.waitFor = waitFor; + this.absoluteTimeout = absoluteTimeout; + this.withObservable = withObservable; + this.scheduler = scheduler; } - FindValueOperator.prototype.call = function (observer, source) { - return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg)); + TimeoutWithOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler)); }; - return FindValueOperator; + return TimeoutWithOperator; }()); - -var FindValueSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FindValueSubscriber, _super); - function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) { +var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TimeoutWithSubscriber, _super); + function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) { var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.source = source; - _this.yieldIndex = yieldIndex; - _this.thisArg = thisArg; - _this.index = 0; + _this.absoluteTimeout = absoluteTimeout; + _this.waitFor = waitFor; + _this.withObservable = withObservable; + _this.scheduler = scheduler; + _this.action = null; + _this.scheduleTimeout(); return _this; } - FindValueSubscriber.prototype.notifyComplete = function (value) { - var destination = this.destination; - destination.next(value); - destination.complete(); - this.unsubscribe(); + TimeoutWithSubscriber.dispatchTimeout = function (subscriber) { + var withObservable = subscriber.withObservable; + subscriber._unsubscribeAndRecycle(); + subscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(subscriber, withObservable)); }; - FindValueSubscriber.prototype._next = function (value) { - var _a = this, predicate = _a.predicate, thisArg = _a.thisArg; - var index = this.index++; - try { - var result = predicate.call(thisArg || this, value, index, this.source); - if (result) { - this.notifyComplete(this.yieldIndex ? index : value); - } + TimeoutWithSubscriber.prototype.scheduleTimeout = function () { + var action = this.action; + if (action) { + this.action = action.schedule(this, this.waitFor); } - catch (err) { - this.destination.error(err); + else { + this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this)); } }; - FindValueSubscriber.prototype._complete = function () { - this.notifyComplete(this.yieldIndex ? -1 : undefined); + TimeoutWithSubscriber.prototype._next = function (value) { + if (!this.absoluteTimeout) { + this.scheduleTimeout(); + } + _super.prototype._next.call(this, value); }; - return FindValueSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -//# sourceMappingURL=find.js.map + TimeoutWithSubscriber.prototype._unsubscribe = function () { + this.action = null; + this.scheduler = null; + this.withObservable = null; + }; + return TimeoutWithSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=timeoutWith.js.map /***/ }), -/* 305 */ +/* 329 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); -/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(304); -/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return timestamp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timestamp", function() { return Timestamp; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(197); +/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */ -function findIndex(predicate, thisArg) { - return function (source) { return source.lift(new _operators_find__WEBPACK_IMPORTED_MODULE_0__["FindValueOperator"](predicate, source, true, thisArg)); }; + +function timestamp(scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return Object(_map__WEBPACK_IMPORTED_MODULE_1__["map"])(function (value) { return new Timestamp(value, scheduler.now()); }); } -//# sourceMappingURL=findIndex.js.map +var Timestamp = /*@__PURE__*/ (function () { + function Timestamp(value, timestamp) { + this.value = value; + this.timestamp = timestamp; + } + return Timestamp; +}()); + +//# sourceMappingURL=timestamp.js.map /***/ }), -/* 306 */ +/* 330 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "first", function() { return first; }); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(223); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(297); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(287); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(296); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(220); -/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ - - - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(285); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ -function first(predicate, defaultValue) { - var hasDefaultValue = arguments.length >= 2; - return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_take__WEBPACK_IMPORTED_MODULE_2__["take"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; +function toArrayReducer(arr, item, index) { + if (index === 0) { + return [item]; + } + arr.push(item); + return arr; } -//# sourceMappingURL=first.js.map +function toArray() { + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(toArrayReducer, []); +} +//# sourceMappingURL=toArray.js.map /***/ }), -/* 307 */ +/* 331 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return ignoreElements; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "window", function() { return window; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function ignoreElements() { - return function ignoreElementsOperatorFunction(source) { - return source.lift(new IgnoreElementsOperator()); + + +function window(windowBoundaries) { + return function windowOperatorFunction(source) { + return source.lift(new WindowOperator(windowBoundaries)); }; } -var IgnoreElementsOperator = /*@__PURE__*/ (function () { - function IgnoreElementsOperator() { +var WindowOperator = /*@__PURE__*/ (function () { + function WindowOperator(windowBoundaries) { + this.windowBoundaries = windowBoundaries; } - IgnoreElementsOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new IgnoreElementsSubscriber(subscriber)); + WindowOperator.prototype.call = function (subscriber, source) { + var windowSubscriber = new WindowSubscriber(subscriber); + var sourceSubscription = source.subscribe(windowSubscriber); + if (!sourceSubscription.closed) { + windowSubscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(windowSubscriber, this.windowBoundaries)); + } + return sourceSubscription; }; - return IgnoreElementsOperator; + return WindowOperator; }()); -var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IgnoreElementsSubscriber, _super); - function IgnoreElementsSubscriber() { - return _super !== null && _super.apply(this, arguments) || this; +var WindowSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); + function WindowSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + destination.next(_this.window); + return _this; } - IgnoreElementsSubscriber.prototype._next = function (unused) { + WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openWindow(); }; - return IgnoreElementsSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=ignoreElements.js.map - - -/***/ }), -/* 308 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return isEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -function isEmpty() { - return function (source) { return source.lift(new IsEmptyOperator()); }; -} -var IsEmptyOperator = /*@__PURE__*/ (function () { - function IsEmptyOperator() { - } - IsEmptyOperator.prototype.call = function (observer, source) { - return source.subscribe(new IsEmptySubscriber(observer)); + WindowSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); }; - return IsEmptyOperator; -}()); -var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IsEmptySubscriber, _super); - function IsEmptySubscriber(destination) { - return _super.call(this, destination) || this; - } - IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) { - var destination = this.destination; - destination.next(isEmpty); - destination.complete(); + WindowSubscriber.prototype.notifyComplete = function (innerSub) { + this._complete(); }; - IsEmptySubscriber.prototype._next = function (value) { - this.notifyComplete(false); + WindowSubscriber.prototype._next = function (value) { + this.window.next(value); }; - IsEmptySubscriber.prototype._complete = function () { - this.notifyComplete(true); + WindowSubscriber.prototype._error = function (err) { + this.window.error(err); + this.destination.error(err); }; - return IsEmptySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=isEmpty.js.map + WindowSubscriber.prototype._complete = function () { + this.window.complete(); + this.destination.complete(); + }; + WindowSubscriber.prototype._unsubscribe = function () { + this.window = null; + }; + WindowSubscriber.prototype.openWindow = function () { + var prevWindow = this.window; + if (prevWindow) { + prevWindow.complete(); + } + var destination = this.destination; + var newWindow = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + destination.next(newWindow); + }; + return WindowSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=window.js.map /***/ }), -/* 309 */ +/* 332 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(223); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(310); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(296); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(287); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(220); -/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return windowCount; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(158); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */ -function last(predicate, defaultValue) { - var hasDefaultValue = arguments.length >= 2; - return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_takeLast__WEBPACK_IMPORTED_MODULE_2__["takeLast"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; +function windowCount(windowSize, startWindowEvery) { + if (startWindowEvery === void 0) { + startWindowEvery = 0; + } + return function windowCountOperatorFunction(source) { + return source.lift(new WindowCountOperator(windowSize, startWindowEvery)); + }; } -//# sourceMappingURL=last.js.map - - -/***/ }), -/* 310 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return takeLast; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(222); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(203); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ - - - - -function takeLast(count) { - return function takeLastOperatorFunction(source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); - } - else { - return source.lift(new TakeLastOperator(count)); - } - }; -} -var TakeLastOperator = /*@__PURE__*/ (function () { - function TakeLastOperator(total) { - this.total = total; - if (this.total < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; - } +var WindowCountOperator = /*@__PURE__*/ (function () { + function WindowCountOperator(windowSize, startWindowEvery) { + this.windowSize = windowSize; + this.startWindowEvery = startWindowEvery; } - TakeLastOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeLastSubscriber(subscriber, this.total)); + WindowCountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery)); }; - return TakeLastOperator; + return WindowCountOperator; }()); -var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeLastSubscriber, _super); - function TakeLastSubscriber(destination, total) { +var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowCountSubscriber, _super); + function WindowCountSubscriber(destination, windowSize, startWindowEvery) { var _this = _super.call(this, destination) || this; - _this.total = total; - _this.ring = new Array(); + _this.destination = destination; + _this.windowSize = windowSize; + _this.startWindowEvery = startWindowEvery; + _this.windows = [new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"]()]; _this.count = 0; + destination.next(_this.windows[0]); return _this; } - TakeLastSubscriber.prototype._next = function (value) { - var ring = this.ring; - var total = this.total; - var count = this.count++; - if (ring.length < total) { - ring.push(value); + WindowCountSubscriber.prototype._next = function (value) { + var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize; + var destination = this.destination; + var windowSize = this.windowSize; + var windows = this.windows; + var len = windows.length; + for (var i = 0; i < len && !this.closed; i++) { + windows[i].next(value); } - else { - var index = count % total; - ring[index] = value; + var c = this.count - windowSize + 1; + if (c >= 0 && c % startWindowEvery === 0 && !this.closed) { + windows.shift().complete(); + } + if (++this.count % startWindowEvery === 0 && !this.closed) { + var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); + windows.push(window_1); + destination.next(window_1); } }; - TakeLastSubscriber.prototype._complete = function () { - var destination = this.destination; - var count = this.count; - if (count > 0) { - var total = this.count >= this.total ? this.total : this.count; - var ring = this.ring; - for (var i = 0; i < total; i++) { - var idx = (count++) % total; - destination.next(ring[idx]); + WindowCountSubscriber.prototype._error = function (err) { + var windows = this.windows; + if (windows) { + while (windows.length > 0 && !this.closed) { + windows.shift().error(err); } } - destination.complete(); - }; - return TakeLastSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=takeLast.js.map - - -/***/ }), -/* 311 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return mapTo; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -function mapTo(value) { - return function (source) { return source.lift(new MapToOperator(value)); }; -} -var MapToOperator = /*@__PURE__*/ (function () { - function MapToOperator(value) { - this.value = value; - } - MapToOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MapToSubscriber(subscriber, this.value)); - }; - return MapToOperator; -}()); -var MapToSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapToSubscriber, _super); - function MapToSubscriber(destination, value) { - var _this = _super.call(this, destination) || this; - _this.value = value; - return _this; - } - MapToSubscriber.prototype._next = function (x) { - this.destination.next(this.value); - }; - return MapToSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=mapTo.js.map - - -/***/ }), -/* 312 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return materialize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ - - - -function materialize() { - return function materializeOperatorFunction(source) { - return source.lift(new MaterializeOperator()); - }; -} -var MaterializeOperator = /*@__PURE__*/ (function () { - function MaterializeOperator() { - } - MaterializeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MaterializeSubscriber(subscriber)); - }; - return MaterializeOperator; -}()); -var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MaterializeSubscriber, _super); - function MaterializeSubscriber(destination) { - return _super.call(this, destination) || this; - } - MaterializeSubscriber.prototype._next = function (value) { - this.destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); + this.destination.error(err); }; - MaterializeSubscriber.prototype._error = function (err) { - var destination = this.destination; - destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); - destination.complete(); + WindowCountSubscriber.prototype._complete = function () { + var windows = this.windows; + if (windows) { + while (windows.length > 0 && !this.closed) { + windows.shift().complete(); + } + } + this.destination.complete(); }; - MaterializeSubscriber.prototype._complete = function () { - var destination = this.destination; - destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); - destination.complete(); + WindowCountSubscriber.prototype._unsubscribe = function () { + this.count = 0; + this.windows = null; }; - return MaterializeSubscriber; + return WindowCountSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=materialize.js.map +//# sourceMappingURL=windowCount.js.map /***/ }), -/* 313 */ +/* 333 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(314); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ - -function max(comparer) { - var max = (typeof comparer === 'function') - ? function (x, y) { return comparer(x, y) > 0 ? x : y; } - : function (x, y) { return x > y ? x : y; }; - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(max); -} -//# sourceMappingURL=max.js.map - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return windowTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(186); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(143); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(228); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(176); +/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ -/***/ }), -/* 314 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(315); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(310); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(287); -/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(184); -/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ -function reduce(accumulator, seed) { - if (arguments.length >= 2) { - return function reduceOperatorFunctionWithSeed(source) { - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(accumulator, seed), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1), Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__["defaultIfEmpty"])(seed))(source); - }; +function windowTime(windowTimeSpan) { + var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + var windowCreationInterval = null; + var maxWindowSize = Number.POSITIVE_INFINITY; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[3])) { + scheduler = arguments[3]; } - return function reduceOperatorFunction(source) { - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(function (acc, value, index) { return accumulator(acc, value, index + 1); }), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1))(source); - }; -} -//# sourceMappingURL=reduce.js.map - - -/***/ }), -/* 315 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return scan; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -function scan(accumulator, seed) { - var hasSeed = false; - if (arguments.length >= 2) { - hasSeed = true; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[2])) { + scheduler = arguments[2]; } - return function scanOperatorFunction(source) { - return source.lift(new ScanOperator(accumulator, seed, hasSeed)); + else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[2])) { + maxWindowSize = arguments[2]; + } + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[1])) { + scheduler = arguments[1]; + } + else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[1])) { + windowCreationInterval = arguments[1]; + } + return function windowTimeOperatorFunction(source) { + return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler)); }; } -var ScanOperator = /*@__PURE__*/ (function () { - function ScanOperator(accumulator, seed, hasSeed) { - if (hasSeed === void 0) { - hasSeed = false; - } - this.accumulator = accumulator; - this.seed = seed; - this.hasSeed = hasSeed; +var WindowTimeOperator = /*@__PURE__*/ (function () { + function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { + this.windowTimeSpan = windowTimeSpan; + this.windowCreationInterval = windowCreationInterval; + this.maxWindowSize = maxWindowSize; + this.scheduler = scheduler; } - ScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); + WindowTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler)); }; - return ScanOperator; + return WindowTimeOperator; }()); -var ScanSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ScanSubscriber, _super); - function ScanSubscriber(destination, accumulator, _seed, hasSeed) { - var _this = _super.call(this, destination) || this; - _this.accumulator = accumulator; - _this._seed = _seed; - _this.hasSeed = hasSeed; - _this.index = 0; +var CountedSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountedSubject, _super); + function CountedSubject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._numberOfNextedValues = 0; return _this; } - Object.defineProperty(ScanSubscriber.prototype, "seed", { + CountedSubject.prototype.next = function (value) { + this._numberOfNextedValues++; + _super.prototype.next.call(this, value); + }; + Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", { get: function () { - return this._seed; - }, - set: function (value) { - this.hasSeed = true; - this._seed = value; + return this._numberOfNextedValues; }, enumerable: true, configurable: true }); - ScanSubscriber.prototype._next = function (value) { - if (!this.hasSeed) { - this.seed = value; - this.destination.next(value); + return CountedSubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); +var WindowTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowTimeSubscriber, _super); + function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + _this.windowTimeSpan = windowTimeSpan; + _this.windowCreationInterval = windowCreationInterval; + _this.maxWindowSize = maxWindowSize; + _this.scheduler = scheduler; + _this.windows = []; + var window = _this.openWindow(); + if (windowCreationInterval !== null && windowCreationInterval >= 0) { + var closeState = { subscriber: _this, window: window, context: null }; + var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler }; + _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState)); + _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState)); } else { - return this._tryNext(value); + var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan }; + _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState)); + } + return _this; + } + WindowTimeSubscriber.prototype._next = function (value) { + var windows = this.windows; + var len = windows.length; + for (var i = 0; i < len; i++) { + var window_1 = windows[i]; + if (!window_1.closed) { + window_1.next(value); + if (window_1.numberOfNextedValues >= this.maxWindowSize) { + this.closeWindow(window_1); + } + } } }; - ScanSubscriber.prototype._tryNext = function (value) { - var index = this.index++; - var result; - try { - result = this.accumulator(this.seed, value, index); + WindowTimeSubscriber.prototype._error = function (err) { + var windows = this.windows; + while (windows.length > 0) { + windows.shift().error(err); } - catch (err) { - this.destination.error(err); + this.destination.error(err); + }; + WindowTimeSubscriber.prototype._complete = function () { + var windows = this.windows; + while (windows.length > 0) { + var window_2 = windows.shift(); + if (!window_2.closed) { + window_2.complete(); + } } - this.seed = result; - this.destination.next(result); + this.destination.complete(); }; - return ScanSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=scan.js.map - - -/***/ }), -/* 316 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); -/* harmony import */ var _observable_merge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(258); -/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */ - -function merge() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; + WindowTimeSubscriber.prototype.openWindow = function () { + var window = new CountedSubject(); + this.windows.push(window); + var destination = this.destination; + destination.next(window); + return window; + }; + WindowTimeSubscriber.prototype.closeWindow = function (window) { + window.complete(); + var windows = this.windows; + windows.splice(windows.indexOf(window), 1); + }; + return WindowTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +function dispatchWindowTimeSpanOnly(state) { + var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window; + if (window) { + subscriber.closeWindow(window); } - return function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }; + state.window = subscriber.openWindow(); + this.schedule(state, windowTimeSpan); } -//# sourceMappingURL=merge.js.map - - -/***/ }), -/* 317 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return mergeMapTo; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); -/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ - -function mergeMapTo(innerObservable, resultSelector, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - if (typeof resultSelector === 'function') { - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, resultSelector, concurrent); - } - if (typeof resultSelector === 'number') { - concurrent = resultSelector; +function dispatchWindowCreation(state) { + var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval; + var window = subscriber.openWindow(); + var action = this; + var context = { action: action, subscription: null }; + var timeSpanState = { subscriber: subscriber, window: window, context: context }; + context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState); + action.add(context.subscription); + action.schedule(state, windowCreationInterval); +} +function dispatchWindowClose(state) { + var subscriber = state.subscriber, window = state.window, context = state.context; + if (context && context.action && context.subscription) { + context.action.remove(context.subscription); } - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, concurrent); + subscriber.closeWindow(window); } -//# sourceMappingURL=mergeMapTo.js.map +//# sourceMappingURL=windowTime.js.map /***/ }), -/* 318 */ +/* 334 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return mergeScan; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanOperator", function() { return MergeScanOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanSubscriber", function() { return MergeScanSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(230); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(231); -/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return windowToggle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(148); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function mergeScan(accumulator, seed, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); }; + +function windowToggle(openings, closingSelector) { + return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); }; } -var MergeScanOperator = /*@__PURE__*/ (function () { - function MergeScanOperator(accumulator, seed, concurrent) { - this.accumulator = accumulator; - this.seed = seed; - this.concurrent = concurrent; +var WindowToggleOperator = /*@__PURE__*/ (function () { + function WindowToggleOperator(openings, closingSelector) { + this.openings = openings; + this.closingSelector = closingSelector; } - MergeScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent)); + WindowToggleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector)); }; - return MergeScanOperator; + return WindowToggleOperator; }()); - -var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeScanSubscriber, _super); - function MergeScanSubscriber(destination, accumulator, acc, concurrent) { +var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowToggleSubscriber, _super); + function WindowToggleSubscriber(destination, openings, closingSelector) { var _this = _super.call(this, destination) || this; - _this.accumulator = accumulator; - _this.acc = acc; - _this.concurrent = concurrent; - _this.hasValue = false; - _this.hasCompleted = false; - _this.buffer = []; - _this.active = 0; - _this.index = 0; + _this.openings = openings; + _this.closingSelector = closingSelector; + _this.contexts = []; + _this.add(_this.openSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(_this, openings, openings)); return _this; } - MergeScanSubscriber.prototype._next = function (value) { - if (this.active < this.concurrent) { - var index = this.index++; - var destination = this.destination; - var ish = void 0; - try { - var accumulator = this.accumulator; - ish = accumulator(this.acc, value, index); + WindowToggleSubscriber.prototype._next = function (value) { + var contexts = this.contexts; + if (contexts) { + var len = contexts.length; + for (var i = 0; i < len; i++) { + contexts[i].window.next(value); } - catch (e) { - return destination.error(e); - } - this.active++; - this._innerSub(ish, value, index); - } - else { - this.buffer.push(value); } }; - MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); - }; - MergeScanSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - if (this.hasValue === false) { - this.destination.next(this.acc); + WindowToggleSubscriber.prototype._error = function (err) { + var contexts = this.contexts; + this.contexts = null; + if (contexts) { + var len = contexts.length; + var index = -1; + while (++index < len) { + var context_1 = contexts[index]; + context_1.window.error(err); + context_1.subscription.unsubscribe(); } - this.destination.complete(); } - this.unsubscribe(); - }; - MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var destination = this.destination; - this.acc = innerValue; - this.hasValue = true; - destination.next(innerValue); + _super.prototype._error.call(this, err); }; - MergeScanSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - var destination = this.destination; - destination.remove(innerSub); - this.active--; - if (buffer.length > 0) { - this._next(buffer.shift()); + WindowToggleSubscriber.prototype._complete = function () { + var contexts = this.contexts; + this.contexts = null; + if (contexts) { + var len = contexts.length; + var index = -1; + while (++index < len) { + var context_2 = contexts[index]; + context_2.window.complete(); + context_2.subscription.unsubscribe(); + } } - else if (this.active === 0 && this.hasCompleted) { - if (this.hasValue === false) { - this.destination.next(this.acc); + _super.prototype._complete.call(this); + }; + WindowToggleSubscriber.prototype._unsubscribe = function () { + var contexts = this.contexts; + this.contexts = null; + if (contexts) { + var len = contexts.length; + var index = -1; + while (++index < len) { + var context_3 = contexts[index]; + context_3.window.unsubscribe(); + context_3.subscription.unsubscribe(); } - this.destination.complete(); } }; - return MergeScanSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); - -//# sourceMappingURL=mergeScan.js.map - - -/***/ }), -/* 319 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(314); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ - -function min(comparer) { - var min = (typeof comparer === 'function') - ? function (x, y) { return comparer(x, y) < 0 ? x : y; } - : function (x, y) { return x < y ? x : y; }; - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(min); -} -//# sourceMappingURL=min.js.map - - -/***/ }), -/* 320 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return multicast; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MulticastOperator", function() { return MulticastOperator; }); -/* harmony import */ var _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); -/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */ - -function multicast(subjectOrSubjectFactory, selector) { - return function multicastOperatorFunction(source) { - var subjectFactory; - if (typeof subjectOrSubjectFactory === 'function') { - subjectFactory = subjectOrSubjectFactory; + WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + if (outerValue === this.openings) { + var closingNotifier = void 0; + try { + var closingSelector = this.closingSelector; + closingNotifier = closingSelector(innerValue); + } + catch (e) { + return this.error(e); + } + var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); + var context_4 = { window: window_1, subscription: subscription }; + this.contexts.push(context_4); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, closingNotifier, context_4); + if (innerSubscription.closed) { + this.closeWindow(this.contexts.length - 1); + } + else { + innerSubscription.context = context_4; + subscription.add(innerSubscription); + } + this.destination.next(window_1); } else { - subjectFactory = function subjectFactory() { - return subjectOrSubjectFactory; - }; + this.closeWindow(this.contexts.indexOf(outerValue)); } - if (typeof selector === 'function') { - return source.lift(new MulticastOperator(subjectFactory, selector)); + }; + WindowToggleSubscriber.prototype.notifyError = function (err) { + this.error(err); + }; + WindowToggleSubscriber.prototype.notifyComplete = function (inner) { + if (inner !== this.openSubscription) { + this.closeWindow(this.contexts.indexOf(inner.context)); } - var connectable = Object.create(source, _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__["connectableObservableDescriptor"]); - connectable.source = source; - connectable.subjectFactory = subjectFactory; - return connectable; }; -} -var MulticastOperator = /*@__PURE__*/ (function () { - function MulticastOperator(subjectFactory, selector) { - this.subjectFactory = subjectFactory; - this.selector = selector; - } - MulticastOperator.prototype.call = function (subscriber, source) { - var selector = this.selector; - var subject = this.subjectFactory(); - var subscription = selector(subject).subscribe(subscriber); - subscription.add(source.subscribe(subject)); - return subscription; + WindowToggleSubscriber.prototype.closeWindow = function (index) { + if (index === -1) { + return; + } + var contexts = this.contexts; + var context = contexts[index]; + var window = context.window, subscription = context.subscription; + contexts.splice(index, 1); + window.complete(); + subscription.unsubscribe(); }; - return MulticastOperator; -}()); - -//# sourceMappingURL=multicast.js.map + return WindowToggleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=windowToggle.js.map /***/ }), -/* 321 */ +/* 335 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNextStatic", function() { return onErrorResumeNextStatic; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return windowWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function onErrorResumeNext() { - var nextSources = []; - for (var _i = 0; _i < arguments.length; _i++) { - nextSources[_i] = arguments[_i]; - } - if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { - nextSources = nextSources[0]; - } - return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); }; -} -function onErrorResumeNextStatic() { - var nextSources = []; - for (var _i = 0; _i < arguments.length; _i++) { - nextSources[_i] = arguments[_i]; - } - var source = null; - if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { - nextSources = nextSources[0]; - } - source = nextSources.shift(); - return Object(_observable_from__WEBPACK_IMPORTED_MODULE_1__["from"])(source, null).lift(new OnErrorResumeNextOperator(nextSources)); +function windowWhen(closingSelector) { + return function windowWhenOperatorFunction(source) { + return source.lift(new WindowOperator(closingSelector)); + }; } -var OnErrorResumeNextOperator = /*@__PURE__*/ (function () { - function OnErrorResumeNextOperator(nextSources) { - this.nextSources = nextSources; +var WindowOperator = /*@__PURE__*/ (function () { + function WindowOperator(closingSelector) { + this.closingSelector = closingSelector; } - OnErrorResumeNextOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources)); + WindowOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector)); }; - return OnErrorResumeNextOperator; + return WindowOperator; }()); -var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OnErrorResumeNextSubscriber, _super); - function OnErrorResumeNextSubscriber(destination, nextSources) { +var WindowSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); + function WindowSubscriber(destination, closingSelector) { var _this = _super.call(this, destination) || this; _this.destination = destination; - _this.nextSources = nextSources; + _this.closingSelector = closingSelector; + _this.openWindow(); return _this; } - OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) { - this.subscribeToNextSource(); + WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openWindow(innerSub); }; - OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) { - this.subscribeToNextSource(); + WindowSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); }; - OnErrorResumeNextSubscriber.prototype._error = function (err) { - this.subscribeToNextSource(); - this.unsubscribe(); + WindowSubscriber.prototype.notifyComplete = function (innerSub) { + this.openWindow(innerSub); }; - OnErrorResumeNextSubscriber.prototype._complete = function () { - this.subscribeToNextSource(); - this.unsubscribe(); + WindowSubscriber.prototype._next = function (value) { + this.window.next(value); }; - OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () { - var next = this.nextSources.shift(); - if (!!next) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, next, undefined, undefined, innerSubscriber); + WindowSubscriber.prototype._error = function (err) { + this.window.error(err); + this.destination.error(err); + this.unsubscribeClosingNotification(); + }; + WindowSubscriber.prototype._complete = function () { + this.window.complete(); + this.destination.complete(); + this.unsubscribeClosingNotification(); + }; + WindowSubscriber.prototype.unsubscribeClosingNotification = function () { + if (this.closingNotification) { + this.closingNotification.unsubscribe(); } - else { - this.destination.complete(); + }; + WindowSubscriber.prototype.openWindow = function (innerSub) { + if (innerSub === void 0) { + innerSub = null; + } + if (innerSub) { + this.remove(innerSub); + innerSub.unsubscribe(); + } + var prevWindow = this.window; + if (prevWindow) { + prevWindow.complete(); + } + var window = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + this.destination.next(window); + var closingNotifier; + try { + var closingSelector = this.closingSelector; + closingNotifier = closingSelector(); + } + catch (e) { + this.destination.error(e); + this.window.error(e); + return; } + this.add(this.closingNotification = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); }; - return OnErrorResumeNextSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=onErrorResumeNext.js.map + return WindowSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=windowWhen.js.map /***/ }), -/* 322 */ +/* 336 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return pairwise; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return withLatestFrom; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function pairwise() { - return function (source) { return source.lift(new PairwiseOperator()); }; + +function withLatestFrom() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return function (source) { + var project; + if (typeof args[args.length - 1] === 'function') { + project = args.pop(); + } + var observables = args; + return source.lift(new WithLatestFromOperator(observables, project)); + }; } -var PairwiseOperator = /*@__PURE__*/ (function () { - function PairwiseOperator() { +var WithLatestFromOperator = /*@__PURE__*/ (function () { + function WithLatestFromOperator(observables, project) { + this.observables = observables; + this.project = project; } - PairwiseOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new PairwiseSubscriber(subscriber)); + WithLatestFromOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); }; - return PairwiseOperator; + return WithLatestFromOperator; }()); -var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](PairwiseSubscriber, _super); - function PairwiseSubscriber(destination) { +var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WithLatestFromSubscriber, _super); + function WithLatestFromSubscriber(destination, observables, project) { var _this = _super.call(this, destination) || this; - _this.hasPrev = false; + _this.observables = observables; + _this.project = project; + _this.toRespond = []; + var len = observables.length; + _this.values = new Array(len); + for (var i = 0; i < len; i++) { + _this.toRespond.push(i); + } + for (var i = 0; i < len; i++) { + var observable = observables[i]; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, observable, observable, i)); + } return _this; } - PairwiseSubscriber.prototype._next = function (value) { - var pair; - if (this.hasPrev) { - pair = [this.prev, value]; - } - else { - this.hasPrev = true; + WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values[outerIndex] = innerValue; + var toRespond = this.toRespond; + if (toRespond.length > 0) { + var found = toRespond.indexOf(outerIndex); + if (found !== -1) { + toRespond.splice(found, 1); + } } - this.prev = value; - if (pair) { - this.destination.next(pair); + }; + WithLatestFromSubscriber.prototype.notifyComplete = function () { + }; + WithLatestFromSubscriber.prototype._next = function (value) { + if (this.toRespond.length === 0) { + var args = [value].concat(this.values); + if (this.project) { + this._tryProject(args); + } + else { + this.destination.next(args); + } } }; - return PairwiseSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=pairwise.js.map - - -/***/ }), -/* 323 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); -/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(263); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); -/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */ - - -function partition(predicate, thisArg) { - return function (source) { - return [ - Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(predicate, thisArg)(source), - Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(source) - ]; + WithLatestFromSubscriber.prototype._tryProject = function (args) { + var result; + try { + result = this.project.apply(this, args); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); }; -} -//# sourceMappingURL=partition.js.map + return WithLatestFromSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=withLatestFrom.js.map /***/ }), -/* 324 */ +/* 337 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return pluck; }); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(226); -/** PURE_IMPORTS_START _map PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); +/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(240); +/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ -function pluck() { - var properties = []; +function zip() { + var observables = []; for (var _i = 0; _i < arguments.length; _i++) { - properties[_i] = arguments[_i]; - } - var length = properties.length; - if (length === 0) { - throw new Error('list of properties cannot be empty.'); + observables[_i] = arguments[_i]; } - return function (source) { return Object(_map__WEBPACK_IMPORTED_MODULE_0__["map"])(plucker(properties, length))(source); }; -} -function plucker(props, length) { - var mapper = function (x) { - var currentProp = x; - for (var i = 0; i < length; i++) { - var p = currentProp[props[i]]; - if (typeof p !== 'undefined') { - currentProp = p; - } - else { - return undefined; - } - } - return currentProp; + return function zipOperatorFunction(source) { + return source.lift.call(_observable_zip__WEBPACK_IMPORTED_MODULE_0__["zip"].apply(void 0, [source].concat(observables))); }; - return mapper; } -//# sourceMappingURL=pluck.js.map +//# sourceMappingURL=zip.js.map /***/ }), -/* 325 */ +/* 338 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(187); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); -/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return zipAll; }); +/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(240); +/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ -function publish(selector) { - return selector ? - Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"](); }, selector) : - Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"]()); +function zipAll(project) { + return function (source) { return source.lift(new _observable_zip__WEBPACK_IMPORTED_MODULE_0__["ZipOperator"](project)); }; } -//# sourceMappingURL=publish.js.map +//# sourceMappingURL=zipAll.js.map /***/ }), -/* 326 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 339 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); -/* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(192); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); -/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ - -function publishBehavior(value) { - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__["BehaviorSubject"](value))(source); }; -} -//# sourceMappingURL=publishBehavior.js.map +const callbacks = new Set(); +let called = false; -/***/ }), -/* 327 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +function exit(exit, signal) { + if (called) { + return; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); -/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(210); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); -/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ + called = true; + for (const callback of callbacks) { + callback(); + } -function publishLast() { - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__["AsyncSubject"]())(source); }; + if (exit === true) { + process.exit(128 + signal); // eslint-disable-line unicorn/no-process-exit + } } -//# sourceMappingURL=publishLast.js.map +module.exports = callback => { + callbacks.add(callback); -/***/ }), -/* 328 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; }); -/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); -/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ + if (callbacks.size === 1) { + process.once('exit', exit); + process.once('SIGINT', exit.bind(null, true, 2)); + process.once('SIGTERM', exit.bind(null, true, 15)); + // PM2 Cluster shutdown message. Caught to support async handlers with pm2, needed because + // explicitly calling process.exit() doesn't trigger the beforeExit event, and the exit + // event cannot support async handlers, since the event loop is never called after it. + process.on('message', message => { + if (message === 'shutdown') { + exit(true, -128); + } + }); + } -function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { - if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { - scheduler = selectorOrScheduler; - } - var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; - var subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return subject; }, selector)(source); }; -} -//# sourceMappingURL=publishReplay.js.map + return () => { + callbacks.delete(callback); + }; +}; /***/ }), -/* 329 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 340 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/* harmony import */ var _observable_race__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */ - -function race() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - return function raceOperatorFunction(source) { - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { - observables = observables[0]; - } - return source.lift.call(_observable_race__WEBPACK_IMPORTED_MODULE_1__["race"].apply(void 0, [source].concat(observables))); - }; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const $isCliError = Symbol('isCliError'); +function createCliError(message) { + const error = new Error(message); + error[$isCliError] = true; + return error; } -//# sourceMappingURL=race.js.map +exports.createCliError = createCliError; +function isCliError(error) { + return error && !!error[$isCliError]; +} +exports.isCliError = isCliError; /***/ }), -/* 330 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 341 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(203); -/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */ - - -function repeat(count) { - if (count === void 0) { - count = -1; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const execa_1 = tslib_1.__importDefault(__webpack_require__(342)); +const fs_1 = __webpack_require__(349); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const operators_1 = __webpack_require__(241); +const chalk_1 = tslib_1.__importDefault(__webpack_require__(386)); +const tree_kill_1 = tslib_1.__importDefault(__webpack_require__(396)); +const util_1 = __webpack_require__(397); +const treeKillAsync = util_1.promisify((...args) => tree_kill_1.default(...args)); +const observe_lines_1 = __webpack_require__(398); +const errors_1 = __webpack_require__(340); +const SECOND = 1000; +const STOP_TIMEOUT = 30 * SECOND; +async function withTimeout(attempt, ms, onTimeout) { + const TIMEOUT = Symbol('timeout'); + try { + await Promise.race([ + attempt(), + new Promise((_, reject) => setTimeout(() => reject(TIMEOUT), ms)), + ]); } - return function (source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); - } - else if (count < 0) { - return source.lift(new RepeatOperator(-1, source)); + catch (error) { + if (error === TIMEOUT) { + await onTimeout(); } else { - return source.lift(new RepeatOperator(count - 1, source)); + throw error; } - }; -} -var RepeatOperator = /*@__PURE__*/ (function () { - function RepeatOperator(count, source) { - this.count = count; - this.source = source; } - RepeatOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source)); - }; - return RepeatOperator; -}()); -var RepeatSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatSubscriber, _super); - function RepeatSubscriber(destination, count, source) { - var _this = _super.call(this, destination) || this; - _this.count = count; - _this.source = source; - return _this; +} +function startProc(name, options, log) { + const { cmd, args, cwd, env, stdin } = options; + log.info('[%s] > %s', name, cmd, args.join(' ')); + // spawn fails with ENOENT when either the + // cmd or cwd don't exist, so we check for the cwd + // ahead of time so that the error is less ambiguous + try { + if (!fs_1.statSync(cwd).isDirectory()) { + throw new Error(`cwd "${cwd}" exists but is not a directory`); + } } - RepeatSubscriber.prototype.complete = function () { - if (!this.isStopped) { - var _a = this, source = _a.source, count = _a.count; - if (count === 0) { - return _super.prototype.complete.call(this); - } - else if (count > -1) { - this.count = count - 1; - } - source.subscribe(this._unsubscribeAndRecycle()); + catch (err) { + if (err.code === 'ENOENT') { + throw new Error(`cwd "${cwd}" does not exist`); } - }; - return RepeatSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=repeat.js.map - - -/***/ }), -/* 331 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return repeatWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - - -function repeatWhen(notifier) { - return function (source) { return source.lift(new RepeatWhenOperator(notifier)); }; -} -var RepeatWhenOperator = /*@__PURE__*/ (function () { - function RepeatWhenOperator(notifier) { - this.notifier = notifier; } - RepeatWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source)); - }; - return RepeatWhenOperator; -}()); -var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatWhenSubscriber, _super); - function RepeatWhenSubscriber(destination, notifier, source) { - var _this = _super.call(this, destination) || this; - _this.notifier = notifier; - _this.source = source; - _this.sourceIsBeingSubscribedTo = true; - return _this; + const childProcess = execa_1.default(cmd, args, { + cwd, + env, + stdio: ['pipe', 'pipe', 'pipe'], + preferLocal: true, + }); + if (stdin) { + childProcess.stdin.end(stdin, 'utf8'); } - RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.sourceIsBeingSubscribedTo = true; - this.source.subscribe(this); - }; - RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) { - if (this.sourceIsBeingSubscribedTo === false) { - return _super.prototype.complete.call(this); - } - }; - RepeatWhenSubscriber.prototype.complete = function () { - this.sourceIsBeingSubscribedTo = false; - if (!this.isStopped) { - if (!this.retries) { - this.subscribeToRetries(); - } - if (!this.retriesSubscription || this.retriesSubscription.closed) { - return _super.prototype.complete.call(this); - } - this._unsubscribeAndRecycle(); - this.notifications.next(); - } - }; - RepeatWhenSubscriber.prototype._unsubscribe = function () { - var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription; - if (notifications) { - notifications.unsubscribe(); - this.notifications = null; - } - if (retriesSubscription) { - retriesSubscription.unsubscribe(); - this.retriesSubscription = null; + else { + childProcess.stdin.end(); + } + let stopCalled = false; + const outcome$ = Rx.race( + // observe first exit event + Rx.fromEvent(childProcess, 'exit').pipe(operators_1.take(1), operators_1.map(([code]) => { + if (stopCalled) { + return null; } - this.retries = null; - }; - RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () { - var _unsubscribe = this._unsubscribe; - this._unsubscribe = null; - _super.prototype._unsubscribeAndRecycle.call(this); - this._unsubscribe = _unsubscribe; - return this; - }; - RepeatWhenSubscriber.prototype.subscribeToRetries = function () { - this.notifications = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - var retries; - try { - var notifier = this.notifier; - retries = notifier(this.notifications); + // JVM exits with 143 on SIGTERM and 130 on SIGINT, dont' treat then as errors + if (code > 0 && !(code === 143 || code === 130)) { + throw errors_1.createCliError(`[${name}] exited with code ${code}`); } - catch (e) { - return _super.prototype.complete.call(this); + return code; + })), + // observe first error event + Rx.fromEvent(childProcess, 'error').pipe(operators_1.take(1), operators_1.mergeMap((err) => Rx.throwError(err)))).pipe(operators_1.share()); + const lines$ = Rx.merge(observe_lines_1.observeLines(childProcess.stdout), observe_lines_1.observeLines(childProcess.stderr)).pipe(operators_1.tap((line) => log.write(` ${chalk_1.default.gray('proc')} [${chalk_1.default.gray(name)}] ${line}`)), operators_1.share()); + const outcomePromise = Rx.merge(lines$.pipe(operators_1.ignoreElements()), outcome$).toPromise(); + async function stop(signal) { + if (stopCalled) { + return; } - this.retries = retries; - this.retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); + stopCalled = true; + await withTimeout(async () => { + log.debug(`Sending "${signal}" to proc "${name}"`); + await treeKillAsync(childProcess.pid, signal); + await outcomePromise; + }, STOP_TIMEOUT, async () => { + log.warning(`Proc "${name}" was sent "${signal}" didn't emit the "exit" or "error" events after ${STOP_TIMEOUT} ms, sending SIGKILL`); + await treeKillAsync(childProcess.pid, 'SIGKILL'); + }); + await withTimeout(async () => { + try { + await outcomePromise; + } + catch (error) { + // ignore + } + }, STOP_TIMEOUT, async () => { + throw new Error(`Proc "${name}" was stopped but never emitted either the "exit" or "error" event after ${STOP_TIMEOUT} ms`); + }); + } + return { + name, + lines$, + outcome$, + outcomePromise, + stop, }; - return RepeatWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=repeatWhen.js.map +} +exports.startProc = startProc; /***/ }), -/* 332 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 342 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return retry; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +const path = __webpack_require__(4); +const childProcess = __webpack_require__(343); +const crossSpawn = __webpack_require__(344); +const stripFinalNewline = __webpack_require__(358); +const npmRunPath = __webpack_require__(359); +const onetime = __webpack_require__(360); +const makeError = __webpack_require__(362); +const normalizeStdio = __webpack_require__(368); +const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(369); +const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(374); +const {mergePromise, getSpawnedPromise} = __webpack_require__(384); +const {joinCommand, parseCommand} = __webpack_require__(385); -function retry(count) { - if (count === void 0) { - count = -1; - } - return function (source) { return source.lift(new RetryOperator(count, source)); }; -} -var RetryOperator = /*@__PURE__*/ (function () { - function RetryOperator(count, source) { - this.count = count; - this.source = source; - } - RetryOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source)); - }; - return RetryOperator; -}()); -var RetrySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetrySubscriber, _super); - function RetrySubscriber(destination, count, source) { - var _this = _super.call(this, destination) || this; - _this.count = count; - _this.source = source; - return _this; - } - RetrySubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var _a = this, source = _a.source, count = _a.count; - if (count === 0) { - return _super.prototype.error.call(this, err); - } - else if (count > -1) { - this.count = count - 1; - } - source.subscribe(this._unsubscribeAndRecycle()); - } - }; - return RetrySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=retry.js.map +const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; +const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => { + const env = extendEnv ? {...process.env, ...envOption} : envOption; -/***/ }), -/* 333 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if (preferLocal) { + return npmRunPath.env({env, cwd: localDir, execPath}); + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return retryWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + return env; +}; +const handleArgs = (file, args, options = {}) => { + const parsed = crossSpawn._parse(file, args, options); + file = parsed.command; + args = parsed.args; + options = parsed.options; + options = { + maxBuffer: DEFAULT_MAX_BUFFER, + buffer: true, + stripFinalNewline: true, + extendEnv: true, + preferLocal: false, + localDir: options.cwd || process.cwd(), + execPath: process.execPath, + encoding: 'utf8', + reject: true, + cleanup: true, + all: false, + windowsHide: true, + ...options + }; + options.env = getEnv(options); -function retryWhen(notifier) { - return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); }; -} -var RetryWhenOperator = /*@__PURE__*/ (function () { - function RetryWhenOperator(notifier, source) { - this.notifier = notifier; - this.source = source; - } - RetryWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source)); - }; - return RetryWhenOperator; -}()); -var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetryWhenSubscriber, _super); - function RetryWhenSubscriber(destination, notifier, source) { - var _this = _super.call(this, destination) || this; - _this.notifier = notifier; - _this.source = source; - return _this; - } - RetryWhenSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var errors = this.errors; - var retries = this.retries; - var retriesSubscription = this.retriesSubscription; - if (!retries) { - errors = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - try { - var notifier = this.notifier; - retries = notifier(errors); - } - catch (e) { - return _super.prototype.error.call(this, e); - } - retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); - } - else { - this.errors = null; - this.retriesSubscription = null; - } - this._unsubscribeAndRecycle(); - this.errors = errors; - this.retries = retries; - this.retriesSubscription = retriesSubscription; - errors.next(err); - } - }; - RetryWhenSubscriber.prototype._unsubscribe = function () { - var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription; - if (errors) { - errors.unsubscribe(); - this.errors = null; - } - if (retriesSubscription) { - retriesSubscription.unsubscribe(); - this.retriesSubscription = null; - } - this.retries = null; - }; - RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var _unsubscribe = this._unsubscribe; - this._unsubscribe = null; - this._unsubscribeAndRecycle(); - this._unsubscribe = _unsubscribe; - this.source.subscribe(this); - }; - return RetryWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=retryWhen.js.map + options.stdio = normalizeStdio(options); + if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') { + // #116 + args.unshift('/q'); + } -/***/ }), -/* 334 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + return {file, args, options, parsed}; +}; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return sample; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +const handleOutput = (options, value, error) => { + if (typeof value !== 'string' && !Buffer.isBuffer(value)) { + // When `execa.sync()` errors, we normalize it to '' to mimic `execa()` + return error === undefined ? undefined : ''; + } + if (options.stripFinalNewline) { + return stripFinalNewline(value); + } + return value; +}; -function sample(notifier) { - return function (source) { return source.lift(new SampleOperator(notifier)); }; -} -var SampleOperator = /*@__PURE__*/ (function () { - function SampleOperator(notifier) { - this.notifier = notifier; - } - SampleOperator.prototype.call = function (subscriber, source) { - var sampleSubscriber = new SampleSubscriber(subscriber); - var subscription = source.subscribe(sampleSubscriber); - subscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(sampleSubscriber, this.notifier)); - return subscription; - }; - return SampleOperator; -}()); -var SampleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleSubscriber, _super); - function SampleSubscriber() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.hasValue = false; - return _this; - } - SampleSubscriber.prototype._next = function (value) { - this.value = value; - this.hasValue = true; - }; - SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.emitValue(); - }; - SampleSubscriber.prototype.notifyComplete = function () { - this.emitValue(); - }; - SampleSubscriber.prototype.emitValue = function () { - if (this.hasValue) { - this.hasValue = false; - this.destination.next(this.value); - } - }; - return SampleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=sample.js.map +const execa = (file, args, options) => { + const parsed = handleArgs(file, args, options); + const command = joinCommand(file, args); + let spawned; + try { + spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options); + } catch (error) { + // Ensure the returned error is always both a promise and a child process + const dummySpawned = new childProcess.ChildProcess(); + const errorPromise = Promise.reject(makeError({ + error, + stdout: '', + stderr: '', + all: '', + command, + parsed, + timedOut: false, + isCanceled: false, + killed: false + })); + return mergePromise(dummySpawned, errorPromise); + } -/***/ }), -/* 335 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const spawnedPromise = getSpawnedPromise(spawned); + const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise); + const processDone = setExitHandler(spawned, parsed.options, timedPromise); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return sampleTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ + const context = {isCanceled: false}; + spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned)); + spawned.cancel = spawnedCancel.bind(null, spawned, context); + const handlePromise = async () => { + const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone); + const stdout = handleOutput(parsed.options, stdoutResult); + const stderr = handleOutput(parsed.options, stderrResult); + const all = handleOutput(parsed.options, allResult); -function sampleTime(period, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - } - return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); }; -} -var SampleTimeOperator = /*@__PURE__*/ (function () { - function SampleTimeOperator(period, scheduler) { - this.period = period; - this.scheduler = scheduler; - } - SampleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler)); - }; - return SampleTimeOperator; -}()); -var SampleTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleTimeSubscriber, _super); - function SampleTimeSubscriber(destination, period, scheduler) { - var _this = _super.call(this, destination) || this; - _this.period = period; - _this.scheduler = scheduler; - _this.hasValue = false; - _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period })); - return _this; - } - SampleTimeSubscriber.prototype._next = function (value) { - this.lastValue = value; - this.hasValue = true; - }; - SampleTimeSubscriber.prototype.notifyNext = function () { - if (this.hasValue) { - this.hasValue = false; - this.destination.next(this.lastValue); - } - }; - return SampleTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNotification(state) { - var subscriber = state.subscriber, period = state.period; - subscriber.notifyNext(); - this.schedule(state, period); -} -//# sourceMappingURL=sampleTime.js.map + if (error || exitCode !== 0 || signal !== null) { + const returnedError = makeError({ + error, + exitCode, + signal, + stdout, + stderr, + all, + command, + parsed, + timedOut, + isCanceled: context.isCanceled, + killed: spawned.killed + }); + if (!parsed.options.reject) { + return returnedError; + } -/***/ }), -/* 336 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + throw returnedError; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return sequenceEqual; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualOperator", function() { return SequenceEqualOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualSubscriber", function() { return SequenceEqualSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + return { + command, + exitCode: 0, + stdout, + stderr, + all, + failed: false, + timedOut: false, + isCanceled: false, + killed: false + }; + }; + const handlePromiseOnce = onetime(handlePromise); -function sequenceEqual(compareTo, comparator) { - return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); }; -} -var SequenceEqualOperator = /*@__PURE__*/ (function () { - function SequenceEqualOperator(compareTo, comparator) { - this.compareTo = compareTo; - this.comparator = comparator; - } - SequenceEqualOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator)); - }; - return SequenceEqualOperator; -}()); + crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed); -var SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualSubscriber, _super); - function SequenceEqualSubscriber(destination, compareTo, comparator) { - var _this = _super.call(this, destination) || this; - _this.compareTo = compareTo; - _this.comparator = comparator; - _this._a = []; - _this._b = []; - _this._oneComplete = false; - _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this))); - return _this; - } - SequenceEqualSubscriber.prototype._next = function (value) { - if (this._oneComplete && this._b.length === 0) { - this.emit(false); - } - else { - this._a.push(value); - this.checkValues(); - } - }; - SequenceEqualSubscriber.prototype._complete = function () { - if (this._oneComplete) { - this.emit(this._a.length === 0 && this._b.length === 0); - } - else { - this._oneComplete = true; - } - this.unsubscribe(); - }; - SequenceEqualSubscriber.prototype.checkValues = function () { - var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator; - while (_a.length > 0 && _b.length > 0) { - var a = _a.shift(); - var b = _b.shift(); - var areEqual = false; - try { - areEqual = comparator ? comparator(a, b) : a === b; - } - catch (e) { - this.destination.error(e); - } - if (!areEqual) { - this.emit(false); - } - } - }; - SequenceEqualSubscriber.prototype.emit = function (value) { - var destination = this.destination; - destination.next(value); - destination.complete(); - }; - SequenceEqualSubscriber.prototype.nextB = function (value) { - if (this._oneComplete && this._a.length === 0) { - this.emit(false); - } - else { - this._b.push(value); - this.checkValues(); - } - }; - SequenceEqualSubscriber.prototype.completeB = function () { - if (this._oneComplete) { - this.emit(this._a.length === 0 && this._b.length === 0); - } - else { - this._oneComplete = true; - } - }; - return SequenceEqualSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); + handleInput(spawned, parsed.options.input); -var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualCompareToSubscriber, _super); - function SequenceEqualCompareToSubscriber(destination, parent) { - var _this = _super.call(this, destination) || this; - _this.parent = parent; - return _this; - } - SequenceEqualCompareToSubscriber.prototype._next = function (value) { - this.parent.nextB(value); - }; - SequenceEqualCompareToSubscriber.prototype._error = function (err) { - this.parent.error(err); - this.unsubscribe(); - }; - SequenceEqualCompareToSubscriber.prototype._complete = function () { - this.parent.completeB(); - this.unsubscribe(); - }; - return SequenceEqualCompareToSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=sequenceEqual.js.map + spawned.all = makeAllStream(spawned, parsed.options); + return mergePromise(spawned, handlePromiseOnce); +}; -/***/ }), -/* 337 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +module.exports = execa; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(320); -/* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(190); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(187); -/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ +module.exports.sync = (file, args, options) => { + const parsed = handleArgs(file, args, options); + const command = joinCommand(file, args); + + validateInputSync(parsed.options); + + let result; + try { + result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options); + } catch (error) { + throw makeError({ + error, + stdout: '', + stderr: '', + all: '', + command, + parsed, + timedOut: false, + isCanceled: false, + killed: false + }); + } + + const stdout = handleOutput(parsed.options, result.stdout, result.error); + const stderr = handleOutput(parsed.options, result.stderr, result.error); + if (result.error || result.status !== 0 || result.signal !== null) { + const error = makeError({ + stdout, + stderr, + error: result.error, + signal: result.signal, + exitCode: result.status, + command, + parsed, + timedOut: result.error && result.error.code === 'ETIMEDOUT', + isCanceled: false, + killed: result.signal !== null + }); + if (!parsed.options.reject) { + return error; + } -function shareSubjectFactory() { - return new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); -} -function share() { - return function (source) { return Object(_refCount__WEBPACK_IMPORTED_MODULE_1__["refCount"])()(Object(_multicast__WEBPACK_IMPORTED_MODULE_0__["multicast"])(shareSubjectFactory)(source)); }; -} -//# sourceMappingURL=share.js.map + throw error; + } + + return { + command, + exitCode: 0, + stdout, + stderr, + failed: false, + timedOut: false, + isCanceled: false, + killed: false + }; +}; + +module.exports.command = (command, options) => { + const [file, ...args] = parseCommand(command); + return execa(file, args, options); +}; + +module.exports.commandSync = (command, options) => { + const [file, ...args] = parseCommand(command); + return execa.sync(file, args, options); +}; + +module.exports.node = (scriptPath, args, options = {}) => { + if (args && !Array.isArray(args) && typeof args === 'object') { + options = args; + args = []; + } + + const stdio = normalizeStdio.node(options); + + const {nodePath = process.execPath, nodeOptions = process.execArgv} = options; + + return execa( + nodePath, + [ + ...nodeOptions, + scriptPath, + ...(Array.isArray(args) ? args : []) + ], + { + ...options, + stdin: undefined, + stdout: undefined, + stderr: undefined, + stdio, + shell: false + } + ); +}; /***/ }), -/* 338 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 343 */ +/***/ (function(module, exports) { + +module.exports = require("child_process"); + +/***/ }), +/* 344 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return shareReplay; }); -/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */ -function shareReplay(configOrBufferSize, windowTime, scheduler) { - var config; - if (configOrBufferSize && typeof configOrBufferSize === 'object') { - config = configOrBufferSize; - } - else { - config = { - bufferSize: configOrBufferSize, - windowTime: windowTime, - refCount: false, - scheduler: scheduler - }; - } - return function (source) { return source.lift(shareReplayOperator(config)); }; + +const cp = __webpack_require__(343); +const parse = __webpack_require__(345); +const enoent = __webpack_require__(357); + +function spawn(command, args, options) { + // Parse the arguments + const parsed = parse(command, args, options); + + // Spawn the child process + const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); + + // Hook into child process "exit" event to emit an error if the command + // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + enoent.hookChildProcess(spawned, parsed); + + return spawned; } -function shareReplayOperator(_a) { - var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler; - var subject; - var refCount = 0; - var subscription; - var hasError = false; - var isComplete = false; - return function shareReplayOperation(source) { - refCount++; - if (!subject || hasError) { - hasError = false; - subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); - subscription = source.subscribe({ - next: function (value) { subject.next(value); }, - error: function (err) { - hasError = true; - subject.error(err); - }, - complete: function () { - isComplete = true; - subject.complete(); - }, - }); - } - var innerSub = subject.subscribe(this); - this.add(function () { - refCount--; - innerSub.unsubscribe(); - if (subscription && !isComplete && useRefCount && refCount === 0) { - subscription.unsubscribe(); - subscription = undefined; - subject = undefined; - } - }); - }; + +function spawnSync(command, args, options) { + // Parse the arguments + const parsed = parse(command, args, options); + + // Spawn the child process + const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); + + // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); + + return result; } -//# sourceMappingURL=shareReplay.js.map + +module.exports = spawn; +module.exports.spawn = spawn; +module.exports.sync = spawnSync; + +module.exports._parse = parse; +module.exports._enoent = enoent; /***/ }), -/* 339 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 345 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "single", function() { return single; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(223); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */ +const path = __webpack_require__(4); +const resolveCommand = __webpack_require__(346); +const escape = __webpack_require__(353); +const readShebang = __webpack_require__(354); -function single(predicate) { - return function (source) { return source.lift(new SingleOperator(predicate, source)); }; +const isWin = process.platform === 'win32'; +const isExecutableRegExp = /\.(?:com|exe)$/i; +const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; + +function detectShebang(parsed) { + parsed.file = resolveCommand(parsed); + + const shebang = parsed.file && readShebang(parsed.file); + + if (shebang) { + parsed.args.unshift(parsed.file); + parsed.command = shebang; + + return resolveCommand(parsed); + } + + return parsed.file; } -var SingleOperator = /*@__PURE__*/ (function () { - function SingleOperator(predicate, source) { - this.predicate = predicate; - this.source = source; + +function parseNonShell(parsed) { + if (!isWin) { + return parsed; } - SingleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source)); - }; - return SingleOperator; -}()); -var SingleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SingleSubscriber, _super); - function SingleSubscriber(destination, predicate, source) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.source = source; - _this.seenValue = false; - _this.index = 0; - return _this; - } - SingleSubscriber.prototype.applySingleValue = function (value) { - if (this.seenValue) { - this.destination.error('Sequence contains more than one element'); - } - else { - this.seenValue = true; - this.singleValue = value; - } - }; - SingleSubscriber.prototype._next = function (value) { - var index = this.index++; - if (this.predicate) { - this.tryNext(value, index); - } - else { - this.applySingleValue(value); - } - }; - SingleSubscriber.prototype.tryNext = function (value, index) { - try { - if (this.predicate(value, index, this.source)) { - this.applySingleValue(value); - } - } - catch (err) { - this.destination.error(err); - } - }; - SingleSubscriber.prototype._complete = function () { - var destination = this.destination; - if (this.index > 0) { - destination.next(this.seenValue ? this.singleValue : undefined); - destination.complete(); - } - else { - destination.error(new _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__["EmptyError"]); - } - }; - return SingleSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=single.js.map + // Detect & add support for shebangs + const commandFile = detectShebang(parsed); -/***/ }), -/* 340 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + // We don't need a shell if the command filename is an executable + const needsShell = !isExecutableRegExp.test(commandFile); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return skip; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + // If a shell is required, use cmd.exe and take care of escaping everything correctly + // Note that `forceShell` is an hidden option used only in tests + if (parsed.options.forceShell || needsShell) { + // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` + // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument + // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, + // we need to double escape them + const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); + // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) + // This is necessary otherwise it will always fail with ENOENT in those cases + parsed.command = path.normalize(parsed.command); -function skip(count) { - return function (source) { return source.lift(new SkipOperator(count)); }; -} -var SkipOperator = /*@__PURE__*/ (function () { - function SkipOperator(total) { - this.total = total; + // Escape command & arguments + parsed.command = escape.command(parsed.command); + parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); + + const shellCommand = [parsed.command].concat(parsed.args).join(' '); + + parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; + parsed.command = process.env.comspec || 'cmd.exe'; + parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped } - SkipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipSubscriber(subscriber, this.total)); - }; - return SkipOperator; -}()); -var SkipSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipSubscriber, _super); - function SkipSubscriber(destination, total) { - var _this = _super.call(this, destination) || this; - _this.total = total; - _this.count = 0; - return _this; + + return parsed; +} + +function parse(command, args, options) { + // Normalize arguments, similar to nodejs + if (args && !Array.isArray(args)) { + options = args; + args = null; } - SkipSubscriber.prototype._next = function (x) { - if (++this.count > this.total) { - this.destination.next(x); - } + + args = args ? args.slice(0) : []; // Clone array to avoid changing the original + options = Object.assign({}, options); // Clone object to avoid changing the original + + // Build our parsed object + const parsed = { + command, + args, + options, + file: undefined, + original: { + command, + args, + }, }; - return SkipSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skip.js.map + + // Delegate further parsing to shell or non-shell + return options.shell ? parsed : parseNonShell(parsed); +} + +module.exports = parse; /***/ }), -/* 341 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 346 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return skipLast; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(222); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */ +const path = __webpack_require__(4); +const which = __webpack_require__(347); +const pathKey = __webpack_require__(352)(); -function skipLast(count) { - return function (source) { return source.lift(new SkipLastOperator(count)); }; -} -var SkipLastOperator = /*@__PURE__*/ (function () { - function SkipLastOperator(_skipCount) { - this._skipCount = _skipCount; - if (this._skipCount < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; +function resolveCommandAttempt(parsed, withoutPathExt) { + const cwd = process.cwd(); + const hasCustomCwd = parsed.options.cwd != null; + // Worker threads do not have process.chdir() + const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined; + + // If a custom `cwd` was specified, we need to change the process cwd + // because `which` will do stat calls but does not support a custom cwd + if (shouldSwitchCwd) { + try { + process.chdir(parsed.options.cwd); + } catch (err) { + /* Empty */ } } - SkipLastOperator.prototype.call = function (subscriber, source) { - if (this._skipCount === 0) { - return source.subscribe(new _Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"](subscriber)); - } - else { - return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount)); + + let resolved; + + try { + resolved = which.sync(parsed.command, { + path: (parsed.options.env || process.env)[pathKey], + pathExt: withoutPathExt ? path.delimiter : undefined, + }); + } catch (e) { + /* Empty */ + } finally { + if (shouldSwitchCwd) { + process.chdir(cwd); } - }; - return SkipLastOperator; -}()); -var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipLastSubscriber, _super); - function SkipLastSubscriber(destination, _skipCount) { - var _this = _super.call(this, destination) || this; - _this._skipCount = _skipCount; - _this._count = 0; - _this._ring = new Array(_skipCount); - return _this; } - SkipLastSubscriber.prototype._next = function (value) { - var skipCount = this._skipCount; - var count = this._count++; - if (count < skipCount) { - this._ring[count] = value; - } - else { - var currentIndex = count % skipCount; - var ring = this._ring; - var oldValue = ring[currentIndex]; - ring[currentIndex] = value; - this.destination.next(oldValue); - } - }; - return SkipLastSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skipLast.js.map + // If we successfully resolved, ensure that an absolute path is returned + // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it + if (resolved) { + resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); + } -/***/ }), -/* 342 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + return resolved; +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return skipUntil; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +function resolveCommand(parsed) { + return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +} +module.exports = resolveCommand; +/***/ }), +/* 347 */ +/***/ (function(module, exports, __webpack_require__) { -function skipUntil(notifier) { - return function (source) { return source.lift(new SkipUntilOperator(notifier)); }; -} -var SkipUntilOperator = /*@__PURE__*/ (function () { - function SkipUntilOperator(notifier) { - this.notifier = notifier; - } - SkipUntilOperator.prototype.call = function (destination, source) { - return source.subscribe(new SkipUntilSubscriber(destination, this.notifier)); - }; - return SkipUntilOperator; -}()); -var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipUntilSubscriber, _super); - function SkipUntilSubscriber(destination, notifier) { - var _this = _super.call(this, destination) || this; - _this.hasValue = false; - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](_this, undefined, undefined); - _this.add(innerSubscriber); - _this.innerSubscription = innerSubscriber; - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(_this, notifier, undefined, undefined, innerSubscriber); - return _this; - } - SkipUntilSubscriber.prototype._next = function (value) { - if (this.hasValue) { - _super.prototype._next.call(this, value); - } - }; - SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.hasValue = true; - if (this.innerSubscription) { - this.innerSubscription.unsubscribe(); - } - }; - SkipUntilSubscriber.prototype.notifyComplete = function () { - }; - return SkipUntilSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=skipUntil.js.map +const isWindows = process.platform === 'win32' || + process.env.OSTYPE === 'cygwin' || + process.env.OSTYPE === 'msys' +const path = __webpack_require__(4) +const COLON = isWindows ? ';' : ':' +const isexe = __webpack_require__(348) -/***/ }), -/* 343 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +const getNotFoundError = (cmd) => + Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return skipWhile; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +const getPathInfo = (cmd, opt) => { + const colon = opt.colon || COLON + + // If it has a slash, then we don't bother searching the pathenv. + // just check the file itself, and that's it. + const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [''] + : ( + [ + // windows always checks the cwd first + ...(isWindows ? [process.cwd()] : []), + ...(opt.path || process.env.PATH || + /* istanbul ignore next: very unusual */ '').split(colon), + ] + ) + const pathExtExe = isWindows + ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM' + : '' + const pathExt = isWindows ? pathExtExe.split(colon) : [''] + if (isWindows) { + if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') + pathExt.unshift('') + } -function skipWhile(predicate) { - return function (source) { return source.lift(new SkipWhileOperator(predicate)); }; + return { + pathEnv, + pathExt, + pathExtExe, + } } -var SkipWhileOperator = /*@__PURE__*/ (function () { - function SkipWhileOperator(predicate) { - this.predicate = predicate; - } - SkipWhileOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate)); - }; - return SkipWhileOperator; -}()); -var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipWhileSubscriber, _super); - function SkipWhileSubscriber(destination, predicate) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.skipping = true; - _this.index = 0; - return _this; - } - SkipWhileSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (this.skipping) { - this.tryCallPredicate(value); - } - if (!this.skipping) { - destination.next(value); - } - }; - SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { - try { - var result = this.predicate(value, this.index++); - this.skipping = Boolean(result); - } - catch (err) { - this.destination.error(err); - } - }; - return SkipWhileSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skipWhile.js.map +const which = (cmd, opt, cb) => { + if (typeof opt === 'function') { + cb = opt + opt = {} + } + if (!opt) + opt = {} -/***/ }), -/* 344 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) + const found = [] -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return startWith; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(205); -/** PURE_IMPORTS_START _observable_concat,_util_isScheduler PURE_IMPORTS_END */ + const step = i => new Promise((resolve, reject) => { + if (i === pathEnv.length) + return opt.all && found.length ? resolve(found) + : reject(getNotFoundError(cmd)) + const ppRaw = pathEnv[i] + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw -function startWith() { - var array = []; - for (var _i = 0; _i < arguments.length; _i++) { - array[_i] = arguments[_i]; - } - var scheduler = array[array.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(scheduler)) { - array.pop(); - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source, scheduler); }; - } - else { - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source); }; - } + const pCmd = path.join(pathPart, cmd) + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd + + resolve(subStep(p, i, 0)) + }) + + const subStep = (p, i, ii) => new Promise((resolve, reject) => { + if (ii === pathExt.length) + return resolve(step(i + 1)) + const ext = pathExt[ii] + isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { + if (!er && is) { + if (opt.all) + found.push(p + ext) + else + return resolve(p + ext) + } + return resolve(subStep(p, i, ii + 1)) + }) + }) + + return cb ? step(0).then(res => cb(null, res), cb) : step(0) } -//# sourceMappingURL=startWith.js.map +const whichSync = (cmd, opt) => { + opt = opt || {} -/***/ }), -/* 345 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) + const found = [] -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return subscribeOn; }); -/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(346); -/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ + for (let i = 0; i < pathEnv.length; i ++) { + const ppRaw = pathEnv[i] + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw -function subscribeOn(scheduler, delay) { - if (delay === void 0) { - delay = 0; + const pCmd = path.join(pathPart, cmd) + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd + + for (let j = 0; j < pathExt.length; j ++) { + const cur = p + pathExt[j] + try { + const is = isexe.sync(cur, { pathExt: pathExtExe }) + if (is) { + if (opt.all) + found.push(cur) + else + return cur + } + } catch (ex) {} } - return function subscribeOnOperatorFunction(source) { - return source.lift(new SubscribeOnOperator(scheduler, delay)); - }; + } + + if (opt.all && found.length) + return found + + if (opt.nothrow) + return null + + throw getNotFoundError(cmd) } -var SubscribeOnOperator = /*@__PURE__*/ (function () { - function SubscribeOnOperator(scheduler, delay) { - this.scheduler = scheduler; - this.delay = delay; - } - SubscribeOnOperator.prototype.call = function (subscriber, source) { - return new _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__["SubscribeOnObservable"](source, this.delay, this.scheduler).subscribe(subscriber); - }; - return SubscribeOnOperator; -}()); -//# sourceMappingURL=subscribeOn.js.map + +module.exports = which +which.sync = whichSync /***/ }), -/* 346 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 348 */ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubscribeOnObservable", function() { return SubscribeOnObservable; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); -/* harmony import */ var _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(211); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(257); -/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */ +var fs = __webpack_require__(349) +var core +if (process.platform === 'win32' || global.TESTING_WINDOWS) { + core = __webpack_require__(350) +} else { + core = __webpack_require__(351) +} +module.exports = isexe +isexe.sync = sync +function isexe (path, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + if (!cb) { + if (typeof Promise !== 'function') { + throw new TypeError('callback not provided') + } -var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscribeOnObservable, _super); - function SubscribeOnObservable(source, delayTime, scheduler) { - if (delayTime === void 0) { - delayTime = 0; - } - if (scheduler === void 0) { - scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; - } - var _this = _super.call(this) || this; - _this.source = source; - _this.delayTime = delayTime; - _this.scheduler = scheduler; - if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_3__["isNumeric"])(delayTime) || delayTime < 0) { - _this.delayTime = 0; - } - if (!scheduler || typeof scheduler.schedule !== 'function') { - _this.scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + return new Promise(function (resolve, reject) { + isexe(path, options || {}, function (er, is) { + if (er) { + reject(er) + } else { + resolve(is) } - return _this; - } - SubscribeOnObservable.create = function (source, delay, scheduler) { - if (delay === void 0) { - delay = 0; - } - if (scheduler === void 0) { - scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; - } - return new SubscribeOnObservable(source, delay, scheduler); - }; - SubscribeOnObservable.dispatch = function (arg) { - var source = arg.source, subscriber = arg.subscriber; - return this.add(source.subscribe(subscriber)); - }; - SubscribeOnObservable.prototype._subscribe = function (subscriber) { - var delay = this.delayTime; - var source = this.source; - var scheduler = this.scheduler; - return scheduler.schedule(SubscribeOnObservable.dispatch, delay, { - source: source, subscriber: subscriber - }); - }; - return SubscribeOnObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); + }) + }) + } -//# sourceMappingURL=SubscribeOnObservable.js.map + core(path, options || {}, function (er, is) { + // ignore EACCES because that just means we aren't allowed to run it + if (er) { + if (er.code === 'EACCES' || options && options.ignoreErrors) { + er = null + is = false + } + } + cb(er, is) + }) +} + +function sync (path, options) { + // my kingdom for a filtered catch + try { + return core.sync(path, options || {}) + } catch (er) { + if (options && options.ignoreErrors || er.code === 'EACCES') { + return false + } else { + throw er + } + } +} /***/ }), -/* 347 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 349 */ +/***/ (function(module, exports) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return switchAll; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(348); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(220); -/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ +module.exports = require("fs"); +/***/ }), +/* 350 */ +/***/ (function(module, exports, __webpack_require__) { -function switchAll() { - return Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]); +module.exports = isexe +isexe.sync = sync + +var fs = __webpack_require__(349) + +function checkPathExt (path, options) { + var pathext = options.pathExt !== undefined ? + options.pathExt : process.env.PATHEXT + + if (!pathext) { + return true + } + + pathext = pathext.split(';') + if (pathext.indexOf('') !== -1) { + return true + } + for (var i = 0; i < pathext.length; i++) { + var p = pathext[i].toLowerCase() + if (p && path.substr(-p.length).toLowerCase() === p) { + return true + } + } + return false +} + +function checkStat (stat, path, options) { + if (!stat.isSymbolicLink() && !stat.isFile()) { + return false + } + return checkPathExt(path, options) +} + +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, path, options)) + }) +} + +function sync (path, options) { + return checkStat(fs.statSync(path), path, options) } -//# sourceMappingURL=switchAll.js.map /***/ }), -/* 348 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 351 */ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return switchMap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(226); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ +module.exports = isexe +isexe.sync = sync + +var fs = __webpack_require__(349) + +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, options)) + }) +} + +function sync (path, options) { + return checkStat(fs.statSync(path), options) +} +function checkStat (stat, options) { + return stat.isFile() && checkMode(stat, options) +} +function checkMode (stat, options) { + var mod = stat.mode + var uid = stat.uid + var gid = stat.gid + var myUid = options.uid !== undefined ? + options.uid : process.getuid && process.getuid() + var myGid = options.gid !== undefined ? + options.gid : process.getgid && process.getgid() + var u = parseInt('100', 8) + var g = parseInt('010', 8) + var o = parseInt('001', 8) + var ug = u | g + var ret = (mod & o) || + (mod & g) && gid === myGid || + (mod & u) && uid === myUid || + (mod & ug) && myUid === 0 -function switchMap(project, resultSelector) { - if (typeof resultSelector === 'function') { - return function (source) { return source.pipe(switchMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; - } - return function (source) { return source.lift(new SwitchMapOperator(project)); }; + return ret } -var SwitchMapOperator = /*@__PURE__*/ (function () { - function SwitchMapOperator(project) { - this.project = project; - } - SwitchMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchMapSubscriber(subscriber, this.project)); - }; - return SwitchMapOperator; -}()); -var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchMapSubscriber, _super); - function SwitchMapSubscriber(destination, project) { - var _this = _super.call(this, destination) || this; - _this.project = project; - _this.index = 0; - return _this; - } - SwitchMapSubscriber.prototype._next = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (error) { - this.destination.error(error); - return; - } - this._innerSub(result, value, index); - }; - SwitchMapSubscriber.prototype._innerSub = function (result, value, index) { - var innerSubscription = this.innerSubscription; - if (innerSubscription) { - innerSubscription.unsubscribe(); - } - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - this.innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); - }; - SwitchMapSubscriber.prototype._complete = function () { - var innerSubscription = this.innerSubscription; - if (!innerSubscription || innerSubscription.closed) { - _super.prototype._complete.call(this); - } - this.unsubscribe(); - }; - SwitchMapSubscriber.prototype._unsubscribe = function () { - this.innerSubscription = null; - }; - SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) { - var destination = this.destination; - destination.remove(innerSub); - this.innerSubscription = null; - if (this.isStopped) { - _super.prototype._complete.call(this); - } - }; - SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); - }; - return SwitchMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=switchMap.js.map /***/ }), -/* 349 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 352 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return switchMapTo; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(348); -/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ -function switchMapTo(innerObservable, resultSelector) { - return resultSelector ? Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }, resultSelector) : Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }); -} -//# sourceMappingURL=switchMapTo.js.map + +const pathKey = (options = {}) => { + const environment = options.env || process.env; + const platform = options.platform || process.platform; + + if (platform !== 'win32') { + return 'PATH'; + } + + return Object.keys(environment).find(key => key.toUpperCase() === 'PATH') || 'Path'; +}; + +module.exports = pathKey; +// TODO: Remove this for the next major release +module.exports.default = pathKey; /***/ }), -/* 350 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 353 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return takeUntil; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +// See http://www.robvanderwoude.com/escapechars.php +const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; -function takeUntil(notifier) { - return function (source) { return source.lift(new TakeUntilOperator(notifier)); }; +function escapeCommand(arg) { + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); + + return arg; } -var TakeUntilOperator = /*@__PURE__*/ (function () { - function TakeUntilOperator(notifier) { - this.notifier = notifier; - } - TakeUntilOperator.prototype.call = function (subscriber, source) { - var takeUntilSubscriber = new TakeUntilSubscriber(subscriber); - var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(takeUntilSubscriber, this.notifier); - if (notifierSubscription && !takeUntilSubscriber.seenValue) { - takeUntilSubscriber.add(notifierSubscription); - return source.subscribe(takeUntilSubscriber); - } - return takeUntilSubscriber; - }; - return TakeUntilOperator; -}()); -var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeUntilSubscriber, _super); - function TakeUntilSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.seenValue = false; - return _this; - } - TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.seenValue = true; - this.complete(); - }; - TakeUntilSubscriber.prototype.notifyComplete = function () { - }; - return TakeUntilSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=takeUntil.js.map +function escapeArgument(arg, doubleEscapeMetaChars) { + // Convert to string + arg = `${arg}`; -/***/ }), -/* 351 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + // Algorithm below is based on https://qntm.org/cmd -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return takeWhile; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + // Sequence of backslashes followed by a double quote: + // double up all the backslashes and escape the double quote + arg = arg.replace(/(\\*)"/g, '$1$1\\"'); + + // Sequence of backslashes followed by the end of the string + // (which will become a double quote later): + // double up all the backslashes + arg = arg.replace(/(\\*)$/, '$1$1'); + // All other backslashes occur literally -function takeWhile(predicate, inclusive) { - if (inclusive === void 0) { - inclusive = false; + // Quote the whole thing: + arg = `"${arg}"`; + + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); + + // Double escape meta chars if necessary + if (doubleEscapeMetaChars) { + arg = arg.replace(metaCharsRegExp, '^$1'); } - return function (source) { - return source.lift(new TakeWhileOperator(predicate, inclusive)); - }; + + return arg; } -var TakeWhileOperator = /*@__PURE__*/ (function () { - function TakeWhileOperator(predicate, inclusive) { - this.predicate = predicate; - this.inclusive = inclusive; - } - TakeWhileOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive)); - }; - return TakeWhileOperator; -}()); -var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeWhileSubscriber, _super); - function TakeWhileSubscriber(destination, predicate, inclusive) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.inclusive = inclusive; - _this.index = 0; - return _this; - } - TakeWhileSubscriber.prototype._next = function (value) { - var destination = this.destination; - var result; - try { - result = this.predicate(value, this.index++); - } - catch (err) { - destination.error(err); - return; - } - this.nextOrComplete(value, result); - }; - TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) { - var destination = this.destination; - if (Boolean(predicateResult)) { - destination.next(value); - } - else { - if (this.inclusive) { - destination.next(value); - } - destination.complete(); - } - }; - return TakeWhileSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=takeWhile.js.map + +module.exports.command = escapeCommand; +module.exports.argument = escapeArgument; /***/ }), -/* 352 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 354 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return tap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(185); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(173); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */ +const fs = __webpack_require__(349); +const shebangCommand = __webpack_require__(355); + +function readShebang(command) { + // Read the first 150 bytes from the file + const size = 150; + const buffer = Buffer.alloc(size); + + let fd; + try { + fd = fs.openSync(command, 'r'); + fs.readSync(fd, buffer, 0, size, 0); + fs.closeSync(fd); + } catch (e) { /* Empty */ } -function tap(nextOrObserver, error, complete) { - return function tapOperatorFunction(source) { - return source.lift(new DoOperator(nextOrObserver, error, complete)); - }; + // Attempt to extract shebang (null is returned if not a shebang) + return shebangCommand(buffer.toString()); } -var DoOperator = /*@__PURE__*/ (function () { - function DoOperator(nextOrObserver, error, complete) { - this.nextOrObserver = nextOrObserver; - this.error = error; - this.complete = complete; - } - DoOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); - }; - return DoOperator; -}()); -var TapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TapSubscriber, _super); - function TapSubscriber(destination, observerOrNext, error, complete) { - var _this = _super.call(this, destination) || this; - _this._tapNext = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_3__["isFunction"])(observerOrNext)) { - _this._context = _this; - _this._tapNext = observerOrNext; - } - else if (observerOrNext) { - _this._context = observerOrNext; - _this._tapNext = observerOrNext.next || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = observerOrNext.error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = observerOrNext.complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - } - return _this; - } - TapSubscriber.prototype._next = function (value) { - try { - this._tapNext.call(this._context, value); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.next(value); - }; - TapSubscriber.prototype._error = function (err) { - try { - this._tapError.call(this._context, err); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.error(err); - }; - TapSubscriber.prototype._complete = function () { - try { - this._tapComplete.call(this._context); - } - catch (err) { - this.destination.error(err); - return; - } - return this.destination.complete(); - }; - return TapSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=tap.js.map + +module.exports = readShebang; /***/ }), -/* 353 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 355 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultThrottleConfig", function() { return defaultThrottleConfig; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return throttle; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +const shebangRegex = __webpack_require__(356); +module.exports = (string = '') => { + const match = string.match(shebangRegex); -var defaultThrottleConfig = { - leading: true, - trailing: false + if (!match) { + return null; + } + + const [path, argument] = match[0].replace(/#! ?/, '').split(' '); + const binary = path.split('/').pop(); + + if (binary === 'env') { + return argument; + } + + return argument ? `${binary} ${argument}` : binary; }; -function throttle(durationSelector, config) { - if (config === void 0) { - config = defaultThrottleConfig; - } - return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); }; -} -var ThrottleOperator = /*@__PURE__*/ (function () { - function ThrottleOperator(durationSelector, leading, trailing) { - this.durationSelector = durationSelector; - this.leading = leading; - this.trailing = trailing; - } - ThrottleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing)); - }; - return ThrottleOperator; -}()); -var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleSubscriber, _super); - function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.durationSelector = durationSelector; - _this._leading = _leading; - _this._trailing = _trailing; - _this._hasValue = false; - return _this; - } - ThrottleSubscriber.prototype._next = function (value) { - this._hasValue = true; - this._sendValue = value; - if (!this._throttled) { - if (this._leading) { - this.send(); - } - else { - this.throttle(value); - } - } - }; - ThrottleSubscriber.prototype.send = function () { - var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue; - if (_hasValue) { - this.destination.next(_sendValue); - this.throttle(_sendValue); - } - this._hasValue = false; - this._sendValue = null; - }; - ThrottleSubscriber.prototype.throttle = function (value) { - var duration = this.tryDurationSelector(value); - if (!!duration) { - this.add(this._throttled = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration)); - } - }; - ThrottleSubscriber.prototype.tryDurationSelector = function (value) { - try { - return this.durationSelector(value); - } - catch (err) { - this.destination.error(err); - return null; - } - }; - ThrottleSubscriber.prototype.throttlingDone = function () { - var _a = this, _throttled = _a._throttled, _trailing = _a._trailing; - if (_throttled) { - _throttled.unsubscribe(); - } - this._throttled = null; - if (_trailing) { - this.send(); - } - }; - ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.throttlingDone(); - }; - ThrottleSubscriber.prototype.notifyComplete = function () { - this.throttlingDone(); - }; - return ThrottleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=throttle.js.map /***/ }), -/* 354 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 356 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return throttleTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); -/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(353); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ +module.exports = /^#!(.*)/; +/***/ }), +/* 357 */ +/***/ (function(module, exports, __webpack_require__) { -function throttleTime(duration, scheduler, config) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - } - if (config === void 0) { - config = _throttle__WEBPACK_IMPORTED_MODULE_3__["defaultThrottleConfig"]; - } - return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); }; +"use strict"; + + +const isWin = process.platform === 'win32'; + +function notFoundError(original, syscall) { + return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { + code: 'ENOENT', + errno: 'ENOENT', + syscall: `${syscall} ${original.command}`, + path: original.command, + spawnargs: original.args, + }); } -var ThrottleTimeOperator = /*@__PURE__*/ (function () { - function ThrottleTimeOperator(duration, scheduler, leading, trailing) { - this.duration = duration; - this.scheduler = scheduler; - this.leading = leading; - this.trailing = trailing; - } - ThrottleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing)); - }; - return ThrottleTimeOperator; -}()); -var ThrottleTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleTimeSubscriber, _super); - function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) { - var _this = _super.call(this, destination) || this; - _this.duration = duration; - _this.scheduler = scheduler; - _this.leading = leading; - _this.trailing = trailing; - _this._hasTrailingValue = false; - _this._trailingValue = null; - return _this; + +function hookChildProcess(cp, parsed) { + if (!isWin) { + return; } - ThrottleTimeSubscriber.prototype._next = function (value) { - if (this.throttled) { - if (this.trailing) { - this._trailingValue = value; - this._hasTrailingValue = true; - } - } - else { - this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this })); - if (this.leading) { - this.destination.next(value); - } - else if (this.trailing) { - this._trailingValue = value; - this._hasTrailingValue = true; - } - } - }; - ThrottleTimeSubscriber.prototype._complete = function () { - if (this._hasTrailingValue) { - this.destination.next(this._trailingValue); - this.destination.complete(); - } - else { - this.destination.complete(); - } - }; - ThrottleTimeSubscriber.prototype.clearThrottle = function () { - var throttled = this.throttled; - if (throttled) { - if (this.trailing && this._hasTrailingValue) { - this.destination.next(this._trailingValue); - this._trailingValue = null; - this._hasTrailingValue = false; + + const originalEmit = cp.emit; + + cp.emit = function (name, arg1) { + // If emitting "exit" event and exit code is 1, we need to check if + // the command exists and emit an "error" instead + // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 + if (name === 'exit') { + const err = verifyENOENT(arg1, parsed, 'spawn'); + + if (err) { + return originalEmit.call(cp, 'error', err); } - throttled.unsubscribe(); - this.remove(throttled); - this.throttled = null; } + + return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params }; - return ThrottleTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNext(arg) { - var subscriber = arg.subscriber; - subscriber.clearThrottle(); } -//# sourceMappingURL=throttleTime.js.map + +function verifyENOENT(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawn'); + } + + return null; +} + +function verifyENOENTSync(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawnSync'); + } + + return null; +} + +module.exports = { + hookChildProcess, + verifyENOENT, + verifyENOENTSync, + notFoundError, +}; /***/ }), -/* 355 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 358 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(315); -/* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(250); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(226); -/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ +module.exports = input => { + const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt(); + const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt(); + if (input[input.length - 1] === LF) { + input = input.slice(0, input.length - 1); + } -function timeInterval(scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return function (source) { - return Object(_observable_defer__WEBPACK_IMPORTED_MODULE_2__["defer"])(function () { - return source.pipe(Object(_scan__WEBPACK_IMPORTED_MODULE_1__["scan"])(function (_a, value) { - var current = _a.current; - return ({ value: value, current: scheduler.now(), last: current }); - }, { current: scheduler.now(), value: undefined, last: undefined }), Object(_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (_a) { - var current = _a.current, last = _a.last, value = _a.value; - return new TimeInterval(value, current - last); - })); - }); - }; -} -var TimeInterval = /*@__PURE__*/ (function () { - function TimeInterval(value, interval) { - this.value = value; - this.interval = interval; - } - return TimeInterval; -}()); + if (input[input.length - 1] === CR) { + input = input.slice(0, input.length - 1); + } -//# sourceMappingURL=timeInterval.js.map + return input; +}; /***/ }), -/* 356 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 359 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return timeout; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); -/* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(224); -/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(357); -/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(209); -/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ - +const path = __webpack_require__(4); +const pathKey = __webpack_require__(352); +const npmRunPath = options => { + options = { + cwd: process.cwd(), + path: process.env[pathKey()], + execPath: process.execPath, + ...options + }; -function timeout(due, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return Object(_timeoutWith__WEBPACK_IMPORTED_MODULE_2__["timeoutWith"])(due, Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_3__["throwError"])(new _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]()), scheduler); -} -//# sourceMappingURL=timeout.js.map + let previous; + let cwdPath = path.resolve(options.cwd); + const result = []; + while (previous !== cwdPath) { + result.push(path.join(cwdPath, 'node_modules/.bin')); + previous = cwdPath; + cwdPath = path.resolve(cwdPath, '..'); + } -/***/ }), -/* 357 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + // Ensure the running `node` binary is used + const execPathDir = path.resolve(options.cwd, options.execPath, '..'); + result.push(execPathDir); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return timeoutWith; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(289); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + return result.concat(options.path).join(path.delimiter); +}; +module.exports = npmRunPath; +// TODO: Remove this for the next major release +module.exports.default = npmRunPath; +module.exports.env = options => { + options = { + env: process.env, + ...options + }; + const env = {...options.env}; + const path = pathKey({env}); + options.path = env[path]; + env[path] = module.exports(options); -function timeoutWith(due, withObservable, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - return function (source) { - var absoluteTimeout = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(due); - var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due); - return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler)); - }; -} -var TimeoutWithOperator = /*@__PURE__*/ (function () { - function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) { - this.waitFor = waitFor; - this.absoluteTimeout = absoluteTimeout; - this.withObservable = withObservable; - this.scheduler = scheduler; - } - TimeoutWithOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler)); - }; - return TimeoutWithOperator; -}()); -var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TimeoutWithSubscriber, _super); - function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) { - var _this = _super.call(this, destination) || this; - _this.absoluteTimeout = absoluteTimeout; - _this.waitFor = waitFor; - _this.withObservable = withObservable; - _this.scheduler = scheduler; - _this.action = null; - _this.scheduleTimeout(); - return _this; - } - TimeoutWithSubscriber.dispatchTimeout = function (subscriber) { - var withObservable = subscriber.withObservable; - subscriber._unsubscribeAndRecycle(); - subscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(subscriber, withObservable)); - }; - TimeoutWithSubscriber.prototype.scheduleTimeout = function () { - var action = this.action; - if (action) { - this.action = action.schedule(this, this.waitFor); - } - else { - this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this)); - } - }; - TimeoutWithSubscriber.prototype._next = function (value) { - if (!this.absoluteTimeout) { - this.scheduleTimeout(); - } - _super.prototype._next.call(this, value); - }; - TimeoutWithSubscriber.prototype._unsubscribe = function () { - this.action = null; - this.scheduler = null; - this.withObservable = null; - }; - return TimeoutWithSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=timeoutWith.js.map + return env; +}; /***/ }), -/* 358 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 360 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return timestamp; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timestamp", function() { return Timestamp; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(226); -/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */ +const mimicFn = __webpack_require__(361); -function timestamp(scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return Object(_map__WEBPACK_IMPORTED_MODULE_1__["map"])(function (value) { return new Timestamp(value, scheduler.now()); }); -} -var Timestamp = /*@__PURE__*/ (function () { - function Timestamp(value, timestamp) { - this.value = value; - this.timestamp = timestamp; - } - return Timestamp; -}()); +const calledFunctions = new WeakMap(); -//# sourceMappingURL=timestamp.js.map +const oneTime = (fn, options = {}) => { + if (typeof fn !== 'function') { + throw new TypeError('Expected a function'); + } + let ret; + let isCalled = false; + let callCount = 0; + const functionName = fn.displayName || fn.name || ''; -/***/ }), -/* 359 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const onetime = function (...args) { + calledFunctions.set(onetime, ++callCount); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(314); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ + if (isCalled) { + if (options.throw === true) { + throw new Error(`Function \`${functionName}\` can only be called once`); + } -function toArrayReducer(arr, item, index) { - if (index === 0) { - return [item]; - } - arr.push(item); - return arr; -} -function toArray() { - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(toArrayReducer, []); -} -//# sourceMappingURL=toArray.js.map + return ret; + } + isCalled = true; + ret = fn.apply(this, args); + fn = null; -/***/ }), -/* 360 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + return ret; + }; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "window", function() { return window; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + mimicFn(onetime, fn); + calledFunctions.set(onetime, callCount); + return onetime; +}; +module.exports = oneTime; +// TODO: Remove this for the next major release +module.exports.default = oneTime; +module.exports.callCount = fn => { + if (!calledFunctions.has(fn)) { + throw new Error(`The given function \`${fn.name}\` is not wrapped by the \`onetime\` package`); + } -function window(windowBoundaries) { - return function windowOperatorFunction(source) { - return source.lift(new WindowOperator(windowBoundaries)); - }; -} -var WindowOperator = /*@__PURE__*/ (function () { - function WindowOperator(windowBoundaries) { - this.windowBoundaries = windowBoundaries; - } - WindowOperator.prototype.call = function (subscriber, source) { - var windowSubscriber = new WindowSubscriber(subscriber); - var sourceSubscription = source.subscribe(windowSubscriber); - if (!sourceSubscription.closed) { - windowSubscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(windowSubscriber, this.windowBoundaries)); - } - return sourceSubscription; - }; - return WindowOperator; -}()); -var WindowSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); - function WindowSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - destination.next(_this.window); - return _this; - } - WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openWindow(); - }; - WindowSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - WindowSubscriber.prototype.notifyComplete = function (innerSub) { - this._complete(); - }; - WindowSubscriber.prototype._next = function (value) { - this.window.next(value); - }; - WindowSubscriber.prototype._error = function (err) { - this.window.error(err); - this.destination.error(err); - }; - WindowSubscriber.prototype._complete = function () { - this.window.complete(); - this.destination.complete(); - }; - WindowSubscriber.prototype._unsubscribe = function () { - this.window = null; - }; - WindowSubscriber.prototype.openWindow = function () { - var prevWindow = this.window; - if (prevWindow) { - prevWindow.complete(); - } - var destination = this.destination; - var newWindow = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - destination.next(newWindow); - }; - return WindowSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=window.js.map + return calledFunctions.get(fn); +}; /***/ }), /* 361 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return windowCount; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(187); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */ - -function windowCount(windowSize, startWindowEvery) { - if (startWindowEvery === void 0) { - startWindowEvery = 0; - } - return function windowCountOperatorFunction(source) { - return source.lift(new WindowCountOperator(windowSize, startWindowEvery)); - }; -} -var WindowCountOperator = /*@__PURE__*/ (function () { - function WindowCountOperator(windowSize, startWindowEvery) { - this.windowSize = windowSize; - this.startWindowEvery = startWindowEvery; - } - WindowCountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery)); - }; - return WindowCountOperator; -}()); -var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowCountSubscriber, _super); - function WindowCountSubscriber(destination, windowSize, startWindowEvery) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.windowSize = windowSize; - _this.startWindowEvery = startWindowEvery; - _this.windows = [new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"]()]; - _this.count = 0; - destination.next(_this.windows[0]); - return _this; - } - WindowCountSubscriber.prototype._next = function (value) { - var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize; - var destination = this.destination; - var windowSize = this.windowSize; - var windows = this.windows; - var len = windows.length; - for (var i = 0; i < len && !this.closed; i++) { - windows[i].next(value); - } - var c = this.count - windowSize + 1; - if (c >= 0 && c % startWindowEvery === 0 && !this.closed) { - windows.shift().complete(); - } - if (++this.count % startWindowEvery === 0 && !this.closed) { - var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); - windows.push(window_1); - destination.next(window_1); - } - }; - WindowCountSubscriber.prototype._error = function (err) { - var windows = this.windows; - if (windows) { - while (windows.length > 0 && !this.closed) { - windows.shift().error(err); - } - } - this.destination.error(err); - }; - WindowCountSubscriber.prototype._complete = function () { - var windows = this.windows; - if (windows) { - while (windows.length > 0 && !this.closed) { - windows.shift().complete(); - } - } - this.destination.complete(); - }; - WindowCountSubscriber.prototype._unsubscribe = function () { - this.count = 0; - this.windows = null; - }; - return WindowCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=windowCount.js.map +const mimicFn = (to, from) => { + for (const prop of Reflect.ownKeys(from)) { + Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); + } + + return to; +}; + +module.exports = mimicFn; +// TODO: Remove this for the next major release +module.exports.default = mimicFn; /***/ }), /* 362 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return windowTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(257); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(205); -/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ +const {signalsByName} = __webpack_require__(363); +const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { + if (timedOut) { + return `timed out after ${timeout} milliseconds`; + } + if (isCanceled) { + return 'was canceled'; + } + if (errorCode !== undefined) { + return `failed with ${errorCode}`; + } + if (signal !== undefined) { + return `was killed with ${signal} (${signalDescription})`; + } -function windowTime(windowTimeSpan) { - var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - var windowCreationInterval = null; - var maxWindowSize = Number.POSITIVE_INFINITY; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[3])) { - scheduler = arguments[3]; - } - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[2])) { - scheduler = arguments[2]; - } - else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[2])) { - maxWindowSize = arguments[2]; - } - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[1])) { - scheduler = arguments[1]; - } - else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[1])) { - windowCreationInterval = arguments[1]; - } - return function windowTimeOperatorFunction(source) { - return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler)); - }; -} -var WindowTimeOperator = /*@__PURE__*/ (function () { - function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { - this.windowTimeSpan = windowTimeSpan; - this.windowCreationInterval = windowCreationInterval; - this.maxWindowSize = maxWindowSize; - this.scheduler = scheduler; - } - WindowTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler)); - }; - return WindowTimeOperator; -}()); -var CountedSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountedSubject, _super); - function CountedSubject() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this._numberOfNextedValues = 0; - return _this; - } - CountedSubject.prototype.next = function (value) { - this._numberOfNextedValues++; - _super.prototype.next.call(this, value); - }; - Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", { - get: function () { - return this._numberOfNextedValues; - }, - enumerable: true, - configurable: true - }); - return CountedSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -var WindowTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowTimeSubscriber, _super); - function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.windowTimeSpan = windowTimeSpan; - _this.windowCreationInterval = windowCreationInterval; - _this.maxWindowSize = maxWindowSize; - _this.scheduler = scheduler; - _this.windows = []; - var window = _this.openWindow(); - if (windowCreationInterval !== null && windowCreationInterval >= 0) { - var closeState = { subscriber: _this, window: window, context: null }; - var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler }; - _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState)); - _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState)); - } - else { - var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan }; - _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState)); - } - return _this; - } - WindowTimeSubscriber.prototype._next = function (value) { - var windows = this.windows; - var len = windows.length; - for (var i = 0; i < len; i++) { - var window_1 = windows[i]; - if (!window_1.closed) { - window_1.next(value); - if (window_1.numberOfNextedValues >= this.maxWindowSize) { - this.closeWindow(window_1); - } - } - } - }; - WindowTimeSubscriber.prototype._error = function (err) { - var windows = this.windows; - while (windows.length > 0) { - windows.shift().error(err); - } - this.destination.error(err); - }; - WindowTimeSubscriber.prototype._complete = function () { - var windows = this.windows; - while (windows.length > 0) { - var window_2 = windows.shift(); - if (!window_2.closed) { - window_2.complete(); - } - } - this.destination.complete(); - }; - WindowTimeSubscriber.prototype.openWindow = function () { - var window = new CountedSubject(); - this.windows.push(window); - var destination = this.destination; - destination.next(window); - return window; - }; - WindowTimeSubscriber.prototype.closeWindow = function (window) { - window.complete(); - var windows = this.windows; - windows.splice(windows.indexOf(window), 1); - }; - return WindowTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -function dispatchWindowTimeSpanOnly(state) { - var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window; - if (window) { - subscriber.closeWindow(window); - } - state.window = subscriber.openWindow(); - this.schedule(state, windowTimeSpan); -} -function dispatchWindowCreation(state) { - var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval; - var window = subscriber.openWindow(); - var action = this; - var context = { action: action, subscription: null }; - var timeSpanState = { subscriber: subscriber, window: window, context: context }; - context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState); - action.add(context.subscription); - action.schedule(state, windowCreationInterval); -} -function dispatchWindowClose(state) { - var subscriber = state.subscriber, window = state.window, context = state.context; - if (context && context.action && context.subscription) { - context.action.remove(context.subscription); - } - subscriber.closeWindow(window); -} -//# sourceMappingURL=windowTime.js.map + if (exitCode !== undefined) { + return `failed with exit code ${exitCode}`; + } + + return 'failed'; +}; + +const makeError = ({ + stdout, + stderr, + all, + error, + signal, + exitCode, + command, + timedOut, + isCanceled, + killed, + parsed: {options: {timeout}} +}) => { + // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`. + // We normalize them to `undefined` + exitCode = exitCode === null ? undefined : exitCode; + signal = signal === null ? undefined : signal; + const signalDescription = signal === undefined ? undefined : signalsByName[signal].description; + + const errorCode = error && error.code; + + const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}); + const execaMessage = `Command ${prefix}: ${command}`; + const isError = Object.prototype.toString.call(error) === '[object Error]'; + const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage; + const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n'); + + if (isError) { + error.originalMessage = error.message; + error.message = message; + } else { + error = new Error(message); + } + + error.shortMessage = shortMessage; + error.command = command; + error.exitCode = exitCode; + error.signal = signal; + error.signalDescription = signalDescription; + error.stdout = stdout; + error.stderr = stderr; + + if (all !== undefined) { + error.all = all; + } + + if ('bufferedData' in error) { + delete error.bufferedData; + } + + error.failed = true; + error.timedOut = Boolean(timedOut); + error.isCanceled = isCanceled; + error.killed = killed && !timedOut; + + return error; +}; + +module.exports = makeError; /***/ }), /* 363 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return windowToggle; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(364); +var _signals=__webpack_require__(365); +var _realtime=__webpack_require__(367); +const getSignalsByName=function(){ +const signals=(0,_signals.getSignals)(); +return signals.reduce(getSignalByName,{}); +}; -function windowToggle(openings, closingSelector) { - return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); }; +const getSignalByName=function( +signalByNameMemo, +{name,number,description,supported,action,forced,standard}) +{ +return{ +...signalByNameMemo, +[name]:{name,number,description,supported,action,forced,standard}}; + +}; + +const signalsByName=getSignalsByName();exports.signalsByName=signalsByName; + + + + +const getSignalsByNumber=function(){ +const signals=(0,_signals.getSignals)(); +const length=_realtime.SIGRTMAX+1; +const signalsA=Array.from({length},(value,number)=> +getSignalByNumber(number,signals)); + +return Object.assign({},...signalsA); +}; + +const getSignalByNumber=function(number,signals){ +const signal=findSignalByNumber(number,signals); + +if(signal===undefined){ +return{}; } -var WindowToggleOperator = /*@__PURE__*/ (function () { - function WindowToggleOperator(openings, closingSelector) { - this.openings = openings; - this.closingSelector = closingSelector; - } - WindowToggleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector)); - }; - return WindowToggleOperator; -}()); -var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowToggleSubscriber, _super); - function WindowToggleSubscriber(destination, openings, closingSelector) { - var _this = _super.call(this, destination) || this; - _this.openings = openings; - _this.closingSelector = closingSelector; - _this.contexts = []; - _this.add(_this.openSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(_this, openings, openings)); - return _this; - } - WindowToggleSubscriber.prototype._next = function (value) { - var contexts = this.contexts; - if (contexts) { - var len = contexts.length; - for (var i = 0; i < len; i++) { - contexts[i].window.next(value); - } - } - }; - WindowToggleSubscriber.prototype._error = function (err) { - var contexts = this.contexts; - this.contexts = null; - if (contexts) { - var len = contexts.length; - var index = -1; - while (++index < len) { - var context_1 = contexts[index]; - context_1.window.error(err); - context_1.subscription.unsubscribe(); - } - } - _super.prototype._error.call(this, err); - }; - WindowToggleSubscriber.prototype._complete = function () { - var contexts = this.contexts; - this.contexts = null; - if (contexts) { - var len = contexts.length; - var index = -1; - while (++index < len) { - var context_2 = contexts[index]; - context_2.window.complete(); - context_2.subscription.unsubscribe(); - } - } - _super.prototype._complete.call(this); - }; - WindowToggleSubscriber.prototype._unsubscribe = function () { - var contexts = this.contexts; - this.contexts = null; - if (contexts) { - var len = contexts.length; - var index = -1; - while (++index < len) { - var context_3 = contexts[index]; - context_3.window.unsubscribe(); - context_3.subscription.unsubscribe(); - } - } - }; - WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (outerValue === this.openings) { - var closingNotifier = void 0; - try { - var closingSelector = this.closingSelector; - closingNotifier = closingSelector(innerValue); - } - catch (e) { - return this.error(e); - } - var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); - var context_4 = { window: window_1, subscription: subscription }; - this.contexts.push(context_4); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, closingNotifier, context_4); - if (innerSubscription.closed) { - this.closeWindow(this.contexts.length - 1); - } - else { - innerSubscription.context = context_4; - subscription.add(innerSubscription); - } - this.destination.next(window_1); - } - else { - this.closeWindow(this.contexts.indexOf(outerValue)); - } - }; - WindowToggleSubscriber.prototype.notifyError = function (err) { - this.error(err); - }; - WindowToggleSubscriber.prototype.notifyComplete = function (inner) { - if (inner !== this.openSubscription) { - this.closeWindow(this.contexts.indexOf(inner.context)); - } - }; - WindowToggleSubscriber.prototype.closeWindow = function (index) { - if (index === -1) { - return; - } - var contexts = this.contexts; - var context = contexts[index]; - var window = context.window, subscription = context.subscription; - contexts.splice(index, 1); - window.complete(); - subscription.unsubscribe(); - }; - return WindowToggleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=windowToggle.js.map +const{name,description,supported,action,forced,standard}=signal; +return{ +[number]:{ +name, +number, +description, +supported, +action, +forced, +standard}}; -/***/ }), -/* 364 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return windowWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +}; +const findSignalByNumber=function(number,signals){ +const signal=signals.find(({name})=>_os.constants.signals[name]===number); -function windowWhen(closingSelector) { - return function windowWhenOperatorFunction(source) { - return source.lift(new WindowOperator(closingSelector)); - }; +if(signal!==undefined){ +return signal; } -var WindowOperator = /*@__PURE__*/ (function () { - function WindowOperator(closingSelector) { - this.closingSelector = closingSelector; - } - WindowOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector)); - }; - return WindowOperator; -}()); -var WindowSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); - function WindowSubscriber(destination, closingSelector) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.closingSelector = closingSelector; - _this.openWindow(); - return _this; - } - WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openWindow(innerSub); - }; - WindowSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - WindowSubscriber.prototype.notifyComplete = function (innerSub) { - this.openWindow(innerSub); - }; - WindowSubscriber.prototype._next = function (value) { - this.window.next(value); - }; - WindowSubscriber.prototype._error = function (err) { - this.window.error(err); - this.destination.error(err); - this.unsubscribeClosingNotification(); - }; - WindowSubscriber.prototype._complete = function () { - this.window.complete(); - this.destination.complete(); - this.unsubscribeClosingNotification(); - }; - WindowSubscriber.prototype.unsubscribeClosingNotification = function () { - if (this.closingNotification) { - this.closingNotification.unsubscribe(); - } - }; - WindowSubscriber.prototype.openWindow = function (innerSub) { - if (innerSub === void 0) { - innerSub = null; - } - if (innerSub) { - this.remove(innerSub); - innerSub.unsubscribe(); - } - var prevWindow = this.window; - if (prevWindow) { - prevWindow.complete(); - } - var window = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - this.destination.next(window); - var closingNotifier; - try { - var closingSelector = this.closingSelector; - closingNotifier = closingSelector(); - } - catch (e) { - this.destination.error(e); - this.window.error(e); - return; - } - this.add(this.closingNotification = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); - }; - return WindowSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=windowWhen.js.map - - -/***/ }), -/* 365 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return withLatestFrom; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - -function withLatestFrom() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return function (source) { - var project; - if (typeof args[args.length - 1] === 'function') { - project = args.pop(); - } - var observables = args; - return source.lift(new WithLatestFromOperator(observables, project)); - }; -} -var WithLatestFromOperator = /*@__PURE__*/ (function () { - function WithLatestFromOperator(observables, project) { - this.observables = observables; - this.project = project; - } - WithLatestFromOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); - }; - return WithLatestFromOperator; -}()); -var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WithLatestFromSubscriber, _super); - function WithLatestFromSubscriber(destination, observables, project) { - var _this = _super.call(this, destination) || this; - _this.observables = observables; - _this.project = project; - _this.toRespond = []; - var len = observables.length; - _this.values = new Array(len); - for (var i = 0; i < len; i++) { - _this.toRespond.push(i); - } - for (var i = 0; i < len; i++) { - var observable = observables[i]; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, observable, observable, i)); - } - return _this; - } - WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values[outerIndex] = innerValue; - var toRespond = this.toRespond; - if (toRespond.length > 0) { - var found = toRespond.indexOf(outerIndex); - if (found !== -1) { - toRespond.splice(found, 1); - } - } - }; - WithLatestFromSubscriber.prototype.notifyComplete = function () { - }; - WithLatestFromSubscriber.prototype._next = function (value) { - if (this.toRespond.length === 0) { - var args = [value].concat(this.values); - if (this.project) { - this._tryProject(args); - } - else { - this.destination.next(args); - } - } - }; - WithLatestFromSubscriber.prototype._tryProject = function (args) { - var result; - try { - result = this.project.apply(this, args); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.next(result); - }; - return WithLatestFromSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=withLatestFrom.js.map - - -/***/ }), -/* 366 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); -/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(269); -/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ -function zip() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - return function zipOperatorFunction(source) { - return source.lift.call(_observable_zip__WEBPACK_IMPORTED_MODULE_0__["zip"].apply(void 0, [source].concat(observables))); - }; -} -//# sourceMappingURL=zip.js.map +return signals.find(signalA=>signalA.number===number); +}; +const signalsByNumber=getSignalsByNumber();exports.signalsByNumber=signalsByNumber; +//# sourceMappingURL=main.js.map /***/ }), -/* 367 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return zipAll; }); -/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(269); -/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ - -function zipAll(project) { - return function (source) { return source.lift(new _observable_zip__WEBPACK_IMPORTED_MODULE_0__["ZipOperator"](project)); }; -} -//# sourceMappingURL=zipAll.js.map +/* 364 */ +/***/ (function(module, exports) { +module.exports = require("os"); /***/ }), -/* 368 */ +/* 365 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(364); +var _core=__webpack_require__(366); +var _realtime=__webpack_require__(367); -const callbacks = new Set(); -let called = false; -function exit(exit, signal) { - if (called) { - return; - } - called = true; +const getSignals=function(){ +const realtimeSignals=(0,_realtime.getRealtimeSignals)(); +const signals=[..._core.SIGNALS,...realtimeSignals].map(normalizeSignal); +return signals; +};exports.getSignals=getSignals; - for (const callback of callbacks) { - callback(); - } - if (exit === true) { - process.exit(128 + signal); // eslint-disable-line unicorn/no-process-exit - } -} -module.exports = callback => { - callbacks.add(callback); - if (callbacks.size === 1) { - process.once('exit', exit); - process.once('SIGINT', exit.bind(null, true, 2)); - process.once('SIGTERM', exit.bind(null, true, 15)); - // PM2 Cluster shutdown message. Caught to support async handlers with pm2, needed because - // explicitly calling process.exit() doesn't trigger the beforeExit event, and the exit - // event cannot support async handlers, since the event loop is never called after it. - process.on('message', message => { - if (message === 'shutdown') { - exit(true, -128); - } - }); - } - return () => { - callbacks.delete(callback); - }; -}; +const normalizeSignal=function({ +name, +number:defaultNumber, +description, +action, +forced=false, +standard}) +{ +const{ +signals:{[name]:constantSignal}}= +_os.constants; +const supported=constantSignal!==undefined; +const number=supported?constantSignal:defaultNumber; +return{name,number,description,supported,action,forced,standard}; +}; +//# sourceMappingURL=signals.js.map /***/ }), -/* 369 */ +/* 366 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.SIGNALS=void 0; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const $isCliError = Symbol('isCliError'); -function createCliError(message) { - const error = new Error(message); - error[$isCliError] = true; - return error; -} -exports.createCliError = createCliError; -function isCliError(error) { - return error && !!error[$isCliError]; -} -exports.isCliError = isCliError; +const SIGNALS=[ +{ +name:"SIGHUP", +number:1, +action:"terminate", +description:"Terminal closed", +standard:"posix"}, +{ +name:"SIGINT", +number:2, +action:"terminate", +description:"User interruption with CTRL-C", +standard:"ansi"}, -/***/ }), -/* 370 */ -/***/ (function(module, exports, __webpack_require__) { +{ +name:"SIGQUIT", +number:3, +action:"core", +description:"User interruption with CTRL-\\", +standard:"posix"}, -"use strict"; +{ +name:"SIGILL", +number:4, +action:"core", +description:"Invalid machine instruction", +standard:"ansi"}, -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const execa_1 = tslib_1.__importDefault(__webpack_require__(371)); -const fs_1 = __webpack_require__(23); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const operators_1 = __webpack_require__(270); -const chalk_1 = tslib_1.__importDefault(__webpack_require__(2)); -const tree_kill_1 = tslib_1.__importDefault(__webpack_require__(411)); -const util_1 = __webpack_require__(29); -const treeKillAsync = util_1.promisify((...args) => tree_kill_1.default(...args)); -const observe_lines_1 = __webpack_require__(412); -const errors_1 = __webpack_require__(369); -const SECOND = 1000; -const STOP_TIMEOUT = 30 * SECOND; -async function withTimeout(attempt, ms, onTimeout) { - const TIMEOUT = Symbol('timeout'); - try { - await Promise.race([ - attempt(), - new Promise((_, reject) => setTimeout(() => reject(TIMEOUT), ms)), - ]); - } - catch (error) { - if (error === TIMEOUT) { - await onTimeout(); - } - else { - throw error; - } - } -} -function startProc(name, options, log) { - const { cmd, args, cwd, env, stdin } = options; - log.info('[%s] > %s', name, cmd, args.join(' ')); - // spawn fails with ENOENT when either the - // cmd or cwd don't exist, so we check for the cwd - // ahead of time so that the error is less ambiguous - try { - if (!fs_1.statSync(cwd).isDirectory()) { - throw new Error(`cwd "${cwd}" exists but is not a directory`); - } - } - catch (err) { - if (err.code === 'ENOENT') { - throw new Error(`cwd "${cwd}" does not exist`); - } - } - const childProcess = execa_1.default(cmd, args, { - cwd, - env, - stdio: ['pipe', 'pipe', 'pipe'], - preferLocal: true, - }); - if (stdin) { - childProcess.stdin.end(stdin, 'utf8'); - } - else { - childProcess.stdin.end(); - } - let stopCalled = false; - const outcome$ = Rx.race( - // observe first exit event - Rx.fromEvent(childProcess, 'exit').pipe(operators_1.take(1), operators_1.map(([code]) => { - if (stopCalled) { - return null; - } - // JVM exits with 143 on SIGTERM and 130 on SIGINT, dont' treat then as errors - if (code > 0 && !(code === 143 || code === 130)) { - throw errors_1.createCliError(`[${name}] exited with code ${code}`); - } - return code; - })), - // observe first error event - Rx.fromEvent(childProcess, 'error').pipe(operators_1.take(1), operators_1.mergeMap((err) => Rx.throwError(err)))).pipe(operators_1.share()); - const lines$ = Rx.merge(observe_lines_1.observeLines(childProcess.stdout), observe_lines_1.observeLines(childProcess.stderr)).pipe(operators_1.tap((line) => log.write(` ${chalk_1.default.gray('proc')} [${chalk_1.default.gray(name)}] ${line}`)), operators_1.share()); - const outcomePromise = Rx.merge(lines$.pipe(operators_1.ignoreElements()), outcome$).toPromise(); - async function stop(signal) { - if (stopCalled) { - return; - } - stopCalled = true; - await withTimeout(async () => { - log.debug(`Sending "${signal}" to proc "${name}"`); - await treeKillAsync(childProcess.pid, signal); - await outcomePromise; - }, STOP_TIMEOUT, async () => { - log.warning(`Proc "${name}" was sent "${signal}" didn't emit the "exit" or "error" events after ${STOP_TIMEOUT} ms, sending SIGKILL`); - await treeKillAsync(childProcess.pid, 'SIGKILL'); - }); - await withTimeout(async () => { - try { - await outcomePromise; - } - catch (error) { - // ignore - } - }, STOP_TIMEOUT, async () => { - throw new Error(`Proc "${name}" was stopped but never emitted either the "exit" or "error" event after ${STOP_TIMEOUT} ms`); - }); - } - return { - name, - lines$, - outcome$, - outcomePromise, - stop, - }; -} -exports.startProc = startProc; +{ +name:"SIGTRAP", +number:5, +action:"core", +description:"Debugger breakpoint", +standard:"posix"}, +{ +name:"SIGABRT", +number:6, +action:"core", +description:"Aborted", +standard:"ansi"}, -/***/ }), -/* 371 */ -/***/ (function(module, exports, __webpack_require__) { +{ +name:"SIGIOT", +number:6, +action:"core", +description:"Aborted", +standard:"bsd"}, -"use strict"; +{ +name:"SIGBUS", +number:7, +action:"core", +description: +"Bus error due to misaligned, non-existing address or paging error", +standard:"bsd"}, -const path = __webpack_require__(16); -const childProcess = __webpack_require__(372); -const crossSpawn = __webpack_require__(373); -const stripFinalNewline = __webpack_require__(386); -const npmRunPath = __webpack_require__(387); -const onetime = __webpack_require__(388); -const makeError = __webpack_require__(390); -const normalizeStdio = __webpack_require__(395); -const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(396); -const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(400); -const {mergePromise, getSpawnedPromise} = __webpack_require__(409); -const {joinCommand, parseCommand} = __webpack_require__(410); +{ +name:"SIGEMT", +number:7, +action:"terminate", +description:"Command should be emulated but is not implemented", +standard:"other"}, -const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; +{ +name:"SIGFPE", +number:8, +action:"core", +description:"Floating point arithmetic error", +standard:"ansi"}, -const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => { - const env = extendEnv ? {...process.env, ...envOption} : envOption; +{ +name:"SIGKILL", +number:9, +action:"terminate", +description:"Forced termination", +standard:"posix", +forced:true}, - if (preferLocal) { - return npmRunPath.env({env, cwd: localDir, execPath}); - } +{ +name:"SIGUSR1", +number:10, +action:"terminate", +description:"Application-specific signal", +standard:"posix"}, - return env; -}; +{ +name:"SIGSEGV", +number:11, +action:"core", +description:"Segmentation fault", +standard:"ansi"}, -const handleArgs = (file, args, options = {}) => { - const parsed = crossSpawn._parse(file, args, options); - file = parsed.command; - args = parsed.args; - options = parsed.options; +{ +name:"SIGUSR2", +number:12, +action:"terminate", +description:"Application-specific signal", +standard:"posix"}, - options = { - maxBuffer: DEFAULT_MAX_BUFFER, - buffer: true, - stripFinalNewline: true, - extendEnv: true, - preferLocal: false, - localDir: options.cwd || process.cwd(), - execPath: process.execPath, - encoding: 'utf8', - reject: true, - cleanup: true, - all: false, - windowsHide: true, - ...options - }; +{ +name:"SIGPIPE", +number:13, +action:"terminate", +description:"Broken pipe or socket", +standard:"posix"}, - options.env = getEnv(options); +{ +name:"SIGALRM", +number:14, +action:"terminate", +description:"Timeout or timer", +standard:"posix"}, - options.stdio = normalizeStdio(options); +{ +name:"SIGTERM", +number:15, +action:"terminate", +description:"Termination", +standard:"ansi"}, - if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') { - // #116 - args.unshift('/q'); - } +{ +name:"SIGSTKFLT", +number:16, +action:"terminate", +description:"Stack is empty or overflowed", +standard:"other"}, - return {file, args, options, parsed}; -}; +{ +name:"SIGCHLD", +number:17, +action:"ignore", +description:"Child process terminated, paused or unpaused", +standard:"posix"}, -const handleOutput = (options, value, error) => { - if (typeof value !== 'string' && !Buffer.isBuffer(value)) { - // When `execa.sync()` errors, we normalize it to '' to mimic `execa()` - return error === undefined ? undefined : ''; - } +{ +name:"SIGCLD", +number:17, +action:"ignore", +description:"Child process terminated, paused or unpaused", +standard:"other"}, - if (options.stripFinalNewline) { - return stripFinalNewline(value); - } +{ +name:"SIGCONT", +number:18, +action:"unpause", +description:"Unpaused", +standard:"posix", +forced:true}, - return value; -}; +{ +name:"SIGSTOP", +number:19, +action:"pause", +description:"Paused", +standard:"posix", +forced:true}, -const execa = (file, args, options) => { - const parsed = handleArgs(file, args, options); - const command = joinCommand(file, args); +{ +name:"SIGTSTP", +number:20, +action:"pause", +description:"Paused using CTRL-Z or \"suspend\"", +standard:"posix"}, - let spawned; - try { - spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options); - } catch (error) { - // Ensure the returned error is always both a promise and a child process - const dummySpawned = new childProcess.ChildProcess(); - const errorPromise = Promise.reject(makeError({ - error, - stdout: '', - stderr: '', - all: '', - command, - parsed, - timedOut: false, - isCanceled: false, - killed: false - })); - return mergePromise(dummySpawned, errorPromise); - } +{ +name:"SIGTTIN", +number:21, +action:"pause", +description:"Background process cannot read terminal input", +standard:"posix"}, - const spawnedPromise = getSpawnedPromise(spawned); - const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise); - const processDone = setExitHandler(spawned, parsed.options, timedPromise); +{ +name:"SIGBREAK", +number:21, +action:"terminate", +description:"User interruption with CTRL-BREAK", +standard:"other"}, - const context = {isCanceled: false}; +{ +name:"SIGTTOU", +number:22, +action:"pause", +description:"Background process cannot write to terminal output", +standard:"posix"}, - spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned)); - spawned.cancel = spawnedCancel.bind(null, spawned, context); +{ +name:"SIGURG", +number:23, +action:"ignore", +description:"Socket received out-of-band data", +standard:"bsd"}, - const handlePromise = async () => { - const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone); - const stdout = handleOutput(parsed.options, stdoutResult); - const stderr = handleOutput(parsed.options, stderrResult); - const all = handleOutput(parsed.options, allResult); +{ +name:"SIGXCPU", +number:24, +action:"core", +description:"Process timed out", +standard:"bsd"}, - if (error || exitCode !== 0 || signal !== null) { - const returnedError = makeError({ - error, - exitCode, - signal, - stdout, - stderr, - all, - command, - parsed, - timedOut, - isCanceled: context.isCanceled, - killed: spawned.killed - }); +{ +name:"SIGXFSZ", +number:25, +action:"core", +description:"File too big", +standard:"bsd"}, - if (!parsed.options.reject) { - return returnedError; - } +{ +name:"SIGVTALRM", +number:26, +action:"terminate", +description:"Timeout or timer", +standard:"bsd"}, - throw returnedError; - } +{ +name:"SIGPROF", +number:27, +action:"terminate", +description:"Timeout or timer", +standard:"bsd"}, - return { - command, - exitCode: 0, - stdout, - stderr, - all, - failed: false, - timedOut: false, - isCanceled: false, - killed: false - }; - }; +{ +name:"SIGWINCH", +number:28, +action:"ignore", +description:"Terminal window size changed", +standard:"bsd"}, - const handlePromiseOnce = onetime(handlePromise); +{ +name:"SIGIO", +number:29, +action:"terminate", +description:"I/O is available", +standard:"other"}, - crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed); +{ +name:"SIGPOLL", +number:29, +action:"terminate", +description:"Watched event", +standard:"other"}, - handleInput(spawned, parsed.options.input); +{ +name:"SIGINFO", +number:29, +action:"ignore", +description:"Request for process information", +standard:"other"}, - spawned.all = makeAllStream(spawned, parsed.options); +{ +name:"SIGPWR", +number:30, +action:"terminate", +description:"Device running out of power", +standard:"systemv"}, + +{ +name:"SIGSYS", +number:31, +action:"core", +description:"Invalid system call", +standard:"other"}, + +{ +name:"SIGUNUSED", +number:31, +action:"terminate", +description:"Invalid system call", +standard:"other"}];exports.SIGNALS=SIGNALS; +//# sourceMappingURL=core.js.map + +/***/ }), +/* 367 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.SIGRTMAX=exports.getRealtimeSignals=void 0; +const getRealtimeSignals=function(){ +const length=SIGRTMAX-SIGRTMIN+1; +return Array.from({length},getRealtimeSignal); +};exports.getRealtimeSignals=getRealtimeSignals; + +const getRealtimeSignal=function(value,index){ +return{ +name:`SIGRT${index+1}`, +number:SIGRTMIN+index, +action:"terminate", +description:"Application-specific signal (realtime)", +standard:"posix"}; - return mergePromise(spawned, handlePromiseOnce); }; -module.exports = execa; +const SIGRTMIN=34; +const SIGRTMAX=64;exports.SIGRTMAX=SIGRTMAX; +//# sourceMappingURL=realtime.js.map -module.exports.sync = (file, args, options) => { - const parsed = handleArgs(file, args, options); - const command = joinCommand(file, args); +/***/ }), +/* 368 */ +/***/ (function(module, exports, __webpack_require__) { - validateInputSync(parsed.options); +"use strict"; - let result; - try { - result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options); - } catch (error) { - throw makeError({ - error, - stdout: '', - stderr: '', - all: '', - command, - parsed, - timedOut: false, - isCanceled: false, - killed: false - }); +const aliases = ['stdin', 'stdout', 'stderr']; + +const hasAlias = opts => aliases.some(alias => opts[alias] !== undefined); + +const normalizeStdio = opts => { + if (!opts) { + return; } - const stdout = handleOutput(parsed.options, result.stdout, result.error); - const stderr = handleOutput(parsed.options, result.stderr, result.error); + const {stdio} = opts; - if (result.error || result.status !== 0 || result.signal !== null) { - const error = makeError({ - stdout, - stderr, - error: result.error, - signal: result.signal, - exitCode: result.status, - command, - parsed, - timedOut: result.error && result.error.code === 'ETIMEDOUT', - isCanceled: false, - killed: result.signal !== null - }); + if (stdio === undefined) { + return aliases.map(alias => opts[alias]); + } - if (!parsed.options.reject) { - return error; - } + if (hasAlias(opts)) { + throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`); + } - throw error; + if (typeof stdio === 'string') { + return stdio; } - return { - command, - exitCode: 0, - stdout, - stderr, - failed: false, - timedOut: false, - isCanceled: false, - killed: false - }; -}; + if (!Array.isArray(stdio)) { + throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); + } -module.exports.command = (command, options) => { - const [file, ...args] = parseCommand(command); - return execa(file, args, options); + const length = Math.max(stdio.length, aliases.length); + return Array.from({length}, (value, index) => stdio[index]); }; -module.exports.commandSync = (command, options) => { - const [file, ...args] = parseCommand(command); - return execa.sync(file, args, options); -}; +module.exports = normalizeStdio; -module.exports.node = (scriptPath, args, options = {}) => { - if (args && !Array.isArray(args) && typeof args === 'object') { - options = args; - args = []; +// `ipc` is pushed unless it is already present +module.exports.node = opts => { + const stdio = normalizeStdio(opts); + + if (stdio === 'ipc') { + return 'ipc'; } - const stdio = normalizeStdio.node(options); + if (stdio === undefined || typeof stdio === 'string') { + return [stdio, stdio, stdio, 'ipc']; + } - const {nodePath = process.execPath, nodeOptions = process.execArgv} = options; + if (stdio.includes('ipc')) { + return stdio; + } - return execa( - nodePath, - [ - ...nodeOptions, - scriptPath, - ...(Array.isArray(args) ? args : []) - ], - { - ...options, - stdin: undefined, - stdout: undefined, - stderr: undefined, - stdio, - shell: false - } - ); + return [...stdio, 'ipc']; }; /***/ }), -/* 372 */ -/***/ (function(module, exports) { - -module.exports = require("child_process"); - -/***/ }), -/* 373 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const os = __webpack_require__(364); +const onExit = __webpack_require__(370); -const cp = __webpack_require__(372); -const parse = __webpack_require__(374); -const enoent = __webpack_require__(385); +const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; -function spawn(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); +// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior +const spawnedKill = (kill, signal = 'SIGTERM', options = {}) => { + const killResult = kill(signal); + setKillTimeout(kill, signal, options, killResult); + return killResult; +}; - // Spawn the child process - const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); +const setKillTimeout = (kill, signal, options, killResult) => { + if (!shouldForceKill(signal, options, killResult)) { + return; + } - // Hook into child process "exit" event to emit an error if the command - // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - enoent.hookChildProcess(spawned, parsed); + const timeout = getForceKillAfterTimeout(options); + const t = setTimeout(() => { + kill('SIGKILL'); + }, timeout); - return spawned; -} + // Guarded because there's no `.unref()` when `execa` is used in the renderer + // process in Electron. This cannot be tested since we don't run tests in + // Electron. + // istanbul ignore else + if (t.unref) { + t.unref(); + } +}; -function spawnSync(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); +const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => { + return isSigterm(signal) && forceKillAfterTimeout !== false && killResult; +}; - // Spawn the child process - const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); +const isSigterm = signal => { + return signal === os.constants.signals.SIGTERM || + (typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM'); +}; - // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); +const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => { + if (forceKillAfterTimeout === true) { + return DEFAULT_FORCE_KILL_TIMEOUT; + } - return result; -} + if (!Number.isInteger(forceKillAfterTimeout) || forceKillAfterTimeout < 0) { + throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`); + } -module.exports = spawn; -module.exports.spawn = spawn; -module.exports.sync = spawnSync; + return forceKillAfterTimeout; +}; -module.exports._parse = parse; -module.exports._enoent = enoent; +// `childProcess.cancel()` +const spawnedCancel = (spawned, context) => { + const killResult = spawned.kill(); + if (killResult) { + context.isCanceled = true; + } +}; -/***/ }), -/* 374 */ -/***/ (function(module, exports, __webpack_require__) { +const timeoutKill = (spawned, signal, reject) => { + spawned.kill(signal); + reject(Object.assign(new Error('Timed out'), {timedOut: true, signal})); +}; -"use strict"; +// `timeout` option handling +const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => { + if (timeout === 0 || timeout === undefined) { + return spawnedPromise; + } + if (!Number.isInteger(timeout) || timeout < 0) { + throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`); + } -const path = __webpack_require__(16); -const resolveCommand = __webpack_require__(375); -const escape = __webpack_require__(381); -const readShebang = __webpack_require__(382); + let timeoutId; + const timeoutPromise = new Promise((resolve, reject) => { + timeoutId = setTimeout(() => { + timeoutKill(spawned, killSignal, reject); + }, timeout); + }); -const isWin = process.platform === 'win32'; -const isExecutableRegExp = /\.(?:com|exe)$/i; -const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; + const safeSpawnedPromise = spawnedPromise.finally(() => { + clearTimeout(timeoutId); + }); -function detectShebang(parsed) { - parsed.file = resolveCommand(parsed); + return Promise.race([timeoutPromise, safeSpawnedPromise]); +}; - const shebang = parsed.file && readShebang(parsed.file); +// `cleanup` option handling +const setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => { + if (!cleanup || detached) { + return timedPromise; + } - if (shebang) { - parsed.args.unshift(parsed.file); - parsed.command = shebang; + const removeExitHandler = onExit(() => { + spawned.kill(); + }); - return resolveCommand(parsed); - } + return timedPromise.finally(() => { + removeExitHandler(); + }); +}; - return parsed.file; -} +module.exports = { + spawnedKill, + spawnedCancel, + setupTimeout, + setExitHandler +}; -function parseNonShell(parsed) { - if (!isWin) { - return parsed; - } - // Detect & add support for shebangs - const commandFile = detectShebang(parsed); +/***/ }), +/* 370 */ +/***/ (function(module, exports, __webpack_require__) { - // We don't need a shell if the command filename is an executable - const needsShell = !isExecutableRegExp.test(commandFile); +// Note: since nyc uses this module to output coverage, any lines +// that are in the direct sync flow of nyc's outputCoverage are +// ignored, since we can never get coverage for them. +var assert = __webpack_require__(371) +var signals = __webpack_require__(372) - // If a shell is required, use cmd.exe and take care of escaping everything correctly - // Note that `forceShell` is an hidden option used only in tests - if (parsed.options.forceShell || needsShell) { - // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` - // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument - // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, - // we need to double escape them - const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); +var EE = __webpack_require__(373) +/* istanbul ignore if */ +if (typeof EE !== 'function') { + EE = EE.EventEmitter +} - // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) - // This is necessary otherwise it will always fail with ENOENT in those cases - parsed.command = path.normalize(parsed.command); +var emitter +if (process.__signal_exit_emitter__) { + emitter = process.__signal_exit_emitter__ +} else { + emitter = process.__signal_exit_emitter__ = new EE() + emitter.count = 0 + emitter.emitted = {} +} - // Escape command & arguments - parsed.command = escape.command(parsed.command); - parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); +// Because this emitter is a global, we have to check to see if a +// previous version of this library failed to enable infinite listeners. +// I know what you're about to say. But literally everything about +// signal-exit is a compromise with evil. Get used to it. +if (!emitter.infinite) { + emitter.setMaxListeners(Infinity) + emitter.infinite = true +} - const shellCommand = [parsed.command].concat(parsed.args).join(' '); +module.exports = function (cb, opts) { + assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') - parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; - parsed.command = process.env.comspec || 'cmd.exe'; - parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped - } + if (loaded === false) { + load() + } - return parsed; -} + var ev = 'exit' + if (opts && opts.alwaysLast) { + ev = 'afterexit' + } -function parse(command, args, options) { - // Normalize arguments, similar to nodejs - if (args && !Array.isArray(args)) { - options = args; - args = null; + var remove = function () { + emitter.removeListener(ev, cb) + if (emitter.listeners('exit').length === 0 && + emitter.listeners('afterexit').length === 0) { + unload() } + } + emitter.on(ev, cb) - args = args ? args.slice(0) : []; // Clone array to avoid changing the original - options = Object.assign({}, options); // Clone object to avoid changing the original - - // Build our parsed object - const parsed = { - command, - args, - options, - file: undefined, - original: { - command, - args, - }, - }; - - // Delegate further parsing to shell or non-shell - return options.shell ? parsed : parseNonShell(parsed); + return remove } -module.exports = parse; +module.exports.unload = unload +function unload () { + if (!loaded) { + return + } + loaded = false + signals.forEach(function (sig) { + try { + process.removeListener(sig, sigListeners[sig]) + } catch (er) {} + }) + process.emit = originalProcessEmit + process.reallyExit = originalProcessReallyExit + emitter.count -= 1 +} -/***/ }), -/* 375 */ -/***/ (function(module, exports, __webpack_require__) { +function emit (event, code, signal) { + if (emitter.emitted[event]) { + return + } + emitter.emitted[event] = true + emitter.emit(event, code, signal) +} -"use strict"; +// { : , ... } +var sigListeners = {} +signals.forEach(function (sig) { + sigListeners[sig] = function listener () { + // If there are no other listeners, an exit is coming! + // Simplest way: remove us and then re-send the signal. + // We know that this will kill the process, so we can + // safely emit now. + var listeners = process.listeners(sig) + if (listeners.length === emitter.count) { + unload() + emit('exit', null, sig) + /* istanbul ignore next */ + emit('afterexit', null, sig) + /* istanbul ignore next */ + process.kill(process.pid, sig) + } + } +}) +module.exports.signals = function () { + return signals +} -const path = __webpack_require__(16); -const which = __webpack_require__(376); -const pathKey = __webpack_require__(380)(); +module.exports.load = load -function resolveCommandAttempt(parsed, withoutPathExt) { - const cwd = process.cwd(); - const hasCustomCwd = parsed.options.cwd != null; - // Worker threads do not have process.chdir() - const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined; +var loaded = false - // If a custom `cwd` was specified, we need to change the process cwd - // because `which` will do stat calls but does not support a custom cwd - if (shouldSwitchCwd) { - try { - process.chdir(parsed.options.cwd); - } catch (err) { - /* Empty */ - } - } +function load () { + if (loaded) { + return + } + loaded = true - let resolved; + // This is the number of onSignalExit's that are in play. + // It's important so that we can count the correct number of + // listeners on signals, and don't wait for the other one to + // handle it instead of us. + emitter.count += 1 + signals = signals.filter(function (sig) { try { - resolved = which.sync(parsed.command, { - path: (parsed.options.env || process.env)[pathKey], - pathExt: withoutPathExt ? path.delimiter : undefined, - }); - } catch (e) { - /* Empty */ - } finally { - if (shouldSwitchCwd) { - process.chdir(cwd); - } + process.on(sig, sigListeners[sig]) + return true + } catch (er) { + return false } + }) - // If we successfully resolved, ensure that an absolute path is returned - // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it - if (resolved) { - resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); - } + process.emit = processEmit + process.reallyExit = processReallyExit +} - return resolved; +var originalProcessReallyExit = process.reallyExit +function processReallyExit (code) { + process.exitCode = code || 0 + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + originalProcessReallyExit.call(process, process.exitCode) } -function resolveCommand(parsed) { - return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +var originalProcessEmit = process.emit +function processEmit (ev, arg) { + if (ev === 'exit') { + if (arg !== undefined) { + process.exitCode = arg + } + var ret = originalProcessEmit.apply(this, arguments) + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + return ret + } else { + return originalProcessEmit.apply(this, arguments) + } } -module.exports = resolveCommand; +/***/ }), +/* 371 */ +/***/ (function(module, exports) { + +module.exports = require("assert"); /***/ }), -/* 376 */ -/***/ (function(module, exports, __webpack_require__) { +/* 372 */ +/***/ (function(module, exports) { -const isWindows = process.platform === 'win32' || - process.env.OSTYPE === 'cygwin' || - process.env.OSTYPE === 'msys' +// This is not the set of all possible signals. +// +// It IS, however, the set of all signals that trigger +// an exit on either Linux or BSD systems. Linux is a +// superset of the signal names supported on BSD, and +// the unknown signals just fail to register, so we can +// catch that easily enough. +// +// Don't bother with SIGKILL. It's uncatchable, which +// means that we can't fire any callbacks anyway. +// +// If a user does happen to register a handler on a non- +// fatal signal like SIGWINCH or something, and then +// exit, it'll end up firing `process.emit('exit')`, so +// the handler will be fired anyway. +// +// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised +// artificially, inherently leave the process in a +// state from which it is not safe to try and enter JS +// listeners. +module.exports = [ + 'SIGABRT', + 'SIGALRM', + 'SIGHUP', + 'SIGINT', + 'SIGTERM' +] -const path = __webpack_require__(16) -const COLON = isWindows ? ';' : ':' -const isexe = __webpack_require__(377) +if (process.platform !== 'win32') { + module.exports.push( + 'SIGVTALRM', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGUSR2', + 'SIGTRAP', + 'SIGSYS', + 'SIGQUIT', + 'SIGIOT' + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ) +} -const getNotFoundError = (cmd) => - Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) +if (process.platform === 'linux') { + module.exports.push( + 'SIGIO', + 'SIGPOLL', + 'SIGPWR', + 'SIGSTKFLT', + 'SIGUNUSED' + ) +} -const getPathInfo = (cmd, opt) => { - const colon = opt.colon || COLON - // If it has a slash, then we don't bother searching the pathenv. - // just check the file itself, and that's it. - const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [''] - : ( - [ - // windows always checks the cwd first - ...(isWindows ? [process.cwd()] : []), - ...(opt.path || process.env.PATH || - /* istanbul ignore next: very unusual */ '').split(colon), - ] - ) - const pathExtExe = isWindows - ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM' - : '' - const pathExt = isWindows ? pathExtExe.split(colon) : [''] +/***/ }), +/* 373 */ +/***/ (function(module, exports) { - if (isWindows) { - if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') - pathExt.unshift('') - } +module.exports = require("events"); - return { - pathEnv, - pathExt, - pathExtExe, - } -} +/***/ }), +/* 374 */ +/***/ (function(module, exports, __webpack_require__) { -const which = (cmd, opt, cb) => { - if (typeof opt === 'function') { - cb = opt - opt = {} - } - if (!opt) - opt = {} +"use strict"; - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] +const isStream = __webpack_require__(375); +const getStream = __webpack_require__(376); +const mergeStream = __webpack_require__(383); - const step = i => new Promise((resolve, reject) => { - if (i === pathEnv.length) - return opt.all && found.length ? resolve(found) - : reject(getNotFoundError(cmd)) +// `input` option +const handleInput = (spawned, input) => { + // Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852 + // TODO: Remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0 + if (input === undefined || spawned.stdin === undefined) { + return; + } - const ppRaw = pathEnv[i] - const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw + if (isStream(input)) { + input.pipe(spawned.stdin); + } else { + spawned.stdin.end(input); + } +}; - const pCmd = path.join(pathPart, cmd) - const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd - : pCmd +// `all` interleaves `stdout` and `stderr` +const makeAllStream = (spawned, {all}) => { + if (!all || (!spawned.stdout && !spawned.stderr)) { + return; + } - resolve(subStep(p, i, 0)) - }) + const mixed = mergeStream(); - const subStep = (p, i, ii) => new Promise((resolve, reject) => { - if (ii === pathExt.length) - return resolve(step(i + 1)) - const ext = pathExt[ii] - isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { - if (!er && is) { - if (opt.all) - found.push(p + ext) - else - return resolve(p + ext) - } - return resolve(subStep(p, i, ii + 1)) - }) - }) + if (spawned.stdout) { + mixed.add(spawned.stdout); + } - return cb ? step(0).then(res => cb(null, res), cb) : step(0) -} + if (spawned.stderr) { + mixed.add(spawned.stderr); + } -const whichSync = (cmd, opt) => { - opt = opt || {} + return mixed; +}; - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] +// On failure, `result.stdout|stderr|all` should contain the currently buffered stream +const getBufferedData = async (stream, streamPromise) => { + if (!stream) { + return; + } - for (let i = 0; i < pathEnv.length; i ++) { - const ppRaw = pathEnv[i] - const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw + stream.destroy(); - const pCmd = path.join(pathPart, cmd) - const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd - : pCmd + try { + return await streamPromise; + } catch (error) { + return error.bufferedData; + } +}; - for (let j = 0; j < pathExt.length; j ++) { - const cur = p + pathExt[j] - try { - const is = isexe.sync(cur, { pathExt: pathExtExe }) - if (is) { - if (opt.all) - found.push(cur) - else - return cur - } - } catch (ex) {} - } - } +const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => { + if (!stream || !buffer) { + return; + } - if (opt.all && found.length) - return found + if (encoding) { + return getStream(stream, {encoding, maxBuffer}); + } - if (opt.nothrow) - return null + return getStream.buffer(stream, {maxBuffer}); +}; - throw getNotFoundError(cmd) -} +// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all) +const getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => { + const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer}); + const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer}); + const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2}); + + try { + return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]); + } catch (error) { + return Promise.all([ + {error, signal: error.signal, timedOut: error.timedOut}, + getBufferedData(stdout, stdoutPromise), + getBufferedData(stderr, stderrPromise), + getBufferedData(all, allPromise) + ]); + } +}; + +const validateInputSync = ({input}) => { + if (isStream(input)) { + throw new TypeError('The `input` option cannot be a stream in sync mode'); + } +}; + +module.exports = { + handleInput, + makeAllStream, + getSpawnedResult, + validateInputSync +}; -module.exports = which -which.sync = whichSync /***/ }), -/* 377 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(23) -var core -if (process.platform === 'win32' || global.TESTING_WINDOWS) { - core = __webpack_require__(378) -} else { - core = __webpack_require__(379) -} +"use strict"; -module.exports = isexe -isexe.sync = sync -function isexe (path, options, cb) { - if (typeof options === 'function') { - cb = options - options = {} - } +const isStream = stream => + stream !== null && + typeof stream === 'object' && + typeof stream.pipe === 'function'; - if (!cb) { - if (typeof Promise !== 'function') { - throw new TypeError('callback not provided') - } +isStream.writable = stream => + isStream(stream) && + stream.writable !== false && + typeof stream._write === 'function' && + typeof stream._writableState === 'object'; - return new Promise(function (resolve, reject) { - isexe(path, options || {}, function (er, is) { - if (er) { - reject(er) - } else { - resolve(is) - } - }) - }) - } +isStream.readable = stream => + isStream(stream) && + stream.readable !== false && + typeof stream._read === 'function' && + typeof stream._readableState === 'object'; - core(path, options || {}, function (er, is) { - // ignore EACCES because that just means we aren't allowed to run it - if (er) { - if (er.code === 'EACCES' || options && options.ignoreErrors) { - er = null - is = false - } - } - cb(er, is) - }) -} +isStream.duplex = stream => + isStream.writable(stream) && + isStream.readable(stream); -function sync (path, options) { - // my kingdom for a filtered catch - try { - return core.sync(path, options || {}) - } catch (er) { - if (options && options.ignoreErrors || er.code === 'EACCES') { - return false - } else { - throw er - } - } -} +isStream.transform = stream => + isStream.duplex(stream) && + typeof stream._transform === 'function' && + typeof stream._transformState === 'object'; + +module.exports = isStream; /***/ }), -/* 378 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = isexe -isexe.sync = sync +"use strict"; -var fs = __webpack_require__(23) +const pump = __webpack_require__(377); +const bufferStream = __webpack_require__(381); -function checkPathExt (path, options) { - var pathext = options.pathExt !== undefined ? - options.pathExt : process.env.PATHEXT +class MaxBufferError extends Error { + constructor() { + super('maxBuffer exceeded'); + this.name = 'MaxBufferError'; + } +} - if (!pathext) { - return true - } +async function getStream(inputStream, options) { + if (!inputStream) { + return Promise.reject(new Error('Expected a stream')); + } - pathext = pathext.split(';') - if (pathext.indexOf('') !== -1) { - return true - } - for (var i = 0; i < pathext.length; i++) { - var p = pathext[i].toLowerCase() - if (p && path.substr(-p.length).toLowerCase() === p) { - return true - } - } - return false -} + options = { + maxBuffer: Infinity, + ...options + }; -function checkStat (stat, path, options) { - if (!stat.isSymbolicLink() && !stat.isFile()) { - return false - } - return checkPathExt(path, options) -} + const {maxBuffer} = options; -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, path, options)) - }) -} + let stream; + await new Promise((resolve, reject) => { + const rejectPromise = error => { + if (error) { // A null check + error.bufferedData = stream.getBufferedValue(); + } -function sync (path, options) { - return checkStat(fs.statSync(path), path, options) + reject(error); + }; + + stream = pump(inputStream, bufferStream(options), error => { + if (error) { + rejectPromise(error); + return; + } + + resolve(); + }); + + stream.on('data', () => { + if (stream.getBufferedLength() > maxBuffer) { + rejectPromise(new MaxBufferError()); + } + }); + }); + + return stream.getBufferedValue(); } +module.exports = getStream; +// TODO: Remove this for the next major release +module.exports.default = getStream; +module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'}); +module.exports.array = (stream, options) => getStream(stream, {...options, array: true}); +module.exports.MaxBufferError = MaxBufferError; + /***/ }), -/* 379 */ +/* 377 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = isexe -isexe.sync = sync +var once = __webpack_require__(378) +var eos = __webpack_require__(380) +var fs = __webpack_require__(349) // we only need fs to get the ReadStream and WriteStream prototypes -var fs = __webpack_require__(23) +var noop = function () {} +var ancient = /^v?\.0/.test(process.version) -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, options)) - }) +var isFn = function (fn) { + return typeof fn === 'function' } -function sync (path, options) { - return checkStat(fs.statSync(path), options) +var isFS = function (stream) { + if (!ancient) return false // newer node version do not need to care about fs is a special way + if (!fs) return false // browser + return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) } -function checkStat (stat, options) { - return stat.isFile() && checkMode(stat, options) +var isRequest = function (stream) { + return stream.setHeader && isFn(stream.abort) } -function checkMode (stat, options) { - var mod = stat.mode - var uid = stat.uid - var gid = stat.gid +var destroyer = function (stream, reading, writing, callback) { + callback = once(callback) - var myUid = options.uid !== undefined ? - options.uid : process.getuid && process.getuid() - var myGid = options.gid !== undefined ? - options.gid : process.getgid && process.getgid() + var closed = false + stream.on('close', function () { + closed = true + }) - var u = parseInt('100', 8) - var g = parseInt('010', 8) - var o = parseInt('001', 8) - var ug = u | g + eos(stream, {readable: reading, writable: writing}, function (err) { + if (err) return callback(err) + closed = true + callback() + }) - var ret = (mod & o) || - (mod & g) && gid === myGid || - (mod & u) && uid === myUid || - (mod & ug) && myUid === 0 + var destroyed = false + return function (err) { + if (closed) return + if (destroyed) return + destroyed = true - return ret -} + if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks + if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want + if (isFn(stream.destroy)) return stream.destroy() -/***/ }), -/* 380 */ -/***/ (function(module, exports, __webpack_require__) { + callback(err || new Error('stream was destroyed')) + } +} -"use strict"; +var call = function (fn) { + fn() +} +var pipe = function (from, to) { + return from.pipe(to) +} -const pathKey = (options = {}) => { - const environment = options.env || process.env; - const platform = options.platform || process.platform; +var pump = function () { + var streams = Array.prototype.slice.call(arguments) + var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop - if (platform !== 'win32') { - return 'PATH'; - } + if (Array.isArray(streams[0])) streams = streams[0] + if (streams.length < 2) throw new Error('pump requires two streams per minimum') - return Object.keys(environment).find(key => key.toUpperCase() === 'PATH') || 'Path'; -}; + var error + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1 + var writing = i > 0 + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err + if (err) destroys.forEach(call) + if (reading) return + destroys.forEach(call) + callback(error) + }) + }) -module.exports = pathKey; -// TODO: Remove this for the next major release -module.exports.default = pathKey; + return streams.reduce(pipe) +} + +module.exports = pump /***/ }), -/* 381 */ +/* 378 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - +var wrappy = __webpack_require__(379) +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) -// See http://www.robvanderwoude.com/escapechars.php -const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) -function escapeCommand(arg) { - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) - return arg; +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f } -function escapeArgument(arg, doubleEscapeMetaChars) { - // Convert to string - arg = `${arg}`; +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} - // Algorithm below is based on https://qntm.org/cmd - // Sequence of backslashes followed by a double quote: - // double up all the backslashes and escape the double quote - arg = arg.replace(/(\\*)"/g, '$1$1\\"'); +/***/ }), +/* 379 */ +/***/ (function(module, exports) { - // Sequence of backslashes followed by the end of the string - // (which will become a double quote later): - // double up all the backslashes - arg = arg.replace(/(\\*)$/, '$1$1'); +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) - // All other backslashes occur literally + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') - // Quote the whole thing: - arg = `"${arg}"`; + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); + return wrapper - // Double escape meta chars if necessary - if (doubleEscapeMetaChars) { - arg = arg.replace(metaCharsRegExp, '^$1'); + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] } - - return arg; + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } } -module.exports.command = escapeCommand; -module.exports.argument = escapeArgument; - /***/ }), -/* 382 */ +/* 380 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var once = __webpack_require__(378); +var noop = function() {}; -const fs = __webpack_require__(23); -const shebangCommand = __webpack_require__(383); +var isRequest = function(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +}; -function readShebang(command) { - // Read the first 150 bytes from the file - const size = 150; - const buffer = Buffer.alloc(size); +var isChildProcess = function(stream) { + return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3 +}; - let fd; +var eos = function(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; - try { - fd = fs.openSync(command, 'r'); - fs.readSync(fd, buffer, 0, size, 0); - fs.closeSync(fd); - } catch (e) { /* Empty */ } + callback = once(callback || noop); - // Attempt to extract shebang (null is returned if not a shebang) - return shebangCommand(buffer.toString()); -} + var ws = stream._writableState; + var rs = stream._readableState; + var readable = opts.readable || (opts.readable !== false && stream.readable); + var writable = opts.writable || (opts.writable !== false && stream.writable); -module.exports = readShebang; + var onlegacyfinish = function() { + if (!stream.writable) onfinish(); + }; + var onfinish = function() { + writable = false; + if (!readable) callback.call(stream); + }; -/***/ }), -/* 383 */ -/***/ (function(module, exports, __webpack_require__) { + var onend = function() { + readable = false; + if (!writable) callback.call(stream); + }; -"use strict"; + var onexit = function(exitCode) { + callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null); + }; -const shebangRegex = __webpack_require__(384); + var onerror = function(err) { + callback.call(stream, err); + }; -module.exports = (string = '') => { - const match = string.match(shebangRegex); + var onclose = function() { + if (readable && !(rs && rs.ended)) return callback.call(stream, new Error('premature close')); + if (writable && !(ws && ws.ended)) return callback.call(stream, new Error('premature close')); + }; - if (!match) { - return null; + var onrequest = function() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest(); + else stream.on('request', onrequest); + } else if (writable && !ws) { // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); } - const [path, argument] = match[0].replace(/#! ?/, '').split(' '); - const binary = path.split('/').pop(); + if (isChildProcess(stream)) stream.on('exit', onexit); - if (binary === 'env') { - return argument; - } + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); - return argument ? `${binary} ${argument}` : binary; + return function() { + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('exit', onexit); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; }; +module.exports = eos; + /***/ }), -/* 384 */ +/* 381 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = /^#!(.*)/; +const {PassThrough: PassThroughStream} = __webpack_require__(382); +module.exports = options => { + options = {...options}; -/***/ }), -/* 385 */ -/***/ (function(module, exports, __webpack_require__) { + const {array} = options; + let {encoding} = options; + const isBuffer = encoding === 'buffer'; + let objectMode = false; -"use strict"; + if (array) { + objectMode = !(encoding || isBuffer); + } else { + encoding = encoding || 'utf8'; + } + if (isBuffer) { + encoding = null; + } -const isWin = process.platform === 'win32'; + const stream = new PassThroughStream({objectMode}); -function notFoundError(original, syscall) { - return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { - code: 'ENOENT', - errno: 'ENOENT', - syscall: `${syscall} ${original.command}`, - path: original.command, - spawnargs: original.args, - }); -} + if (encoding) { + stream.setEncoding(encoding); + } -function hookChildProcess(cp, parsed) { - if (!isWin) { - return; - } + let length = 0; + const chunks = []; - const originalEmit = cp.emit; + stream.on('data', chunk => { + chunks.push(chunk); - cp.emit = function (name, arg1) { - // If emitting "exit" event and exit code is 1, we need to check if - // the command exists and emit an "error" instead - // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 - if (name === 'exit') { - const err = verifyENOENT(arg1, parsed, 'spawn'); + if (objectMode) { + length = chunks.length; + } else { + length += chunk.length; + } + }); - if (err) { - return originalEmit.call(cp, 'error', err); - } - } + stream.getBufferedValue = () => { + if (array) { + return chunks; + } - return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params - }; -} + return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); + }; -function verifyENOENT(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawn'); - } + stream.getBufferedLength = () => length; - return null; -} + return stream; +}; -function verifyENOENTSync(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawnSync'); - } - return null; -} - -module.exports = { - hookChildProcess, - verifyENOENT, - verifyENOENTSync, - notFoundError, -}; +/***/ }), +/* 382 */ +/***/ (function(module, exports) { +module.exports = require("stream"); /***/ }), -/* 386 */ +/* 383 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = input => { - const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt(); - const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt(); +const { PassThrough } = __webpack_require__(382); - if (input[input.length - 1] === LF) { - input = input.slice(0, input.length - 1); - } +module.exports = function (/*streams...*/) { + var sources = [] + var output = new PassThrough({objectMode: true}) - if (input[input.length - 1] === CR) { - input = input.slice(0, input.length - 1); - } + output.setMaxListeners(0) - return input; -}; + output.add = add + output.isEmpty = isEmpty + + output.on('unpipe', remove) + + Array.prototype.slice.call(arguments).forEach(add) + + return output + + function add (source) { + if (Array.isArray(source)) { + source.forEach(add) + return this + } + + sources.push(source); + source.once('end', remove.bind(null, source)) + source.once('error', output.emit.bind(output, 'error')) + source.pipe(output, {end: false}) + return this + } + + function isEmpty () { + return sources.length == 0; + } + + function remove (source) { + sources = sources.filter(function (it) { return it !== source }) + if (!sources.length && output.readable) { output.end() } + } +} /***/ }), -/* 387 */ +/* 384 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const pathKey = __webpack_require__(380); -const npmRunPath = options => { - options = { - cwd: process.cwd(), - path: process.env[pathKey()], - execPath: process.execPath, - ...options - }; +const nativePromisePrototype = (async () => {})().constructor.prototype; +const descriptors = ['then', 'catch', 'finally'].map(property => [ + property, + Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property) +]); - let previous; - let cwdPath = path.resolve(options.cwd); - const result = []; +// The return value is a mixin of `childProcess` and `Promise` +const mergePromise = (spawned, promise) => { + for (const [property, descriptor] of descriptors) { + // Starting the main `promise` is deferred to avoid consuming streams + const value = typeof promise === 'function' ? + (...args) => Reflect.apply(descriptor.value, promise(), args) : + descriptor.value.bind(promise); - while (previous !== cwdPath) { - result.push(path.join(cwdPath, 'node_modules/.bin')); - previous = cwdPath; - cwdPath = path.resolve(cwdPath, '..'); + Reflect.defineProperty(spawned, property, {...descriptor, value}); } - // Ensure the running `node` binary is used - const execPathDir = path.resolve(options.cwd, options.execPath, '..'); - result.push(execPathDir); - - return result.concat(options.path).join(path.delimiter); + return spawned; }; -module.exports = npmRunPath; -// TODO: Remove this for the next major release -module.exports.default = npmRunPath; - -module.exports.env = options => { - options = { - env: process.env, - ...options - }; +// Use promises instead of `child_process` events +const getSpawnedPromise = spawned => { + return new Promise((resolve, reject) => { + spawned.on('exit', (exitCode, signal) => { + resolve({exitCode, signal}); + }); - const env = {...options.env}; - const path = pathKey({env}); + spawned.on('error', error => { + reject(error); + }); - options.path = env[path]; - env[path] = module.exports(options); + if (spawned.stdin) { + spawned.stdin.on('error', error => { + reject(error); + }); + } + }); +}; - return env; +module.exports = { + mergePromise, + getSpawnedPromise }; + /***/ }), -/* 388 */ +/* 385 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const mimicFn = __webpack_require__(389); - -const calledFunctions = new WeakMap(); +const SPACES_REGEXP = / +/g; -const oneTime = (fn, options = {}) => { - if (typeof fn !== 'function') { - throw new TypeError('Expected a function'); +const joinCommand = (file, args = []) => { + if (!Array.isArray(args)) { + return file; } - let ret; - let isCalled = false; - let callCount = 0; - const functionName = fn.displayName || fn.name || ''; - - const onetime = function (...args) { - calledFunctions.set(onetime, ++callCount); - - if (isCalled) { - if (options.throw === true) { - throw new Error(`Function \`${functionName}\` can only be called once`); - } - - return ret; - } + return [file, ...args].join(' '); +}; - isCalled = true; - ret = fn.apply(this, args); - fn = null; +// Allow spaces to be escaped by a backslash if not meant as a delimiter +const handleEscaping = (tokens, token, index) => { + if (index === 0) { + return [token]; + } - return ret; - }; + const previousToken = tokens[tokens.length - 1]; - mimicFn(onetime, fn); - calledFunctions.set(onetime, callCount); + if (previousToken.endsWith('\\')) { + return [...tokens.slice(0, -1), `${previousToken.slice(0, -1)} ${token}`]; + } - return onetime; + return [...tokens, token]; }; -module.exports = oneTime; -// TODO: Remove this for the next major release -module.exports.default = oneTime; - -module.exports.callCount = fn => { - if (!calledFunctions.has(fn)) { - throw new Error(`The given function \`${fn.name}\` is not wrapped by the \`onetime\` package`); - } +// Handle `execa.command()` +const parseCommand = command => { + return command + .trim() + .split(SPACES_REGEXP) + .reduce(handleEscaping, []); +}; - return calledFunctions.get(fn); +module.exports = { + joinCommand, + parseCommand }; /***/ }), -/* 389 */ +/* 386 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const escapeStringRegexp = __webpack_require__(387); +const ansiStyles = __webpack_require__(388); +const stdoutColor = __webpack_require__(393).stdout; -const mimicFn = (to, from) => { - for (const prop of Reflect.ownKeys(from)) { - Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); - } +const template = __webpack_require__(395); - return to; -}; +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); -module.exports = mimicFn; -// TODO: Remove this for the next major release -module.exports.default = mimicFn; +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); -/***/ }), -/* 390 */ -/***/ (function(module, exports, __webpack_require__) { +const styles = Object.create(null); -"use strict"; +function applyOptions(obj, options) { + options = options || {}; -const {signalsByName} = __webpack_require__(391); + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; +} -const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { - if (timedOut) { - return `timed out after ${timeout} milliseconds`; - } +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); - if (isCanceled) { - return 'was canceled'; - } + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; - if (errorCode !== undefined) { - return `failed with ${errorCode}`; - } + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); - if (signal !== undefined) { - return `was killed with ${signal} (${signalDescription})`; - } + chalk.template.constructor = Chalk; - if (exitCode !== undefined) { - return `failed with exit code ${exitCode}`; + return chalk.template; } - return 'failed'; -}; + applyOptions(this, options); +} -const makeError = ({ - stdout, - stderr, - all, - error, - signal, - exitCode, - command, - timedOut, - isCanceled, - killed, - parsed: {options: {timeout}} -}) => { - // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`. - // We normalize them to `undefined` - exitCode = exitCode === null ? undefined : exitCode; - signal = signal === null ? undefined : signal; - const signalDescription = signal === undefined ? undefined : signalsByName[signal].description; +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} - const errorCode = error && error.code; +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}); - const execaMessage = `Command ${prefix}: ${command}`; - const isError = Object.prototype.toString.call(error) === '[object Error]'; - const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage; - const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n'); + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} - if (isError) { - error.originalMessage = error.message; - error.message = message; - } else { - error = new Error(message); +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); } +}; - error.shortMessage = shortMessage; - error.command = command; - error.exitCode = exitCode; - error.signal = signal; - error.signalDescription = signalDescription; - error.stdout = stdout; - error.stderr = stderr; - - if (all !== undefined) { - error.all = all; +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; } - if ('bufferedData' in error) { - delete error.bufferedData; - } + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} - error.failed = true; - error.timedOut = Boolean(timedOut); - error.isCanceled = isCanceled; - error.killed = killed && !timedOut; +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } - return error; -}; + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} -module.exports = makeError; +const proto = Object.defineProperties(() => {}, styles); +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; -/***/ }), -/* 391 */ -/***/ (function(module, exports, __webpack_require__) { + builder._styles = _styles; + builder._empty = _empty; -"use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(11); + const self = this; -var _signals=__webpack_require__(392); -var _realtime=__webpack_require__(394); + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; -const getSignalsByName=function(){ -const signals=(0,_signals.getSignals)(); -return signals.reduce(getSignalByName,{}); -}; + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto -const getSignalByName=function( -signalByNameMemo, -{name,number,description,supported,action,forced,standard}) -{ -return{ -...signalByNameMemo, -[name]:{name,number,description,supported,action,forced,standard}}; + return builder; +} -}; +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); -const signalsByName=getSignalsByName();exports.signalsByName=signalsByName; + if (argsLen === 0) { + return ''; + } + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } -const getSignalsByNumber=function(){ -const signals=(0,_signals.getSignals)(); -const length=_realtime.SIGRTMAX+1; -const signalsA=Array.from({length},(value,number)=> -getSignalByNumber(number,signals)); + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; -return Object.assign({},...signalsA); -}; + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } -const getSignalByNumber=function(number,signals){ -const signal=findSignalByNumber(number,signals); + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; -if(signal===undefined){ -return{}; + return str; } -const{name,description,supported,action,forced,standard}=signal; -return{ -[number]:{ -name, -number, -description, -supported, -action, -forced, -standard}}; - - -}; - +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; -const findSignalByNumber=function(number,signals){ -const signal=signals.find(({name})=>_os.constants.signals[name]===number); + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } -if(signal!==undefined){ -return signal; + return template(chalk, parts.join('')); } -return signals.find(signalA=>signalA.number===number); -}; +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript -const signalsByNumber=getSignalsByNumber();exports.signalsByNumber=signalsByNumber; -//# sourceMappingURL=main.js.map /***/ }), -/* 392 */ +/* 387 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(11); -var _core=__webpack_require__(393); -var _realtime=__webpack_require__(394); +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +module.exports = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } -const getSignals=function(){ -const realtimeSignals=(0,_realtime.getRealtimeSignals)(); -const signals=[..._core.SIGNALS,...realtimeSignals].map(normalizeSignal); -return signals; -};exports.getSignals=getSignals; + return str.replace(matchOperatorsRe, '\\$&'); +}; - - - - - -const normalizeSignal=function({ -name, -number:defaultNumber, -description, -action, -forced=false, -standard}) -{ -const{ -signals:{[name]:constantSignal}}= -_os.constants; -const supported=constantSignal!==undefined; -const number=supported?constantSignal:defaultNumber; -return{name,number,description,supported,action,forced,standard}; -}; -//# sourceMappingURL=signals.js.map - /***/ }), -/* 393 */ +/* 388 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.SIGNALS=void 0; +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(389); -const SIGNALS=[ -{ -name:"SIGHUP", -number:1, -action:"terminate", -description:"Terminal closed", -standard:"posix"}, +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; -{ -name:"SIGINT", -number:2, -action:"terminate", -description:"User interruption with CTRL-C", -standard:"ansi"}, +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; -{ -name:"SIGQUIT", -number:3, -action:"core", -description:"User interruption with CTRL-\\", -standard:"posix"}, +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; -{ -name:"SIGILL", -number:4, -action:"core", -description:"Invalid machine instruction", -standard:"ansi"}, +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], -{ -name:"SIGTRAP", -number:5, -action:"core", -description:"Debugger breakpoint", -standard:"posix"}, + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], -{ -name:"SIGABRT", -number:6, -action:"core", -description:"Aborted", -standard:"ansi"}, + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; -{ -name:"SIGIOT", -number:6, -action:"core", -description:"Aborted", -standard:"bsd"}, + // Fix humans + styles.color.grey = styles.color.gray; -{ -name:"SIGBUS", -number:7, -action:"core", -description: -"Bus error due to misaligned, non-existing address or paging error", -standard:"bsd"}, + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; -{ -name:"SIGEMT", -number:7, -action:"terminate", -description:"Command should be emulated but is not implemented", -standard:"other"}, + for (const styleName of Object.keys(group)) { + const style = group[styleName]; -{ -name:"SIGFPE", -number:8, -action:"core", -description:"Floating point arithmetic error", -standard:"ansi"}, + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; -{ -name:"SIGKILL", -number:9, -action:"terminate", -description:"Forced termination", -standard:"posix", -forced:true}, + group[styleName] = styles[styleName]; -{ -name:"SIGUSR1", -number:10, -action:"terminate", -description:"Application-specific signal", -standard:"posix"}, + codes.set(style[0], style[1]); + } -{ -name:"SIGSEGV", -number:11, -action:"core", -description:"Segmentation fault", -standard:"ansi"}, + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); -{ -name:"SIGUSR2", -number:12, -action:"terminate", -description:"Application-specific signal", -standard:"posix"}, + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } -{ -name:"SIGPIPE", -number:13, -action:"terminate", -description:"Broken pipe or socket", -standard:"posix"}, + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; -{ -name:"SIGALRM", -number:14, -action:"terminate", -description:"Timeout or timer", -standard:"posix"}, + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; -{ -name:"SIGTERM", -number:15, -action:"terminate", -description:"Termination", -standard:"ansi"}, + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; -{ -name:"SIGSTKFLT", -number:16, -action:"terminate", -description:"Stack is empty or overflowed", -standard:"other"}, + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; -{ -name:"SIGCHLD", -number:17, -action:"ignore", -description:"Child process terminated, paused or unpaused", -standard:"posix"}, + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } -{ -name:"SIGCLD", -number:17, -action:"ignore", -description:"Child process terminated, paused or unpaused", -standard:"other"}, + const suite = colorConvert[key]; -{ -name:"SIGCONT", -number:18, -action:"unpause", -description:"Unpaused", -standard:"posix", -forced:true}, + if (key === 'ansi16') { + key = 'ansi'; + } -{ -name:"SIGSTOP", -number:19, -action:"pause", -description:"Paused", -standard:"posix", -forced:true}, + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } -{ -name:"SIGTSTP", -number:20, -action:"pause", -description:"Paused using CTRL-Z or \"suspend\"", -standard:"posix"}, + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } -{ -name:"SIGTTIN", -number:21, -action:"pause", -description:"Background process cannot read terminal input", -standard:"posix"}, + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } -{ -name:"SIGBREAK", -number:21, -action:"terminate", -description:"User interruption with CTRL-BREAK", -standard:"other"}, + return styles; +} -{ -name:"SIGTTOU", -number:22, -action:"pause", -description:"Background process cannot write to terminal output", -standard:"posix"}, +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); -{ -name:"SIGURG", -number:23, -action:"ignore", -description:"Socket received out-of-band data", -standard:"bsd"}, +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) -{ -name:"SIGXCPU", -number:24, -action:"core", -description:"Process timed out", -standard:"bsd"}, +/***/ }), +/* 389 */ +/***/ (function(module, exports, __webpack_require__) { -{ -name:"SIGXFSZ", -number:25, -action:"core", -description:"File too big", -standard:"bsd"}, +var conversions = __webpack_require__(390); +var route = __webpack_require__(392); -{ -name:"SIGVTALRM", -number:26, -action:"terminate", -description:"Timeout or timer", -standard:"bsd"}, +var convert = {}; -{ -name:"SIGPROF", -number:27, -action:"terminate", -description:"Timeout or timer", -standard:"bsd"}, +var models = Object.keys(conversions); -{ -name:"SIGWINCH", -number:28, -action:"ignore", -description:"Terminal window size changed", -standard:"bsd"}, +function wrapRaw(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } -{ -name:"SIGIO", -number:29, -action:"terminate", -description:"I/O is available", -standard:"other"}, + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } -{ -name:"SIGPOLL", -number:29, -action:"terminate", -description:"Watched event", -standard:"other"}, + return fn(args); + }; -{ -name:"SIGINFO", -number:29, -action:"ignore", -description:"Request for process information", -standard:"other"}, + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } -{ -name:"SIGPWR", -number:30, -action:"terminate", -description:"Device running out of power", -standard:"systemv"}, + return wrappedFn; +} -{ -name:"SIGSYS", -number:31, -action:"core", -description:"Invalid system call", -standard:"other"}, +function wrapRounded(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } -{ -name:"SIGUNUSED", -number:31, -action:"terminate", -description:"Invalid system call", -standard:"other"}];exports.SIGNALS=SIGNALS; -//# sourceMappingURL=core.js.map + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } -/***/ }), -/* 394 */ -/***/ (function(module, exports, __webpack_require__) { + var result = fn(args); -"use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.SIGRTMAX=exports.getRealtimeSignals=void 0; -const getRealtimeSignals=function(){ -const length=SIGRTMAX-SIGRTMIN+1; -return Array.from({length},getRealtimeSignal); -};exports.getRealtimeSignals=getRealtimeSignals; + // we're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (var len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } -const getRealtimeSignal=function(value,index){ -return{ -name:`SIGRT${index+1}`, -number:SIGRTMIN+index, -action:"terminate", -description:"Application-specific signal (realtime)", -standard:"posix"}; + return result; + }; -}; + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } -const SIGRTMIN=34; -const SIGRTMAX=64;exports.SIGRTMAX=SIGRTMAX; -//# sourceMappingURL=realtime.js.map + return wrappedFn; +} -/***/ }), -/* 395 */ -/***/ (function(module, exports, __webpack_require__) { +models.forEach(function (fromModel) { + convert[fromModel] = {}; -"use strict"; + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); -const aliases = ['stdin', 'stdout', 'stderr']; + var routes = route(fromModel); + var routeModels = Object.keys(routes); -const hasAlias = opts => aliases.some(alias => opts[alias] !== undefined); + routeModels.forEach(function (toModel) { + var fn = routes[toModel]; -const normalizeStdio = opts => { - if (!opts) { - return; - } + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); - const {stdio} = opts; +module.exports = convert; - if (stdio === undefined) { - return aliases.map(alias => opts[alias]); - } - if (hasAlias(opts)) { - throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`); - } +/***/ }), +/* 390 */ +/***/ (function(module, exports, __webpack_require__) { - if (typeof stdio === 'string') { - return stdio; - } +/* MIT license */ +var cssKeywords = __webpack_require__(391); - if (!Array.isArray(stdio)) { - throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) + +var reverseKeywords = {}; +for (var key in cssKeywords) { + if (cssKeywords.hasOwnProperty(key)) { + reverseKeywords[cssKeywords[key]] = key; } +} - const length = Math.max(stdio.length, aliases.length); - return Array.from({length}, (value, index) => stdio[index]); +var convert = module.exports = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} }; -module.exports = normalizeStdio; +// hide .channels and .labels properties +for (var model in convert) { + if (convert.hasOwnProperty(model)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } -// `ipc` is pushed unless it is already present -module.exports.node = opts => { - const stdio = normalizeStdio(opts); + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } - if (stdio === 'ipc') { - return 'ipc'; - } + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } - if (stdio === undefined || typeof stdio === 'string') { - return [stdio, stdio, stdio, 'ipc']; + var channels = convert[model].channels; + var labels = convert[model].labels; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); } +} - if (stdio.includes('ipc')) { - return stdio; +convert.rgb.hsl = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var l; + + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; } - return [...stdio, 'ipc']; -}; + h = Math.min(h * 60, 360); + if (h < 0) { + h += 360; + } -/***/ }), -/* 396 */ -/***/ (function(module, exports, __webpack_require__) { + l = (min + max) / 2; -"use strict"; + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } -const os = __webpack_require__(11); -const onExit = __webpack_require__(397); + return [h, s * 100, l * 100]; +}; -const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; +convert.rgb.hsv = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var v; -// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior -const spawnedKill = (kill, signal = 'SIGTERM', options = {}) => { - const killResult = kill(signal); - setKillTimeout(kill, signal, options, killResult); - return killResult; -}; + if (max === 0) { + s = 0; + } else { + s = (delta / max * 1000) / 10; + } -const setKillTimeout = (kill, signal, options, killResult) => { - if (!shouldForceKill(signal, options, killResult)) { - return; + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; } - const timeout = getForceKillAfterTimeout(options); - const t = setTimeout(() => { - kill('SIGKILL'); - }, timeout); + h = Math.min(h * 60, 360); - // Guarded because there's no `.unref()` when `execa` is used in the renderer - // process in Electron. This cannot be tested since we don't run tests in - // Electron. - // istanbul ignore else - if (t.unref) { - t.unref(); + if (h < 0) { + h += 360; } -}; -const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => { - return isSigterm(signal) && forceKillAfterTimeout !== false && killResult; -}; + v = ((max / 255) * 1000) / 10; -const isSigterm = signal => { - return signal === os.constants.signals.SIGTERM || - (typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM'); + return [h, s, v]; }; -const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => { - if (forceKillAfterTimeout === true) { - return DEFAULT_FORCE_KILL_TIMEOUT; - } +convert.rgb.hwb = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var h = convert.rgb.hsl(rgb)[0]; + var w = 1 / 255 * Math.min(r, Math.min(g, b)); - if (!Number.isInteger(forceKillAfterTimeout) || forceKillAfterTimeout < 0) { - throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`); - } + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); - return forceKillAfterTimeout; + return [h, w * 100, b * 100]; }; -// `childProcess.cancel()` -const spawnedCancel = (spawned, context) => { - const killResult = spawned.kill(); +convert.rgb.cmyk = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var c; + var m; + var y; + var k; - if (killResult) { - context.isCanceled = true; - } -}; + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; -const timeoutKill = (spawned, signal, reject) => { - spawned.kill(signal); - reject(Object.assign(new Error('Timed out'), {timedOut: true, signal})); + return [c * 100, m * 100, y * 100, k * 100]; }; -// `timeout` option handling -const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => { - if (timeout === 0 || timeout === undefined) { - return spawnedPromise; - } +/** + * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + * */ +function comparativeDistance(x, y) { + return ( + Math.pow(x[0] - y[0], 2) + + Math.pow(x[1] - y[1], 2) + + Math.pow(x[2] - y[2], 2) + ); +} - if (!Number.isInteger(timeout) || timeout < 0) { - throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`); +convert.rgb.keyword = function (rgb) { + var reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; } - let timeoutId; - const timeoutPromise = new Promise((resolve, reject) => { - timeoutId = setTimeout(() => { - timeoutKill(spawned, killSignal, reject); - }, timeout); - }); + var currentClosestDistance = Infinity; + var currentClosestKeyword; - const safeSpawnedPromise = spawnedPromise.finally(() => { - clearTimeout(timeoutId); - }); + for (var keyword in cssKeywords) { + if (cssKeywords.hasOwnProperty(keyword)) { + var value = cssKeywords[keyword]; - return Promise.race([timeoutPromise, safeSpawnedPromise]); -}; + // Compute comparative distance + var distance = comparativeDistance(rgb, value); -// `cleanup` option handling -const setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => { - if (!cleanup || detached) { - return timedPromise; + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } } - const removeExitHandler = onExit(() => { - spawned.kill(); - }); - - return timedPromise.finally(() => { - removeExitHandler(); - }); + return currentClosestKeyword; }; -module.exports = { - spawnedKill, - spawnedCancel, - setupTimeout, - setExitHandler +convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; }; +convert.rgb.xyz = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; -/***/ }), -/* 397 */ -/***/ (function(module, exports, __webpack_require__) { + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); -// Note: since nyc uses this module to output coverage, any lines -// that are in the direct sync flow of nyc's outputCoverage are -// ignored, since we can never get coverage for them. -var assert = __webpack_require__(30) -var signals = __webpack_require__(398) + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); -var EE = __webpack_require__(399) -/* istanbul ignore if */ -if (typeof EE !== 'function') { - EE = EE.EventEmitter -} + return [x * 100, y * 100, z * 100]; +}; -var emitter -if (process.__signal_exit_emitter__) { - emitter = process.__signal_exit_emitter__ -} else { - emitter = process.__signal_exit_emitter__ = new EE() - emitter.count = 0 - emitter.emitted = {} -} +convert.rgb.lab = function (rgb) { + var xyz = convert.rgb.xyz(rgb); + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; -// Because this emitter is a global, we have to check to see if a -// previous version of this library failed to enable infinite listeners. -// I know what you're about to say. But literally everything about -// signal-exit is a compromise with evil. Get used to it. -if (!emitter.infinite) { - emitter.setMaxListeners(Infinity) - emitter.infinite = true -} + x /= 95.047; + y /= 100; + z /= 108.883; -module.exports = function (cb, opts) { - assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); - if (loaded === false) { - load() - } + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); - var ev = 'exit' - if (opts && opts.alwaysLast) { - ev = 'afterexit' - } + return [l, a, b]; +}; - var remove = function () { - emitter.removeListener(ev, cb) - if (emitter.listeners('exit').length === 0 && - emitter.listeners('afterexit').length === 0) { - unload() - } - } - emitter.on(ev, cb) +convert.hsl.rgb = function (hsl) { + var h = hsl[0] / 360; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var t1; + var t2; + var t3; + var rgb; + var val; - return remove -} + if (s === 0) { + val = l * 255; + return [val, val, val]; + } -module.exports.unload = unload -function unload () { - if (!loaded) { - return - } - loaded = false + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } - signals.forEach(function (sig) { - try { - process.removeListener(sig, sigListeners[sig]) - } catch (er) {} - }) - process.emit = originalProcessEmit - process.reallyExit = originalProcessReallyExit - emitter.count -= 1 -} + t1 = 2 * l - t2; -function emit (event, code, signal) { - if (emitter.emitted[event]) { - return - } - emitter.emitted[event] = true - emitter.emit(event, code, signal) -} + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } -// { : , ... } -var sigListeners = {} -signals.forEach(function (sig) { - sigListeners[sig] = function listener () { - // If there are no other listeners, an exit is coming! - // Simplest way: remove us and then re-send the signal. - // We know that this will kill the process, so we can - // safely emit now. - var listeners = process.listeners(sig) - if (listeners.length === emitter.count) { - unload() - emit('exit', null, sig) - /* istanbul ignore next */ - emit('afterexit', null, sig) - /* istanbul ignore next */ - process.kill(process.pid, sig) - } - } -}) + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } -module.exports.signals = function () { - return signals -} + rgb[i] = val * 255; + } -module.exports.load = load + return rgb; +}; -var loaded = false +convert.hsl.hsv = function (hsl) { + var h = hsl[0]; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var smin = s; + var lmin = Math.max(l, 0.01); + var sv; + var v; -function load () { - if (loaded) { - return - } - loaded = true + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + v = (l + s) / 2; + sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); - // This is the number of onSignalExit's that are in play. - // It's important so that we can count the correct number of - // listeners on signals, and don't wait for the other one to - // handle it instead of us. - emitter.count += 1 + return [h, sv * 100, v * 100]; +}; - signals = signals.filter(function (sig) { - try { - process.on(sig, sigListeners[sig]) - return true - } catch (er) { - return false - } - }) +convert.hsv.rgb = function (hsv) { + var h = hsv[0] / 60; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var hi = Math.floor(h) % 6; - process.emit = processEmit - process.reallyExit = processReallyExit -} + var f = h - Math.floor(h); + var p = 255 * v * (1 - s); + var q = 255 * v * (1 - (s * f)); + var t = 255 * v * (1 - (s * (1 - f))); + v *= 255; -var originalProcessReallyExit = process.reallyExit -function processReallyExit (code) { - process.exitCode = code || 0 - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - originalProcessReallyExit.call(process, process.exitCode) -} + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; -var originalProcessEmit = process.emit -function processEmit (ev, arg) { - if (ev === 'exit') { - if (arg !== undefined) { - process.exitCode = arg - } - var ret = originalProcessEmit.apply(this, arguments) - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - return ret - } else { - return originalProcessEmit.apply(this, arguments) - } -} +convert.hsv.hsl = function (hsv) { + var h = hsv[0]; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var vmin = Math.max(v, 0.01); + var lmin; + var sl; + var l; + l = (2 - s) * v; + lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; -/***/ }), -/* 398 */ -/***/ (function(module, exports) { + return [h, sl * 100, l * 100]; +}; -// This is not the set of all possible signals. -// -// It IS, however, the set of all signals that trigger -// an exit on either Linux or BSD systems. Linux is a -// superset of the signal names supported on BSD, and -// the unknown signals just fail to register, so we can -// catch that easily enough. -// -// Don't bother with SIGKILL. It's uncatchable, which -// means that we can't fire any callbacks anyway. -// -// If a user does happen to register a handler on a non- -// fatal signal like SIGWINCH or something, and then -// exit, it'll end up firing `process.emit('exit')`, so -// the handler will be fired anyway. -// -// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised -// artificially, inherently leave the process in a -// state from which it is not safe to try and enter JS -// listeners. -module.exports = [ - 'SIGABRT', - 'SIGALRM', - 'SIGHUP', - 'SIGINT', - 'SIGTERM' -] - -if (process.platform !== 'win32') { - module.exports.push( - 'SIGVTALRM', - 'SIGXCPU', - 'SIGXFSZ', - 'SIGUSR2', - 'SIGTRAP', - 'SIGSYS', - 'SIGQUIT', - 'SIGIOT' - // should detect profiler and enable/disable accordingly. - // see #21 - // 'SIGPROF' - ) -} - -if (process.platform === 'linux') { - module.exports.push( - 'SIGIO', - 'SIGPOLL', - 'SIGPWR', - 'SIGSTKFLT', - 'SIGUNUSED' - ) -} - - -/***/ }), -/* 399 */ -/***/ (function(module, exports) { - -module.exports = require("events"); - -/***/ }), -/* 400 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const isStream = __webpack_require__(401); -const getStream = __webpack_require__(402); -const mergeStream = __webpack_require__(408); +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + var h = hwb[0] / 360; + var wh = hwb[1] / 100; + var bl = hwb[2] / 100; + var ratio = wh + bl; + var i; + var v; + var f; + var n; -// `input` option -const handleInput = (spawned, input) => { - // Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852 - // TODO: Remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0 - if (input === undefined || spawned.stdin === undefined) { - return; + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; } - if (isStream(input)) { - input.pipe(spawned.stdin); - } else { - spawned.stdin.end(input); - } -}; + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; -// `all` interleaves `stdout` and `stderr` -const makeAllStream = (spawned, {all}) => { - if (!all || (!spawned.stdout && !spawned.stderr)) { - return; + if ((i & 0x01) !== 0) { + f = 1 - f; } - const mixed = mergeStream(); - - if (spawned.stdout) { - mixed.add(spawned.stdout); - } + n = wh + f * (v - wh); // linear interpolation - if (spawned.stderr) { - mixed.add(spawned.stderr); + var r; + var g; + var b; + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; } - return mixed; + return [r * 255, g * 255, b * 255]; }; -// On failure, `result.stdout|stderr|all` should contain the currently buffered stream -const getBufferedData = async (stream, streamPromise) => { - if (!stream) { - return; - } +convert.cmyk.rgb = function (cmyk) { + var c = cmyk[0] / 100; + var m = cmyk[1] / 100; + var y = cmyk[2] / 100; + var k = cmyk[3] / 100; + var r; + var g; + var b; - stream.destroy(); + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); - try { - return await streamPromise; - } catch (error) { - return error.bufferedData; - } + return [r * 255, g * 255, b * 255]; }; -const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => { - if (!stream || !buffer) { - return; - } +convert.xyz.rgb = function (xyz) { + var x = xyz[0] / 100; + var y = xyz[1] / 100; + var z = xyz[2] / 100; + var r; + var g; + var b; - if (encoding) { - return getStream(stream, {encoding, maxBuffer}); - } + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - return getStream.buffer(stream, {maxBuffer}); -}; + // assume sRGB + r = r > 0.0031308 + ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r * 12.92; -// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all) -const getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => { - const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer}); - const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer}); - const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2}); + g = g > 0.0031308 + ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g * 12.92; - try { - return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]); - } catch (error) { - return Promise.all([ - {error, signal: error.signal, timedOut: error.timedOut}, - getBufferedData(stdout, stdoutPromise), - getBufferedData(stderr, stderrPromise), - getBufferedData(all, allPromise) - ]); - } -}; + b = b > 0.0031308 + ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b * 12.92; -const validateInputSync = ({input}) => { - if (isStream(input)) { - throw new TypeError('The `input` option cannot be a stream in sync mode'); - } -}; + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); -module.exports = { - handleInput, - makeAllStream, - getSpawnedResult, - validateInputSync + return [r * 255, g * 255, b * 255]; }; +convert.xyz.lab = function (xyz) { + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + x /= 95.047; + y /= 100; + z /= 108.883; -/***/ }), -/* 401 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const isStream = stream => - stream !== null && - typeof stream === 'object' && - typeof stream.pipe === 'function'; + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); -isStream.writable = stream => - isStream(stream) && - stream.writable !== false && - typeof stream._write === 'function' && - typeof stream._writableState === 'object'; + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); -isStream.readable = stream => - isStream(stream) && - stream.readable !== false && - typeof stream._read === 'function' && - typeof stream._readableState === 'object'; + return [l, a, b]; +}; -isStream.duplex = stream => - isStream.writable(stream) && - isStream.readable(stream); +convert.lab.xyz = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var x; + var y; + var z; -isStream.transform = stream => - isStream.duplex(stream) && - typeof stream._transform === 'function' && - typeof stream._transformState === 'object'; + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; -module.exports = isStream; + var y2 = Math.pow(y, 3); + var x2 = Math.pow(x, 3); + var z2 = Math.pow(z, 3); + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + x *= 95.047; + y *= 100; + z *= 108.883; -/***/ }), -/* 402 */ -/***/ (function(module, exports, __webpack_require__) { + return [x, y, z]; +}; -"use strict"; +convert.lab.lch = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var hr; + var h; + var c; -const pump = __webpack_require__(403); -const bufferStream = __webpack_require__(407); + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; -class MaxBufferError extends Error { - constructor() { - super('maxBuffer exceeded'); - this.name = 'MaxBufferError'; + if (h < 0) { + h += 360; } -} -async function getStream(inputStream, options) { - if (!inputStream) { - return Promise.reject(new Error('Expected a stream')); - } + c = Math.sqrt(a * a + b * b); - options = { - maxBuffer: Infinity, - ...options - }; + return [l, c, h]; +}; - const {maxBuffer} = options; +convert.lch.lab = function (lch) { + var l = lch[0]; + var c = lch[1]; + var h = lch[2]; + var a; + var b; + var hr; - let stream; - await new Promise((resolve, reject) => { - const rejectPromise = error => { - if (error) { // A null check - error.bufferedData = stream.getBufferedValue(); - } + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); - reject(error); - }; + return [l, a, b]; +}; - stream = pump(inputStream, bufferStream(options), error => { - if (error) { - rejectPromise(error); - return; - } +convert.rgb.ansi16 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization - resolve(); - }); + value = Math.round(value / 50); - stream.on('data', () => { - if (stream.getBufferedLength() > maxBuffer) { - rejectPromise(new MaxBufferError()); - } - }); - }); + if (value === 0) { + return 30; + } - return stream.getBufferedValue(); -} + var ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); -module.exports = getStream; -// TODO: Remove this for the next major release -module.exports.default = getStream; -module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'}); -module.exports.array = (stream, options) => getStream(stream, {...options, array: true}); -module.exports.MaxBufferError = MaxBufferError; + if (value === 2) { + ansi += 60; + } + return ansi; +}; -/***/ }), -/* 403 */ -/***/ (function(module, exports, __webpack_require__) { +convert.hsv.ansi16 = function (args) { + // optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; -var once = __webpack_require__(404) -var eos = __webpack_require__(406) -var fs = __webpack_require__(23) // we only need fs to get the ReadStream and WriteStream prototypes +convert.rgb.ansi256 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; -var noop = function () {} -var ancient = /^v?\.0/.test(process.version) + // we use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } -var isFn = function (fn) { - return typeof fn === 'function' -} + if (r > 248) { + return 231; + } -var isFS = function (stream) { - if (!ancient) return false // newer node version do not need to care about fs is a special way - if (!fs) return false // browser - return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) -} + return Math.round(((r - 8) / 247) * 24) + 232; + } -var isRequest = function (stream) { - return stream.setHeader && isFn(stream.abort) -} + var ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); -var destroyer = function (stream, reading, writing, callback) { - callback = once(callback) + return ansi; +}; - var closed = false - stream.on('close', function () { - closed = true - }) +convert.ansi16.rgb = function (args) { + var color = args % 10; - eos(stream, {readable: reading, writable: writing}, function (err) { - if (err) return callback(err) - closed = true - callback() - }) + // handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } - var destroyed = false - return function (err) { - if (closed) return - if (destroyed) return - destroyed = true + color = color / 10.5 * 255; - if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks - if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want + return [color, color, color]; + } - if (isFn(stream.destroy)) return stream.destroy() + var mult = (~~(args > 50) + 1) * 0.5; + var r = ((color & 1) * mult) * 255; + var g = (((color >> 1) & 1) * mult) * 255; + var b = (((color >> 2) & 1) * mult) * 255; - callback(err || new Error('stream was destroyed')) - } -} + return [r, g, b]; +}; -var call = function (fn) { - fn() -} +convert.ansi256.rgb = function (args) { + // handle greyscale + if (args >= 232) { + var c = (args - 232) * 10 + 8; + return [c, c, c]; + } -var pipe = function (from, to) { - return from.pipe(to) -} + args -= 16; -var pump = function () { - var streams = Array.prototype.slice.call(arguments) - var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop + var rem; + var r = Math.floor(args / 36) / 5 * 255; + var g = Math.floor((rem = args % 36) / 6) / 5 * 255; + var b = (rem % 6) / 5 * 255; - if (Array.isArray(streams[0])) streams = streams[0] - if (streams.length < 2) throw new Error('pump requires two streams per minimum') + return [r, g, b]; +}; - var error - var destroys = streams.map(function (stream, i) { - var reading = i < streams.length - 1 - var writing = i > 0 - return destroyer(stream, reading, writing, function (err) { - if (!error) error = err - if (err) destroys.forEach(call) - if (reading) return - destroys.forEach(call) - callback(error) - }) - }) +convert.rgb.hex = function (args) { + var integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); - return streams.reduce(pipe) -} + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; -module.exports = pump +convert.hex.rgb = function (args) { + var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } + var colorString = match[0]; -/***/ }), -/* 404 */ -/***/ (function(module, exports, __webpack_require__) { + if (match[0].length === 3) { + colorString = colorString.split('').map(function (char) { + return char + char; + }).join(''); + } -var wrappy = __webpack_require__(405) -module.exports = wrappy(once) -module.exports.strict = wrappy(onceStrict) + var integer = parseInt(colorString, 16); + var r = (integer >> 16) & 0xFF; + var g = (integer >> 8) & 0xFF; + var b = integer & 0xFF; -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) - - Object.defineProperty(Function.prototype, 'onceStrict', { - value: function () { - return onceStrict(this) - }, - configurable: true - }) -}) - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true - return f.value = fn.apply(this, arguments) - } - f.called = false - return f -} - -function onceStrict (fn) { - var f = function () { - if (f.called) - throw new Error(f.onceError) - f.called = true - return f.value = fn.apply(this, arguments) - } - var name = fn.name || 'Function wrapped with `once`' - f.onceError = name + " shouldn't be called more than once" - f.called = false - return f -} - - -/***/ }), -/* 405 */ -/***/ (function(module, exports) { - -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} - - -/***/ }), -/* 406 */ -/***/ (function(module, exports, __webpack_require__) { - -var once = __webpack_require__(404); - -var noop = function() {}; - -var isRequest = function(stream) { - return stream.setHeader && typeof stream.abort === 'function'; -}; - -var isChildProcess = function(stream) { - return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3 + return [r, g, b]; }; -var eos = function(stream, opts, callback) { - if (typeof opts === 'function') return eos(stream, null, opts); - if (!opts) opts = {}; - - callback = once(callback || noop); - - var ws = stream._writableState; - var rs = stream._readableState; - var readable = opts.readable || (opts.readable !== false && stream.readable); - var writable = opts.writable || (opts.writable !== false && stream.writable); - - var onlegacyfinish = function() { - if (!stream.writable) onfinish(); - }; - - var onfinish = function() { - writable = false; - if (!readable) callback.call(stream); - }; - - var onend = function() { - readable = false; - if (!writable) callback.call(stream); - }; - - var onexit = function(exitCode) { - callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null); - }; - - var onerror = function(err) { - callback.call(stream, err); - }; - - var onclose = function() { - if (readable && !(rs && rs.ended)) return callback.call(stream, new Error('premature close')); - if (writable && !(ws && ws.ended)) return callback.call(stream, new Error('premature close')); - }; - - var onrequest = function() { - stream.req.on('finish', onfinish); - }; +convert.rgb.hcg = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var max = Math.max(Math.max(r, g), b); + var min = Math.min(Math.min(r, g), b); + var chroma = (max - min); + var grayscale; + var hue; - if (isRequest(stream)) { - stream.on('complete', onfinish); - stream.on('abort', onclose); - if (stream.req) onrequest(); - else stream.on('request', onrequest); - } else if (writable && !ws) { // legacy streams - stream.on('end', onlegacyfinish); - stream.on('close', onlegacyfinish); + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; } - if (isChildProcess(stream)) stream.on('exit', onexit); + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma + 4; + } - stream.on('end', onend); - stream.on('finish', onfinish); - if (opts.error !== false) stream.on('error', onerror); - stream.on('close', onclose); + hue /= 6; + hue %= 1; - return function() { - stream.removeListener('complete', onfinish); - stream.removeListener('abort', onclose); - stream.removeListener('request', onrequest); - if (stream.req) stream.req.removeListener('finish', onfinish); - stream.removeListener('end', onlegacyfinish); - stream.removeListener('close', onlegacyfinish); - stream.removeListener('finish', onfinish); - stream.removeListener('exit', onexit); - stream.removeListener('end', onend); - stream.removeListener('error', onerror); - stream.removeListener('close', onclose); - }; + return [hue * 360, chroma * 100, grayscale * 100]; }; -module.exports = eos; - - -/***/ }), -/* 407 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const {PassThrough: PassThroughStream} = __webpack_require__(27); - -module.exports = options => { - options = {...options}; - - const {array} = options; - let {encoding} = options; - const isBuffer = encoding === 'buffer'; - let objectMode = false; +convert.hsl.hcg = function (hsl) { + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var c = 1; + var f = 0; - if (array) { - objectMode = !(encoding || isBuffer); + if (l < 0.5) { + c = 2.0 * s * l; } else { - encoding = encoding || 'utf8'; - } - - if (isBuffer) { - encoding = null; + c = 2.0 * s * (1.0 - l); } - const stream = new PassThroughStream({objectMode}); - - if (encoding) { - stream.setEncoding(encoding); + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); } - let length = 0; - const chunks = []; - - stream.on('data', chunk => { - chunks.push(chunk); - - if (objectMode) { - length = chunks.length; - } else { - length += chunk.length; - } - }); - - stream.getBufferedValue = () => { - if (array) { - return chunks; - } - - return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); - }; - - stream.getBufferedLength = () => length; - - return stream; + return [hsl[0], c * 100, f * 100]; }; +convert.hsv.hcg = function (hsv) { + var s = hsv[1] / 100; + var v = hsv[2] / 100; -/***/ }), -/* 408 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + var c = s * v; + var f = 0; + if (c < 1.0) { + f = (v - c) / (1 - c); + } -const { PassThrough } = __webpack_require__(27); + return [hsv[0], c * 100, f * 100]; +}; -module.exports = function (/*streams...*/) { - var sources = [] - var output = new PassThrough({objectMode: true}) +convert.hcg.rgb = function (hcg) { + var h = hcg[0] / 360; + var c = hcg[1] / 100; + var g = hcg[2] / 100; - output.setMaxListeners(0) + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } - output.add = add - output.isEmpty = isEmpty + var pure = [0, 0, 0]; + var hi = (h % 1) * 6; + var v = hi % 1; + var w = 1 - v; + var mg = 0; - output.on('unpipe', remove) + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } - Array.prototype.slice.call(arguments).forEach(add) + mg = (1.0 - c) * g; - return output + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; - function add (source) { - if (Array.isArray(source)) { - source.forEach(add) - return this - } +convert.hcg.hsv = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; - sources.push(source); - source.once('end', remove.bind(null, source)) - source.once('error', output.emit.bind(output, 'error')) - source.pipe(output, {end: false}) - return this - } + var v = c + g * (1.0 - c); + var f = 0; - function isEmpty () { - return sources.length == 0; - } + if (v > 0.0) { + f = c / v; + } - function remove (source) { - sources = sources.filter(function (it) { return it !== source }) - if (!sources.length && output.readable) { output.end() } - } -} + return [hcg[0], f * 100, v * 100]; +}; +convert.hcg.hsl = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; -/***/ }), -/* 409 */ -/***/ (function(module, exports, __webpack_require__) { + var l = g * (1.0 - c) + 0.5 * c; + var s = 0; -"use strict"; + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } + return [hcg[0], s * 100, l * 100]; +}; -const nativePromisePrototype = (async () => {})().constructor.prototype; -const descriptors = ['then', 'catch', 'finally'].map(property => [ - property, - Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property) -]); +convert.hcg.hwb = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + var v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; -// The return value is a mixin of `childProcess` and `Promise` -const mergePromise = (spawned, promise) => { - for (const [property, descriptor] of descriptors) { - // Starting the main `promise` is deferred to avoid consuming streams - const value = typeof promise === 'function' ? - (...args) => Reflect.apply(descriptor.value, promise(), args) : - descriptor.value.bind(promise); +convert.hwb.hcg = function (hwb) { + var w = hwb[1] / 100; + var b = hwb[2] / 100; + var v = 1 - b; + var c = v - w; + var g = 0; - Reflect.defineProperty(spawned, property, {...descriptor, value}); + if (c < 1) { + g = (v - c) / (1 - c); } - return spawned; + return [hwb[0], c * 100, g * 100]; }; -// Use promises instead of `child_process` events -const getSpawnedPromise = spawned => { - return new Promise((resolve, reject) => { - spawned.on('exit', (exitCode, signal) => { - resolve({exitCode, signal}); - }); - - spawned.on('error', error => { - reject(error); - }); - - if (spawned.stdin) { - spawned.stdin.on('error', error => { - reject(error); - }); - } - }); +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; }; -module.exports = { - mergePromise, - getSpawnedPromise +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; }; - - -/***/ }), -/* 410 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const SPACES_REGEXP = / +/g; - -const joinCommand = (file, args = []) => { - if (!Array.isArray(args)) { - return file; - } - - return [file, ...args].join(' '); +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; }; -// Allow spaces to be escaped by a backslash if not meant as a delimiter -const handleEscaping = (tokens, token, index) => { - if (index === 0) { - return [token]; - } +convert.gray.hsl = convert.gray.hsv = function (args) { + return [0, 0, args[0]]; +}; - const previousToken = tokens[tokens.length - 1]; +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; +}; - if (previousToken.endsWith('\\')) { - return [...tokens.slice(0, -1), `${previousToken.slice(0, -1)} ${token}`]; - } +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; - return [...tokens, token]; +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; }; -// Handle `execa.command()` -const parseCommand = command => { - return command - .trim() - .split(SPACES_REGEXP) - .reduce(handleEscaping, []); +convert.gray.hex = function (gray) { + var val = Math.round(gray[0] / 100 * 255) & 0xFF; + var integer = (val << 16) + (val << 8) + val; + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; }; -module.exports = { - joinCommand, - parseCommand +convert.rgb.gray = function (rgb) { + var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; }; /***/ }), -/* 411 */ +/* 391 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; + + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; -var childProcess = __webpack_require__(372); -var spawn = childProcess.spawn; -var exec = childProcess.exec; - -module.exports = function (pid, signal, callback) { - if (typeof signal === 'function' && callback === undefined) { - callback = signal; - signal = undefined; - } - - pid = parseInt(pid); - if (Number.isNaN(pid)) { - if (callback) { - return callback(new Error("pid must be a number")); - } else { - throw new Error("pid must be a number"); - } - } - - var tree = {}; - var pidsToProcess = {}; - tree[pid] = []; - pidsToProcess[pid] = 1; - - switch (process.platform) { - case 'win32': - exec('taskkill /pid ' + pid + ' /T /F', callback); - break; - case 'darwin': - buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { - return spawn('pgrep', ['-P', parentPid]); - }, function () { - killAll(tree, signal, callback); - }); - break; - // case 'sunos': - // buildProcessTreeSunOS(pid, tree, pidsToProcess, function () { - // killAll(tree, signal, callback); - // }); - // break; - default: // Linux - buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { - return spawn('ps', ['-o', 'pid', '--no-headers', '--ppid', parentPid]); - }, function () { - killAll(tree, signal, callback); - }); - break; - } -}; - -function killAll (tree, signal, callback) { - var killed = {}; - try { - Object.keys(tree).forEach(function (pid) { - tree[pid].forEach(function (pidpid) { - if (!killed[pidpid]) { - killPid(pidpid, signal); - killed[pidpid] = 1; - } - }); - if (!killed[pid]) { - killPid(pid, signal); - killed[pid] = 1; - } - }); - } catch (err) { - if (callback) { - return callback(err); - } else { - throw err; - } - } - if (callback) { - return callback(); - } -} - -function killPid(pid, signal) { - try { - process.kill(parseInt(pid, 10), signal); - } - catch (err) { - if (err.code !== 'ESRCH') throw err; - } -} +/***/ }), +/* 392 */ +/***/ (function(module, exports, __webpack_require__) { -function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) { - var ps = spawnChildProcessesList(parentPid); - var allData = ''; - ps.stdout.on('data', function (data) { - var data = data.toString('ascii'); - allData += data; - }); +var conversions = __webpack_require__(390); - var onClose = function (code) { - delete pidsToProcess[parentPid]; +/* + this function routes a model to all other models. - if (code != 0) { - // no more parent processes - if (Object.keys(pidsToProcess).length == 0) { - cb(); - } - return; - } + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). - allData.match(/\d+/g).forEach(function (pid) { - pid = parseInt(pid, 10); - tree[parentPid].push(pid); - tree[pid] = []; - pidsToProcess[pid] = 1; - buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb); - }); - }; + conversions that are not possible simply are not included. +*/ - ps.on('close', onClose); +function buildGraph() { + var graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + var models = Object.keys(conversions); + + for (var len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; } +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + var graph = buildGraph(); + var queue = [fromModel]; // unshift -> queue -> pop -/***/ }), -/* 412 */ -/***/ (function(module, exports, __webpack_require__) { + graph[fromModel].distance = 0; -"use strict"; + while (queue.length) { + var current = queue.pop(); + var adjacents = Object.keys(conversions[current]); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const operators_1 = __webpack_require__(270); -const SEP = /\r?\n/; -const observe_readable_1 = __webpack_require__(413); -/** - * Creates an Observable from a Readable Stream that: - * - splits data from `readable` into lines - * - completes when `readable` emits "end" - * - fails if `readable` emits "errors" - * - * @param {ReadableStream} readable - * @return {Rx.Observable} - */ -function observeLines(readable) { - const done$ = observe_readable_1.observeReadable(readable).pipe(operators_1.share()); - const scan$ = Rx.fromEvent(readable, 'data').pipe(operators_1.scan(({ buffer }, chunk) => { - buffer += chunk; - const lines = []; - while (true) { - const match = buffer.match(SEP); - if (!match || match.index === undefined) { - break; - } - lines.push(buffer.slice(0, match.index)); - buffer = buffer.slice(match.index + match[0].length); - } - return { buffer, lines }; - }, { buffer: '' }), - // stop if done completes or errors - operators_1.takeUntil(done$.pipe(operators_1.materialize())), operators_1.share()); - return Rx.merge( - // use done$ to provide completion/errors - done$, - // merge in the "lines" from each step - scan$.pipe(operators_1.mergeMap(({ lines }) => lines || [])), - // inject the "unsplit" data at the end - scan$.pipe(operators_1.last(), operators_1.mergeMap(({ buffer }) => (buffer ? [buffer] : [])), - // if there were no lines, last() will error, so catch and complete - operators_1.catchError(() => Rx.empty()))); + for (var len = adjacents.length, i = 0; i < len; i++) { + var adjacent = adjacents[i]; + var node = graph[adjacent]; + + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } + + return graph; } -exports.observeLines = observeLines; +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} -/***/ }), -/* 413 */ -/***/ (function(module, exports, __webpack_require__) { +function wrapConversion(toModel, graph) { + var path = [graph[toModel].parent, toModel]; + var fn = conversions[graph[toModel].parent][toModel]; -"use strict"; + var cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const operators_1 = __webpack_require__(270); -/** - * Produces an Observable from a ReadableSteam that: - * - completes on the first "end" event - * - fails on the first "error" event - */ -function observeReadable(readable) { - return Rx.race(Rx.fromEvent(readable, 'end').pipe(operators_1.first(), operators_1.ignoreElements()), Rx.fromEvent(readable, 'error').pipe(operators_1.first(), operators_1.mergeMap((err) => Rx.throwError(err)))); + fn.conversion = path; + return fn; } -exports.observeReadable = observeReadable; +module.exports = function (fromModel) { + var graph = deriveBFS(fromModel); + var conversion = {}; -/***/ }), -/* 414 */ -/***/ (function(module, exports, __webpack_require__) { + var models = Object.keys(graph); + for (var len = models.length, i = 0; i < len; i++) { + var toModel = models[i]; + var node = graph[toModel]; -"use strict"; + if (node.parent === null) { + // no possible conversion, or this node is the source model. + continue; + } + + conversion[toModel] = wrapConversion(toModel, graph); + } + + return conversion; +}; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var tooling_log_1 = __webpack_require__(415); -exports.ToolingLog = tooling_log_1.ToolingLog; -var tooling_log_text_writer_1 = __webpack_require__(416); -exports.ToolingLogTextWriter = tooling_log_text_writer_1.ToolingLogTextWriter; -var log_levels_1 = __webpack_require__(417); -exports.pickLevelFromFlags = log_levels_1.pickLevelFromFlags; -exports.parseLogLevel = log_levels_1.parseLogLevel; -var tooling_log_collecting_writer_1 = __webpack_require__(418); -exports.ToolingLogCollectingWriter = tooling_log_collecting_writer_1.ToolingLogCollectingWriter; /***/ }), -/* 415 */ +/* 393 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const tooling_log_text_writer_1 = __webpack_require__(416); -class ToolingLog { - constructor(writerConfig) { - this.identWidth = 0; - this.writers = writerConfig ? [new tooling_log_text_writer_1.ToolingLogTextWriter(writerConfig)] : []; - this.written$ = new Rx.Subject(); - } - indent(delta = 0) { - this.identWidth = Math.max(this.identWidth + delta, 0); - return this.identWidth; - } - verbose(...args) { - this.sendToWriters('verbose', args); - } - debug(...args) { - this.sendToWriters('debug', args); - } - info(...args) { - this.sendToWriters('info', args); - } - success(...args) { - this.sendToWriters('success', args); - } - warning(...args) { - this.sendToWriters('warning', args); - } - error(error) { - this.sendToWriters('error', [error]); - } - write(...args) { - this.sendToWriters('write', args); - } - getWriters() { - return this.writers.slice(0); - } - setWriters(writers) { - this.writers = [...writers]; - } - getWritten$() { - return this.written$.asObservable(); - } - sendToWriters(type, args) { - const msg = { - type, - indent: this.identWidth, - args, - }; - let written = false; - for (const writer of this.writers) { - if (writer.write(msg)) { - written = true; - } - } - if (written) { - this.written$.next(msg); - } - } -} -exports.ToolingLog = ToolingLog; - +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); -/***/ }), -/* 416 */ -/***/ (function(module, exports, __webpack_require__) { +const env = process.env; -"use strict"; +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const util_1 = __webpack_require__(29); -const chalk_1 = tslib_1.__importDefault(__webpack_require__(2)); -const log_levels_1 = __webpack_require__(417); -const { magentaBright, yellow, red, blue, green, dim } = chalk_1.default; -const PREFIX_INDENT = ' '.repeat(6); -const MSG_PREFIXES = { - verbose: ` ${magentaBright('sill')} `, - debug: ` ${dim('debg')} `, - info: ` ${blue('info')} `, - success: ` ${green('succ')} `, - warning: ` ${yellow('warn')} `, - error: `${red('ERROR')} `, -}; -const has = (obj, key) => obj.hasOwnProperty(key); -function shouldWriteType(level, type) { - if (type === 'write') { - return true; - } - return Boolean(level.flags[type === 'success' ? 'info' : type]); -} -function stringifyError(error) { - if (typeof error !== 'string' && !(error instanceof Error)) { - error = new Error(`"${error}" thrown`); - } - if (typeof error === 'string') { - return error; - } - return error.stack || error.message || error; -} -class ToolingLogTextWriter { - constructor(config) { - this.level = log_levels_1.parseLogLevel(config.level); - this.writeTo = config.writeTo; - if (!this.writeTo || typeof this.writeTo.write !== 'function') { - throw new Error('ToolingLogTextWriter requires the `writeTo` option be set to a stream (like process.stdout)'); - } - } - write(msg) { - if (!shouldWriteType(this.level, msg.type)) { - return false; - } - const prefix = has(MSG_PREFIXES, msg.type) ? MSG_PREFIXES[msg.type] : ''; - ToolingLogTextWriter.write(this.writeTo, prefix, msg); - return true; - } - static write(writeTo, prefix, msg) { - const txt = msg.type === 'error' - ? stringifyError(msg.args[0]) - : util_1.format(msg.args[0], ...msg.args.slice(1)); - (prefix + txt).split('\n').forEach((line, i) => { - let lineIndent = ''; - if (msg.indent > 0) { - // if we are indenting write some spaces followed by a symbol - lineIndent += ' '.repeat(msg.indent - 1); - lineIndent += line.startsWith('-') ? '└' : '│'; - } - if (line && prefix && i > 0) { - // apply additional indentation to lines after - // the first if this message gets a prefix - lineIndent += PREFIX_INDENT; - } - writeTo.write(`${lineIndent}${line}\n`); - }); - } +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; } -exports.ToolingLogTextWriter = ToolingLogTextWriter; +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } -/***/ }), -/* 417 */ -/***/ (function(module, exports, __webpack_require__) { + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } -"use strict"; + if (hasFlag('color=256')) { + return 2; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const LEVELS = ['silent', 'error', 'warning', 'info', 'debug', 'verbose']; -function pickLevelFromFlags(flags, options = {}) { - if (flags.verbose) - return 'verbose'; - if (flags.debug) - return 'debug'; - if (flags.quiet) - return 'error'; - if (flags.silent) - return 'silent'; - return options.default || 'info'; -} -exports.pickLevelFromFlags = pickLevelFromFlags; -function parseLogLevel(name) { - const i = LEVELS.indexOf(name); - if (i === -1) { - const msg = `Invalid log level "${name}" ` + `(expected one of ${LEVELS.join(',')})`; - throw new Error(msg); - } - const flags = {}; - LEVELS.forEach((level, levelI) => { - flags[level] = levelI <= i; - }); - return { - name, - flags: flags, - }; -} -exports.parseLogLevel = parseLogLevel; + if (stream && !stream.isTTY && forceColor !== true) { + // VS code debugger doesn't have isTTY set + if (env.VSCODE_PID) { + return 1; + } + return 0; + } + const min = forceColor ? 1 : 0; -/***/ }), -/* 418 */ -/***/ (function(module, exports, __webpack_require__) { + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } -"use strict"; + return 1; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tooling_log_text_writer_1 = __webpack_require__(416); -class ToolingLogCollectingWriter extends tooling_log_text_writer_1.ToolingLogTextWriter { - constructor() { - super({ - level: 'verbose', - writeTo: { - write: (msg) => { - // trim trailing new line - this.messages.push(msg.slice(0, -1)); - }, - }, - }); - this.messages = []; - } -} -exports.ToolingLogCollectingWriter = ToolingLogCollectingWriter; + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + return min; + } -/***/ }), -/* 419 */ -/***/ (function(module, exports, __webpack_require__) { + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } -"use strict"; + if (env.COLORTERM === 'truecolor') { + return 3; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var absolute_path_serializer_1 = __webpack_require__(420); -exports.createAbsolutePathSerializer = absolute_path_serializer_1.createAbsolutePathSerializer; + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } -/***/ }), -/* 420 */ -/***/ (function(module, exports, __webpack_require__) { + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } -"use strict"; + if ('COLORTERM' in env) { + return 1; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const repo_root_1 = __webpack_require__(421); -function createAbsolutePathSerializer(rootPath = repo_root_1.REPO_ROOT) { - return { - print: (value) => value.replace(rootPath, '').replace(/\\/g, '/'), - test: (value) => typeof value === 'string' && value.startsWith(rootPath), - }; + if (env.TERM === 'dumb') { + return min; + } + + return min; } -exports.createAbsolutePathSerializer = createAbsolutePathSerializer; + +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; /***/ }), -/* 421 */ +/* 394 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const path_1 = tslib_1.__importDefault(__webpack_require__(16)); -const fs_1 = tslib_1.__importDefault(__webpack_require__(23)); -const load_json_file_1 = tslib_1.__importDefault(__webpack_require__(422)); -const isKibanaDir = (dir) => { - try { - const path = path_1.default.resolve(dir, 'package.json'); - const json = load_json_file_1.default.sync(path); - if (json && typeof json === 'object' && 'name' in json && json.name === 'kibana') { - return true; - } - } - catch (error) { - if (error && error.code === 'ENOENT') { - return false; - } - throw error; - } +module.exports = (flag, argv) => { + argv = argv || process.argv; + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const pos = argv.indexOf(prefix + flag); + const terminatorPos = argv.indexOf('--'); + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); }; -// search for the kibana directory, since this file is moved around it might -// not be where we think but should always be a relatively close parent -// of this directory -const startDir = fs_1.default.realpathSync(__dirname); -const { root: rootDir } = path_1.default.parse(startDir); -let cursor = startDir; -while (true) { - if (isKibanaDir(cursor)) { - break; - } - const parent = path_1.default.dirname(cursor); - if (parent === rootDir) { - throw new Error(`unable to find kibana directory from ${startDir}`); - } - cursor = parent; -} -exports.REPO_ROOT = cursor; /***/ }), -/* 422 */ +/* 395 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(423); -const stripBom = __webpack_require__(427); -const parseJson = __webpack_require__(428); +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; -const parse = (data, filePath, options = {}) => { - data = stripBom(data); +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); - if (typeof options.beforeParse === 'function') { - data = options.beforeParse(data); +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); } - return parseJson(data, options.reviver, path.relative(process.cwd(), filePath)); -}; - -module.exports = async (filePath, options) => parse(await promisify(fs.readFile)(filePath, 'utf8'), filePath, options); -module.exports.sync = (filePath, options) => parse(fs.readFileSync(filePath, 'utf8'), filePath, options); + return ESCAPES.get(c) || c; +} +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; -/***/ }), -/* 423 */ -/***/ (function(module, exports, __webpack_require__) { + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } -var fs = __webpack_require__(23) -var polyfills = __webpack_require__(424) -var legacy = __webpack_require__(425) -var clone = __webpack_require__(426) + return results; +} -var queue = [] +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; -var util = __webpack_require__(29) + const results = []; + let matches; -function noop () {} + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } -if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(queue) - __webpack_require__(30).equal(queue.length, 0) - }) + return results; } -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} +function buildStyle(chalk, styles) { + const enabled = {}; -// Always patch fs.close/closeSync, because we want to -// retry() whenever a close happens *anywhere* in the program. -// This is essential when multiple graceful-fs instances are -// in play at the same time. -module.exports.close = (function (fs$close) { return function (fd, cb) { - return fs$close.call(fs, fd, function (err) { - if (!err) - retry() + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } - if (typeof cb === 'function') - cb.apply(this, arguments) - }) -}})(fs.close) + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } -module.exports.closeSync = (function (fs$closeSync) { return function (fd) { - // Note that graceful-fs also retries when fs.closeSync() fails. - // Looks like a bug to me, although it's probably a harmless one. - var rval = fs$closeSync.apply(fs, arguments) - retry() - return rval -}})(fs.closeSync) + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } -// Only patch fs once, otherwise we'll run into a memory leak if -// graceful-fs is loaded multiple times, such as in test environments that -// reset the loaded modules between tests. -// We look for the string `graceful-fs` from the comment above. This -// way we are not adding any extra properties and it will detect if older -// versions of graceful-fs are installed. -if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { - fs.closeSync = module.exports.closeSync; - fs.close = module.exports.close; + return current; } -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch - fs.FileReadStream = ReadStream; // Legacy name. - fs.FileWriteStream = WriteStream; // Legacy name. - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null - - return go$readFile(path, options, cb) +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); - return go$writeFile(path, data, options, cb) + chunks.push(chunk.join('')); - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + return chunks.join(''); +}; - return go$appendFile(path, data, options, cb) - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +/***/ }), +/* 396 */ +/***/ (function(module, exports, __webpack_require__) { - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options - } - args.push(go$readdir$cb) +"use strict"; - return go$readdir(args) - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() +var childProcess = __webpack_require__(343); +var spawn = childProcess.spawn; +var exec = childProcess.exec; - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) +module.exports = function (pid, signal, callback) { + if (typeof signal === 'function' && callback === undefined) { + callback = signal; + signal = undefined; + } - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } + pid = parseInt(pid); + if (Number.isNaN(pid)) { + if (callback) { + return callback(new Error("pid must be a number")); + } else { + throw new Error("pid must be a number"); + } } - } - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + var tree = {}; + var pidsToProcess = {}; + tree[pid] = []; + pidsToProcess[pid] = 1; - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + switch (process.platform) { + case 'win32': + exec('taskkill /pid ' + pid + ' /T /F', callback); + break; + case 'darwin': + buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { + return spawn('pgrep', ['-P', parentPid]); + }, function () { + killAll(tree, signal, callback); + }); + break; + // case 'sunos': + // buildProcessTreeSunOS(pid, tree, pidsToProcess, function () { + // killAll(tree, signal, callback); + // }); + // break; + default: // Linux + buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { + return spawn('ps', ['-o', 'pid', '--no-headers', '--ppid', parentPid]); + }, function () { + killAll(tree, signal, callback); + }); + break; + } +}; - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } +function killAll (tree, signal, callback) { + var killed = {}; + try { + Object.keys(tree).forEach(function (pid) { + tree[pid].forEach(function (pidpid) { + if (!killed[pidpid]) { + killPid(pidpid, signal); + killed[pidpid] = 1; + } + }); + if (!killed[pid]) { + killPid(pid, signal); + killed[pid] = 1; + } + }); + } catch (err) { + if (callback) { + return callback(err); + } else { + throw err; + } + } + if (callback) { + return callback(); + } +} - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } +function killPid(pid, signal) { + try { + process.kill(parseInt(pid, 10), signal); + } + catch (err) { + if (err.code !== 'ESRCH') throw err; + } +} - fs.ReadStream = ReadStream - fs.WriteStream = WriteStream +function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) { + var ps = spawnChildProcessesList(parentPid); + var allData = ''; + ps.stdout.on('data', function (data) { + var data = data.toString('ascii'); + allData += data; + }); - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } + var onClose = function (code) { + delete pidsToProcess[parentPid]; - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() + if (code != 0) { + // no more parent processes + if (Object.keys(pidsToProcess).length == 0) { + cb(); + } + return; + } - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } + allData.match(/\d+/g).forEach(function (pid) { + pid = parseInt(pid, 10); + tree[parentPid].push(pid); + tree[pid] = []; + pidsToProcess[pid] = 1; + buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb); + }); + }; - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } + ps.on('close', onClose); +} - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } - function createReadStream (path, options) { - return new ReadStream(path, options) - } +/***/ }), +/* 397 */ +/***/ (function(module, exports) { - function createWriteStream (path, options) { - return new WriteStream(path, options) - } +module.exports = require("util"); - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null +/***/ }), +/* 398 */ +/***/ (function(module, exports, __webpack_require__) { - return go$open(path, flags, mode, cb) +"use strict"; - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const operators_1 = __webpack_require__(241); +const SEP = /\r?\n/; +const observe_readable_1 = __webpack_require__(399); +/** + * Creates an Observable from a Readable Stream that: + * - splits data from `readable` into lines + * - completes when `readable` emits "end" + * - fails if `readable` emits "errors" + * + * @param {ReadableStream} readable + * @return {Rx.Observable} + */ +function observeLines(readable) { + const done$ = observe_readable_1.observeReadable(readable).pipe(operators_1.share()); + const scan$ = Rx.fromEvent(readable, 'data').pipe(operators_1.scan(({ buffer }, chunk) => { + buffer += chunk; + const lines = []; + while (true) { + const match = buffer.match(SEP); + if (!match || match.index === undefined) { + break; + } + lines.push(buffer.slice(0, match.index)); + buffer = buffer.slice(match.index + match[0].length); } - }) - } - } - - return fs -} - -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - queue.push(elem) -} - -function retry () { - var elem = queue.shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } + return { buffer, lines }; + }, { buffer: '' }), + // stop if done completes or errors + operators_1.takeUntil(done$.pipe(operators_1.materialize())), operators_1.share()); + return Rx.merge( + // use done$ to provide completion/errors + done$, + // merge in the "lines" from each step + scan$.pipe(operators_1.mergeMap(({ lines }) => lines || [])), + // inject the "unsplit" data at the end + scan$.pipe(operators_1.last(), operators_1.mergeMap(({ buffer }) => (buffer ? [buffer] : [])), + // if there were no lines, last() will error, so catch and complete + operators_1.catchError(() => Rx.empty()))); } +exports.observeLines = observeLines; /***/ }), -/* 424 */ +/* 399 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(25) - -var origCwd = process.cwd -var cwd = null - -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} +"use strict"; -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const operators_1 = __webpack_require__(241); +/** + * Produces an Observable from a ReadableSteam that: + * - completes on the first "end" event + * - fails on the first "error" event + */ +function observeReadable(readable) { + return Rx.race(Rx.fromEvent(readable, 'end').pipe(operators_1.first(), operators_1.ignoreElements()), Rx.fromEvent(readable, 'error').pipe(operators_1.first(), operators_1.mergeMap((err) => Rx.throwError(err)))); } +exports.observeReadable = observeReadable; -module.exports = patch - -function patch (fs) { - // (re-)implement some things that are known busted or missing. - - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } - - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } - - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. - - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) +/***/ }), +/* 400 */ +/***/ (function(module, exports, __webpack_require__) { - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) +"use strict"; - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tooling_log_1 = __webpack_require__(401); +exports.ToolingLog = tooling_log_1.ToolingLog; +var tooling_log_text_writer_1 = __webpack_require__(402); +exports.ToolingLogTextWriter = tooling_log_text_writer_1.ToolingLogTextWriter; +var log_levels_1 = __webpack_require__(403); +exports.pickLevelFromFlags = log_levels_1.pickLevelFromFlags; +exports.parseLogLevel = log_levels_1.parseLogLevel; +var tooling_log_collecting_writer_1 = __webpack_require__(404); +exports.ToolingLogCollectingWriter = tooling_log_collecting_writer_1.ToolingLogCollectingWriter; - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) +/***/ }), +/* 401 */ +/***/ (function(module, exports, __webpack_require__) { - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} - } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} - } +"use strict"; - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. - - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } - - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const tooling_log_text_writer_1 = __webpack_require__(402); +class ToolingLog { + constructor(writerConfig) { + this.identWidth = 0; + this.writers = writerConfig ? [new tooling_log_text_writer_1.ToolingLogTextWriter(writerConfig)] : []; + this.written$ = new Rx.Subject(); } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - }})(fs.read) - - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } + indent(delta = 0) { + this.identWidth = Math.max(this.identWidth + delta, 0); + return this.identWidth; } - }})(fs.readSync) - - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) + verbose(...args) { + this.sendToWriters('verbose', args); } - - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) - - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) + debug(...args) { + this.sendToWriters('debug', args); + } + info(...args) { + this.sendToWriters('info', args); + } + success(...args) { + this.sendToWriters('success', args); + } + warning(...args) { + this.sendToWriters('warning', args); + } + error(error) { + this.sendToWriters('error', [error]); + } + write(...args) { + this.sendToWriters('write', args); + } + getWriters() { + return this.writers.slice(0); + } + setWriters(writers) { + this.writers = [...writers]; + } + getWritten$() { + return this.written$.asObservable(); + } + sendToWriters(type, args) { + const msg = { + type, + indent: this.identWidth, + args, + }; + let written = false; + for (const writer of this.writers) { + if (writer.write(msg)) { + written = true; + } + } + if (written) { + this.written$.next(msg); } - } - return ret } - } +} +exports.ToolingLog = ToolingLog; - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } +/***/ }), +/* 402 */ +/***/ (function(module, exports, __webpack_require__) { - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } - } +"use strict"; - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const util_1 = __webpack_require__(397); +const chalk_1 = tslib_1.__importDefault(__webpack_require__(386)); +const log_levels_1 = __webpack_require__(403); +const { magentaBright, yellow, red, blue, green, dim } = chalk_1.default; +const PREFIX_INDENT = ' '.repeat(6); +const MSG_PREFIXES = { + verbose: ` ${magentaBright('sill')} `, + debug: ` ${dim('debg')} `, + info: ` ${blue('info')} `, + success: ` ${green('succ')} `, + warning: ` ${yellow('warn')} `, + error: `${red('ERROR')} `, +}; +const has = (obj, key) => obj.hasOwnProperty(key); +function shouldWriteType(level, type) { + if (type === 'write') { + return level.name !== 'silent'; } - } - - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } + return Boolean(level.flags[type === 'success' ? 'info' : type]); +} +function stringifyError(error) { + if (typeof error !== 'string' && !(error instanceof Error)) { + error = new Error(`"${error}" thrown`); } - } - - - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + if (typeof error === 'string') { + return error; } - } - - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } + return error.stack || error.message || error; +} +class ToolingLogTextWriter { + constructor(config) { + this.level = log_levels_1.parseLogLevel(config.level); + this.writeTo = config.writeTo; + if (!this.writeTo || typeof this.writeTo.write !== 'function') { + throw new Error('ToolingLogTextWriter requires the `writeTo` option be set to a stream (like process.stdout)'); + } } - } - - - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) + write(msg) { + if (!shouldWriteType(this.level, msg.type)) { + return false; + } + const prefix = has(MSG_PREFIXES, msg.type) ? MSG_PREFIXES[msg.type] : ''; + ToolingLogTextWriter.write(this.writeTo, prefix, msg); + return true; } - } - - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; + static write(writeTo, prefix, msg) { + const txt = msg.type === 'error' + ? stringifyError(msg.args[0]) + : util_1.format(msg.args[0], ...msg.args.slice(1)); + (prefix + txt).split('\n').forEach((line, i) => { + let lineIndent = ''; + if (msg.indent > 0) { + // if we are indenting write some spaces followed by a symbol + lineIndent += ' '.repeat(msg.indent - 1); + lineIndent += line.startsWith('-') ? '└' : '│'; + } + if (line && prefix && i > 0) { + // apply additional indentation to lines after + // the first if this message gets a prefix + lineIndent += PREFIX_INDENT; + } + writeTo.write(`${lineIndent}${line}\n`); + }); } - } +} +exports.ToolingLogTextWriter = ToolingLogTextWriter; - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true - if (er.code === "ENOSYS") - return true +/***/ }), +/* 403 */ +/***/ (function(module, exports, __webpack_require__) { - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } +"use strict"; - return false - } +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const LEVELS = ['silent', 'error', 'warning', 'info', 'debug', 'verbose']; +function pickLevelFromFlags(flags, options = {}) { + if (flags.verbose) + return 'verbose'; + if (flags.debug) + return 'debug'; + if (flags.quiet) + return 'error'; + if (flags.silent) + return 'silent'; + return options.default || 'info'; +} +exports.pickLevelFromFlags = pickLevelFromFlags; +function parseLogLevel(name) { + const i = LEVELS.indexOf(name); + if (i === -1) { + const msg = `Invalid log level "${name}" ` + `(expected one of ${LEVELS.join(',')})`; + throw new Error(msg); + } + const flags = {}; + LEVELS.forEach((level, levelI) => { + flags[level] = levelI <= i; + }); + return { + name, + flags: flags, + }; } +exports.parseLogLevel = parseLogLevel; /***/ }), -/* 425 */ +/* 404 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(27).Stream +"use strict"; -module.exports = legacy +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tooling_log_text_writer_1 = __webpack_require__(402); +class ToolingLogCollectingWriter extends tooling_log_text_writer_1.ToolingLogTextWriter { + constructor(level = 'verbose') { + super({ + level, + writeTo: { + write: (msg) => { + // trim trailing new line + this.messages.push(msg.slice(0, -1)); + }, + }, + }); + this.messages = []; + } +} +exports.ToolingLogCollectingWriter = ToolingLogCollectingWriter; -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); +/***/ }), +/* 405 */ +/***/ (function(module, exports, __webpack_require__) { - Stream.call(this); +"use strict"; - var self = this; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var absolute_path_serializer_1 = __webpack_require__(406); +exports.createAbsolutePathSerializer = absolute_path_serializer_1.createAbsolutePathSerializer; - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; +/***/ }), +/* 406 */ +/***/ (function(module, exports, __webpack_require__) { - options = options || {}; +"use strict"; - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } - - if (this.encoding) this.setEncoding(this.encoding); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const repo_root_1 = __webpack_require__(407); +function createAbsolutePathSerializer(rootPath = repo_root_1.REPO_ROOT) { + return { + print: (value) => value.replace(rootPath, '').replace(/\\/g, '/'), + test: (value) => typeof value === 'string' && value.startsWith(rootPath), + }; +} +exports.createAbsolutePathSerializer = createAbsolutePathSerializer; - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } - if (this.start > this.end) { - throw new Error('start must be <= end'); - } +/***/ }), +/* 407 */ +/***/ (function(module, exports, __webpack_require__) { - this.pos = this.start; - } +"use strict"; - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const path_1 = tslib_1.__importDefault(__webpack_require__(4)); +const fs_1 = tslib_1.__importDefault(__webpack_require__(349)); +const load_json_file_1 = tslib_1.__importDefault(__webpack_require__(408)); +const isKibanaDir = (dir) => { + try { + const path = path_1.default.resolve(dir, 'package.json'); + const json = load_json_file_1.default.sync(path); + if (json && typeof json === 'object' && 'name' in json && json.name === 'kibana') { + return true; + } } - - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } - - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } - - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); - - Stream.call(this); - - this.path = path; - this.fd = null; - this.writable = true; - - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; - - options = options || {}; - - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; + catch (error) { + if (error && error.code === 'ENOENT') { + return false; + } + throw error; } - - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } - - this.pos = this.start; +}; +// search for the kibana directory, since this file is moved around it might +// not be where we think but should always be a relatively close parent +// of this directory +const startDir = fs_1.default.realpathSync(__dirname); +const { root: rootDir } = path_1.default.parse(startDir); +let cursor = startDir; +while (true) { + if (isKibanaDir(cursor)) { + break; } - - this.busy = false; - this._queue = []; - - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); + const parent = path_1.default.dirname(cursor); + if (parent === rootDir) { + throw new Error(`unable to find kibana directory from ${startDir}`); } - } + cursor = parent; } +exports.REPO_ROOT = cursor; /***/ }), -/* 426 */ +/* 408 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const path = __webpack_require__(4); +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(409); +const stripBom = __webpack_require__(414); +const parseJson = __webpack_require__(415); -module.exports = clone - -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj +const parse = (data, filePath, options = {}) => { + data = stripBom(data); - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + if (typeof options.beforeParse === 'function') { + data = options.beforeParse(data); + } - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + return parseJson(data, options.reviver, path.relative(process.cwd(), filePath)); +}; - return copy -} +module.exports = async (filePath, options) => parse(await promisify(fs.readFile)(filePath, 'utf8'), filePath, options); +module.exports.sync = (filePath, options) => parse(fs.readFileSync(filePath, 'utf8'), filePath, options); /***/ }), -/* 427 */ +/* 409 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var fs = __webpack_require__(349) +var polyfills = __webpack_require__(410) +var legacy = __webpack_require__(412) +var clone = __webpack_require__(413) +var queue = [] -module.exports = string => { - if (typeof string !== 'string') { - throw new TypeError(`Expected a string, got ${typeof string}`); - } +var util = __webpack_require__(397) - // Catches EFBBBF (UTF-8 BOM) because the buffer-to-string - // conversion translates it to FEFF (UTF-16 BOM) - if (string.charCodeAt(0) === 0xFEFF) { - return string.slice(1); - } +function noop () {} - return string; -}; +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } +if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(queue) + __webpack_require__(371).equal(queue.length, 0) + }) +} -/***/ }), -/* 428 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports = patch(clone(fs)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module.exports = patch(fs) + fs.__patched = true; +} -"use strict"; +// Always patch fs.close/closeSync, because we want to +// retry() whenever a close happens *anywhere* in the program. +// This is essential when multiple graceful-fs instances are +// in play at the same time. +module.exports.close = (function (fs$close) { return function (fd, cb) { + return fs$close.call(fs, fd, function (err) { + if (!err) + retry() -const errorEx = __webpack_require__(429); -const fallback = __webpack_require__(431); -const {default: LinesAndColumns} = __webpack_require__(432); -const {codeFrameColumns} = __webpack_require__(433); + if (typeof cb === 'function') + cb.apply(this, arguments) + }) +}})(fs.close) -const JSONError = errorEx('JSONError', { - fileName: errorEx.append('in %s'), - codeFrame: errorEx.append('\n\n%s\n') -}); +module.exports.closeSync = (function (fs$closeSync) { return function (fd) { + // Note that graceful-fs also retries when fs.closeSync() fails. + // Looks like a bug to me, although it's probably a harmless one. + var rval = fs$closeSync.apply(fs, arguments) + retry() + return rval +}})(fs.closeSync) -module.exports = (string, reviver, filename) => { - if (typeof reviver === 'string') { - filename = reviver; - reviver = null; - } +// Only patch fs once, otherwise we'll run into a memory leak if +// graceful-fs is loaded multiple times, such as in test environments that +// reset the loaded modules between tests. +// We look for the string `graceful-fs` from the comment above. This +// way we are not adding any extra properties and it will detect if older +// versions of graceful-fs are installed. +if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { + fs.closeSync = module.exports.closeSync; + fs.close = module.exports.close; +} - try { - try { - return JSON.parse(string, reviver); - } catch (error) { - fallback(string, reviver); - throw error; - } - } catch (error) { - error.message = error.message.replace(/\n/g, ''); - const indexMatch = error.message.match(/in JSON at position (\d+) while parsing near/); +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + fs.FileReadStream = ReadStream; // Legacy name. + fs.FileWriteStream = WriteStream; // Legacy name. + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null - const jsonError = new JSONError(error); - if (filename) { - jsonError.fileName = filename; - } + return go$readFile(path, options, cb) - if (indexMatch && indexMatch.length > 0) { - const lines = new LinesAndColumns(string); - const index = Number(indexMatch[1]); - const location = lines.locationForIndex(index); + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } - const codeFrame = codeFrameColumns( - string, - {start: {line: location.line + 1, column: location.column + 1}}, - {highlightCode: true} - ); + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null - jsonError.codeFrame = codeFrame; - } + return go$writeFile(path, data, options, cb) - throw jsonError; - } -}; + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null -/***/ }), -/* 429 */ -/***/ (function(module, exports, __webpack_require__) { + return go$appendFile(path, data, options, cb) -"use strict"; + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) + } else { + cb = options + } + args.push(go$readdir$cb) -var util = __webpack_require__(29); -var isArrayish = __webpack_require__(430); + return go$readdir(args) -var errorEx = function errorEx(name, properties) { - if (!name || name.constructor !== String) { - properties = name || {}; - name = Error.name; - } + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() - var errorExError = function ErrorEXError(message) { - if (!this) { - return new ErrorEXError(message); - } + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) - message = message instanceof Error - ? message.message - : (message || this.message); + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } - Error.call(this, message); - Error.captureStackTrace(this, errorExError); + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } - this.name = name; + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } - Object.defineProperty(this, 'message', { - configurable: true, - enumerable: false, - get: function () { - var newMessage = message.split(/\r?\n/g); + var fs$ReadStream = fs.ReadStream + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + } - for (var key in properties) { - if (!properties.hasOwnProperty(key)) { - continue; - } + var fs$WriteStream = fs.WriteStream + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + } - var modifier = properties[key]; + fs.ReadStream = ReadStream + fs.WriteStream = WriteStream - if ('message' in modifier) { - newMessage = modifier.message(this[key], newMessage) || newMessage; - if (!isArrayish(newMessage)) { - newMessage = [newMessage]; - } - } - } + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } - return newMessage.join('\n'); - }, - set: function (v) { - message = v; - } - }); + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() - var stackDescriptor = Object.getOwnPropertyDescriptor(this, 'stack'); - var stackGetter = stackDescriptor.get; - var stackValue = stackDescriptor.value; - delete stackDescriptor.value; - delete stackDescriptor.writable; + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } - stackDescriptor.get = function () { - var stack = (stackGetter) - ? stackGetter.call(this).split(/\r?\n+/g) - : stackValue.split(/\r?\n+/g); + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } - // starting in Node 7, the stack builder caches the message. - // just replace it. - stack[0] = this.name + ': ' + this.message; + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } - var lineCount = 1; - for (var key in properties) { - if (!properties.hasOwnProperty(key)) { - continue; - } + function createReadStream (path, options) { + return new ReadStream(path, options) + } - var modifier = properties[key]; + function createWriteStream (path, options) { + return new WriteStream(path, options) + } - if ('line' in modifier) { - var line = modifier.line(this[key]); - if (line) { - stack.splice(lineCount++, 0, ' ' + line); - } - } + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null - if ('stack' in modifier) { - modifier.stack(this[key], stack); - } - } + return go$open(path, flags, mode, cb) - return stack.join('\n'); - }; - - Object.defineProperty(this, 'stack', stackDescriptor); - }; - - if (Object.setPrototypeOf) { - Object.setPrototypeOf(errorExError.prototype, Error.prototype); - Object.setPrototypeOf(errorExError, Error); - } else { - util.inherits(errorExError, Error); - } - - return errorExError; -}; - -errorEx.append = function (str, def) { - return { - message: function (v, message) { - v = v || def; - - if (v) { - message[0] += ' ' + str.replace('%s', v.toString()); - } - - return message; - } - }; -}; - -errorEx.line = function (str, def) { - return { - line: function (v) { - v = v || def; + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } - if (v) { - return str.replace('%s', v.toString()); - } + return fs +} - return null; - } - }; -}; +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + queue.push(elem) +} -module.exports = errorEx; +function retry () { + var elem = queue.shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } +} /***/ }), -/* 430 */ +/* 410 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -module.exports = function isArrayish(obj) { - if (!obj) { - return false; - } - - return obj instanceof Array || Array.isArray(obj) || - (obj.length >= 0 && obj.splice instanceof Function); -}; - +var constants = __webpack_require__(411) -/***/ }), -/* 431 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; +var origCwd = process.cwd +var cwd = null +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform -module.exports = parseJson -function parseJson (txt, reviver, context) { - context = context || 20 - try { - return JSON.parse(txt, reviver) - } catch (e) { - const syntaxErr = e.message.match(/^Unexpected token.*position\s+(\d+)/i) - const errIdx = syntaxErr - ? +syntaxErr[1] - : e.message.match(/^Unexpected end of JSON.*/i) - ? txt.length - 1 - : null - if (errIdx != null) { - const start = errIdx <= context - ? 0 - : errIdx - context - const end = errIdx + context >= txt.length - ? txt.length - : errIdx + context - e.message += ` while parsing near '${ - start === 0 ? '' : '...' - }${txt.slice(start, end)}${ - end === txt.length ? '' : '...' - }'` - } else { - e.message += ` while parsing '${txt.slice(0, context * 2)}'` - } - throw e - } +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd } +try { + process.cwd() +} catch (er) {} +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} -/***/ }), -/* 432 */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -var LF = '\n'; -var CR = '\r'; -var LinesAndColumns = (function () { - function LinesAndColumns(string) { - this.string = string; - var offsets = [0]; - for (var offset = 0; offset < string.length;) { - switch (string[offset]) { - case LF: - offset += LF.length; - offsets.push(offset); - break; - case CR: - offset += CR.length; - if (string[offset] === LF) { - offset += LF.length; - } - offsets.push(offset); - break; - default: - offset++; - break; - } - } - this.offsets = offsets; - } - LinesAndColumns.prototype.locationForIndex = function (index) { - if (index < 0 || index > this.string.length) { - return null; - } - var line = 0; - var offsets = this.offsets; - while (offsets[line + 1] <= index) { - line++; - } - var column = index - offsets[line]; - return { line: line, column: column }; - }; - LinesAndColumns.prototype.indexForLocation = function (location) { - var line = location.line, column = location.column; - if (line < 0 || line >= this.offsets.length) { - return null; - } - if (column < 0 || column > this.lengthOfLine(line)) { - return null; - } - return this.offsets[line] + column; - }; - LinesAndColumns.prototype.lengthOfLine = function (line) { - var offset = this.offsets[line]; - var nextOffset = line === this.offsets.length - 1 ? this.string.length : this.offsets[line + 1]; - return nextOffset - offset; - }; - return LinesAndColumns; -}()); -/* harmony default export */ __webpack_exports__["default"] = (LinesAndColumns); - - -/***/ }), -/* 433 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports = patch -"use strict"; +function patch (fs) { + // (re-)implement some things that are known busted or missing. + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.codeFrameColumns = codeFrameColumns; -exports.default = _default; + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } -var _highlight = _interopRequireWildcard(__webpack_require__(434)); + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. -function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) -let deprecationWarningShown = false; + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) -function getDefs(chalk) { - return { - gutter: chalk.grey, - marker: chalk.red.bold, - message: chalk.red.bold - }; -} + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) -const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) -function getMarkerLines(loc, source, opts) { - const startLoc = Object.assign({ - column: 0, - line: -1 - }, loc.start); - const endLoc = Object.assign({}, startLoc, {}, loc.end); - const { - linesAbove = 2, - linesBelow = 3 - } = opts || {}; - const startLine = startLoc.line; - const startColumn = startLoc.column; - const endLine = endLoc.line; - const endColumn = endLoc.column; - let start = Math.max(startLine - (linesAbove + 1), 0); - let end = Math.min(source.length, endLine + linesBelow); + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) - if (startLine === -1) { - start = 0; + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) + } + fs.lchmodSync = function () {} } - - if (endLine === -1) { - end = source.length; + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) + } + fs.lchownSync = function () {} } - const lineDiff = endLine - startLine; - const markerLines = {}; + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. - if (lineDiff) { - for (let i = 0; i <= lineDiff; i++) { - const lineNumber = i + startLine; + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } - if (!startColumn) { - markerLines[lineNumber] = true; - } else if (i === 0) { - const sourceLength = source[lineNumber - 1].length; - markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; - } else if (i === lineDiff) { - markerLines[lineNumber] = [0, endColumn]; - } else { - const sourceLength = source[lineNumber - i].length; - markerLines[lineNumber] = [0, sourceLength]; + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) } } - } else { - if (startColumn === endColumn) { - if (startColumn) { - markerLines[startLine] = [startColumn, 0]; - } else { - markerLines[startLine] = true; + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + }})(fs.read) + + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er } - } else { - markerLines[startLine] = [startColumn, endColumn - startColumn]; } - } - - return { - start, - end, - markerLines - }; -} - -function codeFrameColumns(rawLines, loc, opts = {}) { - const highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts); - const chalk = (0, _highlight.getChalk)(opts); - const defs = getDefs(chalk); + }})(fs.readSync) - const maybeHighlight = (chalkFn, string) => { - return highlighted ? chalkFn(string) : string; - }; + function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } - const lines = rawLines.split(NEWLINE); - const { - start, - end, - markerLines - } = getMarkerLines(loc, lines, opts); - const hasColumns = loc.start && typeof loc.start.column === "number"; - const numberMaxWidth = String(end).length; - const highlightedLines = highlighted ? (0, _highlight.default)(rawLines, opts) : rawLines; - let frame = highlightedLines.split(NEWLINE).slice(start, end).map((line, index) => { - const number = start + 1 + index; - const paddedNumber = ` ${number}`.slice(-numberMaxWidth); - const gutter = ` ${paddedNumber} | `; - const hasMarker = markerLines[number]; - const lastMarkerLine = !markerLines[number + 1]; + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) - if (hasMarker) { - let markerLine = ""; + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + } - if (Array.isArray(hasMarker)) { - const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); - const numberOfMarkers = hasMarker[1] || 1; - markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join(""); + function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } - if (lastMarkerLine && opts.message) { - markerLine += " " + maybeHighlight(defs.message, opts.message); + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } } + return ret } - return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join(""); } else { - return ` ${maybeHighlight(defs.gutter, gutter)}${line}`; + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} } - }).join("\n"); - - if (opts.message && !hasColumns) { - frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; } - if (highlighted) { - return chalk.reset(frame); - } else { - return frame; + function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } } -} - -function _default(rawLines, lineNumber, colNumber, opts = {}) { - if (!deprecationWarningShown) { - deprecationWarningShown = true; - const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; - if (process.emitWarning) { - process.emitWarning(message, "DeprecationWarning"); - } else { - const deprecationError = new Error(message); - deprecationError.name = "DeprecationWarning"; - console.warn(new Error(message)); + function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } } } - colNumber = Math.max(colNumber, 0); - const location = { - start: { - column: colNumber, - line: lineNumber - } - }; - return codeFrameColumns(rawLines, location, opts); -} - -/***/ }), -/* 434 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.shouldHighlight = shouldHighlight; -exports.getChalk = getChalk; -exports.default = highlight; - -var _jsTokens = _interopRequireWildcard(__webpack_require__(435)); - -var _helperValidatorIdentifier = __webpack_require__(436); - -var _chalk = _interopRequireDefault(__webpack_require__(439)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - -function getDefs(chalk) { - return { - keyword: chalk.cyan, - capitalized: chalk.yellow, - jsx_tag: chalk.yellow, - punctuator: chalk.yellow, - number: chalk.magenta, - string: chalk.green, - regex: chalk.magenta, - comment: chalk.grey, - invalid: chalk.white.bgRed.bold - }; -} - -const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; -const JSX_TAG = /^[a-z][\w-]*$/i; -const BRACKET = /^[()[\]{}]$/; - -function getTokenType(match) { - const [offset, text] = match.slice(-2); - const token = (0, _jsTokens.matchToToken)(match); - - if (token.type === "name") { - if ((0, _helperValidatorIdentifier.isKeyword)(token.value) || (0, _helperValidatorIdentifier.isReservedWord)(token.value)) { - return "keyword"; - } - if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.substr(offset - 2, 2) == " colorize(str)).join("\n"); - } else { - return args[0]; + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true } - }); -} - -function shouldHighlight(options) { - return _chalk.default.supportsColor || options.forceColor; -} - -function getChalk(options) { - let chalk = _chalk.default; - if (options.forceColor) { - chalk = new _chalk.default.constructor({ - enabled: true, - level: 1 - }); + return false } - - return chalk; } -function highlight(code, options = {}) { - if (shouldHighlight(options)) { - const chalk = getChalk(options); - const defs = getDefs(chalk); - return highlightTokens(defs, code); - } else { - return code; - } -} /***/ }), -/* 435 */ +/* 411 */ /***/ (function(module, exports) { -// Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell -// License: MIT. (See LICENSE.) - -Object.defineProperty(exports, "__esModule", { - value: true -}) - -// This regex comes from regex.coffee, and is inserted here by generate-index.js -// (run `npm run build`). -exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g - -exports.matchToToken = function(match) { - var token = {type: "invalid", value: match[0], closed: undefined} - if (match[ 1]) token.type = "string" , token.closed = !!(match[3] || match[4]) - else if (match[ 5]) token.type = "comment" - else if (match[ 6]) token.type = "comment", token.closed = !!match[7] - else if (match[ 8]) token.type = "regex" - else if (match[ 9]) token.type = "number" - else if (match[10]) token.type = "name" - else if (match[11]) token.type = "punctuator" - else if (match[12]) token.type = "whitespace" - return token -} - +module.exports = require("constants"); /***/ }), -/* 436 */ +/* 412 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var Stream = __webpack_require__(382).Stream +module.exports = legacy -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "isIdentifierName", { - enumerable: true, - get: function () { - return _identifier.isIdentifierName; - } -}); -Object.defineProperty(exports, "isIdentifierChar", { - enumerable: true, - get: function () { - return _identifier.isIdentifierChar; - } -}); -Object.defineProperty(exports, "isIdentifierStart", { - enumerable: true, - get: function () { - return _identifier.isIdentifierStart; - } -}); -Object.defineProperty(exports, "isReservedWord", { - enumerable: true, - get: function () { - return _keyword.isReservedWord; - } -}); -Object.defineProperty(exports, "isStrictBindOnlyReservedWord", { - enumerable: true, - get: function () { - return _keyword.isStrictBindOnlyReservedWord; - } -}); -Object.defineProperty(exports, "isStrictBindReservedWord", { - enumerable: true, - get: function () { - return _keyword.isStrictBindReservedWord; - } -}); -Object.defineProperty(exports, "isStrictReservedWord", { - enumerable: true, - get: function () { - return _keyword.isStrictReservedWord; - } -}); -Object.defineProperty(exports, "isKeyword", { - enumerable: true, - get: function () { - return _keyword.isKeyword; +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream } -}); -var _identifier = __webpack_require__(437); + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -var _keyword = __webpack_require__(438); + Stream.call(this); -/***/ }), -/* 437 */ -/***/ (function(module, exports, __webpack_require__) { + var self = this; -"use strict"; + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.isIdentifierStart = isIdentifierStart; -exports.isIdentifierChar = isIdentifierChar; -exports.isIdentifierName = isIdentifierName; -let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08c7\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\u9ffc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7ca\ua7f5-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; -let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf\u1ac0\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; -const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); -const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); -nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; -const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 157, 310, 10, 21, 11, 7, 153, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 107, 20, 28, 22, 13, 52, 76, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 230, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 35, 56, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 190, 0, 80, 921, 103, 110, 18, 195, 2749, 1070, 4050, 582, 8634, 568, 8, 30, 114, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8952, 286, 50, 2, 18, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 2357, 44, 11, 6, 17, 0, 370, 43, 1301, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42717, 35, 4148, 12, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938]; -const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 154, 10, 176, 2, 54, 14, 32, 9, 16, 3, 46, 10, 54, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 161, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 19306, 9, 135, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 5319, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 262, 6, 10, 9, 419, 13, 1495, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; + options = options || {}; -function isInAstralSet(code, set) { - let pos = 0x10000; + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } - for (let i = 0, length = set.length; i < length; i += 2) { - pos += set[i]; - if (pos > code) return false; - pos += set[i + 1]; - if (pos >= code) return true; - } + if (this.encoding) this.setEncoding(this.encoding); - return false; -} + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); + } -function isIdentifierStart(code) { - if (code < 65) return code === 36; - if (code <= 90) return true; - if (code < 97) return code === 95; - if (code <= 122) return true; + if (this.start > this.end) { + throw new Error('start must be <= end'); + } - if (code <= 0xffff) { - return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); - } + this.pos = this.start; + } - return isInAstralSet(code, astralIdentifierStartCodes); -} + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } -function isIdentifierChar(code) { - if (code < 48) return code === 36; - if (code < 58) return true; - if (code < 65) return false; - if (code <= 90) return true; - if (code < 97) return code === 95; - if (code <= 122) return true; + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } - if (code <= 0xffff) { - return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); + self.fd = fd; + self.emit('open', fd); + self._read(); + }) } - return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); -} + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); -function isIdentifierName(name) { - let isFirst = true; + Stream.call(this); - for (let _i = 0, _Array$from = Array.from(name); _i < _Array$from.length; _i++) { - const char = _Array$from[_i]; - const cp = char.codePointAt(0); + this.path = path; + this.fd = null; + this.writable = true; - if (isFirst) { - if (!isIdentifierStart(cp)) { - return false; + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; + + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); } - isFirst = false; - } else if (!isIdentifierChar(cp)) { - return false; + this.pos = this.start; } - } - return true; + this.busy = false; + this._queue = []; + + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); + } + } } + /***/ }), -/* 438 */ +/* 413 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.isReservedWord = isReservedWord; -exports.isStrictReservedWord = isStrictReservedWord; -exports.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord; -exports.isStrictBindReservedWord = isStrictBindReservedWord; -exports.isKeyword = isKeyword; -const reservedWords = { - keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"], - strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"], - strictBind: ["eval", "arguments"] -}; -const keywords = new Set(reservedWords.keyword); -const reservedWordsStrictSet = new Set(reservedWords.strict); -const reservedWordsStrictBindSet = new Set(reservedWords.strictBind); +module.exports = clone -function isReservedWord(word, inModule) { - return inModule && word === "await" || word === "enum"; -} +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj -function isStrictReservedWord(word, inModule) { - return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word); -} + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) -function isStrictBindOnlyReservedWord(word) { - return reservedWordsStrictBindSet.has(word); -} + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) -function isStrictBindReservedWord(word, inModule) { - return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word); + return copy } -function isKeyword(word) { - return keywords.has(word); -} /***/ }), -/* 439 */ +/* 414 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(3); -const ansiStyles = __webpack_require__(440); -const stdoutColor = __webpack_require__(441).stdout; -const template = __webpack_require__(442); +module.exports = string => { + if (typeof string !== 'string') { + throw new TypeError(`Expected a string, got ${typeof string}`); + } -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); + // Catches EFBBBF (UTF-8 BOM) because the buffer-to-string + // conversion translates it to FEFF (UTF-16 BOM) + if (string.charCodeAt(0) === 0xFEFF) { + return string.slice(1); + } -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; + return string; +}; -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); -const styles = Object.create(null); +/***/ }), +/* 415 */ +/***/ (function(module, exports, __webpack_require__) { -function applyOptions(obj, options) { - options = options || {}; +"use strict"; - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} +const errorEx = __webpack_require__(416); +const fallback = __webpack_require__(418); +const {default: LinesAndColumns} = __webpack_require__(419); +const {codeFrameColumns} = __webpack_require__(420); -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); +const JSONError = errorEx('JSONError', { + fileName: errorEx.append('in %s'), + codeFrame: errorEx.append('\n\n%s\n') +}); - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; +module.exports = (string, reviver, filename) => { + if (typeof reviver === 'string') { + filename = reviver; + reviver = null; + } - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + try { + try { + return JSON.parse(string, reviver); + } catch (error) { + fallback(string, reviver); + throw error; + } + } catch (error) { + error.message = error.message.replace(/\n/g, ''); + const indexMatch = error.message.match(/in JSON at position (\d+) while parsing near/); - chalk.template.constructor = Chalk; + const jsonError = new JSONError(error); + if (filename) { + jsonError.fileName = filename; + } - return chalk.template; - } + if (indexMatch && indexMatch.length > 0) { + const lines = new LinesAndColumns(string); + const index = Number(indexMatch[1]); + const location = lines.locationForIndex(index); - applyOptions(this, options); -} - -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; -} - -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + const codeFrame = codeFrameColumns( + string, + {start: {line: location.line + 1, column: location.column + 1}}, + {highlightCode: true} + ); - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + jsonError.codeFrame = codeFrame; } - }; -} -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); + throw jsonError; } }; -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} +/***/ }), +/* 416 */ +/***/ (function(module, exports, __webpack_require__) { -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; +"use strict"; + + +var util = __webpack_require__(397); +var isArrayish = __webpack_require__(417); + +var errorEx = function errorEx(name, properties) { + if (!name || name.constructor !== String) { + properties = name || {}; + name = Error.name; } - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; + var errorExError = function ErrorEXError(message) { + if (!this) { + return new ErrorEXError(message); } - }; -} -const proto = Object.defineProperties(() => {}, styles); + message = message instanceof Error + ? message.message + : (message || this.message); -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; + Error.call(this, message); + Error.captureStackTrace(this, errorExError); - builder._styles = _styles; - builder._empty = _empty; + this.name = name; - const self = this; + Object.defineProperty(this, 'message', { + configurable: true, + enumerable: false, + get: function () { + var newMessage = message.split(/\r?\n/g); - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); + for (var key in properties) { + if (!properties.hasOwnProperty(key)) { + continue; + } - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); + var modifier = properties[key]; - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + if ('message' in modifier) { + newMessage = modifier.message(this[key], newMessage) || newMessage; + if (!isArrayish(newMessage)) { + newMessage = [newMessage]; + } + } + } - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto + return newMessage.join('\n'); + }, + set: function (v) { + message = v; + } + }); - return builder; -} + var stackDescriptor = Object.getOwnPropertyDescriptor(this, 'stack'); + var stackGetter = stackDescriptor.get; + var stackValue = stackDescriptor.value; + delete stackDescriptor.value; + delete stackDescriptor.writable; -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); + stackDescriptor.get = function () { + var stack = (stackGetter) + ? stackGetter.call(this).split(/\r?\n+/g) + : stackValue.split(/\r?\n+/g); - if (argsLen === 0) { - return ''; - } + // starting in Node 7, the stack builder caches the message. + // just replace it. + stack[0] = this.name + ': ' + this.message; - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } + var lineCount = 1; + for (var key in properties) { + if (!properties.hasOwnProperty(key)) { + continue; + } - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + var modifier = properties[key]; - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + if ('line' in modifier) { + var line = modifier.line(this[key]); + if (line) { + stack.splice(lineCount++, 0, ' ' + line); + } + } - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; + if ('stack' in modifier) { + modifier.stack(this[key], stack); + } + } - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + return stack.join('\n'); + }; + + Object.defineProperty(this, 'stack', stackDescriptor); + }; + + if (Object.setPrototypeOf) { + Object.setPrototypeOf(errorExError.prototype, Error.prototype); + Object.setPrototypeOf(errorExError, Error); + } else { + util.inherits(errorExError, Error); } - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + return errorExError; +}; - return str; -} +errorEx.append = function (str, def) { + return { + message: function (v, message) { + v = v || def; -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } + if (v) { + message[0] += ' ' + str.replace('%s', v.toString()); + } - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + return message; + } + }; +}; - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } +errorEx.line = function (str, def) { + return { + line: function (v) { + v = v || def; - return template(chalk, parts.join('')); -} + if (v) { + return str.replace('%s', v.toString()); + } -Object.defineProperties(Chalk.prototype, styles); + return null; + } + }; +}; -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript +module.exports = errorEx; /***/ }), -/* 440 */ +/* 417 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(6); -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; -}; -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; +module.exports = function isArrayish(obj) { + if (!obj) { + return false; + } -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; + return obj instanceof Array || Array.isArray(obj) || + (obj.length >= 0 && obj.splice instanceof Function); }; -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], - - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; +/***/ }), +/* 418 */ +/***/ (function(module, exports, __webpack_require__) { - // Fix humans - styles.color.grey = styles.color.gray; +"use strict"; - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; - for (const styleName of Object.keys(group)) { - const style = group[styleName]; +module.exports = parseJson +function parseJson (txt, reviver, context) { + context = context || 20 + try { + return JSON.parse(txt, reviver) + } catch (e) { + const syntaxErr = e.message.match(/^Unexpected token.*position\s+(\d+)/i) + const errIdx = syntaxErr + ? +syntaxErr[1] + : e.message.match(/^Unexpected end of JSON.*/i) + ? txt.length - 1 + : null + if (errIdx != null) { + const start = errIdx <= context + ? 0 + : errIdx - context + const end = errIdx + context >= txt.length + ? txt.length + : errIdx + context + e.message += ` while parsing near '${ + start === 0 ? '' : '...' + }${txt.slice(start, end)}${ + end === txt.length ? '' : '...' + }'` + } else { + e.message += ` while parsing '${txt.slice(0, context * 2)}'` + } + throw e + } +} - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; - group[styleName] = styles[styleName]; +/***/ }), +/* 419 */ +/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - codes.set(style[0], style[1]); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +var LF = '\n'; +var CR = '\r'; +var LinesAndColumns = (function () { + function LinesAndColumns(string) { + this.string = string; + var offsets = [0]; + for (var offset = 0; offset < string.length;) { + switch (string[offset]) { + case LF: + offset += LF.length; + offsets.push(offset); + break; + case CR: + offset += CR.length; + if (string[offset] === LF) { + offset += LF.length; + } + offsets.push(offset); + break; + default: + offset++; + break; + } + } + this.offsets = offsets; + } + LinesAndColumns.prototype.locationForIndex = function (index) { + if (index < 0 || index > this.string.length) { + return null; + } + var line = 0; + var offsets = this.offsets; + while (offsets[line + 1] <= index) { + line++; + } + var column = index - offsets[line]; + return { line: line, column: column }; + }; + LinesAndColumns.prototype.indexForLocation = function (location) { + var line = location.line, column = location.column; + if (line < 0 || line >= this.offsets.length) { + return null; + } + if (column < 0 || column > this.lengthOfLine(line)) { + return null; + } + return this.offsets[line] + column; + }; + LinesAndColumns.prototype.lengthOfLine = function (line) { + var offset = this.offsets[line]; + var nextOffset = line === this.offsets.length - 1 ? this.string.length : this.offsets[line + 1]; + return nextOffset - offset; + }; + return LinesAndColumns; +}()); +/* harmony default export */ __webpack_exports__["default"] = (LinesAndColumns); - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - } +/***/ }), +/* 420 */ +/***/ (function(module, exports, __webpack_require__) { - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; +"use strict"; - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.codeFrameColumns = codeFrameColumns; +exports.default = _default; - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; +var _highlight = _interopRequireWildcard(__webpack_require__(421)); - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - const suite = colorConvert[key]; +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - if (key === 'ansi16') { - key = 'ansi'; - } +let deprecationWarningShown = false; - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } +function getDefs(chalk) { + return { + gutter: chalk.grey, + marker: chalk.red.bold, + message: chalk.red.bold + }; +} - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } +const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } - } +function getMarkerLines(loc, source, opts) { + const startLoc = Object.assign({ + column: 0, + line: -1 + }, loc.start); + const endLoc = Object.assign({}, startLoc, {}, loc.end); + const { + linesAbove = 2, + linesBelow = 3 + } = opts || {}; + const startLine = startLoc.line; + const startColumn = startLoc.column; + const endLine = endLoc.line; + const endColumn = endLoc.column; + let start = Math.max(startLine - (linesAbove + 1), 0); + let end = Math.min(source.length, endLine + linesBelow); - return styles; -} + if (startLine === -1) { + start = 0; + } -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); + if (endLine === -1) { + end = source.length; + } -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) + const lineDiff = endLine - startLine; + const markerLines = {}; -/***/ }), -/* 441 */ -/***/ (function(module, exports, __webpack_require__) { + if (lineDiff) { + for (let i = 0; i <= lineDiff; i++) { + const lineNumber = i + startLine; -"use strict"; + if (!startColumn) { + markerLines[lineNumber] = true; + } else if (i === 0) { + const sourceLength = source[lineNumber - 1].length; + markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; + } else if (i === lineDiff) { + markerLines[lineNumber] = [0, endColumn]; + } else { + const sourceLength = source[lineNumber - i].length; + markerLines[lineNumber] = [0, sourceLength]; + } + } + } else { + if (startColumn === endColumn) { + if (startColumn) { + markerLines[startLine] = [startColumn, 0]; + } else { + markerLines[startLine] = true; + } + } else { + markerLines[startLine] = [startColumn, endColumn - startColumn]; + } + } -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); + return { + start, + end, + markerLines + }; +} -const env = process.env; +function codeFrameColumns(rawLines, loc, opts = {}) { + const highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts); + const chalk = (0, _highlight.getChalk)(opts); + const defs = getDefs(chalk); -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} + const maybeHighlight = (chalkFn, string) => { + return highlighted ? chalkFn(string) : string; + }; -function translateLevel(level) { - if (level === 0) { - return false; - } + const lines = rawLines.split(NEWLINE); + const { + start, + end, + markerLines + } = getMarkerLines(loc, lines, opts); + const hasColumns = loc.start && typeof loc.start.column === "number"; + const numberMaxWidth = String(end).length; + const highlightedLines = highlighted ? (0, _highlight.default)(rawLines, opts) : rawLines; + let frame = highlightedLines.split(NEWLINE).slice(start, end).map((line, index) => { + const number = start + 1 + index; + const paddedNumber = ` ${number}`.slice(-numberMaxWidth); + const gutter = ` ${paddedNumber} | `; + const hasMarker = markerLines[number]; + const lastMarkerLine = !markerLines[number + 1]; - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} + if (hasMarker) { + let markerLine = ""; -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } + if (Array.isArray(hasMarker)) { + const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); + const numberOfMarkers = hasMarker[1] || 1; + markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join(""); - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } + if (lastMarkerLine && opts.message) { + markerLine += " " + maybeHighlight(defs.message, opts.message); + } + } - if (hasFlag('color=256')) { - return 2; - } + return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join(""); + } else { + return ` ${maybeHighlight(defs.gutter, gutter)}${line}`; + } + }).join("\n"); - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } + if (opts.message && !hasColumns) { + frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; + } - const min = forceColor ? 1 : 0; + if (highlighted) { + return chalk.reset(frame); + } else { + return frame; + } +} - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } +function _default(rawLines, lineNumber, colNumber, opts = {}) { + if (!deprecationWarningShown) { + deprecationWarningShown = true; + const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; - return 1; - } + if (process.emitWarning) { + process.emitWarning(message, "DeprecationWarning"); + } else { + const deprecationError = new Error(message); + deprecationError.name = "DeprecationWarning"; + console.warn(new Error(message)); + } + } - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } + colNumber = Math.max(colNumber, 0); + const location = { + start: { + column: colNumber, + line: lineNumber + } + }; + return codeFrameColumns(rawLines, location, opts); +} - return min; - } +/***/ }), +/* 421 */ +/***/ (function(module, exports, __webpack_require__) { - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } +"use strict"; - if (env.COLORTERM === 'truecolor') { - return 3; - } - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.shouldHighlight = shouldHighlight; +exports.getChalk = getChalk; +exports.default = highlight; - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } +var _jsTokens = _interopRequireWildcard(__webpack_require__(422)); - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } +var _helperValidatorIdentifier = __webpack_require__(423); - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } +var _chalk = _interopRequireDefault(__webpack_require__(426)); - if ('COLORTERM' in env) { - return 1; - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - if (env.TERM === 'dumb') { - return min; - } +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - return min; -} +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); +function getDefs(chalk) { + return { + keyword: chalk.cyan, + capitalized: chalk.yellow, + jsx_tag: chalk.yellow, + punctuator: chalk.yellow, + number: chalk.magenta, + string: chalk.green, + regex: chalk.magenta, + comment: chalk.grey, + invalid: chalk.white.bgRed.bold + }; } -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; +const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; +const JSX_TAG = /^[a-z][\w-]*$/i; +const BRACKET = /^[()[\]{}]$/; +function getTokenType(match) { + const [offset, text] = match.slice(-2); + const token = (0, _jsTokens.matchToToken)(match); -/***/ }), -/* 442 */ -/***/ (function(module, exports, __webpack_require__) { + if (token.type === "name") { + if ((0, _helperValidatorIdentifier.isKeyword)(token.value) || (0, _helperValidatorIdentifier.isReservedWord)(token.value)) { + return "keyword"; + } -"use strict"; + if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.substr(offset - 2, 2) == " escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } +function highlightTokens(defs, text) { + return text.replace(_jsTokens.default, function (...args) { + const type = getTokenType(args); + const colorize = defs[type]; - return results; + if (colorize) { + return args[0].split(NEWLINE).map(str => colorize(str)).join("\n"); + } else { + return args[0]; + } + }); } -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; +function shouldHighlight(options) { + return _chalk.default.supportsColor || options.forceColor; +} - const results = []; - let matches; +function getChalk(options) { + let chalk = _chalk.default; - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; + if (options.forceColor) { + chalk = new _chalk.default.constructor({ + enabled: true, + level: 1 + }); + } - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } + return chalk; +} - return results; +function highlight(code, options = {}) { + if (shouldHighlight(options)) { + const chalk = getChalk(options); + const defs = getDefs(chalk); + return highlightTokens(defs, code); + } else { + return code; + } } -function buildStyle(chalk, styles) { - const enabled = {}; +/***/ }), +/* 422 */ +/***/ (function(module, exports) { - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } +// Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell +// License: MIT. (See LICENSE.) - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } +Object.defineProperty(exports, "__esModule", { + value: true +}) - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } +// This regex comes from regex.coffee, and is inserted here by generate-index.js +// (run `npm run build`). +exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g - return current; +exports.matchToToken = function(match) { + var token = {type: "invalid", value: match[0], closed: undefined} + if (match[ 1]) token.type = "string" , token.closed = !!(match[3] || match[4]) + else if (match[ 5]) token.type = "comment" + else if (match[ 6]) token.type = "comment", token.closed = !!match[7] + else if (match[ 8]) token.type = "regex" + else if (match[ 9]) token.type = "number" + else if (match[10]) token.type = "name" + else if (match[11]) token.type = "punctuator" + else if (match[12]) token.type = "whitespace" + return token } -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } +/***/ }), +/* 423 */ +/***/ (function(module, exports, __webpack_require__) { - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); +"use strict"; - chunks.push(chunk.join('')); - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "isIdentifierName", { + enumerable: true, + get: function () { + return _identifier.isIdentifierName; + } +}); +Object.defineProperty(exports, "isIdentifierChar", { + enumerable: true, + get: function () { + return _identifier.isIdentifierChar; + } +}); +Object.defineProperty(exports, "isIdentifierStart", { + enumerable: true, + get: function () { + return _identifier.isIdentifierStart; + } +}); +Object.defineProperty(exports, "isReservedWord", { + enumerable: true, + get: function () { + return _keyword.isReservedWord; + } +}); +Object.defineProperty(exports, "isStrictBindOnlyReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindOnlyReservedWord; + } +}); +Object.defineProperty(exports, "isStrictBindReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindReservedWord; + } +}); +Object.defineProperty(exports, "isStrictReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictReservedWord; + } +}); +Object.defineProperty(exports, "isKeyword", { + enumerable: true, + get: function () { + return _keyword.isKeyword; + } +}); - return chunks.join(''); -}; +var _identifier = __webpack_require__(424); +var _keyword = __webpack_require__(425); /***/ }), -/* 443 */ +/* 424 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const path_1 = __webpack_require__(16); -exports.CA_CERT_PATH = path_1.resolve(__dirname, '../certs/ca.crt'); -exports.ES_KEY_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.key'); -exports.ES_CERT_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.crt'); -exports.ES_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.p12'); -exports.ES_P12_PASSWORD = 'storepass'; -exports.ES_EMPTYPASSWORD_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch_emptypassword.p12'); -exports.ES_NOPASSWORD_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch_nopassword.p12'); -exports.KBN_KEY_PATH = path_1.resolve(__dirname, '../certs/kibana.key'); -exports.KBN_CERT_PATH = path_1.resolve(__dirname, '../certs/kibana.crt'); -exports.KBN_P12_PATH = path_1.resolve(__dirname, '../certs/kibana.p12'); -exports.KBN_P12_PASSWORD = 'storepass'; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isIdentifierStart = isIdentifierStart; +exports.isIdentifierChar = isIdentifierChar; +exports.isIdentifierName = isIdentifierName; +let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08c7\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\u9ffc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7ca\ua7f5-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf\u1ac0\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; +const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); +const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); +nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; +const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 157, 310, 10, 21, 11, 7, 153, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 107, 20, 28, 22, 13, 52, 76, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 230, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 35, 56, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 190, 0, 80, 921, 103, 110, 18, 195, 2749, 1070, 4050, 582, 8634, 568, 8, 30, 114, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8952, 286, 50, 2, 18, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 2357, 44, 11, 6, 17, 0, 370, 43, 1301, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42717, 35, 4148, 12, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938]; +const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 154, 10, 176, 2, 54, 14, 32, 9, 16, 3, 46, 10, 54, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 161, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 19306, 9, 135, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 5319, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 262, 6, 10, 9, 419, 13, 1495, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; -/***/ }), -/* 444 */ -/***/ (function(module, exports, __webpack_require__) { +function isInAstralSet(code, set) { + let pos = 0x10000; -"use strict"; + for (let i = 0, length = set.length; i < length; i += 2) { + pos += set[i]; + if (pos > code) return false; + pos += set[i + 1]; + if (pos >= code) return true; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var run_1 = __webpack_require__(445); -exports.run = run_1.run; -var fail_1 = __webpack_require__(446); -exports.createFailError = fail_1.createFailError; -exports.createFlagError = fail_1.createFlagError; -exports.combineErrors = fail_1.combineErrors; -exports.isFailError = fail_1.isFailError; + return false; +} +function isIdentifierStart(code) { + if (code < 65) return code === 36; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; -/***/ }), -/* 445 */ -/***/ (function(module, exports, __webpack_require__) { + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); + } -"use strict"; + return isInAstralSet(code, astralIdentifierStartCodes); +} -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const util_1 = __webpack_require__(29); -// @ts-ignore @types are outdated and module is super simple -const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(368)); -const tooling_log_1 = __webpack_require__(414); -const fail_1 = __webpack_require__(446); -const flags_1 = __webpack_require__(447); -const proc_runner_1 = __webpack_require__(37); -async function run(fn, options = {}) { - var _a; - const flags = flags_1.getFlags(process.argv.slice(2), options); - if (flags.help) { - process.stderr.write(flags_1.getHelp(options)); - process.exit(1); - } - const log = new tooling_log_1.ToolingLog({ - level: tooling_log_1.pickLevelFromFlags(flags), - writeTo: process.stdout, - }); - process.on('unhandledRejection', (error) => { - log.error('UNHANDLED PROMISE REJECTION'); - log.error(error instanceof Error - ? error - : new Error(`non-Error type rejection value: ${util_1.inspect(error)}`)); - process.exit(1); - }); - const handleErrorWithoutExit = (error) => { - if (fail_1.isFailError(error)) { - log.error(error.message); - if (error.showHelp) { - log.write(flags_1.getHelp(options)); - } - process.exitCode = error.exitCode; - } - else { - log.error('UNHANDLED ERROR'); - log.error(error); - process.exitCode = 1; - } - }; - const doCleanup = () => { - const tasks = cleanupTasks.slice(0); - cleanupTasks.length = 0; - for (const task of tasks) { - try { - task(); - } - catch (error) { - handleErrorWithoutExit(error); - } - } - }; - const unhookExit = exit_hook_1.default(doCleanup); - const cleanupTasks = [unhookExit]; - try { - if (!((_a = options.flags) === null || _a === void 0 ? void 0 : _a.allowUnexpected) && flags.unexpected.length) { - throw fail_1.createFlagError(`Unknown flag(s) "${flags.unexpected.join('", "')}"`); - } - try { - await proc_runner_1.withProcRunner(log, async (procRunner) => { - await fn({ - log, - flags, - procRunner, - addCleanupTask: (task) => cleanupTasks.push(task), - }); - }); - } - finally { - doCleanup(); - } - } - catch (error) { - handleErrorWithoutExit(error); - process.exit(); - } +function isIdentifierChar(code) { + if (code < 48) return code === 36; + if (code < 58) return true; + if (code < 65) return false; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); + } + + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); } -exports.run = run; +function isIdentifierName(name) { + let isFirst = true; -/***/ }), -/* 446 */ -/***/ (function(module, exports, __webpack_require__) { + for (let _i = 0, _Array$from = Array.from(name); _i < _Array$from.length; _i++) { + const char = _Array$from[_i]; + const cp = char.codePointAt(0); -"use strict"; + if (isFirst) { + if (!isIdentifierStart(cp)) { + return false; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const util_1 = __webpack_require__(29); -const FAIL_TAG = Symbol('fail error'); -function createFailError(reason, options = {}) { - const { exitCode = 1, showHelp = false } = options; - return Object.assign(new Error(reason), { - exitCode, - showHelp, - [FAIL_TAG]: true, - }); -} -exports.createFailError = createFailError; -function createFlagError(reason) { - return createFailError(reason, { - showHelp: true, - }); -} -exports.createFlagError = createFlagError; -function isFailError(error) { - return Boolean(error && error[FAIL_TAG]); -} -exports.isFailError = isFailError; -function combineErrors(errors) { - if (errors.length === 1) { - return errors[0]; + isFirst = false; + } else if (!isIdentifierChar(cp)) { + return false; } - const exitCode = errors - .filter(isFailError) - .reduce((acc, error) => Math.max(acc, error.exitCode), 1); - const showHelp = errors.some((error) => isFailError(error) && error.showHelp); - const message = errors.reduce((acc, error) => { - if (isFailError(error)) { - return acc + '\n' + error.message; - } - return acc + `\nUNHANDLED ERROR\n${util_1.inspect(error)}`; - }, ''); - return createFailError(`${errors.length} errors:\n${message}`, { - exitCode, - showHelp, - }); -} -exports.combineErrors = combineErrors; + } + return true; +} /***/ }), -/* 447 */ +/* 425 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const path_1 = __webpack_require__(16); -const dedent_1 = tslib_1.__importDefault(__webpack_require__(14)); -const getopts_1 = tslib_1.__importDefault(__webpack_require__(448)); -function getFlags(argv, options) { - const unexpectedNames = new Set(); - const flagOpts = options.flags || {}; - const { verbose, quiet, silent, debug, help, _, ...others } = getopts_1.default(argv, { - string: flagOpts.string, - boolean: [...(flagOpts.boolean || []), 'verbose', 'quiet', 'silent', 'debug', 'help'], - alias: { - ...(flagOpts.alias || {}), - v: 'verbose', - }, - default: flagOpts.default, - unknown: (name) => { - unexpectedNames.add(name); - return flagOpts.guessTypesForUnexpectedFlags; - }, - }); - const unexpected = []; - for (const unexpectedName of unexpectedNames) { - const matchingArgv = []; - iterArgv: for (const [i, v] of argv.entries()) { - for (const prefix of ['--', '-']) { - if (v.startsWith(prefix)) { - // -/--name=value - if (v.startsWith(`${prefix}${unexpectedName}=`)) { - matchingArgv.push(v); - continue iterArgv; - } - // -/--name (value possibly follows) - if (v === `${prefix}${unexpectedName}`) { - matchingArgv.push(v); - // value follows -/--name - if (argv.length > i + 1 && !argv[i + 1].startsWith('-')) { - matchingArgv.push(argv[i + 1]); - } - continue iterArgv; - } - } - } - // special case for `--no-{flag}` disabling of boolean flags - if (v === `--no-${unexpectedName}`) { - matchingArgv.push(v); - continue iterArgv; - } - // special case for shortcut flags formatted as `-abc` where `a`, `b`, - // and `c` will be three separate unexpected flags - if (unexpectedName.length === 1 && - v[0] === '-' && - v[1] !== '-' && - !v.includes('=') && - v.includes(unexpectedName)) { - matchingArgv.push(`-${unexpectedName}`); - continue iterArgv; - } - } - if (matchingArgv.length) { - unexpected.push(...matchingArgv); - } - else { - throw new Error(`unable to find unexpected flag named "${unexpectedName}"`); - } - } - return { - verbose, - quiet, - silent, - debug, - help, - _, - unexpected, - ...others, - }; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isReservedWord = isReservedWord; +exports.isStrictReservedWord = isStrictReservedWord; +exports.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord; +exports.isStrictBindReservedWord = isStrictBindReservedWord; +exports.isKeyword = isKeyword; +const reservedWords = { + keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"], + strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"], + strictBind: ["eval", "arguments"] +}; +const keywords = new Set(reservedWords.keyword); +const reservedWordsStrictSet = new Set(reservedWords.strict); +const reservedWordsStrictBindSet = new Set(reservedWords.strictBind); + +function isReservedWord(word, inModule) { + return inModule && word === "await" || word === "enum"; } -exports.getFlags = getFlags; -function getHelp(options) { - var _a, _b; - const usage = options.usage || `node ${path_1.relative(process.cwd(), process.argv[1])}`; - const optionHelp = (dedent_1.default(((_b = (_a = options) === null || _a === void 0 ? void 0 : _a.flags) === null || _b === void 0 ? void 0 : _b.help) || '') + - '\n' + - dedent_1.default ` - --verbose, -v Log verbosely - --debug Log debug messages (less than verbose) - --quiet Only log errors - --silent Don't log anything - --help Show this message - `) - .split('\n') - .filter(Boolean) - .join('\n '); - return ` - ${usage} - ${dedent_1.default(options.description || 'Runs a dev task') - .split('\n') - .join('\n ')} +function isStrictReservedWord(word, inModule) { + return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word); +} - Options: - ${optionHelp + '\n\n'}`; +function isStrictBindOnlyReservedWord(word) { + return reservedWordsStrictBindSet.has(word); +} + +function isStrictBindReservedWord(word, inModule) { + return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word); } -exports.getHelp = getHelp; +function isKeyword(word) { + return keywords.has(word); +} /***/ }), -/* 448 */ +/* 426 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const escapeStringRegexp = __webpack_require__(387); +const ansiStyles = __webpack_require__(427); +const stdoutColor = __webpack_require__(428).stdout; -const EMPTYARR = [] -const SHORTSPLIT = /$|[!-@[-`{-~][\s\S]*/g -const isArray = Array.isArray +const template = __webpack_require__(429); -const parseValue = function(any) { - if (any === "") return "" - if (any === "false") return false - const maybe = Number(any) - return maybe * 0 === 0 ? maybe : any -} +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); -const parseAlias = function(aliases) { - let out = {}, - key, - alias, - prev, - len, - any, - i, - k +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - for (key in aliases) { - any = aliases[key] - alias = out[key] = isArray(any) ? any : [any] +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); - for (i = 0, len = alias.length; i < len; i++) { - prev = out[alias[i]] = [key] +const styles = Object.create(null); - for (k = 0; k < len; k++) { - if (i !== k) prev.push(alias[k]) - } - } - } +function applyOptions(obj, options) { + options = options || {}; - return out + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; } -const parseDefault = function(aliases, defaults) { - let out = {}, - key, - alias, - value, - len, - i +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); - for (key in defaults) { - value = defaults[key] - alias = aliases[key] + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; - out[key] = value + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); - if (alias === undefined) { - aliases[key] = EMPTYARR - } else { - for (i = 0, len = alias.length; i < len; i++) { - out[alias[i]] = value - } - } - } + chalk.template.constructor = Chalk; - return out + return chalk.template; + } + + applyOptions(this, options); } -const parseOptions = function(aliases, options, value) { - let out = {}, - key, - alias, - len, - end, - i, - k +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} - if (options !== undefined) { - for (i = 0, len = options.length; i < len; i++) { - key = options[i] - alias = aliases[key] - - out[key] = value - - if (alias === undefined) { - aliases[key] = EMPTYARR - } else { - for (k = 0, end = alias.length; k < end; k++) { - out[alias[k]] = value - } - } - } - } +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - return out + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; } -const write = function(out, key, value, aliases, unknown) { - let i, - prev, - alias = aliases[key], - len = alias === undefined ? -1 : alias.length - - if (len >= 0 || unknown === undefined || unknown(key)) { - prev = out[key] +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; - if (prev === undefined) { - out[key] = value - } else { - if (isArray(prev)) { - prev.push(value) - } else { - out[key] = [prev, value] - } - } +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } - for (i = 0; i < len; i++) { - out[alias[i]] = out[key] - } - } + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; } -const getopts = function(argv, opts) { - let unknown = (opts = opts || {}).unknown, - aliases = parseAlias(opts.alias), - strings = parseOptions(aliases, opts.string, ""), - values = parseDefault(aliases, opts.default), - bools = parseOptions(aliases, opts.boolean, false), - stopEarly = opts.stopEarly, - _ = [], - out = { _ }, - i = 0, - k = 0, - len = argv.length, - key, - arg, - end, - match, - value - - for (; i < len; i++) { - arg = argv[i] - - if (arg[0] !== "-" || arg === "-") { - if (stopEarly) while (i < len) _.push(argv[i++]) - else _.push(arg) - } else if (arg === "--") { - while (++i < len) _.push(argv[i]) - } else if (arg[1] === "-") { - end = arg.indexOf("=", 2) - if (arg[2] === "n" && arg[3] === "o" && arg[4] === "-") { - key = arg.slice(5, end >= 0 ? end : undefined) - value = false - } else if (end >= 0) { - key = arg.slice(2, end) - value = - bools[key] !== undefined || - (strings[key] === undefined - ? parseValue(arg.slice(end + 1)) - : arg.slice(end + 1)) - } else { - key = arg.slice(2) - value = - bools[key] !== undefined || - (len === i + 1 || argv[i + 1][0] === "-" - ? strings[key] === undefined - ? true - : "" - : strings[key] === undefined - ? parseValue(argv[++i]) - : argv[++i]) - } - write(out, key, value, aliases, unknown) - } else { - SHORTSPLIT.lastIndex = 2 - match = SHORTSPLIT.exec(arg) - end = match.index - value = match[0] - - for (k = 1; k < end; k++) { - write( - out, - (key = arg[k]), - k + 1 < end - ? strings[key] === undefined || - arg.substring(k + 1, (k = end)) + value - : value === "" - ? len === i + 1 || argv[i + 1][0] === "-" - ? strings[key] === undefined || "" - : bools[key] !== undefined || - (strings[key] === undefined ? parseValue(argv[++i]) : argv[++i]) - : bools[key] !== undefined || - (strings[key] === undefined ? parseValue(value) : value), - aliases, - unknown - ) - } - } - } - - for (key in values) if (out[key] === undefined) out[key] = values[key] - for (key in bools) if (out[key] === undefined) out[key] = false - for (key in strings) if (out[key] === undefined) out[key] = "" +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } - return out + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; } -module.exports = getopts - - -/***/ }), -/* 449 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var kbn_client_1 = __webpack_require__(450); -exports.KbnClient = kbn_client_1.KbnClient; -var kbn_client_requester_1 = __webpack_require__(451); -exports.uriencode = kbn_client_requester_1.uriencode; +const proto = Object.defineProperties(() => {}, styles); +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; -/***/ }), -/* 450 */ -/***/ (function(module, exports, __webpack_require__) { + builder._styles = _styles; + builder._empty = _empty; -"use strict"; + const self = this; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const kbn_client_requester_1 = __webpack_require__(451); -const kbn_client_status_1 = __webpack_require__(494); -const kbn_client_plugins_1 = __webpack_require__(495); -const kbn_client_version_1 = __webpack_require__(496); -const kbn_client_saved_objects_1 = __webpack_require__(497); -const kbn_client_ui_settings_1 = __webpack_require__(498); -class KbnClient { - /** - * Basic Kibana server client that implements common behaviors for talking - * to the Kibana server from dev tooling. - * - * @param log ToolingLog - * @param kibanaUrls Array of kibana server urls to send requests to - * @param uiSettingDefaults Map of uiSetting values that will be merged with all uiSetting resets - */ - constructor(log, kibanaUrls, uiSettingDefaults) { - this.log = log; - this.kibanaUrls = kibanaUrls; - this.uiSettingDefaults = uiSettingDefaults; - this.requester = new kbn_client_requester_1.KbnClientRequester(this.log, this.kibanaUrls); - this.status = new kbn_client_status_1.KbnClientStatus(this.requester); - this.plugins = new kbn_client_plugins_1.KbnClientPlugins(this.status); - this.version = new kbn_client_version_1.KbnClientVersion(this.status); - this.savedObjects = new kbn_client_saved_objects_1.KbnClientSavedObjects(this.log, this.requester); - this.uiSettings = new kbn_client_ui_settings_1.KbnClientUiSettings(this.log, this.requester, this.uiSettingDefaults); - if (!kibanaUrls.length) { - throw new Error('missing Kibana urls'); - } - } - /** - * Make a direct request to the Kibana server - */ - async request(options) { - return await this.requester.request(options); - } - resolveUrl(relativeUrl) { - return this.requester.resolveUrl(relativeUrl); - } -} -exports.KbnClient = KbnClient; + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); -/***/ }), -/* 451 */ -/***/ (function(module, exports, __webpack_require__) { + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; -"use strict"; + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const url_1 = tslib_1.__importDefault(__webpack_require__(452)); -const axios_1 = tslib_1.__importDefault(__webpack_require__(453)); -const axios_2 = __webpack_require__(492); -const isConcliftOnGetError = (error) => { - return (axios_2.isAxiosResponseError(error) && error.config.method === 'GET' && error.response.status === 409); -}; -exports.uriencode = (strings, ...values) => { - const queue = strings.slice(); - if (queue.length === 0) { - throw new Error('how could strings passed to `uriencode` template tag be empty?'); - } - if (queue.length !== values.length + 1) { - throw new Error('strings and values passed to `uriencode` template tag are unbalanced'); - } - // pull the first string off the queue, there is one less item in `values` - // since the values are always wrapped in strings, so we shift the extra string - // off the queue to balance the queue and values array. - const leadingString = queue.shift(); - return queue.reduce((acc, string, i) => `${acc}${encodeURIComponent(values[i])}${string}`, leadingString); -}; -const DEFAULT_MAX_ATTEMPTS = 5; -const delay = (ms) => new Promise((resolve) => { - setTimeout(resolve, ms); -}); -class KbnClientRequester { - constructor(log, kibanaUrls) { - this.log = log; - this.kibanaUrls = kibanaUrls; - } - pickUrl() { - const url = this.kibanaUrls.shift(); - this.kibanaUrls.push(url); - return url; - } - resolveUrl(relativeUrl = '/') { - return url_1.default.resolve(this.pickUrl(), relativeUrl); - } - async request(options) { - var _a; - const url = url_1.default.resolve(this.pickUrl(), options.path); - const description = options.description || `${options.method} ${url}`; - let attempt = 0; - const maxAttempts = (_a = options.retries, (_a !== null && _a !== void 0 ? _a : DEFAULT_MAX_ATTEMPTS)); - while (true) { - attempt += 1; - try { - const response = await axios_1.default.request({ - method: options.method, - url, - data: options.body, - params: options.query, - headers: { - 'kbn-xsrf': 'kbn-client', - }, - }); - return response.data; - } - catch (error) { - const conflictOnGet = isConcliftOnGetError(error); - const requestedRetries = options.retries !== undefined; - const failedToGetResponse = axios_2.isAxiosRequestError(error); - let errorMessage; - if (conflictOnGet) { - errorMessage = `Conflict on GET (path=${options.path}, attempt=${attempt}/${maxAttempts})`; - this.log.error(errorMessage); - } - else if (requestedRetries || failedToGetResponse) { - errorMessage = `[${description}] request failed (attempt=${attempt}/${maxAttempts})`; - this.log.error(errorMessage); - } - else { - throw error; - } - if (attempt < maxAttempts) { - await delay(1000 * attempt); - continue; - } - throw new Error(`${errorMessage} -- and ran out of retries`); - } - } - } + return builder; } -exports.KbnClientRequester = KbnClientRequester; - - -/***/ }), -/* 452 */ -/***/ (function(module, exports) { - -module.exports = require("url"); - -/***/ }), -/* 453 */ -/***/ (function(module, exports, __webpack_require__) { -module.exports = __webpack_require__(454); +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); -/***/ }), -/* 454 */ -/***/ (function(module, exports, __webpack_require__) { + if (argsLen === 0) { + return ''; + } -"use strict"; + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } -var utils = __webpack_require__(455); -var bind = __webpack_require__(456); -var Axios = __webpack_require__(457); -var mergeConfig = __webpack_require__(488); -var defaults = __webpack_require__(463); + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } -/** - * Create an instance of Axios - * - * @param {Object} defaultConfig The default config for the instance - * @return {Axios} A new instance of Axios - */ -function createInstance(defaultConfig) { - var context = new Axios(defaultConfig); - var instance = bind(Axios.prototype.request, context); + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; - // Copy axios.prototype to instance - utils.extend(instance, Axios.prototype, context); + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } - // Copy context to instance - utils.extend(instance, context); + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; - return instance; + return str; } -// Create the default instance to be exported -var axios = createInstance(defaults); - -// Expose Axios class to allow class inheritance -axios.Axios = Axios; +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } -// Factory for creating new instances -axios.create = function create(instanceConfig) { - return createInstance(mergeConfig(axios.defaults, instanceConfig)); -}; + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; -// Expose Cancel & CancelToken -axios.Cancel = __webpack_require__(489); -axios.CancelToken = __webpack_require__(490); -axios.isCancel = __webpack_require__(462); + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } -// Expose all/spread -axios.all = function all(promises) { - return Promise.all(promises); -}; -axios.spread = __webpack_require__(491); + return template(chalk, parts.join('')); +} -module.exports = axios; +Object.defineProperties(Chalk.prototype, styles); -// Allow use of default import syntax in TypeScript -module.exports.default = axios; +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript /***/ }), -/* 455 */ +/* 427 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(389); +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; -var bind = __webpack_require__(456); - -/*global toString:true*/ - -// utils is a library of generic helper functions non-specific to axios +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; -var toString = Object.prototype.toString; +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; -/** - * Determine if a value is an Array - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Array, otherwise false - */ -function isArray(val) { - return toString.call(val) === '[object Array]'; -} - -/** - * Determine if a value is undefined - * - * @param {Object} val The value to test - * @returns {boolean} True if the value is undefined, otherwise false - */ -function isUndefined(val) { - return typeof val === 'undefined'; -} - -/** - * Determine if a value is a Buffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Buffer, otherwise false - */ -function isBuffer(val) { - return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) - && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); -} - -/** - * Determine if a value is an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an ArrayBuffer, otherwise false - */ -function isArrayBuffer(val) { - return toString.call(val) === '[object ArrayBuffer]'; -} +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], -/** - * Determine if a value is a FormData - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an FormData, otherwise false - */ -function isFormData(val) { - return (typeof FormData !== 'undefined') && (val instanceof FormData); -} + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], -/** - * Determine if a value is a view on an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false - */ -function isArrayBufferView(val) { - var result; - if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { - result = ArrayBuffer.isView(val); - } else { - result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); - } - return result; -} + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; -/** - * Determine if a value is a String - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a String, otherwise false - */ -function isString(val) { - return typeof val === 'string'; -} + // Fix humans + styles.color.grey = styles.color.gray; -/** - * Determine if a value is a Number - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Number, otherwise false - */ -function isNumber(val) { - return typeof val === 'number'; -} + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; -/** - * Determine if a value is an Object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Object, otherwise false - */ -function isObject(val) { - return val !== null && typeof val === 'object'; -} + for (const styleName of Object.keys(group)) { + const style = group[styleName]; -/** - * Determine if a value is a Date - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Date, otherwise false - */ -function isDate(val) { - return toString.call(val) === '[object Date]'; -} + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; -/** - * Determine if a value is a File - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a File, otherwise false - */ -function isFile(val) { - return toString.call(val) === '[object File]'; -} + group[styleName] = styles[styleName]; -/** - * Determine if a value is a Blob - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Blob, otherwise false - */ -function isBlob(val) { - return toString.call(val) === '[object Blob]'; -} + codes.set(style[0], style[1]); + } -/** - * Determine if a value is a Function - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Function, otherwise false - */ -function isFunction(val) { - return toString.call(val) === '[object Function]'; -} + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); -/** - * Determine if a value is a Stream - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Stream, otherwise false - */ -function isStream(val) { - return isObject(val) && isFunction(val.pipe); -} + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } -/** - * Determine if a value is a URLSearchParams object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a URLSearchParams object, otherwise false - */ -function isURLSearchParams(val) { - return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; -} + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; -/** - * Trim excess whitespace off the beginning and end of a string - * - * @param {String} str The String to trim - * @returns {String} The String freed of excess whitespace - */ -function trim(str) { - return str.replace(/^\s*/, '').replace(/\s*$/, ''); -} + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; -/** - * Determine if we're running in a standard browser environment - * - * This allows axios to run in a web worker, and react-native. - * Both environments support XMLHttpRequest, but not fully standard globals. - * - * web workers: - * typeof window -> undefined - * typeof document -> undefined - * - * react-native: - * navigator.product -> 'ReactNative' - * nativescript - * navigator.product -> 'NativeScript' or 'NS' - */ -function isStandardBrowserEnv() { - if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || - navigator.product === 'NativeScript' || - navigator.product === 'NS')) { - return false; - } - return ( - typeof window !== 'undefined' && - typeof document !== 'undefined' - ); -} + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; -/** - * Iterate over an Array or an Object invoking a function for each item. - * - * If `obj` is an Array callback will be called passing - * the value, index, and complete array for each item. - * - * If 'obj' is an Object callback will be called passing - * the value, key, and complete object for each property. - * - * @param {Object|Array} obj The object to iterate - * @param {Function} fn The callback to invoke for each item - */ -function forEach(obj, fn) { - // Don't bother if no value provided - if (obj === null || typeof obj === 'undefined') { - return; - } + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; - // Force an array if not already something iterable - if (typeof obj !== 'object') { - /*eslint no-param-reassign:0*/ - obj = [obj]; - } + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } - if (isArray(obj)) { - // Iterate over array values - for (var i = 0, l = obj.length; i < l; i++) { - fn.call(null, obj[i], i, obj); - } - } else { - // Iterate over object keys - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - fn.call(null, obj[key], key, obj); - } - } - } -} + const suite = colorConvert[key]; -/** - * Accepts varargs expecting each argument to be an object, then - * immutably merges the properties of each object and returns result. - * - * When multiple objects contain the same key the later object in - * the arguments list will take precedence. - * - * Example: - * - * ```js - * var result = merge({foo: 123}, {foo: 456}); - * console.log(result.foo); // outputs 456 - * ``` - * - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ -function merge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (typeof result[key] === 'object' && typeof val === 'object') { - result[key] = merge(result[key], val); - } else { - result[key] = val; - } - } + if (key === 'ansi16') { + key = 'ansi'; + } - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; -} + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } -/** - * Function equal to merge with the difference being that no reference - * to original objects is kept. - * - * @see merge - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ -function deepMerge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (typeof result[key] === 'object' && typeof val === 'object') { - result[key] = deepMerge(result[key], val); - } else if (typeof val === 'object') { - result[key] = deepMerge({}, val); - } else { - result[key] = val; - } - } + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; -} + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } -/** - * Extends object a by mutably adding to it the properties of object b. - * - * @param {Object} a The object to be extended - * @param {Object} b The object to copy properties from - * @param {Object} thisArg The object to bind function to - * @return {Object} The resulting value of object a - */ -function extend(a, b, thisArg) { - forEach(b, function assignValue(val, key) { - if (thisArg && typeof val === 'function') { - a[key] = bind(val, thisArg); - } else { - a[key] = val; - } - }); - return a; + return styles; } -module.exports = { - isArray: isArray, - isArrayBuffer: isArrayBuffer, - isBuffer: isBuffer, - isFormData: isFormData, - isArrayBufferView: isArrayBufferView, - isString: isString, - isNumber: isNumber, - isObject: isObject, - isUndefined: isUndefined, - isDate: isDate, - isFile: isFile, - isBlob: isBlob, - isFunction: isFunction, - isStream: isStream, - isURLSearchParams: isURLSearchParams, - isStandardBrowserEnv: isStandardBrowserEnv, - forEach: forEach, - merge: merge, - deepMerge: deepMerge, - extend: extend, - trim: trim -}; +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) /***/ }), -/* 456 */ +/* 428 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); -module.exports = function bind(fn, thisArg) { - return function wrap() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - return fn.apply(thisArg, args); - }; -}; - - -/***/ }), -/* 457 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; +const env = process.env; +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} -var utils = __webpack_require__(455); -var buildURL = __webpack_require__(458); -var InterceptorManager = __webpack_require__(459); -var dispatchRequest = __webpack_require__(460); -var mergeConfig = __webpack_require__(488); +function translateLevel(level) { + if (level === 0) { + return false; + } -/** - * Create a new instance of Axios - * - * @param {Object} instanceConfig The default config for the instance - */ -function Axios(instanceConfig) { - this.defaults = instanceConfig; - this.interceptors = { - request: new InterceptorManager(), - response: new InterceptorManager() - }; + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; } -/** - * Dispatch a request - * - * @param {Object} config The config specific for this request (merged with this.defaults) - */ -Axios.prototype.request = function request(config) { - /*eslint no-param-reassign:0*/ - // Allow for axios('example/url'[, config]) a la fetch API - if (typeof config === 'string') { - config = arguments[1] || {}; - config.url = arguments[0]; - } else { - config = config || {}; - } +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } - config = mergeConfig(this.defaults, config); + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } - // Set config.method - if (config.method) { - config.method = config.method.toLowerCase(); - } else if (this.defaults.method) { - config.method = this.defaults.method.toLowerCase(); - } else { - config.method = 'get'; - } + if (hasFlag('color=256')) { + return 2; + } - // Hook up interceptors middleware - var chain = [dispatchRequest, undefined]; - var promise = Promise.resolve(config); + if (stream && !stream.isTTY && forceColor !== true) { + // VS code debugger doesn't have isTTY set + if (env.VSCODE_PID) { + return 1; + } + return 0; + } - this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { - chain.unshift(interceptor.fulfilled, interceptor.rejected); - }); + const min = forceColor ? 1 : 0; - this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { - chain.push(interceptor.fulfilled, interceptor.rejected); - }); + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } - while (chain.length) { - promise = promise.then(chain.shift(), chain.shift()); - } + return 1; + } - return promise; -}; + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } -Axios.prototype.getUri = function getUri(config) { - config = mergeConfig(this.defaults, config); - return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); -}; + return min; + } -// Provide aliases for supported request methods -utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url - })); - }; -}); + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, data, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url, - data: data - })); - }; -}); + if (env.COLORTERM === 'truecolor') { + return 3; + } -module.exports = Axios; + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } -/***/ }), -/* 458 */ -/***/ (function(module, exports, __webpack_require__) { + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } -"use strict"; + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + if ('COLORTERM' in env) { + return 1; + } -var utils = __webpack_require__(455); + if (env.TERM === 'dumb') { + return min; + } -function encode(val) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%20/g, '+'). - replace(/%5B/gi, '['). - replace(/%5D/gi, ']'); + return min; } -/** - * Build a URL by appending params to the end - * - * @param {string} url The base of the url (e.g., http://www.google.com) - * @param {object} [params] The params to be appended - * @returns {string} The formatted url - */ -module.exports = function buildURL(url, params, paramsSerializer) { - /*eslint no-param-reassign:0*/ - if (!params) { - return url; - } - - var serializedParams; - if (paramsSerializer) { - serializedParams = paramsSerializer(params); - } else if (utils.isURLSearchParams(params)) { - serializedParams = params.toString(); - } else { - var parts = []; - - utils.forEach(params, function serialize(val, key) { - if (val === null || typeof val === 'undefined') { - return; - } - - if (utils.isArray(val)) { - key = key + '[]'; - } else { - val = [val]; - } - - utils.forEach(val, function parseValue(v) { - if (utils.isDate(v)) { - v = v.toISOString(); - } else if (utils.isObject(v)) { - v = JSON.stringify(v); - } - parts.push(encode(key) + '=' + encode(v)); - }); - }); - - serializedParams = parts.join('&'); - } - - if (serializedParams) { - var hashmarkIndex = url.indexOf('#'); - if (hashmarkIndex !== -1) { - url = url.slice(0, hashmarkIndex); - } - - url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; - } +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} - return url; +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) }; /***/ }), -/* 459 */ +/* 429 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; -var utils = __webpack_require__(455); - -function InterceptorManager() { - this.handlers = []; -} +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); -/** - * Add a new interceptor to the stack - * - * @param {Function} fulfilled The function to handle `then` for a `Promise` - * @param {Function} rejected The function to handle `reject` for a `Promise` - * - * @return {Number} An ID used to remove interceptor later - */ -InterceptorManager.prototype.use = function use(fulfilled, rejected) { - this.handlers.push({ - fulfilled: fulfilled, - rejected: rejected - }); - return this.handlers.length - 1; -}; +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } -/** - * Remove an interceptor from the stack - * - * @param {Number} id The ID that was returned by `use` - */ -InterceptorManager.prototype.eject = function eject(id) { - if (this.handlers[id]) { - this.handlers[id] = null; - } -}; + return ESCAPES.get(c) || c; +} -/** - * Iterate over all the registered interceptors - * - * This method is particularly useful for skipping over any - * interceptors that may have become `null` calling `eject`. - * - * @param {Function} fn The function to call for each interceptor - */ -InterceptorManager.prototype.forEach = function forEach(fn) { - utils.forEach(this.handlers, function forEachHandler(h) { - if (h !== null) { - fn(h); - } - }); -}; +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; -module.exports = InterceptorManager; + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } + return results; +} -/***/ }), -/* 460 */ -/***/ (function(module, exports, __webpack_require__) { +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; -"use strict"; + const results = []; + let matches; + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; -var utils = __webpack_require__(455); -var transformData = __webpack_require__(461); -var isCancel = __webpack_require__(462); -var defaults = __webpack_require__(463); + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } -/** - * Throws a `Cancel` if cancellation has been requested. - */ -function throwIfCancellationRequested(config) { - if (config.cancelToken) { - config.cancelToken.throwIfRequested(); - } + return results; } -/** - * Dispatch a request to the server using the configured adapter. - * - * @param {object} config The config that is to be used for the request - * @returns {Promise} The Promise to be fulfilled - */ -module.exports = function dispatchRequest(config) { - throwIfCancellationRequested(config); +function buildStyle(chalk, styles) { + const enabled = {}; - // Ensure headers exist - config.headers = config.headers || {}; + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } - // Transform request data - config.data = transformData( - config.data, - config.headers, - config.transformRequest - ); + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } - // Flatten headers - config.headers = utils.merge( - config.headers.common || {}, - config.headers[config.method] || {}, - config.headers - ); + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } - utils.forEach( - ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], - function cleanHeaderConfig(method) { - delete config.headers[method]; - } - ); + return current; +} - var adapter = config.adapter || defaults.adapter; +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; - return adapter(config).then(function onAdapterResolution(response) { - throwIfCancellationRequested(config); + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - // Transform response data - response.data = transformData( - response.data, - response.headers, - config.transformResponse - ); + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); - return response; - }, function onAdapterRejection(reason) { - if (!isCancel(reason)) { - throwIfCancellationRequested(config); + chunks.push(chunk.join('')); - // Transform response data - if (reason && reason.response) { - reason.response.data = transformData( - reason.response.data, - reason.response.headers, - config.transformResponse - ); - } - } + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } - return Promise.reject(reason); - }); + return chunks.join(''); }; /***/ }), -/* 461 */ +/* 430 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -var utils = __webpack_require__(455); - -/** - * Transform the data for a request or a response +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 * - * @param {Object|String} data The data to be transformed - * @param {Array} headers The headers for the request or response - * @param {Array|Function} fns A single function or Array of functions - * @returns {*} The resulting transformed data + * http://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. */ -module.exports = function transformData(data, headers, fns) { - /*eslint no-param-reassign:0*/ - utils.forEach(fns, function transform(fn) { - data = fn(data, headers); - }); - - return data; -}; +Object.defineProperty(exports, "__esModule", { value: true }); +const path_1 = __webpack_require__(4); +exports.CA_CERT_PATH = path_1.resolve(__dirname, '../certs/ca.crt'); +exports.ES_KEY_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.key'); +exports.ES_CERT_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.crt'); +exports.ES_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.p12'); +exports.ES_P12_PASSWORD = 'storepass'; +exports.ES_EMPTYPASSWORD_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch_emptypassword.p12'); +exports.ES_NOPASSWORD_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch_nopassword.p12'); +exports.KBN_KEY_PATH = path_1.resolve(__dirname, '../certs/kibana.key'); +exports.KBN_CERT_PATH = path_1.resolve(__dirname, '../certs/kibana.crt'); +exports.KBN_P12_PATH = path_1.resolve(__dirname, '../certs/kibana.p12'); +exports.KBN_P12_PASSWORD = 'storepass'; /***/ }), -/* 462 */ +/* 431 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -module.exports = function isCancel(value) { - return !!(value && value.__CANCEL__); -}; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var run_1 = __webpack_require__(432); +exports.run = run_1.run; +var fail_1 = __webpack_require__(433); +exports.createFailError = fail_1.createFailError; +exports.createFlagError = fail_1.createFlagError; +exports.combineErrors = fail_1.combineErrors; +exports.isFailError = fail_1.isFailError; /***/ }), -/* 463 */ +/* 432 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -var utils = __webpack_require__(455); -var normalizeHeaderName = __webpack_require__(464); - -var DEFAULT_CONTENT_TYPE = { - 'Content-Type': 'application/x-www-form-urlencoded' -}; - -function setContentTypeIfUnset(headers, value) { - if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { - headers['Content-Type'] = value; - } -} - -function getDefaultAdapter() { - var adapter; - if (typeof XMLHttpRequest !== 'undefined') { - // For browsers use XHR adapter - adapter = __webpack_require__(465); - } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { - // For node use HTTP adapter - adapter = __webpack_require__(475); - } - return adapter; -} - -var defaults = { - adapter: getDefaultAdapter(), - - transformRequest: [function transformRequest(data, headers) { - normalizeHeaderName(headers, 'Accept'); - normalizeHeaderName(headers, 'Content-Type'); - if (utils.isFormData(data) || - utils.isArrayBuffer(data) || - utils.isBuffer(data) || - utils.isStream(data) || - utils.isFile(data) || - utils.isBlob(data) - ) { - return data; - } - if (utils.isArrayBufferView(data)) { - return data.buffer; - } - if (utils.isURLSearchParams(data)) { - setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); - return data.toString(); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const util_1 = __webpack_require__(397); +// @ts-ignore @types are outdated and module is super simple +const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(339)); +const tooling_log_1 = __webpack_require__(400); +const fail_1 = __webpack_require__(433); +const flags_1 = __webpack_require__(434); +const proc_runner_1 = __webpack_require__(7); +async function run(fn, options = {}) { + var _a; + const flags = flags_1.getFlags(process.argv.slice(2), options); + if (flags.help) { + process.stderr.write(flags_1.getHelp(options)); + process.exit(1); } - if (utils.isObject(data)) { - setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); - return JSON.stringify(data); + const log = new tooling_log_1.ToolingLog({ + level: tooling_log_1.pickLevelFromFlags(flags), + writeTo: process.stdout, + }); + process.on('unhandledRejection', (error) => { + log.error('UNHANDLED PROMISE REJECTION'); + log.error(error instanceof Error + ? error + : new Error(`non-Error type rejection value: ${util_1.inspect(error)}`)); + process.exit(1); + }); + const handleErrorWithoutExit = (error) => { + if (fail_1.isFailError(error)) { + log.error(error.message); + if (error.showHelp) { + log.write(flags_1.getHelp(options)); + } + process.exitCode = error.exitCode; + } + else { + log.error('UNHANDLED ERROR'); + log.error(error); + process.exitCode = 1; + } + }; + const doCleanup = () => { + const tasks = cleanupTasks.slice(0); + cleanupTasks.length = 0; + for (const task of tasks) { + try { + task(); + } + catch (error) { + handleErrorWithoutExit(error); + } + } + }; + const unhookExit = exit_hook_1.default(doCleanup); + const cleanupTasks = [unhookExit]; + try { + if (!((_a = options.flags) === null || _a === void 0 ? void 0 : _a.allowUnexpected) && flags.unexpected.length) { + throw fail_1.createFlagError(`Unknown flag(s) "${flags.unexpected.join('", "')}"`); + } + try { + await proc_runner_1.withProcRunner(log, async (procRunner) => { + await fn({ + log, + flags, + procRunner, + addCleanupTask: (task) => cleanupTasks.push(task), + }); + }); + } + finally { + doCleanup(); + } } - return data; - }], - - transformResponse: [function transformResponse(data) { - /*eslint no-param-reassign:0*/ - if (typeof data === 'string') { - try { - data = JSON.parse(data); - } catch (e) { /* Ignore */ } + catch (error) { + handleErrorWithoutExit(error); + process.exit(); } - return data; - }], - - /** - * A timeout in milliseconds to abort a request. If set to 0 (default) a - * timeout is not created. - */ - timeout: 0, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - - maxContentLength: -1, - - validateStatus: function validateStatus(status) { - return status >= 200 && status < 300; - } -}; +} +exports.run = run; -defaults.headers = { - common: { - 'Accept': 'application/json, text/plain, */*' - } -}; -utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { - defaults.headers[method] = {}; -}); +/***/ }), +/* 433 */ +/***/ (function(module, exports, __webpack_require__) { -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); -}); +"use strict"; -module.exports = defaults; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const util_1 = __webpack_require__(397); +const FAIL_TAG = Symbol('fail error'); +function createFailError(reason, options = {}) { + const { exitCode = 1, showHelp = false } = options; + return Object.assign(new Error(reason), { + exitCode, + showHelp, + [FAIL_TAG]: true, + }); +} +exports.createFailError = createFailError; +function createFlagError(reason) { + return createFailError(reason, { + showHelp: true, + }); +} +exports.createFlagError = createFlagError; +function isFailError(error) { + return Boolean(error && error[FAIL_TAG]); +} +exports.isFailError = isFailError; +function combineErrors(errors) { + if (errors.length === 1) { + return errors[0]; + } + const exitCode = errors + .filter(isFailError) + .reduce((acc, error) => Math.max(acc, error.exitCode), 1); + const showHelp = errors.some((error) => isFailError(error) && error.showHelp); + const message = errors.reduce((acc, error) => { + if (isFailError(error)) { + return acc + '\n' + error.message; + } + return acc + `\nUNHANDLED ERROR\n${util_1.inspect(error)}`; + }, ''); + return createFailError(`${errors.length} errors:\n${message}`, { + exitCode, + showHelp, + }); +} +exports.combineErrors = combineErrors; /***/ }), -/* 464 */ +/* 434 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const path_1 = __webpack_require__(4); +const dedent_1 = tslib_1.__importDefault(__webpack_require__(2)); +const getopts_1 = tslib_1.__importDefault(__webpack_require__(435)); +function getFlags(argv, options) { + const unexpectedNames = new Set(); + const flagOpts = options.flags || {}; + const { verbose, quiet, silent, debug, help, _, ...others } = getopts_1.default(argv, { + string: flagOpts.string, + boolean: [...(flagOpts.boolean || []), 'verbose', 'quiet', 'silent', 'debug', 'help'], + alias: { + ...(flagOpts.alias || {}), + v: 'verbose', + }, + default: flagOpts.default, + unknown: (name) => { + unexpectedNames.add(name); + return flagOpts.guessTypesForUnexpectedFlags; + }, + }); + const unexpected = []; + for (const unexpectedName of unexpectedNames) { + const matchingArgv = []; + iterArgv: for (const [i, v] of argv.entries()) { + for (const prefix of ['--', '-']) { + if (v.startsWith(prefix)) { + // -/--name=value + if (v.startsWith(`${prefix}${unexpectedName}=`)) { + matchingArgv.push(v); + continue iterArgv; + } + // -/--name (value possibly follows) + if (v === `${prefix}${unexpectedName}`) { + matchingArgv.push(v); + // value follows -/--name + if (argv.length > i + 1 && !argv[i + 1].startsWith('-')) { + matchingArgv.push(argv[i + 1]); + } + continue iterArgv; + } + } + } + // special case for `--no-{flag}` disabling of boolean flags + if (v === `--no-${unexpectedName}`) { + matchingArgv.push(v); + continue iterArgv; + } + // special case for shortcut flags formatted as `-abc` where `a`, `b`, + // and `c` will be three separate unexpected flags + if (unexpectedName.length === 1 && + v[0] === '-' && + v[1] !== '-' && + !v.includes('=') && + v.includes(unexpectedName)) { + matchingArgv.push(`-${unexpectedName}`); + continue iterArgv; + } + } + if (matchingArgv.length) { + unexpected.push(...matchingArgv); + } + else { + throw new Error(`unable to find unexpected flag named "${unexpectedName}"`); + } + } + return { + verbose, + quiet, + silent, + debug, + help, + _, + unexpected, + ...others, + }; +} +exports.getFlags = getFlags; +function getHelp(options) { + var _a, _b; + const usage = options.usage || `node ${path_1.relative(process.cwd(), process.argv[1])}`; + const optionHelp = (dedent_1.default(((_b = (_a = options) === null || _a === void 0 ? void 0 : _a.flags) === null || _b === void 0 ? void 0 : _b.help) || '') + + '\n' + + dedent_1.default ` + --verbose, -v Log verbosely + --debug Log debug messages (less than verbose) + --quiet Only log errors + --silent Don't log anything + --help Show this message + `) + .split('\n') + .filter(Boolean) + .join('\n '); + return ` + ${usage} -var utils = __webpack_require__(455); + ${dedent_1.default(options.description || 'Runs a dev task') + .split('\n') + .join('\n ')} -module.exports = function normalizeHeaderName(headers, normalizedName) { - utils.forEach(headers, function processHeader(value, name) { - if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { - headers[normalizedName] = value; - delete headers[name]; - } - }); -}; + Options: + ${optionHelp + '\n\n'}`; +} +exports.getHelp = getHelp; /***/ }), -/* 465 */ +/* 435 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(455); -var settle = __webpack_require__(466); -var buildURL = __webpack_require__(458); -var buildFullPath = __webpack_require__(469); -var parseHeaders = __webpack_require__(472); -var isURLSameOrigin = __webpack_require__(473); -var createError = __webpack_require__(467); - -module.exports = function xhrAdapter(config) { - return new Promise(function dispatchXhrRequest(resolve, reject) { - var requestData = config.data; - var requestHeaders = config.headers; - - if (utils.isFormData(requestData)) { - delete requestHeaders['Content-Type']; // Let the browser set it - } +const EMPTYARR = [] +const SHORTSPLIT = /$|[!-@[-`{-~][\s\S]*/g +const isArray = Array.isArray - var request = new XMLHttpRequest(); +const parseValue = function(any) { + if (any === "") return "" + if (any === "false") return false + const maybe = Number(any) + return maybe * 0 === 0 ? maybe : any +} - // HTTP basic authentication - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password || ''; - requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); - } +const parseAlias = function(aliases) { + let out = {}, + key, + alias, + prev, + len, + any, + i, + k - var fullPath = buildFullPath(config.baseURL, config.url); - request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + for (key in aliases) { + any = aliases[key] + alias = out[key] = isArray(any) ? any : [any] - // Set the request timeout in MS - request.timeout = config.timeout; + for (i = 0, len = alias.length; i < len; i++) { + prev = out[alias[i]] = [key] - // Listen for ready state - request.onreadystatechange = function handleLoad() { - if (!request || request.readyState !== 4) { - return; + for (k = 0; k < len; k++) { + if (i !== k) prev.push(alias[k]) } + } + } - // The request errored out and we didn't get a response, this will be - // handled by onerror instead - // With one exception: request that using file: protocol, most browsers - // will return status as 0 even though it's a successful request - if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { - return; - } + return out +} - // Prepare the response - var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; - var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; - var response = { - data: responseData, - status: request.status, - statusText: request.statusText, - headers: responseHeaders, - config: config, - request: request - }; +const parseDefault = function(aliases, defaults) { + let out = {}, + key, + alias, + value, + len, + i - settle(resolve, reject, response); + for (key in defaults) { + value = defaults[key] + alias = aliases[key] - // Clean up request - request = null; - }; + out[key] = value - // Handle browser request cancellation (as opposed to a manual cancellation) - request.onabort = function handleAbort() { - if (!request) { - return; + if (alias === undefined) { + aliases[key] = EMPTYARR + } else { + for (i = 0, len = alias.length; i < len; i++) { + out[alias[i]] = value } + } + } - reject(createError('Request aborted', config, 'ECONNABORTED', request)); + return out +} - // Clean up request - request = null; - }; +const parseOptions = function(aliases, options, value) { + let out = {}, + key, + alias, + len, + end, + i, + k - // Handle low level network errors - request.onerror = function handleError() { - // Real errors are hidden from us by the browser - // onerror should only fire if it's a network error - reject(createError('Network Error', config, null, request)); + if (options !== undefined) { + for (i = 0, len = options.length; i < len; i++) { + key = options[i] + alias = aliases[key] - // Clean up request - request = null; - }; + out[key] = value - // Handle timeout - request.ontimeout = function handleTimeout() { - var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; - if (config.timeoutErrorMessage) { - timeoutErrorMessage = config.timeoutErrorMessage; + if (alias === undefined) { + aliases[key] = EMPTYARR + } else { + for (k = 0, end = alias.length; k < end; k++) { + out[alias[k]] = value + } } - reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', - request)); + } + } - // Clean up request - request = null; - }; + return out +} - // Add xsrf header - // This is only done if running in a standard browser environment. - // Specifically not if we're in a web worker, or react-native. - if (utils.isStandardBrowserEnv()) { - var cookies = __webpack_require__(474); +const write = function(out, key, value, aliases, unknown) { + let i, + prev, + alias = aliases[key], + len = alias === undefined ? -1 : alias.length - // Add xsrf header - var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? - cookies.read(config.xsrfCookieName) : - undefined; + if (len >= 0 || unknown === undefined || unknown(key)) { + prev = out[key] - if (xsrfValue) { - requestHeaders[config.xsrfHeaderName] = xsrfValue; + if (prev === undefined) { + out[key] = value + } else { + if (isArray(prev)) { + prev.push(value) + } else { + out[key] = [prev, value] } } - // Add headers to the request - if ('setRequestHeader' in request) { - utils.forEach(requestHeaders, function setRequestHeader(val, key) { - if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { - // Remove Content-Type if data is undefined - delete requestHeaders[key]; - } else { - // Otherwise add header to the request - request.setRequestHeader(key, val); - } - }); + for (i = 0; i < len; i++) { + out[alias[i]] = out[key] } + } +} - // Add withCredentials to request if needed - if (!utils.isUndefined(config.withCredentials)) { - request.withCredentials = !!config.withCredentials; - } +const getopts = function(argv, opts) { + let unknown = (opts = opts || {}).unknown, + aliases = parseAlias(opts.alias), + strings = parseOptions(aliases, opts.string, ""), + values = parseDefault(aliases, opts.default), + bools = parseOptions(aliases, opts.boolean, false), + stopEarly = opts.stopEarly, + _ = [], + out = { _ }, + i = 0, + k = 0, + len = argv.length, + key, + arg, + end, + match, + value - // Add responseType to request if needed - if (config.responseType) { - try { - request.responseType = config.responseType; - } catch (e) { - // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. - // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. - if (config.responseType !== 'json') { - throw e; - } - } - } + for (; i < len; i++) { + arg = argv[i] - // Handle progress if needed - if (typeof config.onDownloadProgress === 'function') { - request.addEventListener('progress', config.onDownloadProgress); - } + if (arg[0] !== "-" || arg === "-") { + if (stopEarly) while (i < len) _.push(argv[i++]) + else _.push(arg) + } else if (arg === "--") { + while (++i < len) _.push(argv[i]) + } else if (arg[1] === "-") { + end = arg.indexOf("=", 2) + if (arg[2] === "n" && arg[3] === "o" && arg[4] === "-") { + key = arg.slice(5, end >= 0 ? end : undefined) + value = false + } else if (end >= 0) { + key = arg.slice(2, end) + value = + bools[key] !== undefined || + (strings[key] === undefined + ? parseValue(arg.slice(end + 1)) + : arg.slice(end + 1)) + } else { + key = arg.slice(2) + value = + bools[key] !== undefined || + (len === i + 1 || argv[i + 1][0] === "-" + ? strings[key] === undefined + ? true + : "" + : strings[key] === undefined + ? parseValue(argv[++i]) + : argv[++i]) + } + write(out, key, value, aliases, unknown) + } else { + SHORTSPLIT.lastIndex = 2 + match = SHORTSPLIT.exec(arg) + end = match.index + value = match[0] - // Not all browsers support upload events - if (typeof config.onUploadProgress === 'function' && request.upload) { - request.upload.addEventListener('progress', config.onUploadProgress); + for (k = 1; k < end; k++) { + write( + out, + (key = arg[k]), + k + 1 < end + ? strings[key] === undefined || + arg.substring(k + 1, (k = end)) + value + : value === "" + ? len === i + 1 || argv[i + 1][0] === "-" + ? strings[key] === undefined || "" + : bools[key] !== undefined || + (strings[key] === undefined ? parseValue(argv[++i]) : argv[++i]) + : bools[key] !== undefined || + (strings[key] === undefined ? parseValue(value) : value), + aliases, + unknown + ) + } } + } - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (!request) { - return; - } - - request.abort(); - reject(cancel); - // Clean up request - request = null; - }); - } + for (key in values) if (out[key] === undefined) out[key] = values[key] + for (key in bools) if (out[key] === undefined) out[key] = false + for (key in strings) if (out[key] === undefined) out[key] = "" - if (requestData === undefined) { - requestData = null; - } + return out +} - // Send the request - request.send(requestData); - }); -}; +module.exports = getopts /***/ }), -/* 466 */ +/* 436 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -var createError = __webpack_require__(467); - -/** - * Resolve or reject a Promise based on response status. +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 * - * @param {Function} resolve A function that resolves the promise. - * @param {Function} reject A function that rejects the promise. - * @param {object} response The response. + * http://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. */ -module.exports = function settle(resolve, reject, response) { - var validateStatus = response.config.validateStatus; - if (!validateStatus || validateStatus(response.status)) { - resolve(response); - } else { - reject(createError( - 'Request failed with status code ' + response.status, - response.config, - null, - response.request, - response - )); - } -}; +Object.defineProperty(exports, "__esModule", { value: true }); +var kbn_client_1 = __webpack_require__(437); +exports.KbnClient = kbn_client_1.KbnClient; +var kbn_client_requester_1 = __webpack_require__(438); +exports.uriencode = kbn_client_requester_1.uriencode; /***/ }), -/* 467 */ +/* 437 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -var enhanceError = __webpack_require__(468); - -/** - * Create an Error with the specified message, config, error code, request and response. +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 * - * @param {string} message The error message. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The created error. + * http://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. */ -module.exports = function createError(message, config, code, request, response) { - var error = new Error(message); - return enhanceError(error, config, code, request, response); -}; +Object.defineProperty(exports, "__esModule", { value: true }); +const kbn_client_requester_1 = __webpack_require__(438); +const kbn_client_status_1 = __webpack_require__(481); +const kbn_client_plugins_1 = __webpack_require__(482); +const kbn_client_version_1 = __webpack_require__(483); +const kbn_client_saved_objects_1 = __webpack_require__(484); +const kbn_client_ui_settings_1 = __webpack_require__(485); +class KbnClient { + /** + * Basic Kibana server client that implements common behaviors for talking + * to the Kibana server from dev tooling. + * + * @param log ToolingLog + * @param kibanaUrls Array of kibana server urls to send requests to + * @param uiSettingDefaults Map of uiSetting values that will be merged with all uiSetting resets + */ + constructor(log, kibanaUrls, uiSettingDefaults) { + this.log = log; + this.kibanaUrls = kibanaUrls; + this.uiSettingDefaults = uiSettingDefaults; + this.requester = new kbn_client_requester_1.KbnClientRequester(this.log, this.kibanaUrls); + this.status = new kbn_client_status_1.KbnClientStatus(this.requester); + this.plugins = new kbn_client_plugins_1.KbnClientPlugins(this.status); + this.version = new kbn_client_version_1.KbnClientVersion(this.status); + this.savedObjects = new kbn_client_saved_objects_1.KbnClientSavedObjects(this.log, this.requester); + this.uiSettings = new kbn_client_ui_settings_1.KbnClientUiSettings(this.log, this.requester, this.uiSettingDefaults); + if (!kibanaUrls.length) { + throw new Error('missing Kibana urls'); + } + } + /** + * Make a direct request to the Kibana server + */ + async request(options) { + return await this.requester.request(options); + } + resolveUrl(relativeUrl) { + return this.requester.resolveUrl(relativeUrl); + } +} +exports.KbnClient = KbnClient; /***/ }), -/* 468 */ +/* 438 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -/** - * Update an Error with the specified config, error code, and response. +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 * - * @param {Error} error The error to update. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The error. + * http://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. */ -module.exports = function enhanceError(error, config, code, request, response) { - error.config = config; - if (code) { - error.code = code; - } - - error.request = request; - error.response = response; - error.isAxiosError = true; - - error.toJSON = function() { - return { - // Standard - message: this.message, - name: this.name, - // Microsoft - description: this.description, - number: this.number, - // Mozilla - fileName: this.fileName, - lineNumber: this.lineNumber, - columnNumber: this.columnNumber, - stack: this.stack, - // Axios - config: this.config, - code: this.code - }; - }; - return error; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const url_1 = tslib_1.__importDefault(__webpack_require__(439)); +const axios_1 = tslib_1.__importDefault(__webpack_require__(440)); +const axios_2 = __webpack_require__(479); +const isConcliftOnGetError = (error) => { + return (axios_2.isAxiosResponseError(error) && error.config.method === 'GET' && error.response.status === 409); +}; +exports.uriencode = (strings, ...values) => { + const queue = strings.slice(); + if (queue.length === 0) { + throw new Error('how could strings passed to `uriencode` template tag be empty?'); + } + if (queue.length !== values.length + 1) { + throw new Error('strings and values passed to `uriencode` template tag are unbalanced'); + } + // pull the first string off the queue, there is one less item in `values` + // since the values are always wrapped in strings, so we shift the extra string + // off the queue to balance the queue and values array. + const leadingString = queue.shift(); + return queue.reduce((acc, string, i) => `${acc}${encodeURIComponent(values[i])}${string}`, leadingString); }; +const DEFAULT_MAX_ATTEMPTS = 5; +const delay = (ms) => new Promise((resolve) => { + setTimeout(resolve, ms); +}); +class KbnClientRequester { + constructor(log, kibanaUrls) { + this.log = log; + this.kibanaUrls = kibanaUrls; + } + pickUrl() { + const url = this.kibanaUrls.shift(); + this.kibanaUrls.push(url); + return url; + } + resolveUrl(relativeUrl = '/') { + return url_1.default.resolve(this.pickUrl(), relativeUrl); + } + async request(options) { + var _a; + const url = url_1.default.resolve(this.pickUrl(), options.path); + const description = options.description || `${options.method} ${url}`; + let attempt = 0; + const maxAttempts = (_a = options.retries, (_a !== null && _a !== void 0 ? _a : DEFAULT_MAX_ATTEMPTS)); + while (true) { + attempt += 1; + try { + const response = await axios_1.default.request({ + method: options.method, + url, + data: options.body, + params: options.query, + headers: { + 'kbn-xsrf': 'kbn-client', + }, + }); + return response.data; + } + catch (error) { + const conflictOnGet = isConcliftOnGetError(error); + const requestedRetries = options.retries !== undefined; + const failedToGetResponse = axios_2.isAxiosRequestError(error); + let errorMessage; + if (conflictOnGet) { + errorMessage = `Conflict on GET (path=${options.path}, attempt=${attempt}/${maxAttempts})`; + this.log.error(errorMessage); + } + else if (requestedRetries || failedToGetResponse) { + errorMessage = `[${description}] request failed (attempt=${attempt}/${maxAttempts})`; + this.log.error(errorMessage); + } + else { + throw error; + } + if (attempt < maxAttempts) { + await delay(1000 * attempt); + continue; + } + throw new Error(`${errorMessage} -- and ran out of retries`); + } + } + } +} +exports.KbnClientRequester = KbnClientRequester; /***/ }), -/* 469 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var isAbsoluteURL = __webpack_require__(470); -var combineURLs = __webpack_require__(471); - -/** - * Creates a new URL by combining the baseURL with the requestedURL, - * only when the requestedURL is not already an absolute URL. - * If the requestURL is absolute, this function returns the requestedURL untouched. - * - * @param {string} baseURL The base URL - * @param {string} requestedURL Absolute or relative URL to combine - * @returns {string} The combined full path - */ -module.exports = function buildFullPath(baseURL, requestedURL) { - if (baseURL && !isAbsoluteURL(requestedURL)) { - return combineURLs(baseURL, requestedURL); - } - return requestedURL; -}; +/* 439 */ +/***/ (function(module, exports) { +module.exports = require("url"); /***/ }), -/* 470 */ +/* 440 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -/** - * Determines whether the specified URL is absolute - * - * @param {string} url The URL to test - * @returns {boolean} True if the specified URL is absolute, otherwise false - */ -module.exports = function isAbsoluteURL(url) { - // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). - // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed - // by any combination of letters, digits, plus, period, or hyphen. - return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); -}; - +module.exports = __webpack_require__(441); /***/ }), -/* 471 */ +/* 441 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +var utils = __webpack_require__(442); +var bind = __webpack_require__(443); +var Axios = __webpack_require__(444); +var mergeConfig = __webpack_require__(475); +var defaults = __webpack_require__(450); + /** - * Creates a new URL by combining the specified URLs + * Create an instance of Axios * - * @param {string} baseURL The base URL - * @param {string} relativeURL The relative URL - * @returns {string} The combined URL + * @param {Object} defaultConfig The default config for the instance + * @return {Axios} A new instance of Axios */ -module.exports = function combineURLs(baseURL, relativeURL) { - return relativeURL - ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') - : baseURL; -}; - +function createInstance(defaultConfig) { + var context = new Axios(defaultConfig); + var instance = bind(Axios.prototype.request, context); -/***/ }), -/* 472 */ -/***/ (function(module, exports, __webpack_require__) { + // Copy axios.prototype to instance + utils.extend(instance, Axios.prototype, context); -"use strict"; + // Copy context to instance + utils.extend(instance, context); + return instance; +} -var utils = __webpack_require__(455); +// Create the default instance to be exported +var axios = createInstance(defaults); -// Headers whose duplicates are ignored by node -// c.f. https://nodejs.org/api/http.html#http_message_headers -var ignoreDuplicateOf = [ - 'age', 'authorization', 'content-length', 'content-type', 'etag', - 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', - 'last-modified', 'location', 'max-forwards', 'proxy-authorization', - 'referer', 'retry-after', 'user-agent' -]; +// Expose Axios class to allow class inheritance +axios.Axios = Axios; -/** - * Parse headers into an object - * - * ``` - * Date: Wed, 27 Aug 2014 08:58:49 GMT - * Content-Type: application/json - * Connection: keep-alive - * Transfer-Encoding: chunked - * ``` - * - * @param {String} headers Headers needing to be parsed - * @returns {Object} Headers parsed into an object - */ -module.exports = function parseHeaders(headers) { - var parsed = {}; - var key; - var val; - var i; +// Factory for creating new instances +axios.create = function create(instanceConfig) { + return createInstance(mergeConfig(axios.defaults, instanceConfig)); +}; - if (!headers) { return parsed; } +// Expose Cancel & CancelToken +axios.Cancel = __webpack_require__(476); +axios.CancelToken = __webpack_require__(477); +axios.isCancel = __webpack_require__(449); - utils.forEach(headers.split('\n'), function parser(line) { - i = line.indexOf(':'); - key = utils.trim(line.substr(0, i)).toLowerCase(); - val = utils.trim(line.substr(i + 1)); +// Expose all/spread +axios.all = function all(promises) { + return Promise.all(promises); +}; +axios.spread = __webpack_require__(478); - if (key) { - if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { - return; - } - if (key === 'set-cookie') { - parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); - } else { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - } - }); +module.exports = axios; - return parsed; -}; +// Allow use of default import syntax in TypeScript +module.exports.default = axios; /***/ }), -/* 473 */ +/* 442 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(455); +var bind = __webpack_require__(443); -module.exports = ( - utils.isStandardBrowserEnv() ? +/*global toString:true*/ - // Standard browser envs have full support of the APIs needed to test - // whether the request URL is of the same origin as current location. - (function standardBrowserEnv() { - var msie = /(msie|trident)/i.test(navigator.userAgent); - var urlParsingNode = document.createElement('a'); - var originURL; +// utils is a library of generic helper functions non-specific to axios - /** - * Parse a URL to discover it's components - * - * @param {String} url The URL to be parsed - * @returns {Object} - */ - function resolveURL(url) { - var href = url; +var toString = Object.prototype.toString; - if (msie) { - // IE needs attribute set twice to normalize properties - urlParsingNode.setAttribute('href', href); - href = urlParsingNode.href; - } +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Array, otherwise false + */ +function isArray(val) { + return toString.call(val) === '[object Array]'; +} - urlParsingNode.setAttribute('href', href); +/** + * Determine if a value is undefined + * + * @param {Object} val The value to test + * @returns {boolean} True if the value is undefined, otherwise false + */ +function isUndefined(val) { + return typeof val === 'undefined'; +} - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') ? - urlParsingNode.pathname : - '/' + urlParsingNode.pathname - }; - } +/** + * Determine if a value is a Buffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Buffer, otherwise false + */ +function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); +} - originURL = resolveURL(window.location.href); +/** + * Determine if a value is an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ +function isArrayBuffer(val) { + return toString.call(val) === '[object ArrayBuffer]'; +} - /** - * Determine if a URL shares the same origin as the current location - * - * @param {String} requestURL The URL to test - * @returns {boolean} True if URL shares the same origin, otherwise false - */ - return function isURLSameOrigin(requestURL) { - var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; - return (parsed.protocol === originURL.protocol && - parsed.host === originURL.host); - }; - })() : +/** + * Determine if a value is a FormData + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an FormData, otherwise false + */ +function isFormData(val) { + return (typeof FormData !== 'undefined') && (val instanceof FormData); +} - // Non standard browser envs (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return function isURLSameOrigin() { - return true; - }; - })() -); +/** + * Determine if a value is a view on an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ +function isArrayBufferView(val) { + var result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); + } + return result; +} +/** + * Determine if a value is a String + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a String, otherwise false + */ +function isString(val) { + return typeof val === 'string'; +} -/***/ }), -/* 474 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * Determine if a value is a Number + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Number, otherwise false + */ +function isNumber(val) { + return typeof val === 'number'; +} -"use strict"; +/** + * Determine if a value is an Object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Object, otherwise false + */ +function isObject(val) { + return val !== null && typeof val === 'object'; +} +/** + * Determine if a value is a Date + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Date, otherwise false + */ +function isDate(val) { + return toString.call(val) === '[object Date]'; +} -var utils = __webpack_require__(455); +/** + * Determine if a value is a File + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a File, otherwise false + */ +function isFile(val) { + return toString.call(val) === '[object File]'; +} -module.exports = ( - utils.isStandardBrowserEnv() ? +/** + * Determine if a value is a Blob + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Blob, otherwise false + */ +function isBlob(val) { + return toString.call(val) === '[object Blob]'; +} - // Standard browser envs support document.cookie - (function standardBrowserEnv() { - return { - write: function write(name, value, expires, path, domain, secure) { - var cookie = []; - cookie.push(name + '=' + encodeURIComponent(value)); +/** + * Determine if a value is a Function + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ +function isFunction(val) { + return toString.call(val) === '[object Function]'; +} - if (utils.isNumber(expires)) { - cookie.push('expires=' + new Date(expires).toGMTString()); - } +/** + * Determine if a value is a Stream + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Stream, otherwise false + */ +function isStream(val) { + return isObject(val) && isFunction(val.pipe); +} - if (utils.isString(path)) { - cookie.push('path=' + path); - } +/** + * Determine if a value is a URLSearchParams object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +function isURLSearchParams(val) { + return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; +} - if (utils.isString(domain)) { - cookie.push('domain=' + domain); - } +/** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * @returns {String} The String freed of excess whitespace + */ +function trim(str) { + return str.replace(/^\s*/, '').replace(/\s*$/, ''); +} - if (secure === true) { - cookie.push('secure'); - } +/** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + */ +function isStandardBrowserEnv() { + if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || + navigator.product === 'NativeScript' || + navigator.product === 'NS')) { + return false; + } + return ( + typeof window !== 'undefined' && + typeof document !== 'undefined' + ); +} - document.cookie = cookie.join('; '); - }, +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ +function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } - read: function read(name) { - var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); - return (match ? decodeURIComponent(match[3]) : null); - }, + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } - remove: function remove(name) { - this.write(name, '', Date.now() - 86400000); - } - }; - })() : + if (isArray(obj)) { + // Iterate over array values + for (var i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj); + } + } + } +} - // Non standard browser env (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return { - write: function write() {}, - read: function read() { return null; }, - remove: function remove() {} - }; - })() -); +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (typeof result[key] === 'object' && typeof val === 'object') { + result[key] = merge(result[key], val); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Function equal to merge with the difference being that no reference + * to original objects is kept. + * + * @see merge + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +function deepMerge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (typeof result[key] === 'object' && typeof val === 'object') { + result[key] = deepMerge(result[key], val); + } else if (typeof val === 'object') { + result[key] = deepMerge({}, val); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * @return {Object} The resulting value of object a + */ +function extend(a, b, thisArg) { + forEach(b, function assignValue(val, key) { + if (thisArg && typeof val === 'function') { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }); + return a; +} + +module.exports = { + isArray: isArray, + isArrayBuffer: isArrayBuffer, + isBuffer: isBuffer, + isFormData: isFormData, + isArrayBufferView: isArrayBufferView, + isString: isString, + isNumber: isNumber, + isObject: isObject, + isUndefined: isUndefined, + isDate: isDate, + isFile: isFile, + isBlob: isBlob, + isFunction: isFunction, + isStream: isStream, + isURLSearchParams: isURLSearchParams, + isStandardBrowserEnv: isStandardBrowserEnv, + forEach: forEach, + merge: merge, + deepMerge: deepMerge, + extend: extend, + trim: trim +}; /***/ }), -/* 475 */ +/* 443 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(455); -var settle = __webpack_require__(466); -var buildFullPath = __webpack_require__(469); -var buildURL = __webpack_require__(458); -var http = __webpack_require__(476); -var https = __webpack_require__(477); -var httpFollow = __webpack_require__(478).http; -var httpsFollow = __webpack_require__(478).https; -var url = __webpack_require__(452); -var zlib = __webpack_require__(486); -var pkg = __webpack_require__(487); -var createError = __webpack_require__(467); -var enhanceError = __webpack_require__(468); +module.exports = function bind(fn, thisArg) { + return function wrap() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + return fn.apply(thisArg, args); + }; +}; -var isHttps = /https:?/; -/*eslint consistent-return:0*/ -module.exports = function httpAdapter(config) { - return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) { - var resolve = function resolve(value) { - resolvePromise(value); - }; - var reject = function reject(value) { - rejectPromise(value); - }; - var data = config.data; - var headers = config.headers; +/***/ }), +/* 444 */ +/***/ (function(module, exports, __webpack_require__) { - // Set User-Agent (required by some servers) - // Only set header if it hasn't been set in config - // See https://github.com/axios/axios/issues/69 - if (!headers['User-Agent'] && !headers['user-agent']) { - headers['User-Agent'] = 'axios/' + pkg.version; - } +"use strict"; - if (data && !utils.isStream(data)) { - if (Buffer.isBuffer(data)) { - // Nothing to do... - } else if (utils.isArrayBuffer(data)) { - data = Buffer.from(new Uint8Array(data)); - } else if (utils.isString(data)) { - data = Buffer.from(data, 'utf-8'); - } else { - return reject(createError( - 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', - config - )); - } - // Add Content-Length header if data exists - headers['Content-Length'] = data.length; - } +var utils = __webpack_require__(442); +var buildURL = __webpack_require__(445); +var InterceptorManager = __webpack_require__(446); +var dispatchRequest = __webpack_require__(447); +var mergeConfig = __webpack_require__(475); - // HTTP basic authentication - var auth = undefined; - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password || ''; - auth = username + ':' + password; - } +/** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + */ +function Axios(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager(), + response: new InterceptorManager() + }; +} - // Parse url - var fullPath = buildFullPath(config.baseURL, config.url); - var parsed = url.parse(fullPath); - var protocol = parsed.protocol || 'http:'; +/** + * Dispatch a request + * + * @param {Object} config The config specific for this request (merged with this.defaults) + */ +Axios.prototype.request = function request(config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof config === 'string') { + config = arguments[1] || {}; + config.url = arguments[0]; + } else { + config = config || {}; + } - if (!auth && parsed.auth) { - var urlAuth = parsed.auth.split(':'); - var urlUsername = urlAuth[0] || ''; - var urlPassword = urlAuth[1] || ''; - auth = urlUsername + ':' + urlPassword; - } + config = mergeConfig(this.defaults, config); - if (auth) { - delete headers.Authorization; - } + // Set config.method + if (config.method) { + config.method = config.method.toLowerCase(); + } else if (this.defaults.method) { + config.method = this.defaults.method.toLowerCase(); + } else { + config.method = 'get'; + } - var isHttpsRequest = isHttps.test(protocol); - var agent = isHttpsRequest ? config.httpsAgent : config.httpAgent; + // Hook up interceptors middleware + var chain = [dispatchRequest, undefined]; + var promise = Promise.resolve(config); - var options = { - path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''), - method: config.method.toUpperCase(), - headers: headers, - agent: agent, - agents: { http: config.httpAgent, https: config.httpsAgent }, - auth: auth - }; + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + chain.unshift(interceptor.fulfilled, interceptor.rejected); + }); - if (config.socketPath) { - options.socketPath = config.socketPath; - } else { - options.hostname = parsed.hostname; - options.port = parsed.port; - } + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + chain.push(interceptor.fulfilled, interceptor.rejected); + }); - var proxy = config.proxy; - if (!proxy && proxy !== false) { - var proxyEnv = protocol.slice(0, -1) + '_proxy'; - var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()]; - if (proxyUrl) { - var parsedProxyUrl = url.parse(proxyUrl); - var noProxyEnv = process.env.no_proxy || process.env.NO_PROXY; - var shouldProxy = true; + while (chain.length) { + promise = promise.then(chain.shift(), chain.shift()); + } - if (noProxyEnv) { - var noProxy = noProxyEnv.split(',').map(function trim(s) { - return s.trim(); - }); + return promise; +}; - shouldProxy = !noProxy.some(function proxyMatch(proxyElement) { - if (!proxyElement) { - return false; - } - if (proxyElement === '*') { - return true; - } - if (proxyElement[0] === '.' && - parsed.hostname.substr(parsed.hostname.length - proxyElement.length) === proxyElement) { - return true; - } +Axios.prototype.getUri = function getUri(config) { + config = mergeConfig(this.defaults, config); + return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); +}; - return parsed.hostname === proxyElement; - }); - } +// Provide aliases for supported request methods +utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(utils.merge(config || {}, { + method: method, + url: url + })); + }; +}); +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, data, config) { + return this.request(utils.merge(config || {}, { + method: method, + url: url, + data: data + })); + }; +}); - if (shouldProxy) { - proxy = { - host: parsedProxyUrl.hostname, - port: parsedProxyUrl.port - }; +module.exports = Axios; - if (parsedProxyUrl.auth) { - var proxyUrlAuth = parsedProxyUrl.auth.split(':'); - proxy.auth = { - username: proxyUrlAuth[0], - password: proxyUrlAuth[1] - }; - } - } - } - } - if (proxy) { - options.hostname = proxy.host; - options.host = proxy.host; - options.headers.host = parsed.hostname + (parsed.port ? ':' + parsed.port : ''); - options.port = proxy.port; - options.path = protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path; +/***/ }), +/* 445 */ +/***/ (function(module, exports, __webpack_require__) { - // Basic proxy authorization - if (proxy.auth) { - var base64 = Buffer.from(proxy.auth.username + ':' + proxy.auth.password, 'utf8').toString('base64'); - options.headers['Proxy-Authorization'] = 'Basic ' + base64; - } - } +"use strict"; - var transport; - var isHttpsProxy = isHttpsRequest && (proxy ? isHttps.test(proxy.protocol) : true); - if (config.transport) { - transport = config.transport; - } else if (config.maxRedirects === 0) { - transport = isHttpsProxy ? https : http; - } else { - if (config.maxRedirects) { - options.maxRedirects = config.maxRedirects; - } - transport = isHttpsProxy ? httpsFollow : httpFollow; - } - if (config.maxContentLength && config.maxContentLength > -1) { - options.maxBodyLength = config.maxContentLength; - } +var utils = __webpack_require__(442); - // Create the request - var req = transport.request(options, function handleResponse(res) { - if (req.aborted) return; +function encode(val) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); +} - // uncompress the response body transparently if required - var stream = res; - switch (res.headers['content-encoding']) { - /*eslint default-case:0*/ - case 'gzip': - case 'compress': - case 'deflate': - // add the unzipper to the body stream processing pipeline - stream = (res.statusCode === 204) ? stream : stream.pipe(zlib.createUnzip()); +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @returns {string} The formatted url + */ +module.exports = function buildURL(url, params, paramsSerializer) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } - // remove the content-encoding in order to not confuse downstream operations - delete res.headers['content-encoding']; - break; + var serializedParams; + if (paramsSerializer) { + serializedParams = paramsSerializer(params); + } else if (utils.isURLSearchParams(params)) { + serializedParams = params.toString(); + } else { + var parts = []; + + utils.forEach(params, function serialize(val, key) { + if (val === null || typeof val === 'undefined') { + return; } - // return the last request in case of redirects - var lastRequest = res.req || req; + if (utils.isArray(val)) { + key = key + '[]'; + } else { + val = [val]; + } - var response = { - status: res.statusCode, - statusText: res.statusMessage, - headers: res.headers, - config: config, - request: lastRequest - }; + utils.forEach(val, function parseValue(v) { + if (utils.isDate(v)) { + v = v.toISOString(); + } else if (utils.isObject(v)) { + v = JSON.stringify(v); + } + parts.push(encode(key) + '=' + encode(v)); + }); + }); - if (config.responseType === 'stream') { - response.data = stream; - settle(resolve, reject, response); - } else { - var responseBuffer = []; - stream.on('data', function handleStreamData(chunk) { - responseBuffer.push(chunk); + serializedParams = parts.join('&'); + } - // make sure the content length is not over the maxContentLength if specified - if (config.maxContentLength > -1 && Buffer.concat(responseBuffer).length > config.maxContentLength) { - stream.destroy(); - reject(createError('maxContentLength size of ' + config.maxContentLength + ' exceeded', - config, null, lastRequest)); - } - }); + if (serializedParams) { + var hashmarkIndex = url.indexOf('#'); + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } - stream.on('error', function handleStreamError(err) { - if (req.aborted) return; - reject(enhanceError(err, config, null, lastRequest)); - }); + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } - stream.on('end', function handleStreamEnd() { - var responseData = Buffer.concat(responseBuffer); - if (config.responseType !== 'arraybuffer') { - responseData = responseData.toString(config.responseEncoding); - } + return url; +}; - response.data = responseData; - settle(resolve, reject, response); - }); - } - }); - // Handle errors - req.on('error', function handleRequestError(err) { - if (req.aborted) return; - reject(enhanceError(err, config, null, req)); - }); +/***/ }), +/* 446 */ +/***/ (function(module, exports, __webpack_require__) { - // Handle request timeout - if (config.timeout) { - // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system. - // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET. - // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up. - // And then these socket which be hang up will devoring CPU little by little. - // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect. - req.setTimeout(config.timeout, function handleRequestTimeout() { - req.abort(); - reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', req)); - }); - } +"use strict"; - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (req.aborted) return; - req.abort(); - reject(cancel); - }); - } +var utils = __webpack_require__(442); - // Send the request - if (utils.isStream(data)) { - data.on('error', function handleStreamError(err) { - reject(enhanceError(err, config, null, req)); - }).pipe(req); - } else { - req.end(data); - } +function InterceptorManager() { + this.handlers = []; +} + +/** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ +InterceptorManager.prototype.use = function use(fulfilled, rejected) { + this.handlers.push({ + fulfilled: fulfilled, + rejected: rejected }); + return this.handlers.length - 1; }; +/** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + */ +InterceptorManager.prototype.eject = function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } +}; -/***/ }), -/* 476 */ -/***/ (function(module, exports) { - -module.exports = require("http"); +/** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + */ +InterceptorManager.prototype.forEach = function forEach(fn) { + utils.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); +}; -/***/ }), -/* 477 */ -/***/ (function(module, exports) { +module.exports = InterceptorManager; -module.exports = require("https"); /***/ }), -/* 478 */ +/* 447 */ /***/ (function(module, exports, __webpack_require__) { -var url = __webpack_require__(452); -var http = __webpack_require__(476); -var https = __webpack_require__(477); -var assert = __webpack_require__(30); -var Writable = __webpack_require__(27).Writable; -var debug = __webpack_require__(479)("follow-redirects"); - -// RFC7231§4.2.1: Of the request methods defined by this specification, -// the GET, HEAD, OPTIONS, and TRACE methods are defined to be safe. -var SAFE_METHODS = { GET: true, HEAD: true, OPTIONS: true, TRACE: true }; +"use strict"; -// Create handlers that pass events from native requests -var eventHandlers = Object.create(null); -["abort", "aborted", "error", "socket", "timeout"].forEach(function (event) { - eventHandlers[event] = function (arg) { - this._redirectable.emit(event, arg); - }; -}); -// An HTTP(S) request that can be redirected -function RedirectableRequest(options, responseCallback) { - // Initialize the request - Writable.call(this); - options.headers = options.headers || {}; - this._options = options; - this._redirectCount = 0; - this._redirects = []; - this._requestBodyLength = 0; - this._requestBodyBuffers = []; +var utils = __webpack_require__(442); +var transformData = __webpack_require__(448); +var isCancel = __webpack_require__(449); +var defaults = __webpack_require__(450); - // Since http.request treats host as an alias of hostname, - // but the url module interprets host as hostname plus port, - // eliminate the host property to avoid confusion. - if (options.host) { - // Use hostname if set, because it has precedence - if (!options.hostname) { - options.hostname = options.host; - } - delete options.host; +/** + * Throws a `Cancel` if cancellation has been requested. + */ +function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); } +} - // Attach a callback if passed - if (responseCallback) { - this.on("response", responseCallback); - } +/** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * @returns {Promise} The Promise to be fulfilled + */ +module.exports = function dispatchRequest(config) { + throwIfCancellationRequested(config); - // React to responses of native requests - var self = this; - this._onNativeResponse = function (response) { - self._processResponse(response); - }; + // Ensure headers exist + config.headers = config.headers || {}; - // Complete the URL object when necessary - if (!options.pathname && options.path) { - var searchPos = options.path.indexOf("?"); - if (searchPos < 0) { - options.pathname = options.path; - } - else { - options.pathname = options.path.substring(0, searchPos); - options.search = options.path.substring(searchPos); + // Transform request data + config.data = transformData( + config.data, + config.headers, + config.transformRequest + ); + + // Flatten headers + config.headers = utils.merge( + config.headers.common || {}, + config.headers[config.method] || {}, + config.headers + ); + + utils.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + function cleanHeaderConfig(method) { + delete config.headers[method]; } - } + ); - // Perform the first request - this._performRequest(); -} -RedirectableRequest.prototype = Object.create(Writable.prototype); + var adapter = config.adapter || defaults.adapter; -// Writes buffered data to the current native request -RedirectableRequest.prototype.write = function (data, encoding, callback) { - // Validate input and shift parameters if necessary - if (!(typeof data === "string" || typeof data === "object" && ("length" in data))) { - throw new Error("data should be a string, Buffer or Uint8Array"); - } - if (typeof encoding === "function") { - callback = encoding; - encoding = null; - } + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); - // Ignore empty buffers, since writing them doesn't invoke the callback - // https://github.com/nodejs/node/issues/22066 - if (data.length === 0) { - if (callback) { - callback(); - } - return; - } - // Only write when we don't exceed the maximum body length - if (this._requestBodyLength + data.length <= this._options.maxBodyLength) { - this._requestBodyLength += data.length; - this._requestBodyBuffers.push({ data: data, encoding: encoding }); - this._currentRequest.write(data, encoding, callback); - } - // Error when we exceed the maximum body length - else { - this.emit("error", new Error("Request body larger than maxBodyLength limit")); - this.abort(); - } -}; + // Transform response data + response.data = transformData( + response.data, + response.headers, + config.transformResponse + ); -// Ends the current native request -RedirectableRequest.prototype.end = function (data, encoding, callback) { - // Shift parameters if necessary - if (typeof data === "function") { - callback = data; - data = encoding = null; - } - else if (typeof encoding === "function") { - callback = encoding; - encoding = null; - } + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); - // Write data and end - var currentRequest = this._currentRequest; - this.write(data || "", encoding, function () { - currentRequest.end(null, null, callback); + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData( + reason.response.data, + reason.response.headers, + config.transformResponse + ); + } + } + + return Promise.reject(reason); }); }; -// Sets a header value on the current native request -RedirectableRequest.prototype.setHeader = function (name, value) { - this._options.headers[name] = value; - this._currentRequest.setHeader(name, value); -}; -// Clears a header value on the current native request -RedirectableRequest.prototype.removeHeader = function (name) { - delete this._options.headers[name]; - this._currentRequest.removeHeader(name); -}; +/***/ }), +/* 448 */ +/***/ (function(module, exports, __webpack_require__) { -// Proxy all other public ClientRequest methods -[ - "abort", "flushHeaders", "getHeader", - "setNoDelay", "setSocketKeepAlive", "setTimeout", -].forEach(function (method) { - RedirectableRequest.prototype[method] = function (a, b) { - return this._currentRequest[method](a, b); - }; -}); +"use strict"; -// Proxy all public ClientRequest properties -["aborted", "connection", "socket"].forEach(function (property) { - Object.defineProperty(RedirectableRequest.prototype, property, { - get: function () { return this._currentRequest[property]; }, - }); -}); -// Executes the next native request (initial or redirect) -RedirectableRequest.prototype._performRequest = function () { - // Load the native protocol - var protocol = this._options.protocol; - var nativeProtocol = this._options.nativeProtocols[protocol]; - if (!nativeProtocol) { - this.emit("error", new Error("Unsupported protocol " + protocol)); - return; - } - - // If specified, use the agent corresponding to the protocol - // (HTTP and HTTPS use different types of agents) - if (this._options.agents) { - var scheme = protocol.substr(0, protocol.length - 1); - this._options.agent = this._options.agents[scheme]; - } - - // Create the native request - var request = this._currentRequest = - nativeProtocol.request(this._options, this._onNativeResponse); - this._currentUrl = url.format(this._options); +var utils = __webpack_require__(442); - // Set up event handlers - request._redirectable = this; - for (var event in eventHandlers) { - /* istanbul ignore else */ - if (event) { - request.on(event, eventHandlers[event]); - } - } +/** + * Transform the data for a request or a response + * + * @param {Object|String} data The data to be transformed + * @param {Array} headers The headers for the request or response + * @param {Array|Function} fns A single function or Array of functions + * @returns {*} The resulting transformed data + */ +module.exports = function transformData(data, headers, fns) { + /*eslint no-param-reassign:0*/ + utils.forEach(fns, function transform(fn) { + data = fn(data, headers); + }); - // End a redirected request - // (The first request must be ended explicitly with RedirectableRequest#end) - if (this._isRedirect) { - // Write the request entity and end. - var i = 0; - var buffers = this._requestBodyBuffers; - (function writeNext() { - if (i < buffers.length) { - var buffer = buffers[i++]; - request.write(buffer.data, buffer.encoding, writeNext); - } - else { - request.end(); - } - }()); - } + return data; }; -// Processes a response from the current native request -RedirectableRequest.prototype._processResponse = function (response) { - // Store the redirected response - if (this._options.trackRedirects) { - this._redirects.push({ - url: this._currentUrl, - headers: response.headers, - statusCode: response.statusCode, - }); - } - - // RFC7231§6.4: The 3xx (Redirection) class of status code indicates - // that further action needs to be taken by the user agent in order to - // fulfill the request. If a Location header field is provided, - // the user agent MAY automatically redirect its request to the URI - // referenced by the Location field value, - // even if the specific status code is not understood. - var location = response.headers.location; - if (location && this._options.followRedirects !== false && - response.statusCode >= 300 && response.statusCode < 400) { - // RFC7231§6.4: A client SHOULD detect and intervene - // in cyclical redirections (i.e., "infinite" redirection loops). - if (++this._redirectCount > this._options.maxRedirects) { - this.emit("error", new Error("Max redirects exceeded.")); - return; - } - - // RFC7231§6.4: Automatic redirection needs to done with - // care for methods not known to be safe […], - // since the user might not wish to redirect an unsafe request. - // RFC7231§6.4.7: The 307 (Temporary Redirect) status code indicates - // that the target resource resides temporarily under a different URI - // and the user agent MUST NOT change the request method - // if it performs an automatic redirection to that URI. - var header; - var headers = this._options.headers; - if (response.statusCode !== 307 && !(this._options.method in SAFE_METHODS)) { - this._options.method = "GET"; - // Drop a possible entity and headers related to it - this._requestBodyBuffers = []; - for (header in headers) { - if (/^content-/i.test(header)) { - delete headers[header]; - } - } - } - // Drop the Host header, as the redirect might lead to a different host - if (!this._isRedirect) { - for (header in headers) { - if (/^host$/i.test(header)) { - delete headers[header]; - } - } - } +/***/ }), +/* 449 */ +/***/ (function(module, exports, __webpack_require__) { - // Perform the redirected request - var redirectUrl = url.resolve(this._currentUrl, location); - debug("redirecting to", redirectUrl); - Object.assign(this._options, url.parse(redirectUrl)); - this._isRedirect = true; - this._performRequest(); +"use strict"; - // Discard the remainder of the response to avoid waiting for data - response.destroy(); - } - else { - // The response is not a redirect; return it as-is - response.responseUrl = this._currentUrl; - response.redirects = this._redirects; - this.emit("response", response); - // Clean up - this._requestBodyBuffers = []; - } +module.exports = function isCancel(value) { + return !!(value && value.__CANCEL__); }; -// Wraps the key/value object of protocols with redirect functionality -function wrap(protocols) { - // Default settings - var exports = { - maxRedirects: 21, - maxBodyLength: 10 * 1024 * 1024, - }; - - // Wrap each protocol - var nativeProtocols = {}; - Object.keys(protocols).forEach(function (scheme) { - var protocol = scheme + ":"; - var nativeProtocol = nativeProtocols[protocol] = protocols[scheme]; - var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol); - - // Executes a request, following redirects - wrappedProtocol.request = function (options, callback) { - if (typeof options === "string") { - options = url.parse(options); - options.maxRedirects = exports.maxRedirects; - } - else { - options = Object.assign({ - protocol: protocol, - maxRedirects: exports.maxRedirects, - maxBodyLength: exports.maxBodyLength, - }, options); - } - options.nativeProtocols = nativeProtocols; - assert.equal(options.protocol, protocol, "protocol mismatch"); - debug("options", options); - return new RedirectableRequest(options, callback); - }; - // Executes a GET request, following redirects - wrappedProtocol.get = function (options, callback) { - var request = wrappedProtocol.request(options, callback); - request.end(); - return request; - }; - }); - return exports; -} +/***/ }), +/* 450 */ +/***/ (function(module, exports, __webpack_require__) { -// Exports -module.exports = wrap({ http: http, https: https }); -module.exports.wrap = wrap; +"use strict"; -/***/ }), -/* 479 */ -/***/ (function(module, exports, __webpack_require__) { +var utils = __webpack_require__(442); +var normalizeHeaderName = __webpack_require__(451); -/** - * Detect Electron renderer process, which is node, but we should - * treat as a browser. - */ +var DEFAULT_CONTENT_TYPE = { + 'Content-Type': 'application/x-www-form-urlencoded' +}; -if (typeof process === 'undefined' || process.type === 'renderer') { - module.exports = __webpack_require__(480); -} else { - module.exports = __webpack_require__(483); +function setContentTypeIfUnset(headers, value) { + if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { + headers['Content-Type'] = value; + } } +function getDefaultAdapter() { + var adapter; + if (typeof XMLHttpRequest !== 'undefined') { + // For browsers use XHR adapter + adapter = __webpack_require__(452); + } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { + // For node use HTTP adapter + adapter = __webpack_require__(462); + } + return adapter; +} -/***/ }), -/* 480 */ -/***/ (function(module, exports, __webpack_require__) { +var defaults = { + adapter: getDefaultAdapter(), -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ + transformRequest: [function transformRequest(data, headers) { + normalizeHeaderName(headers, 'Accept'); + normalizeHeaderName(headers, 'Content-Type'); + if (utils.isFormData(data) || + utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) + ) { + return data; + } + if (utils.isArrayBufferView(data)) { + return data.buffer; + } + if (utils.isURLSearchParams(data)) { + setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); + return data.toString(); + } + if (utils.isObject(data)) { + setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); + return JSON.stringify(data); + } + return data; + }], -exports = module.exports = __webpack_require__(481); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); + transformResponse: [function transformResponse(data) { + /*eslint no-param-reassign:0*/ + if (typeof data === 'string') { + try { + data = JSON.parse(data); + } catch (e) { /* Ignore */ } + } + return data; + }], -/** - * Colors. - */ + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, -exports.colors = [ - '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', - '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', - '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', - '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', - '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', - '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', - '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', - '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', - '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', - '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', - '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33' -]; + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ + maxContentLength: -1, -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { - return true; + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; } +}; - // Internet Explorer and Edge do not support colors. - if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; +defaults.headers = { + common: { + 'Accept': 'application/json, text/plain, */*' } +}; - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ +utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { + defaults.headers[method] = {}; +}); -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; - } -}; +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); +}); +module.exports = defaults; -/** - * Colorize log arguments if enabled. - * - * @api public - */ -function formatArgs(args) { - var useColors = this.useColors; +/***/ }), +/* 451 */ +/***/ (function(module, exports, __webpack_require__) { - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); +"use strict"; - if (!useColors) return; - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit') +var utils = __webpack_require__(442); - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; +module.exports = function normalizeHeaderName(headers, normalizedName) { + utils.forEach(headers, function processHeader(value, name) { + if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { + headers[normalizedName] = value; + delete headers[name]; } }); +}; - args.splice(lastC, 0, c); -} -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ +/***/ }), +/* 452 */ +/***/ (function(module, exports, __webpack_require__) { -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} +"use strict"; -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} +var utils = __webpack_require__(442); +var settle = __webpack_require__(453); +var buildURL = __webpack_require__(445); +var buildFullPath = __webpack_require__(456); +var parseHeaders = __webpack_require__(459); +var isURLSameOrigin = __webpack_require__(460); +var createError = __webpack_require__(454); -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ +module.exports = function xhrAdapter(config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + var requestData = config.data; + var requestHeaders = config.headers; -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} + if (utils.isFormData(requestData)) { + delete requestHeaders['Content-Type']; // Let the browser set it + } - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } + var request = new XMLHttpRequest(); - return r; -} + // HTTP basic authentication + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password || ''; + requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); + } -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ + var fullPath = buildFullPath(config.baseURL, config.url); + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); -exports.enable(load()); + // Set the request timeout in MS + request.timeout = config.timeout; -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ + // Listen for ready state + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } -function localstorage() { - try { - return window.localStorage; - } catch (e) {} -} + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // Prepare the response + var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; + var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; + var response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config: config, + request: request + }; -/***/ }), -/* 481 */ -/***/ (function(module, exports, __webpack_require__) { + settle(resolve, reject, response); + // Clean up request + request = null; + }; -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = __webpack_require__(482); + reject(createError('Request aborted', config, 'ECONNABORTED', request)); -/** - * Active `debug` instances. - */ -exports.instances = []; - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; - -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ + // Clean up request + request = null; + }; -function selectColor(namespace) { - var hash = 0, i; + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(createError('Network Error', config, null, request)); - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } + // Clean up request + request = null; + }; - return exports.colors[Math.abs(hash) % exports.colors.length]; -} + // Handle timeout + request.ontimeout = function handleTimeout() { + var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', + request)); -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ + // Clean up request + request = null; + }; -function createDebug(namespace) { + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (utils.isStandardBrowserEnv()) { + var cookies = __webpack_require__(461); - var prevTime; + // Add xsrf header + var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? + cookies.read(config.xsrfCookieName) : + undefined; - function debug() { - // disabled? - if (!debug.enabled) return; + if (xsrfValue) { + requestHeaders[config.xsrfHeaderName] = xsrfValue; + } + } - var self = debug; + // Add headers to the request + if ('setRequestHeader' in request) { + utils.forEach(requestHeaders, function setRequestHeader(val, key) { + if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { + // Remove Content-Type if data is undefined + delete requestHeaders[key]; + } else { + // Otherwise add header to the request + request.setRequestHeader(key, val); + } + }); + } - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; + // Add withCredentials to request if needed + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; + // Add responseType to request if needed + if (config.responseType) { + try { + request.responseType = config.responseType; + } catch (e) { + // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. + // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. + if (config.responseType !== 'json') { + throw e; + } + } } - args[0] = exports.coerce(args[0]); + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', config.onDownloadProgress); + } - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', config.onUploadProgress); } - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); + if (config.cancelToken) { + // Handle cancellation + config.cancelToken.promise.then(function onCanceled(cancel) { + if (!request) { + return; + } - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); + request.abort(); + reject(cancel); + // Clean up request + request = null; + }); + } - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); + if (requestData === undefined) { + requestData = null; + } - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } + // Send the request + request.send(requestData); + }); +}; - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - debug.destroy = destroy; - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); - } +/***/ }), +/* 453 */ +/***/ (function(module, exports, __webpack_require__) { - exports.instances.push(debug); +"use strict"; - return debug; -} -function destroy () { - var index = exports.instances.indexOf(this); - if (index !== -1) { - exports.instances.splice(index, 1); - return true; - } else { - return false; - } -} +var createError = __webpack_require__(454); /** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. + * Resolve or reject a Promise based on response status. * - * @param {String} namespaces - * @api public + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. */ +module.exports = function settle(resolve, reject, response) { + var validateStatus = response.config.validateStatus; + if (!validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(createError( + 'Request failed with status code ' + response.status, + response.config, + null, + response.request, + response + )); + } +}; -function enable(namespaces) { - exports.save(namespaces); - exports.names = []; - exports.skips = []; +/***/ }), +/* 454 */ +/***/ (function(module, exports, __webpack_require__) { - var i; - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; +"use strict"; - for (i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } - for (i = 0; i < exports.instances.length; i++) { - var instance = exports.instances[i]; - instance.enabled = exports.enabled(instance.namespace); - } -} +var enhanceError = __webpack_require__(455); /** - * Disable debug output. + * Create an Error with the specified message, config, error code, request and response. * - * @api public + * @param {string} message The error message. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The created error. */ +module.exports = function createError(message, config, code, request, response) { + var error = new Error(message); + return enhanceError(error, config, code, request, response); +}; -function disable() { - exports.enable(''); -} -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ +/***/ }), +/* 455 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; -function enabled(name) { - if (name[name.length - 1] === '*') { - return true; - } - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} /** - * Coerce `val`. + * Update an Error with the specified config, error code, and response. * - * @param {Mixed} val - * @return {Mixed} - * @api private + * @param {Error} error The error to update. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The error. */ +module.exports = function enhanceError(error, config, code, request, response) { + error.config = config; + if (code) { + error.code = code; + } -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} + error.request = request; + error.response = response; + error.isAxiosError = true; + + error.toJSON = function() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: this.config, + code: this.code + }; + }; + return error; +}; /***/ }), -/* 482 */ -/***/ (function(module, exports) { +/* 456 */ +/***/ (function(module, exports, __webpack_require__) { -/** - * Helpers. - */ +"use strict"; -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; + +var isAbsoluteURL = __webpack_require__(457); +var combineURLs = __webpack_require__(458); /** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * @returns {string} The combined full path */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); +module.exports = function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); + return requestedURL; }; -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} +/***/ }), +/* 457 */ +/***/ (function(module, exports, __webpack_require__) { -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ +"use strict"; -function fmtShort(ms) { - if (ms >= d) { - return Math.round(ms / d) + 'd'; - } - if (ms >= h) { - return Math.round(ms / h) + 'h'; - } - if (ms >= m) { - return Math.round(ms / m) + 'm'; - } - if (ms >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} /** - * Long format for `ms`. + * Determines whether the specified URL is absolute * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - return plural(ms, d, 'day') || - plural(ms, h, 'hour') || - plural(ms, m, 'minute') || - plural(ms, s, 'second') || - ms + ' ms'; -} - -/** - * Pluralization helper. + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false */ - -function plural(ms, n, name) { - if (ms < n) { - return; - } - if (ms < n * 1.5) { - return Math.floor(ms / n) + ' ' + name; - } - return Math.ceil(ms / n) + ' ' + name + 's'; -} +module.exports = function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); +}; /***/ }), -/* 483 */ +/* 458 */ /***/ (function(module, exports, __webpack_require__) { -/** - * Module dependencies. - */ +"use strict"; -var tty = __webpack_require__(484); -var util = __webpack_require__(29); /** - * This is the Node.js implementation of `debug()`. + * Creates a new URL by combining the specified URLs * - * Expose `debug()` as the module. - */ - -exports = module.exports = __webpack_require__(481); -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * @returns {string} The combined URL */ +module.exports = function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; +}; -exports.colors = [ 6, 2, 3, 4, 5, 1 ]; -try { - var supportsColor = __webpack_require__(485); - if (supportsColor && supportsColor.level >= 2) { - exports.colors = [ - 20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, - 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, - 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 214, 215, 220, 221 - ]; - } -} catch (err) { - // swallow - we only care if `supports-color` is available; it doesn't have to be. -} +/***/ }), +/* 459 */ +/***/ (function(module, exports, __webpack_require__) { -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ +"use strict"; -exports.inspectOpts = Object.keys(process.env).filter(function (key) { - return /^debug_/i.test(key); -}).reduce(function (obj, key) { - // camel-case - var prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - // coerce string value into JS value - var val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) val = true; - else if (/^(no|off|false|disabled)$/i.test(val)) val = false; - else if (val === 'null') val = null; - else val = Number(val); +var utils = __webpack_require__(442); - obj[prop] = val; - return obj; -}, {}); +// Headers whose duplicates are ignored by node +// c.f. https://nodejs.org/api/http.html#http_message_headers +var ignoreDuplicateOf = [ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' +]; /** - * Is stdout a TTY? Colored output is enabled when `true`. + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} headers Headers needing to be parsed + * @returns {Object} Headers parsed into an object */ +module.exports = function parseHeaders(headers) { + var parsed = {}; + var key; + var val; + var i; -function useColors() { - return 'colors' in exports.inspectOpts - ? Boolean(exports.inspectOpts.colors) - : tty.isatty(process.stderr.fd); -} - -/** - * Map %o to `util.inspect()`, all on a single line. - */ + if (!headers) { return parsed; } -exports.formatters.o = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts) - .split('\n').map(function(str) { - return str.trim() - }).join(' '); -}; + utils.forEach(headers.split('\n'), function parser(line) { + i = line.indexOf(':'); + key = utils.trim(line.substr(0, i)).toLowerCase(); + val = utils.trim(line.substr(i + 1)); -/** - * Map %o to `util.inspect()`, allowing multiple lines if needed. - */ + if (key) { + if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { + return; + } + if (key === 'set-cookie') { + parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + }); -exports.formatters.O = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); + return parsed; }; -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - var name = this.namespace; - var useColors = this.useColors; - - if (useColors) { - var c = this.color; - var colorCode = '\u001b[3' + (c < 8 ? c : '8;5;' + c); - var prefix = ' ' + colorCode + ';1m' + name + ' ' + '\u001b[0m'; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push(colorCode + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); - } else { - args[0] = getDate() + name + ' ' + args[0]; - } -} - -function getDate() { - if (exports.inspectOpts.hideDate) { - return ''; - } else { - return new Date().toISOString() + ' '; - } -} -/** - * Invokes `util.format()` with the specified arguments and writes to stderr. - */ +/***/ }), +/* 460 */ +/***/ (function(module, exports, __webpack_require__) { -function log() { - return process.stderr.write(util.format.apply(util, arguments) + '\n'); -} +"use strict"; -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} +var utils = __webpack_require__(442); -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ +module.exports = ( + utils.isStandardBrowserEnv() ? -function load() { - return process.env.DEBUG; -} + // Standard browser envs have full support of the APIs needed to test + // whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + var msie = /(msie|trident)/i.test(navigator.userAgent); + var urlParsingNode = document.createElement('a'); + var originURL; -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ + /** + * Parse a URL to discover it's components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + var href = url; -function init (debug) { - debug.inspectOpts = {}; + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } - var keys = Object.keys(exports.inspectOpts); - for (var i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} + urlParsingNode.setAttribute('href', href); -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } -exports.enable(load()); + originURL = resolveURL(window.location.href); + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : -/***/ }), -/* 484 */ -/***/ (function(module, exports) { + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })() +); -module.exports = require("tty"); /***/ }), -/* 485 */ +/* 461 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); - -const env = process.env; -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} +var utils = __webpack_require__(442); -function translateLevel(level) { - if (level === 0) { - return false; - } +module.exports = ( + utils.isStandardBrowserEnv() ? - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} + // Standard browser envs support document.cookie + (function standardBrowserEnv() { + return { + write: function write(name, value, expires, path, domain, secure) { + var cookie = []; + cookie.push(name + '=' + encodeURIComponent(value)); -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } + if (utils.isNumber(expires)) { + cookie.push('expires=' + new Date(expires).toGMTString()); + } - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } + if (utils.isString(path)) { + cookie.push('path=' + path); + } - if (hasFlag('color=256')) { - return 2; - } + if (utils.isString(domain)) { + cookie.push('domain=' + domain); + } - if (stream && !stream.isTTY && forceColor !== true) { - return 0; - } + if (secure === true) { + cookie.push('secure'); + } - const min = forceColor ? 1 : 0; + document.cookie = cookie.join('; '); + }, - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } + read: function read(name) { + var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, - return 1; - } + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); + } + }; + })() : - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } + // Non standard browser env (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return { + write: function write() {}, + read: function read() { return null; }, + remove: function remove() {} + }; + })() +); - return min; - } - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } +/***/ }), +/* 462 */ +/***/ (function(module, exports, __webpack_require__) { - if (env.COLORTERM === 'truecolor') { - return 3; - } +"use strict"; - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } +var utils = __webpack_require__(442); +var settle = __webpack_require__(453); +var buildFullPath = __webpack_require__(456); +var buildURL = __webpack_require__(445); +var http = __webpack_require__(463); +var https = __webpack_require__(464); +var httpFollow = __webpack_require__(465).http; +var httpsFollow = __webpack_require__(465).https; +var url = __webpack_require__(439); +var zlib = __webpack_require__(473); +var pkg = __webpack_require__(474); +var createError = __webpack_require__(454); +var enhanceError = __webpack_require__(455); - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } +var isHttps = /https:?/; - if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } +/*eslint consistent-return:0*/ +module.exports = function httpAdapter(config) { + return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) { + var resolve = function resolve(value) { + resolvePromise(value); + }; + var reject = function reject(value) { + rejectPromise(value); + }; + var data = config.data; + var headers = config.headers; - if ('COLORTERM' in env) { - return 1; - } + // Set User-Agent (required by some servers) + // Only set header if it hasn't been set in config + // See https://github.com/axios/axios/issues/69 + if (!headers['User-Agent'] && !headers['user-agent']) { + headers['User-Agent'] = 'axios/' + pkg.version; + } - if (env.TERM === 'dumb') { - return min; - } + if (data && !utils.isStream(data)) { + if (Buffer.isBuffer(data)) { + // Nothing to do... + } else if (utils.isArrayBuffer(data)) { + data = Buffer.from(new Uint8Array(data)); + } else if (utils.isString(data)) { + data = Buffer.from(data, 'utf-8'); + } else { + return reject(createError( + 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', + config + )); + } - return min; -} + // Add Content-Length header if data exists + headers['Content-Length'] = data.length; + } -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} + // HTTP basic authentication + var auth = undefined; + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password || ''; + auth = username + ':' + password; + } -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; + // Parse url + var fullPath = buildFullPath(config.baseURL, config.url); + var parsed = url.parse(fullPath); + var protocol = parsed.protocol || 'http:'; + if (!auth && parsed.auth) { + var urlAuth = parsed.auth.split(':'); + var urlUsername = urlAuth[0] || ''; + var urlPassword = urlAuth[1] || ''; + auth = urlUsername + ':' + urlPassword; + } -/***/ }), -/* 486 */ -/***/ (function(module, exports) { + if (auth) { + delete headers.Authorization; + } -module.exports = require("zlib"); + var isHttpsRequest = isHttps.test(protocol); + var agent = isHttpsRequest ? config.httpsAgent : config.httpAgent; -/***/ }), -/* 487 */ -/***/ (function(module) { + var options = { + path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''), + method: config.method.toUpperCase(), + headers: headers, + agent: agent, + agents: { http: config.httpAgent, https: config.httpsAgent }, + auth: auth + }; -module.exports = JSON.parse("{\"name\":\"axios\",\"version\":\"0.19.2\",\"description\":\"Promise based HTTP client for the browser and node.js\",\"main\":\"index.js\",\"scripts\":{\"test\":\"grunt test && bundlesize\",\"start\":\"node ./sandbox/server.js\",\"build\":\"NODE_ENV=production grunt build\",\"preversion\":\"npm test\",\"version\":\"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json\",\"postversion\":\"git push && git push --tags\",\"examples\":\"node ./examples/server.js\",\"coveralls\":\"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js\",\"fix\":\"eslint --fix lib/**/*.js\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/axios/axios.git\"},\"keywords\":[\"xhr\",\"http\",\"ajax\",\"promise\",\"node\"],\"author\":\"Matt Zabriskie\",\"license\":\"MIT\",\"bugs\":{\"url\":\"https://github.com/axios/axios/issues\"},\"homepage\":\"https://github.com/axios/axios\",\"devDependencies\":{\"bundlesize\":\"^0.17.0\",\"coveralls\":\"^3.0.0\",\"es6-promise\":\"^4.2.4\",\"grunt\":\"^1.0.2\",\"grunt-banner\":\"^0.6.0\",\"grunt-cli\":\"^1.2.0\",\"grunt-contrib-clean\":\"^1.1.0\",\"grunt-contrib-watch\":\"^1.0.0\",\"grunt-eslint\":\"^20.1.0\",\"grunt-karma\":\"^2.0.0\",\"grunt-mocha-test\":\"^0.13.3\",\"grunt-ts\":\"^6.0.0-beta.19\",\"grunt-webpack\":\"^1.0.18\",\"istanbul-instrumenter-loader\":\"^1.0.0\",\"jasmine-core\":\"^2.4.1\",\"karma\":\"^1.3.0\",\"karma-chrome-launcher\":\"^2.2.0\",\"karma-coverage\":\"^1.1.1\",\"karma-firefox-launcher\":\"^1.1.0\",\"karma-jasmine\":\"^1.1.1\",\"karma-jasmine-ajax\":\"^0.1.13\",\"karma-opera-launcher\":\"^1.0.0\",\"karma-safari-launcher\":\"^1.0.0\",\"karma-sauce-launcher\":\"^1.2.0\",\"karma-sinon\":\"^1.0.5\",\"karma-sourcemap-loader\":\"^0.3.7\",\"karma-webpack\":\"^1.7.0\",\"load-grunt-tasks\":\"^3.5.2\",\"minimist\":\"^1.2.0\",\"mocha\":\"^5.2.0\",\"sinon\":\"^4.5.0\",\"typescript\":\"^2.8.1\",\"url-search-params\":\"^0.10.0\",\"webpack\":\"^1.13.1\",\"webpack-dev-server\":\"^1.14.1\"},\"browser\":{\"./lib/adapters/http.js\":\"./lib/adapters/xhr.js\"},\"typings\":\"./index.d.ts\",\"dependencies\":{\"follow-redirects\":\"1.5.10\"},\"bundlesize\":[{\"path\":\"./dist/axios.min.js\",\"threshold\":\"5kB\"}]}"); + if (config.socketPath) { + options.socketPath = config.socketPath; + } else { + options.hostname = parsed.hostname; + options.port = parsed.port; + } -/***/ }), -/* 488 */ -/***/ (function(module, exports, __webpack_require__) { + var proxy = config.proxy; + if (!proxy && proxy !== false) { + var proxyEnv = protocol.slice(0, -1) + '_proxy'; + var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()]; + if (proxyUrl) { + var parsedProxyUrl = url.parse(proxyUrl); + var noProxyEnv = process.env.no_proxy || process.env.NO_PROXY; + var shouldProxy = true; -"use strict"; + if (noProxyEnv) { + var noProxy = noProxyEnv.split(',').map(function trim(s) { + return s.trim(); + }); + shouldProxy = !noProxy.some(function proxyMatch(proxyElement) { + if (!proxyElement) { + return false; + } + if (proxyElement === '*') { + return true; + } + if (proxyElement[0] === '.' && + parsed.hostname.substr(parsed.hostname.length - proxyElement.length) === proxyElement) { + return true; + } -var utils = __webpack_require__(455); + return parsed.hostname === proxyElement; + }); + } -/** - * Config-specific merge-function which creates a new config-object - * by merging two configuration objects together. - * - * @param {Object} config1 - * @param {Object} config2 - * @returns {Object} New object resulting from merging config2 to config1 - */ -module.exports = function mergeConfig(config1, config2) { - // eslint-disable-next-line no-param-reassign - config2 = config2 || {}; - var config = {}; - var valueFromConfig2Keys = ['url', 'method', 'params', 'data']; - var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy']; - var defaultToConfig2Keys = [ - 'baseURL', 'url', 'transformRequest', 'transformResponse', 'paramsSerializer', - 'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', - 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', - 'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent', - 'httpsAgent', 'cancelToken', 'socketPath' - ]; + if (shouldProxy) { + proxy = { + host: parsedProxyUrl.hostname, + port: parsedProxyUrl.port + }; - utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { - if (typeof config2[prop] !== 'undefined') { - config[prop] = config2[prop]; + if (parsedProxyUrl.auth) { + var proxyUrlAuth = parsedProxyUrl.auth.split(':'); + proxy.auth = { + username: proxyUrlAuth[0], + password: proxyUrlAuth[1] + }; + } + } + } } - }); - utils.forEach(mergeDeepPropertiesKeys, function mergeDeepProperties(prop) { - if (utils.isObject(config2[prop])) { - config[prop] = utils.deepMerge(config1[prop], config2[prop]); - } else if (typeof config2[prop] !== 'undefined') { - config[prop] = config2[prop]; - } else if (utils.isObject(config1[prop])) { - config[prop] = utils.deepMerge(config1[prop]); - } else if (typeof config1[prop] !== 'undefined') { - config[prop] = config1[prop]; - } - }); + if (proxy) { + options.hostname = proxy.host; + options.host = proxy.host; + options.headers.host = parsed.hostname + (parsed.port ? ':' + parsed.port : ''); + options.port = proxy.port; + options.path = protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path; - utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { - if (typeof config2[prop] !== 'undefined') { - config[prop] = config2[prop]; - } else if (typeof config1[prop] !== 'undefined') { - config[prop] = config1[prop]; + // Basic proxy authorization + if (proxy.auth) { + var base64 = Buffer.from(proxy.auth.username + ':' + proxy.auth.password, 'utf8').toString('base64'); + options.headers['Proxy-Authorization'] = 'Basic ' + base64; + } } - }); - - var axiosKeys = valueFromConfig2Keys - .concat(mergeDeepPropertiesKeys) - .concat(defaultToConfig2Keys); - - var otherKeys = Object - .keys(config2) - .filter(function filterAxiosKeys(key) { - return axiosKeys.indexOf(key) === -1; - }); - utils.forEach(otherKeys, function otherKeysDefaultToConfig2(prop) { - if (typeof config2[prop] !== 'undefined') { - config[prop] = config2[prop]; - } else if (typeof config1[prop] !== 'undefined') { - config[prop] = config1[prop]; + var transport; + var isHttpsProxy = isHttpsRequest && (proxy ? isHttps.test(proxy.protocol) : true); + if (config.transport) { + transport = config.transport; + } else if (config.maxRedirects === 0) { + transport = isHttpsProxy ? https : http; + } else { + if (config.maxRedirects) { + options.maxRedirects = config.maxRedirects; + } + transport = isHttpsProxy ? httpsFollow : httpFollow; } - }); - - return config; -}; + if (config.maxContentLength && config.maxContentLength > -1) { + options.maxBodyLength = config.maxContentLength; + } -/***/ }), -/* 489 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + // Create the request + var req = transport.request(options, function handleResponse(res) { + if (req.aborted) return; + // uncompress the response body transparently if required + var stream = res; + switch (res.headers['content-encoding']) { + /*eslint default-case:0*/ + case 'gzip': + case 'compress': + case 'deflate': + // add the unzipper to the body stream processing pipeline + stream = (res.statusCode === 204) ? stream : stream.pipe(zlib.createUnzip()); -/** - * A `Cancel` is an object that is thrown when an operation is canceled. - * - * @class - * @param {string=} message The message. - */ -function Cancel(message) { - this.message = message; -} + // remove the content-encoding in order to not confuse downstream operations + delete res.headers['content-encoding']; + break; + } -Cancel.prototype.toString = function toString() { - return 'Cancel' + (this.message ? ': ' + this.message : ''); -}; + // return the last request in case of redirects + var lastRequest = res.req || req; -Cancel.prototype.__CANCEL__ = true; + var response = { + status: res.statusCode, + statusText: res.statusMessage, + headers: res.headers, + config: config, + request: lastRequest + }; -module.exports = Cancel; + if (config.responseType === 'stream') { + response.data = stream; + settle(resolve, reject, response); + } else { + var responseBuffer = []; + stream.on('data', function handleStreamData(chunk) { + responseBuffer.push(chunk); + // make sure the content length is not over the maxContentLength if specified + if (config.maxContentLength > -1 && Buffer.concat(responseBuffer).length > config.maxContentLength) { + stream.destroy(); + reject(createError('maxContentLength size of ' + config.maxContentLength + ' exceeded', + config, null, lastRequest)); + } + }); -/***/ }), -/* 490 */ -/***/ (function(module, exports, __webpack_require__) { + stream.on('error', function handleStreamError(err) { + if (req.aborted) return; + reject(enhanceError(err, config, null, lastRequest)); + }); -"use strict"; + stream.on('end', function handleStreamEnd() { + var responseData = Buffer.concat(responseBuffer); + if (config.responseType !== 'arraybuffer') { + responseData = responseData.toString(config.responseEncoding); + } + response.data = responseData; + settle(resolve, reject, response); + }); + } + }); -var Cancel = __webpack_require__(489); + // Handle errors + req.on('error', function handleRequestError(err) { + if (req.aborted) return; + reject(enhanceError(err, config, null, req)); + }); -/** - * A `CancelToken` is an object that can be used to request cancellation of an operation. - * - * @class - * @param {Function} executor The executor function. - */ -function CancelToken(executor) { - if (typeof executor !== 'function') { - throw new TypeError('executor must be a function.'); - } + // Handle request timeout + if (config.timeout) { + // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system. + // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET. + // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up. + // And then these socket which be hang up will devoring CPU little by little. + // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect. + req.setTimeout(config.timeout, function handleRequestTimeout() { + req.abort(); + reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', req)); + }); + } - var resolvePromise; - this.promise = new Promise(function promiseExecutor(resolve) { - resolvePromise = resolve; - }); + if (config.cancelToken) { + // Handle cancellation + config.cancelToken.promise.then(function onCanceled(cancel) { + if (req.aborted) return; - var token = this; - executor(function cancel(message) { - if (token.reason) { - // Cancellation has already been requested - return; + req.abort(); + reject(cancel); + }); } - token.reason = new Cancel(message); - resolvePromise(token.reason); + // Send the request + if (utils.isStream(data)) { + data.on('error', function handleStreamError(err) { + reject(enhanceError(err, config, null, req)); + }).pipe(req); + } else { + req.end(data); + } }); -} - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -CancelToken.prototype.throwIfRequested = function throwIfRequested() { - if (this.reason) { - throw this.reason; - } }; -/** - * Returns an object that contains a new `CancelToken` and a function that, when called, - * cancels the `CancelToken`. - */ -CancelToken.source = function source() { - var cancel; - var token = new CancelToken(function executor(c) { - cancel = c; - }); - return { - token: token, - cancel: cancel - }; -}; -module.exports = CancelToken; +/***/ }), +/* 463 */ +/***/ (function(module, exports) { +module.exports = require("http"); /***/ }), -/* 491 */ +/* 464 */ +/***/ (function(module, exports) { + +module.exports = require("https"); + +/***/ }), +/* 465 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var url = __webpack_require__(439); +var http = __webpack_require__(463); +var https = __webpack_require__(464); +var assert = __webpack_require__(371); +var Writable = __webpack_require__(382).Writable; +var debug = __webpack_require__(466)("follow-redirects"); +// RFC7231§4.2.1: Of the request methods defined by this specification, +// the GET, HEAD, OPTIONS, and TRACE methods are defined to be safe. +var SAFE_METHODS = { GET: true, HEAD: true, OPTIONS: true, TRACE: true }; -/** - * Syntactic sugar for invoking a function and expanding an array for arguments. - * - * Common use case would be to use `Function.prototype.apply`. - * - * ```js - * function f(x, y, z) {} - * var args = [1, 2, 3]; - * f.apply(null, args); - * ``` - * - * With `spread` this example can be re-written. - * - * ```js - * spread(function(x, y, z) {})([1, 2, 3]); - * ``` - * - * @param {Function} callback - * @returns {Function} - */ -module.exports = function spread(callback) { - return function wrap(arr) { - return callback.apply(null, arr); +// Create handlers that pass events from native requests +var eventHandlers = Object.create(null); +["abort", "aborted", "error", "socket", "timeout"].forEach(function (event) { + eventHandlers[event] = function (arg) { + this._redirectable.emit(event, arg); }; -}; +}); +// An HTTP(S) request that can be redirected +function RedirectableRequest(options, responseCallback) { + // Initialize the request + Writable.call(this); + options.headers = options.headers || {}; + this._options = options; + this._redirectCount = 0; + this._redirects = []; + this._requestBodyLength = 0; + this._requestBodyBuffers = []; -/***/ }), -/* 492 */ -/***/ (function(module, exports, __webpack_require__) { + // Since http.request treats host as an alias of hostname, + // but the url module interprets host as hostname plus port, + // eliminate the host property to avoid confusion. + if (options.host) { + // Use hostname if set, because it has precedence + if (!options.hostname) { + options.hostname = options.host; + } + delete options.host; + } -"use strict"; + // Attach a callback if passed + if (responseCallback) { + this.on("response", responseCallback); + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -tslib_1.__exportStar(__webpack_require__(493), exports); + // React to responses of native requests + var self = this; + this._onNativeResponse = function (response) { + self._processResponse(response); + }; + // Complete the URL object when necessary + if (!options.pathname && options.path) { + var searchPos = options.path.indexOf("?"); + if (searchPos < 0) { + options.pathname = options.path; + } + else { + options.pathname = options.path.substring(0, searchPos); + options.search = options.path.substring(searchPos); + } + } -/***/ }), -/* 493 */ -/***/ (function(module, exports, __webpack_require__) { + // Perform the first request + this._performRequest(); +} +RedirectableRequest.prototype = Object.create(Writable.prototype); -"use strict"; +// Writes buffered data to the current native request +RedirectableRequest.prototype.write = function (data, encoding, callback) { + // Validate input and shift parameters if necessary + if (!(typeof data === "string" || typeof data === "object" && ("length" in data))) { + throw new Error("data should be a string, Buffer or Uint8Array"); + } + if (typeof encoding === "function") { + callback = encoding; + encoding = null; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isAxiosRequestError = (error) => { - return error && error.config && error.response === undefined; -}; -exports.isAxiosResponseError = (error) => { - return error && error.response && error.response.status !== undefined; + // Ignore empty buffers, since writing them doesn't invoke the callback + // https://github.com/nodejs/node/issues/22066 + if (data.length === 0) { + if (callback) { + callback(); + } + return; + } + // Only write when we don't exceed the maximum body length + if (this._requestBodyLength + data.length <= this._options.maxBodyLength) { + this._requestBodyLength += data.length; + this._requestBodyBuffers.push({ data: data, encoding: encoding }); + this._currentRequest.write(data, encoding, callback); + } + // Error when we exceed the maximum body length + else { + this.emit("error", new Error("Request body larger than maxBodyLength limit")); + this.abort(); + } }; +// Ends the current native request +RedirectableRequest.prototype.end = function (data, encoding, callback) { + // Shift parameters if necessary + if (typeof data === "function") { + callback = data; + data = encoding = null; + } + else if (typeof encoding === "function") { + callback = encoding; + encoding = null; + } -/***/ }), -/* 494 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + // Write data and end + var currentRequest = this._currentRequest; + this.write(data || "", encoding, function () { + currentRequest.end(null, null, callback); + }); +}; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -class KbnClientStatus { - constructor(requester) { - this.requester = requester; - } - /** - * Get the full server status - */ - async get() { - return await this.requester.request({ - method: 'GET', - path: 'api/status', - }); - } - /** - * Get the overall/merged state - */ - async getOverallState() { - const status = await this.get(); - return status.status.overall.state; - } -} -exports.KbnClientStatus = KbnClientStatus; +// Sets a header value on the current native request +RedirectableRequest.prototype.setHeader = function (name, value) { + this._options.headers[name] = value; + this._currentRequest.setHeader(name, value); +}; +// Clears a header value on the current native request +RedirectableRequest.prototype.removeHeader = function (name) { + delete this._options.headers[name]; + this._currentRequest.removeHeader(name); +}; -/***/ }), -/* 495 */ -/***/ (function(module, exports, __webpack_require__) { +// Proxy all other public ClientRequest methods +[ + "abort", "flushHeaders", "getHeader", + "setNoDelay", "setSocketKeepAlive", "setTimeout", +].forEach(function (method) { + RedirectableRequest.prototype[method] = function (a, b) { + return this._currentRequest[method](a, b); + }; +}); -"use strict"; +// Proxy all public ClientRequest properties +["aborted", "connection", "socket"].forEach(function (property) { + Object.defineProperty(RedirectableRequest.prototype, property, { + get: function () { return this._currentRequest[property]; }, + }); +}); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const PLUGIN_STATUS_ID = /^plugin:(.+?)@/; -class KbnClientPlugins { - constructor(status) { - this.status = status; - } - /** - * Get a list of plugin ids that are enabled on the server - */ - async getEnabledIds() { - const pluginIds = []; - const apiResp = await this.status.get(); - for (const status of apiResp.status.statuses) { - if (status.id) { - const match = status.id.match(PLUGIN_STATUS_ID); - if (match) { - pluginIds.push(match[1]); - } - } - } - return pluginIds; +// Executes the next native request (initial or redirect) +RedirectableRequest.prototype._performRequest = function () { + // Load the native protocol + var protocol = this._options.protocol; + var nativeProtocol = this._options.nativeProtocols[protocol]; + if (!nativeProtocol) { + this.emit("error", new Error("Unsupported protocol " + protocol)); + return; + } + + // If specified, use the agent corresponding to the protocol + // (HTTP and HTTPS use different types of agents) + if (this._options.agents) { + var scheme = protocol.substr(0, protocol.length - 1); + this._options.agent = this._options.agents[scheme]; + } + + // Create the native request + var request = this._currentRequest = + nativeProtocol.request(this._options, this._onNativeResponse); + this._currentUrl = url.format(this._options); + + // Set up event handlers + request._redirectable = this; + for (var event in eventHandlers) { + /* istanbul ignore else */ + if (event) { + request.on(event, eventHandlers[event]); } -} -exports.KbnClientPlugins = KbnClientPlugins; + } + // End a redirected request + // (The first request must be ended explicitly with RedirectableRequest#end) + if (this._isRedirect) { + // Write the request entity and end. + var i = 0; + var buffers = this._requestBodyBuffers; + (function writeNext() { + if (i < buffers.length) { + var buffer = buffers[i++]; + request.write(buffer.data, buffer.encoding, writeNext); + } + else { + request.end(); + } + }()); + } +}; -/***/ }), -/* 496 */ -/***/ (function(module, exports, __webpack_require__) { +// Processes a response from the current native request +RedirectableRequest.prototype._processResponse = function (response) { + // Store the redirected response + if (this._options.trackRedirects) { + this._redirects.push({ + url: this._currentUrl, + headers: response.headers, + statusCode: response.statusCode, + }); + } -"use strict"; + // RFC7231§6.4: The 3xx (Redirection) class of status code indicates + // that further action needs to be taken by the user agent in order to + // fulfill the request. If a Location header field is provided, + // the user agent MAY automatically redirect its request to the URI + // referenced by the Location field value, + // even if the specific status code is not understood. + var location = response.headers.location; + if (location && this._options.followRedirects !== false && + response.statusCode >= 300 && response.statusCode < 400) { + // RFC7231§6.4: A client SHOULD detect and intervene + // in cyclical redirections (i.e., "infinite" redirection loops). + if (++this._redirectCount > this._options.maxRedirects) { + this.emit("error", new Error("Max redirects exceeded.")); + return; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -class KbnClientVersion { - constructor(status) { - this.status = status; + // RFC7231§6.4: Automatic redirection needs to done with + // care for methods not known to be safe […], + // since the user might not wish to redirect an unsafe request. + // RFC7231§6.4.7: The 307 (Temporary Redirect) status code indicates + // that the target resource resides temporarily under a different URI + // and the user agent MUST NOT change the request method + // if it performs an automatic redirection to that URI. + var header; + var headers = this._options.headers; + if (response.statusCode !== 307 && !(this._options.method in SAFE_METHODS)) { + this._options.method = "GET"; + // Drop a possible entity and headers related to it + this._requestBodyBuffers = []; + for (header in headers) { + if (/^content-/i.test(header)) { + delete headers[header]; + } + } } - async get() { - if (this.versionCache !== undefined) { - return this.versionCache; + + // Drop the Host header, as the redirect might lead to a different host + if (!this._isRedirect) { + for (header in headers) { + if (/^host$/i.test(header)) { + delete headers[header]; } - const status = await this.status.get(); - this.versionCache = status.version.number + (status.version.build_snapshot ? '-SNAPSHOT' : ''); - return this.versionCache; + } } -} -exports.KbnClientVersion = KbnClientVersion; + // Perform the redirected request + var redirectUrl = url.resolve(this._currentUrl, location); + debug("redirecting to", redirectUrl); + Object.assign(this._options, url.parse(redirectUrl)); + this._isRedirect = true; + this._performRequest(); -/***/ }), -/* 497 */ -/***/ (function(module, exports, __webpack_require__) { + // Discard the remainder of the response to avoid waiting for data + response.destroy(); + } + else { + // The response is not a redirect; return it as-is + response.responseUrl = this._currentUrl; + response.redirects = this._redirects; + this.emit("response", response); -"use strict"; + // Clean up + this._requestBodyBuffers = []; + } +}; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const kbn_client_requester_1 = __webpack_require__(451); -class KbnClientSavedObjects { - constructor(log, requester) { - this.log = log; - this.requester = requester; - } - /** - * Run the saved objects migration - */ - async migrate() { - this.log.debug('Migrating saved objects'); - return await this.requester.request({ - description: 'migrate saved objects', - path: kbn_client_requester_1.uriencode `/internal/saved_objects/_migrate`, - method: 'POST', - body: {}, - }); - } - /** - * Get an object - */ - async get(options) { - this.log.debug('Gettings saved object: %j', options); - return await this.requester.request({ - description: 'get saved object', - path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, - method: 'GET', - }); - } - /** - * Create a saved object - */ - async create(options) { - this.log.debug('Creating saved object: %j', options); - return await this.requester.request({ - description: 'update saved object', - path: options.id - ? kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}` - : kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}`, - query: { - overwrite: options.overwrite, - }, - method: 'POST', - body: { - attributes: options.attributes, - migrationVersion: options.migrationVersion, - references: options.references, - }, - }); - } - /** - * Update a saved object - */ - async update(options) { - this.log.debug('Updating saved object: %j', options); - return await this.requester.request({ - description: 'update saved object', - path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, - query: { - overwrite: options.overwrite, - }, - method: 'PUT', - body: { - attributes: options.attributes, - migrationVersion: options.migrationVersion, - references: options.references, - }, - }); - } - /** - * Delete an object - */ - async delete(options) { - this.log.debug('Deleting saved object %s/%s', options); - return await this.requester.request({ - description: 'delete saved object', - path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, - method: 'DELETE', - }); - } +// Wraps the key/value object of protocols with redirect functionality +function wrap(protocols) { + // Default settings + var exports = { + maxRedirects: 21, + maxBodyLength: 10 * 1024 * 1024, + }; + + // Wrap each protocol + var nativeProtocols = {}; + Object.keys(protocols).forEach(function (scheme) { + var protocol = scheme + ":"; + var nativeProtocol = nativeProtocols[protocol] = protocols[scheme]; + var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol); + + // Executes a request, following redirects + wrappedProtocol.request = function (options, callback) { + if (typeof options === "string") { + options = url.parse(options); + options.maxRedirects = exports.maxRedirects; + } + else { + options = Object.assign({ + protocol: protocol, + maxRedirects: exports.maxRedirects, + maxBodyLength: exports.maxBodyLength, + }, options); + } + options.nativeProtocols = nativeProtocols; + assert.equal(options.protocol, protocol, "protocol mismatch"); + debug("options", options); + return new RedirectableRequest(options, callback); + }; + + // Executes a GET request, following redirects + wrappedProtocol.get = function (options, callback) { + var request = wrappedProtocol.request(options, callback); + request.end(); + return request; + }; + }); + return exports; } -exports.KbnClientSavedObjects = KbnClientSavedObjects; + +// Exports +module.exports = wrap({ http: http, https: https }); +module.exports.wrap = wrap; /***/ }), -/* 498 */ +/* 466 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. +/** + * Detect Electron renderer process, which is node, but we should + * treat as a browser. */ -Object.defineProperty(exports, "__esModule", { value: true }); -const kbn_client_requester_1 = __webpack_require__(451); -class KbnClientUiSettings { - constructor(log, requester, defaults) { - this.log = log; - this.requester = requester; - this.defaults = defaults; - } - async get(setting) { - var _a; - const all = await this.getAll(); - const value = (_a = all[setting]) === null || _a === void 0 ? void 0 : _a.userValue; - this.log.verbose('uiSettings.value: %j', value); - return value; - } - /** - * Gets defaultIndex from the config doc. - */ - async getDefaultIndex() { - return await this.get('defaultIndex'); - } - /** - * Unset a uiSetting - */ - async unset(setting) { - return await this.requester.request({ - path: kbn_client_requester_1.uriencode `/api/kibana/settings/${setting}`, - method: 'DELETE', - }); - } - /** - * Replace all uiSettings with the `doc` values, `doc` is merged - * with some defaults - */ - async replace(doc, { retries = 5 } = {}) { - this.log.debug('replacing kibana config doc: %j', doc); - const changes = { - ...this.defaults, - ...doc, - }; - for (const [name, { isOverridden }] of Object.entries(await this.getAll())) { - if (!isOverridden && !changes.hasOwnProperty(name)) { - changes[name] = null; - } - } - await this.requester.request({ - method: 'POST', - path: '/api/kibana/settings', - body: { changes }, - retries, - }); - } - /** - * Add fields to the config doc (like setting timezone and defaultIndex) - */ - async update(updates) { - this.log.debug('applying update to kibana config: %j', updates); - await this.requester.request({ - path: '/api/kibana/settings', - method: 'POST', - body: { - changes: updates, - }, - }); - } - async getAll() { - const resp = await this.requester.request({ - path: '/api/kibana/settings', - method: 'GET', - }); - return resp.settings; - } + +if (typeof process === 'undefined' || process.type === 'renderer') { + module.exports = __webpack_require__(467); +} else { + module.exports = __webpack_require__(470); } -exports.KbnClientUiSettings = KbnClientUiSettings; /***/ }), -/* 499 */ +/* 467 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 is the web browser implementation of `debug()`. * - * 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. + * Expose `debug()` as the module. */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -tslib_1.__exportStar(__webpack_require__(500), exports); +exports = module.exports = __webpack_require__(468); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); -/***/ }), -/* 500 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * Colors. + */ -"use strict"; +exports.colors = [ + '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', + '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', + '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', + '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', + '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', + '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', + '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', + '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', + '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', + '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', + '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33' +]; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. * - * 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. + * TODO: add a `localStorage` variable to explicitly enable/disable colors */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const util_1 = __webpack_require__(29); -const axios_1 = tslib_1.__importDefault(__webpack_require__(453)); -function parseConfig(log) { - const configJson = process.env.KIBANA_CI_STATS_CONFIG; - if (!configJson) { - log.debug('KIBANA_CI_STATS_CONFIG environment variable not found, disabling CiStatsReporter'); - return; - } - let config; - try { - config = JSON.parse(configJson); - } - catch (_) { - // handled below - } - if (typeof config === 'object' && config !== null) { - return validateConfig(log, config); - } - log.warning('KIBANA_CI_STATS_CONFIG is invalid, stats will not be reported'); - return; -} -function validateConfig(log, config) { - const validApiUrl = typeof config.apiUrl === 'string' && config.apiUrl.length !== 0; - if (!validApiUrl) { - log.warning('KIBANA_CI_STATS_CONFIG is missing a valid api url, stats will not be reported'); - return; - } - const validApiToken = typeof config.apiToken === 'string' && config.apiToken.length !== 0; - if (!validApiToken) { - log.warning('KIBANA_CI_STATS_CONFIG is missing a valid api token, stats will not be reported'); - return; - } - const validId = typeof config.buildId === 'string' && config.buildId.length !== 0; - if (!validId) { - log.warning('KIBANA_CI_STATS_CONFIG is missing a valid build id, stats will not be reported'); - return; - } - return config; -} -class CiStatsReporter { - constructor(config, log) { - this.config = config; - this.log = log; - } - static fromEnv(log) { - return new CiStatsReporter(parseConfig(log), log); - } - isEnabled() { - return !!this.config; - } - async metrics(metrics) { - var _a, _b, _c, _d; - if (!this.config) { - return; - } - let attempt = 0; - const maxAttempts = 5; - const bodySummary = metrics - .map(({ group, id, value }) => `[${group}/${id}=${value}]`) - .join(' '); - while (true) { - attempt += 1; - try { - await axios_1.default.request({ - method: 'POST', - url: '/v1/metrics', - baseURL: this.config.apiUrl, - headers: { - Authorization: `token ${this.config.apiToken}`, - }, - data: { - buildId: this.config.buildId, - metrics, - }, - }); - return; - } - catch (error) { - if (!((_a = error) === null || _a === void 0 ? void 0 : _a.request)) { - // not an axios error, must be a usage error that we should notify user about - throw error; - } - if (((_b = error) === null || _b === void 0 ? void 0 : _b.response) && error.response.status !== 502) { - // error response from service was received so warn the user and move on - this.log.warning(`error recording metric [status=${error.response.status}] [resp=${util_1.inspect(error.response.data)}] ${bodySummary}`); - return; - } - if (attempt === maxAttempts) { - this.log.warning(`failed to reach kibana-ci-stats service too many times, unable to record metric ${bodySummary}`); - return; - } - // we failed to reach the backend and we have remaining attempts, lets retry after a short delay - const reason = ((_d = (_c = error) === null || _c === void 0 ? void 0 : _c.response) === null || _d === void 0 ? void 0 : _d.status) ? `${error.response.status} response` - : 'no response'; - this.log.warning(`failed to reach kibana-ci-stats service [reason=${reason}], retrying in ${attempt} seconds`); - await new Promise((resolve) => setTimeout(resolve, attempt * 1000)); - } - } - } + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); } -exports.CiStatsReporter = CiStatsReporter; +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ -/***/ }), -/* 501 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parallelizeBatches", function() { return parallelizeBatches; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parallelize", function() { return parallelize; }); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 + +/** + * Colorize log arguments if enabled. * - * 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. + * @api public */ -async function parallelizeBatches(batches, fn) { - for (const batch of batches) { - // We need to make sure the entire batch has completed before we can move on - // to the next batch - await parallelize(batch, fn); - } -} -async function parallelize(items, fn, concurrency = 4) { - if (items.length === 0) { - return; - } - return new Promise((resolve, reject) => { - let activePromises = 0; - const values = items.slice(0); +function formatArgs(args) { + var useColors = this.useColors; - async function scheduleItem(item) { - activePromises++; + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); - try { - await fn(item); - activePromises--; + if (!useColors) return; - if (values.length > 0) { - // We have more work to do, so we schedule the next promise - scheduleItem(values.shift()); - } else if (activePromises === 0) { - // We have no more values left, and all items have completed, so we've - // completed all the work. - resolve(); - } - } catch (error) { - reject(error); - } - } + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') - values.splice(0, concurrency).map(scheduleItem); + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } }); -} -/***/ }), -/* 502 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + args.splice(lastC, 0, c); +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getProjects", function() { return getProjects; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProjectGraph", function() { return buildProjectGraph; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "topologicallyBatchProjects", function() { return topologicallyBatchProjects; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "includeTransitiveProjects", function() { return includeTransitiveProjects; }); -/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(503); -/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(516); -/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(517); -/* harmony import */ var _workspaces__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(578); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". * - * http://www.apache.org/licenses/LICENSE-2.0 + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. * - * 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. + * @param {String} namespaces + * @api private */ +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + return r; +} -const glob = Object(util__WEBPACK_IMPORTED_MODULE_2__["promisify"])(glob__WEBPACK_IMPORTED_MODULE_0___default.a); -/** a Map of project names to Project instances */ +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ -async function getProjects(rootPath, projectsPathsPatterns, { - include = [], - exclude = [] -} = {}) { - const projects = new Map(); - const workspaceProjectsPaths = await Object(_workspaces__WEBPACK_IMPORTED_MODULE_5__["workspacePackagePaths"])(rootPath); +exports.enable(load()); - for (const pattern of projectsPathsPatterns) { - const pathsToProcess = await packagesFromGlobPattern({ - pattern, - rootPath - }); +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ - for (const filePath of pathsToProcess) { - const projectConfigPath = normalize(filePath); - const projectDir = path__WEBPACK_IMPORTED_MODULE_1___default.a.dirname(projectConfigPath); - const project = await _project__WEBPACK_IMPORTED_MODULE_4__["Project"].fromPath(projectDir); +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} - if (workspaceProjectsPaths.indexOf(filePath) >= 0) { - project.isWorkspaceProject = true; - } - const excludeProject = exclude.includes(project.name) || include.length > 0 && !include.includes(project.name); +/***/ }), +/* 468 */ +/***/ (function(module, exports, __webpack_require__) { - if (excludeProject) { - continue; - } - if (projects.has(project.name)) { - throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`There are multiple projects with the same name [${project.name}]`, { - name: project.name, - paths: [project.path, projects.get(project.name).path] - }); - } +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ - projects.set(project.name, project); - } - } +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = __webpack_require__(469); - return projects; -} +/** + * Active `debug` instances. + */ +exports.instances = []; -function packagesFromGlobPattern({ - pattern, - rootPath -}) { - const globOptions = { - cwd: rootPath, - // Should throw in case of unusual errors when reading the file system - strict: true, - // Always returns absolute paths for matched files - absolute: true, - // Do not match ** against multiple filenames - // (This is only specified because we currently don't have a need for it.) - noglobstar: true - }; - return glob(path__WEBPACK_IMPORTED_MODULE_1___default.a.join(pattern, 'package.json'), globOptions); -} // https://github.com/isaacs/node-glob/blob/master/common.js#L104 -// glob always returns "\\" as "/" in windows, so everyone -// gets normalized because we can't have nice things. +/** + * The currently active debug mode names, and names to skip. + */ +exports.names = []; +exports.skips = []; -function normalize(dir) { - return path__WEBPACK_IMPORTED_MODULE_1___default.a.normalize(dir); -} +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ -function buildProjectGraph(projects) { - const projectGraph = new Map(); +exports.formatters = {}; - for (const project of projects.values()) { - const projectDeps = []; - const dependencies = project.allDependencies; +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ - for (const depName of Object.keys(dependencies)) { - if (projects.has(depName)) { - const dep = projects.get(depName); - const dependentProjectIsInWorkspace = project.isWorkspaceProject || project.json.name === 'kibana'; - project.ensureValidProjectDependency(dep, dependentProjectIsInWorkspace); - projectDeps.push(dep); - } - } +function selectColor(namespace) { + var hash = 0, i; - projectGraph.set(project.name, projectDeps); + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer } - return projectGraph; + return exports.colors[Math.abs(hash) % exports.colors.length]; } -function topologicallyBatchProjects(projectsToBatch, projectGraph, { - batchByWorkspace = false -} = {}) { - // We're going to be chopping stuff out of this list, so copy it. - const projectsLeftToBatch = new Set(projectsToBatch.keys()); - const batches = []; - if (batchByWorkspace) { - const workspaceRootProject = Array.from(projectsToBatch.values()).find(p => p.isWorkspaceRoot); +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ - if (!workspaceRootProject) { - throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`There was no yarn workspace root found.`); - } // Push in the workspace root first. +function createDebug(namespace) { + var prevTime; - batches.push([workspaceRootProject]); - projectsLeftToBatch.delete(workspaceRootProject.name); // In the next batch, push in all workspace projects. + function debug() { + // disabled? + if (!debug.enabled) return; - const workspaceBatch = []; + var self = debug; - for (const projectName of projectsLeftToBatch) { - const project = projectsToBatch.get(projectName); + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; - if (project.isWorkspaceProject) { - workspaceBatch.push(project); - projectsLeftToBatch.delete(projectName); - } + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; } - batches.push(workspaceBatch); - } + args[0] = exports.coerce(args[0]); - while (projectsLeftToBatch.size > 0) { - // Get all projects that have no remaining dependencies within the repo - // that haven't yet been picked. - const batch = []; + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } - for (const projectName of projectsLeftToBatch) { - const projectDeps = projectGraph.get(projectName); - const needsDependenciesBatched = projectDeps.some(dep => projectsLeftToBatch.has(dep.name)); + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); - if (!needsDependenciesBatched) { - batch.push(projectsToBatch.get(projectName)); + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; } - } // If we weren't able to find a project with no remaining dependencies, - // then we've encountered a cycle in the dependency graph. + return match; + }); + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); - const hasCycles = batch.length === 0; + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } - if (hasCycles) { - const cycleProjectNames = [...projectsLeftToBatch]; - const message = 'Encountered a cycle in the dependency graph. Projects in cycle are:\n' + cycleProjectNames.join(', '); - throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](message); - } + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + debug.destroy = destroy; - batches.push(batch); - batch.forEach(project => projectsLeftToBatch.delete(project.name)); + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); } - return batches; -} -function includeTransitiveProjects(subsetOfProjects, allProjects, { - onlyProductionDependencies = false -} = {}) { - const projectsWithDependents = new Map(); // the current list of packages we are expanding using breadth-first-search + exports.instances.push(debug); - const toProcess = [...subsetOfProjects]; + return debug; +} - while (toProcess.length > 0) { - const project = toProcess.shift(); - const dependencies = onlyProductionDependencies ? project.productionDependencies : project.allDependencies; - Object.keys(dependencies).forEach(dep => { - if (allProjects.has(dep)) { - toProcess.push(allProjects.get(dep)); - } - }); - projectsWithDependents.set(project.name, project); +function destroy () { + var index = exports.instances.indexOf(this); + if (index !== -1) { + exports.instances.splice(index, 1); + return true; + } else { + return false; } - - return projectsWithDependents; } -/***/ }), -/* 503 */ -/***/ (function(module, exports, __webpack_require__) { - -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern, false) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern, inGlobStar) -// Get the first [n] items from pattern that are all strings -// Join these together. This is PREFIX. -// If there is no more remaining, then stat(PREFIX) and -// add to matches if it succeeds. END. -// -// If inGlobStar and PREFIX is symlink and points to dir -// set ENTRIES = [] -// else readdir(PREFIX) as ENTRIES -// If fail, END -// -// with ENTRIES -// If pattern[n] is GLOBSTAR -// // handle the case where the globstar match is empty -// // by pruning it out, and testing the resulting pattern -// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// // Mark that this entry is a globstar match -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -// -// else // not globstar -// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -// Test ENTRY against pattern[n] -// If fails, continue -// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -// -// Caveat: -// Cache all stats and readdirs results to minimize syscall. Since all -// we ever care about is existence and directory-ness, we can just keep -// `true` for files, and [children,...] for directories, or `false` for -// things that don't exist. - -module.exports = glob +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ -var fs = __webpack_require__(23) -var rp = __webpack_require__(504) -var minimatch = __webpack_require__(506) -var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(510) -var EE = __webpack_require__(399).EventEmitter -var path = __webpack_require__(16) -var assert = __webpack_require__(30) -var isAbsolute = __webpack_require__(512) -var globSync = __webpack_require__(513) -var common = __webpack_require__(514) -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var inflight = __webpack_require__(515) -var util = __webpack_require__(29) -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored +function enable(namespaces) { + exports.save(namespaces); -var once = __webpack_require__(404) + exports.names = []; + exports.skips = []; -function glob (pattern, options, cb) { - if (typeof options === 'function') cb = options, options = {} - if (!options) options = {} + var i; + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; - if (options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return globSync(pattern, options) + for (i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } } - return new Glob(pattern, options, cb) + for (i = 0; i < exports.instances.length; i++) { + var instance = exports.instances[i]; + instance.enabled = exports.enabled(instance.namespace); + } } -glob.sync = globSync -var GlobSync = glob.GlobSync = globSync.GlobSync +/** + * Disable debug output. + * + * @api public + */ -// old api surface -glob.glob = glob +function disable() { + exports.enable(''); +} -function extend (origin, add) { - if (add === null || typeof add !== 'object') { - return origin - } +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ - var keys = Object.keys(add) - var i = keys.length - while (i--) { - origin[keys[i]] = add[keys[i]] +function enabled(name) { + if (name[name.length - 1] === '*') { + return true; } - return origin + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; } -glob.hasMagic = function (pattern, options_) { - var options = extend({}, options_) - options.noprocess = true +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ - var g = new Glob(pattern, options) - var set = g.minimatch.set +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} - if (!pattern) - return false - if (set.length > 1) - return true +/***/ }), +/* 469 */ +/***/ (function(module, exports) { - for (var j = 0; j < set[0].length; j++) { - if (typeof set[0][j] !== 'string') - return true - } +/** + * Helpers. + */ - return false -} +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ - if (options && options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return new GlobSync(pattern, options) +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; - if (!(this instanceof Glob)) - return new Glob(pattern, options, cb) - - setopts(this, pattern, options) - this._didRealPath = false +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ - // process each pattern in the minimatch set - var n = this.minimatch.set.length +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} - // The matches are stored as {: true,...} so that - // duplicates are automagically pruned. - // Later, we do an Object.keys() on these. - // Keep them as a list so we can fill in when nonull is set. - this.matches = new Array(n) +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ - if (typeof cb === 'function') { - cb = once(cb) - this.on('error', cb) - this.on('end', function (matches) { - cb(null, matches) - }) +function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd'; } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} - var self = this - this._processing = 0 - - this._emitQueue = [] - this._processQueue = [] - this.paused = false +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ - if (this.noprocess) - return this +function fmtLong(ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms'; +} - if (n === 0) - return done() +/** + * Pluralization helper. + */ - var sync = true - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false, done) +function plural(ms, n, name) { + if (ms < n) { + return; } - sync = false - - function done () { - --self._processing - if (self._processing <= 0) { - if (sync) { - process.nextTick(function () { - self._finish() - }) - } else { - self._finish() - } - } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; } + return Math.ceil(ms / n) + ' ' + name + 's'; } -Glob.prototype._finish = function () { - assert(this instanceof Glob) - if (this.aborted) - return - if (this.realpath && !this._didRealpath) - return this._realpath() +/***/ }), +/* 470 */ +/***/ (function(module, exports, __webpack_require__) { - common.finish(this) - this.emit('end', this.found) -} +/** + * Module dependencies. + */ -Glob.prototype._realpath = function () { - if (this._didRealpath) - return +var tty = __webpack_require__(471); +var util = __webpack_require__(397); - this._didRealpath = true +/** + * This is the Node.js implementation of `debug()`. + * + * Expose `debug()` as the module. + */ - var n = this.matches.length - if (n === 0) - return this._finish() +exports = module.exports = __webpack_require__(468); +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; - var self = this - for (var i = 0; i < this.matches.length; i++) - this._realpathSet(i, next) +/** + * Colors. + */ - function next () { - if (--n === 0) - self._finish() +exports.colors = [ 6, 2, 3, 4, 5, 1 ]; + +try { + var supportsColor = __webpack_require__(472); + if (supportsColor && supportsColor.level >= 2) { + exports.colors = [ + 20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, + 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, + 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 214, 215, 220, 221 + ]; } +} catch (err) { + // swallow - we only care if `supports-color` is available; it doesn't have to be. } -Glob.prototype._realpathSet = function (index, cb) { - var matchset = this.matches[index] - if (!matchset) - return cb() +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ - var found = Object.keys(matchset) - var self = this - var n = found.length +exports.inspectOpts = Object.keys(process.env).filter(function (key) { + return /^debug_/i.test(key); +}).reduce(function (obj, key) { + // camel-case + var prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - if (n === 0) - return cb() + // coerce string value into JS value + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) val = false; + else if (val === 'null') val = null; + else val = Number(val); - var set = this.matches[index] = Object.create(null) - found.forEach(function (p, i) { - // If there's a problem with the stat, then it means that - // one or more of the links in the realpath couldn't be - // resolved. just return the abs value in that case. - p = self._makeAbs(p) - rp.realpath(p, self.realpathCache, function (er, real) { - if (!er) - set[real] = true - else if (er.syscall === 'stat') - set[p] = true - else - self.emit('error', er) // srsly wtf right here + obj[prop] = val; + return obj; +}, {}); - if (--n === 0) { - self.matches[index] = set - cb() - } - }) - }) +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts + ? Boolean(exports.inspectOpts.colors) + : tty.isatty(process.stderr.fd); } -Glob.prototype._mark = function (p) { - return common.mark(this, p) -} +/** + * Map %o to `util.inspect()`, all on a single line. + */ -Glob.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} +exports.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n').map(function(str) { + return str.trim() + }).join(' '); +}; -Glob.prototype.abort = function () { - this.aborted = true - this.emit('abort') -} +/** + * Map %o to `util.inspect()`, allowing multiple lines if needed. + */ -Glob.prototype.pause = function () { - if (!this.paused) { - this.paused = true - this.emit('pause') - } -} +exports.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; -Glob.prototype.resume = function () { - if (this.paused) { - this.emit('resume') - this.paused = false - if (this._emitQueue.length) { - var eq = this._emitQueue.slice(0) - this._emitQueue.length = 0 - for (var i = 0; i < eq.length; i ++) { - var e = eq[i] - this._emitMatch(e[0], e[1]) - } - } - if (this._processQueue.length) { - var pq = this._processQueue.slice(0) - this._processQueue.length = 0 - for (var i = 0; i < pq.length; i ++) { - var p = pq[i] - this._processing-- - this._process(p[0], p[1], p[2], p[3]) - } - } - } -} +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ -Glob.prototype._process = function (pattern, index, inGlobStar, cb) { - assert(this instanceof Glob) - assert(typeof cb === 'function') +function formatArgs(args) { + var name = this.namespace; + var useColors = this.useColors; - if (this.aborted) - return + if (useColors) { + var c = this.color; + var colorCode = '\u001b[3' + (c < 8 ? c : '8;5;' + c); + var prefix = ' ' + colorCode + ';1m' + name + ' ' + '\u001b[0m'; - this._processing++ - if (this.paused) { - this._processQueue.push([pattern, index, inGlobStar, cb]) - return + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push(colorCode + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); + } else { + args[0] = getDate() + name + ' ' + args[0]; } +} - //console.error('PROCESS %d', this._processing, pattern) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ +function getDate() { + if (exports.inspectOpts.hideDate) { + return ''; + } else { + return new Date().toISOString() + ' '; } - // now n is the index of the first one that is *not* a string. +} - // see if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index, cb) - return +/** + * Invokes `util.format()` with the specified arguments and writes to stderr. + */ - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break +function log() { + return process.stderr.write(util.format.apply(util, arguments) + '\n'); +} - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + if (null == namespaces) { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; } +} - var remain = pattern.slice(n) +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix +function load() { + return process.env.DEBUG; +} - var abs = this._makeAbs(read) +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ - //if ignored, skip _processing - if (childrenIgnored(this, read)) - return cb() +function init (debug) { + debug.inspectOpts = {}; - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) + var keys = Object.keys(exports.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } } -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} +/** + * Enable namespaces listed in `process.env.DEBUG` initially. + */ -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { +exports.enable(load()); - // if the abs isn't a dir, then nothing can match! - if (!entries) - return cb() - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' +/***/ }), +/* 471 */ +/***/ (function(module, exports) { - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } +module.exports = require("tty"); - //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) +/***/ }), +/* 472 */ +/***/ (function(module, exports, __webpack_require__) { - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return cb() +"use strict"; - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) +const env = process.env; - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) - } - // This was the last one, and no stats were needed - return cb() - } +function translateLevel(level) { + if (level === 0) { + return false; + } - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - this._process([e].concat(remain), index, inGlobStar, cb) - } - cb() + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; } -Glob.prototype._emitMatch = function (index, e) { - if (this.aborted) - return +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } - if (isIgnored(this, e)) - return + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } - if (this.paused) { - this._emitQueue.push([index, e]) - return - } + if (hasFlag('color=256')) { + return 2; + } - var abs = isAbsolute(e) ? e : this._makeAbs(e) + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } - if (this.mark) - e = this._mark(e) + const min = forceColor ? 1 : 0; - if (this.absolute) - e = abs + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } - if (this.matches[index][e]) - return + return 1; + } - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } - this.matches[index][e] = true + return min; + } - var st = this.statCache[abs] - if (st) - this.emit('stat', e, st) + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } - this.emit('match', e) -} + if (env.COLORTERM === 'truecolor') { + return 3; + } -Glob.prototype._readdirInGlobStar = function (abs, cb) { - if (this.aborted) - return + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false, cb) + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } - var lstatkey = 'lstat\0' + abs - var self = this - var lstatcb = inflight(lstatkey, lstatcb_) + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } - if (lstatcb) - fs.lstat(abs, lstatcb) + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } - function lstatcb_ (er, lstat) { - if (er && er.code === 'ENOENT') - return cb() + if ('COLORTERM' in env) { + return 1; + } - var isSym = lstat && lstat.isSymbolicLink() - self.symlinks[abs] = isSym + if (env.TERM === 'dumb') { + return min; + } - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) { - self.cache[abs] = 'FILE' - cb() - } else - self._readdir(abs, false, cb) - } + return min; } -Glob.prototype._readdir = function (abs, inGlobStar, cb) { - if (this.aborted) - return - - cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) - if (!cb) - return +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} - //console.error('RD %j %j', +inGlobStar, abs) - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs, cb) +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return cb() - if (Array.isArray(c)) - return cb(null, c) - } +/***/ }), +/* 473 */ +/***/ (function(module, exports) { - var self = this - fs.readdir(abs, readdirCb(this, abs, cb)) -} +module.exports = require("zlib"); -function readdirCb (self, abs, cb) { - return function (er, entries) { - if (er) - self._readdirError(abs, er, cb) - else - self._readdirEntries(abs, entries, cb) - } -} +/***/ }), +/* 474 */ +/***/ (function(module) { -Glob.prototype._readdirEntries = function (abs, entries, cb) { - if (this.aborted) - return +module.exports = JSON.parse("{\"name\":\"axios\",\"version\":\"0.19.2\",\"description\":\"Promise based HTTP client for the browser and node.js\",\"main\":\"index.js\",\"scripts\":{\"test\":\"grunt test && bundlesize\",\"start\":\"node ./sandbox/server.js\",\"build\":\"NODE_ENV=production grunt build\",\"preversion\":\"npm test\",\"version\":\"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json\",\"postversion\":\"git push && git push --tags\",\"examples\":\"node ./examples/server.js\",\"coveralls\":\"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js\",\"fix\":\"eslint --fix lib/**/*.js\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/axios/axios.git\"},\"keywords\":[\"xhr\",\"http\",\"ajax\",\"promise\",\"node\"],\"author\":\"Matt Zabriskie\",\"license\":\"MIT\",\"bugs\":{\"url\":\"https://github.com/axios/axios/issues\"},\"homepage\":\"https://github.com/axios/axios\",\"devDependencies\":{\"bundlesize\":\"^0.17.0\",\"coveralls\":\"^3.0.0\",\"es6-promise\":\"^4.2.4\",\"grunt\":\"^1.0.2\",\"grunt-banner\":\"^0.6.0\",\"grunt-cli\":\"^1.2.0\",\"grunt-contrib-clean\":\"^1.1.0\",\"grunt-contrib-watch\":\"^1.0.0\",\"grunt-eslint\":\"^20.1.0\",\"grunt-karma\":\"^2.0.0\",\"grunt-mocha-test\":\"^0.13.3\",\"grunt-ts\":\"^6.0.0-beta.19\",\"grunt-webpack\":\"^1.0.18\",\"istanbul-instrumenter-loader\":\"^1.0.0\",\"jasmine-core\":\"^2.4.1\",\"karma\":\"^1.3.0\",\"karma-chrome-launcher\":\"^2.2.0\",\"karma-coverage\":\"^1.1.1\",\"karma-firefox-launcher\":\"^1.1.0\",\"karma-jasmine\":\"^1.1.1\",\"karma-jasmine-ajax\":\"^0.1.13\",\"karma-opera-launcher\":\"^1.0.0\",\"karma-safari-launcher\":\"^1.0.0\",\"karma-sauce-launcher\":\"^1.2.0\",\"karma-sinon\":\"^1.0.5\",\"karma-sourcemap-loader\":\"^0.3.7\",\"karma-webpack\":\"^1.7.0\",\"load-grunt-tasks\":\"^3.5.2\",\"minimist\":\"^1.2.0\",\"mocha\":\"^5.2.0\",\"sinon\":\"^4.5.0\",\"typescript\":\"^2.8.1\",\"url-search-params\":\"^0.10.0\",\"webpack\":\"^1.13.1\",\"webpack-dev-server\":\"^1.14.1\"},\"browser\":{\"./lib/adapters/http.js\":\"./lib/adapters/xhr.js\"},\"typings\":\"./index.d.ts\",\"dependencies\":{\"follow-redirects\":\"1.5.10\"},\"bundlesize\":[{\"path\":\"./dist/axios.min.js\",\"threshold\":\"5kB\"}]}"); - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } +/***/ }), +/* 475 */ +/***/ (function(module, exports, __webpack_require__) { - this.cache[abs] = entries - return cb(null, entries) -} +"use strict"; -Glob.prototype._readdirError = function (f, er, cb) { - if (this.aborted) - return - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - this.emit('error', error) - this.abort() - } - break +var utils = __webpack_require__(442); - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * @returns {Object} New object resulting from merging config2 to config1 + */ +module.exports = function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + var config = {}; - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) { - this.emit('error', er) - // If the error is handled, then we abort - // if not, we threw out of here - this.abort() - } - if (!this.silent) - console.error('glob error', er) - break - } - - return cb() -} - -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} + var valueFromConfig2Keys = ['url', 'method', 'params', 'data']; + var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy']; + var defaultToConfig2Keys = [ + 'baseURL', 'url', 'transformRequest', 'transformResponse', 'paramsSerializer', + 'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', + 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', + 'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent', + 'httpsAgent', 'cancelToken', 'socketPath' + ]; + utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } + }); -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - //console.error('pgs2', prefix, remain[0], entries) + utils.forEach(mergeDeepPropertiesKeys, function mergeDeepProperties(prop) { + if (utils.isObject(config2[prop])) { + config[prop] = utils.deepMerge(config1[prop], config2[prop]); + } else if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } else if (utils.isObject(config1[prop])) { + config[prop] = utils.deepMerge(config1[prop]); + } else if (typeof config1[prop] !== 'undefined') { + config[prop] = config1[prop]; + } + }); - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return cb() + utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } else if (typeof config1[prop] !== 'undefined') { + config[prop] = config1[prop]; + } + }); - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) + var axiosKeys = valueFromConfig2Keys + .concat(mergeDeepPropertiesKeys) + .concat(defaultToConfig2Keys); - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false, cb) + var otherKeys = Object + .keys(config2) + .filter(function filterAxiosKeys(key) { + return axiosKeys.indexOf(key) === -1; + }); - var isSym = this.symlinks[abs] - var len = entries.length + utils.forEach(otherKeys, function otherKeysDefaultToConfig2(prop) { + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } else if (typeof config1[prop] !== 'undefined') { + config[prop] = config1[prop]; + } + }); - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return cb() + return config; +}; - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true, cb) +/***/ }), +/* 476 */ +/***/ (function(module, exports, __webpack_require__) { - var below = gspref.concat(entries[i], remain) - this._process(below, index, true, cb) - } +"use strict"; - cb() -} -Glob.prototype._processSimple = function (prefix, index, cb) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var self = this - this._stat(prefix, function (er, exists) { - self._processSimple2(prefix, index, er, exists, cb) - }) +/** + * A `Cancel` is an object that is thrown when an operation is canceled. + * + * @class + * @param {string=} message The message. + */ +function Cancel(message) { + this.message = message; } -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { - - //console.error('ps2', prefix, exists) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return cb() - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - // Mark this as a match - this._emitMatch(index, prefix) - cb() -} +Cancel.prototype.toString = function toString() { + return 'Cancel' + (this.message ? ': ' + this.message : ''); +}; -// Returns either 'DIR', 'FILE', or false -Glob.prototype._stat = function (f, cb) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' +Cancel.prototype.__CANCEL__ = true; - if (f.length > this.maxLength) - return cb() +module.exports = Cancel; - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (Array.isArray(c)) - c = 'DIR' +/***/ }), +/* 477 */ +/***/ (function(module, exports, __webpack_require__) { - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return cb(null, c) +"use strict"; - if (needDir && c === 'FILE') - return cb() - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } +var Cancel = __webpack_require__(476); - var exists - var stat = this.statCache[abs] - if (stat !== undefined) { - if (stat === false) - return cb(null, stat) - else { - var type = stat.isDirectory() ? 'DIR' : 'FILE' - if (needDir && type === 'FILE') - return cb() - else - return cb(null, type, stat) - } +/** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @class + * @param {Function} executor The executor function. + */ +function CancelToken(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); } - var self = this - var statcb = inflight('stat\0' + abs, lstatcb_) - if (statcb) - fs.lstat(abs, statcb) + var resolvePromise; + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); - function lstatcb_ (er, lstat) { - if (lstat && lstat.isSymbolicLink()) { - // If it's a symlink, then treat it as the target, unless - // the target does not exist, then treat it as a file. - return fs.stat(abs, function (er, stat) { - if (er) - self._stat2(f, abs, null, lstat, cb) - else - self._stat2(f, abs, er, stat, cb) - }) - } else { - self._stat2(f, abs, er, lstat, cb) + var token = this; + executor(function cancel(message) { + if (token.reason) { + // Cancellation has already been requested + return; } - } + + token.reason = new Cancel(message); + resolvePromise(token.reason); + }); } -Glob.prototype._stat2 = function (f, abs, er, stat, cb) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return cb() +/** + * Throws a `Cancel` if cancellation has been requested. + */ +CancelToken.prototype.throwIfRequested = function throwIfRequested() { + if (this.reason) { + throw this.reason; } +}; - var needDir = f.slice(-1) === '/' - this.statCache[abs] = stat - - if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) - return cb(null, false, stat) - - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c - - if (needDir && c === 'FILE') - return cb() +/** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ +CancelToken.source = function source() { + var cancel; + var token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token: token, + cancel: cancel + }; +}; - return cb(null, c, stat) -} +module.exports = CancelToken; /***/ }), -/* 504 */ +/* 478 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = realpath -realpath.realpath = realpath -realpath.sync = realpathSync -realpath.realpathSync = realpathSync -realpath.monkeypatch = monkeypatch -realpath.unmonkeypatch = unmonkeypatch - -var fs = __webpack_require__(23) -var origRealpath = fs.realpath -var origRealpathSync = fs.realpathSync - -var version = process.version -var ok = /^v[0-5]\./.test(version) -var old = __webpack_require__(505) - -function newError (er) { - return er && er.syscall === 'realpath' && ( - er.code === 'ELOOP' || - er.code === 'ENOMEM' || - er.code === 'ENAMETOOLONG' - ) -} +"use strict"; -function realpath (p, cache, cb) { - if (ok) { - return origRealpath(p, cache, cb) - } - if (typeof cache === 'function') { - cb = cache - cache = null - } - origRealpath(p, cache, function (er, result) { - if (newError(er)) { - old.realpath(p, cache, cb) - } else { - cb(er, result) - } - }) -} +/** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * @returns {Function} + */ +module.exports = function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; +}; -function realpathSync (p, cache) { - if (ok) { - return origRealpathSync(p, cache) - } - try { - return origRealpathSync(p, cache) - } catch (er) { - if (newError(er)) { - return old.realpathSync(p, cache) - } else { - throw er - } - } -} +/***/ }), +/* 479 */ +/***/ (function(module, exports, __webpack_require__) { -function monkeypatch () { - fs.realpath = realpath - fs.realpathSync = realpathSync -} +"use strict"; -function unmonkeypatch () { - fs.realpath = origRealpath - fs.realpathSync = origRealpathSync -} +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +tslib_1.__exportStar(__webpack_require__(480), exports); /***/ }), -/* 505 */ +/* 480 */ /***/ (function(module, exports, __webpack_require__) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var pathModule = __webpack_require__(16); -var isWindows = process.platform === 'win32'; -var fs = __webpack_require__(23); +"use strict"; -// JavaScript implementation of realpath, ported from node pre-v6 +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isAxiosRequestError = (error) => { + return error && error.config && error.response === undefined; +}; +exports.isAxiosResponseError = (error) => { + return error && error.response && error.response.status !== undefined; +}; -var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); -function rethrow() { - // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and - // is fairly slow to generate. - var callback; - if (DEBUG) { - var backtrace = new Error; - callback = debugCallback; - } else - callback = missingCallback; +/***/ }), +/* 481 */ +/***/ (function(module, exports, __webpack_require__) { - return callback; +"use strict"; - function debugCallback(err) { - if (err) { - backtrace.message = err.message; - err = backtrace; - missingCallback(err); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +class KbnClientStatus { + constructor(requester) { + this.requester = requester; } - } - - function missingCallback(err) { - if (err) { - if (process.throwDeprecation) - throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs - else if (!process.noDeprecation) { - var msg = 'fs: missing callback ' + (err.stack || err.message); - if (process.traceDeprecation) - console.trace(msg); - else - console.error(msg); - } + /** + * Get the full server status + */ + async get() { + return await this.requester.request({ + method: 'GET', + path: 'api/status', + }); + } + /** + * Get the overall/merged state + */ + async getOverallState() { + const status = await this.get(); + return status.status.overall.state; } - } } +exports.KbnClientStatus = KbnClientStatus; -function maybeCallback(cb) { - return typeof cb === 'function' ? cb : rethrow(); -} -var normalize = pathModule.normalize; +/***/ }), +/* 482 */ +/***/ (function(module, exports, __webpack_require__) { -// Regexp that finds the next partion of a (partial) path -// result is [base_with_slash, base], e.g. ['somedir/', 'somedir'] -if (isWindows) { - var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; -} else { - var nextPartRe = /(.*?)(?:[\/]+|$)/g; -} +"use strict"; -// Regex to find the device root, including trailing slash. E.g. 'c:\\'. -if (isWindows) { - var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; -} else { - var splitRootRe = /^[\/]*/; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const PLUGIN_STATUS_ID = /^plugin:(.+?)@/; +class KbnClientPlugins { + constructor(status) { + this.status = status; + } + /** + * Get a list of plugin ids that are enabled on the server + */ + async getEnabledIds() { + const pluginIds = []; + const apiResp = await this.status.get(); + for (const status of apiResp.status.statuses) { + if (status.id) { + const match = status.id.match(PLUGIN_STATUS_ID); + if (match) { + pluginIds.push(match[1]); + } + } + } + return pluginIds; + } } +exports.KbnClientPlugins = KbnClientPlugins; -exports.realpathSync = function realpathSync(p, cache) { - // make p is absolute - p = pathModule.resolve(p); - - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return cache[p]; - } - - var original = p, - seenLinks = {}, - knownHard = {}; - - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - - start(); - - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs.lstatSync(base); - knownHard[base] = true; - } - } +/***/ }), +/* 483 */ +/***/ (function(module, exports, __webpack_require__) { - // walk down the path, swapping out linked pathparts for their real - // values - // NB: p.length changes. - while (pos < p.length) { - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; +"use strict"; - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - continue; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +class KbnClientVersion { + constructor(status) { + this.status = status; } - - var resolvedLink; - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // some known symbolic link. no need to stat again. - resolvedLink = cache[base]; - } else { - var stat = fs.lstatSync(base); - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - continue; - } - - // read the link if it wasn't read before - // dev/ino always return 0 on windows, so skip the check. - var linkTarget = null; - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - linkTarget = seenLinks[id]; + async get() { + if (this.versionCache !== undefined) { + return this.versionCache; } - } - if (linkTarget === null) { - fs.statSync(base); - linkTarget = fs.readlinkSync(base); - } - resolvedLink = pathModule.resolve(previous, linkTarget); - // track this, if given a cache. - if (cache) cache[base] = resolvedLink; - if (!isWindows) seenLinks[id] = linkTarget; + const status = await this.status.get(); + this.versionCache = status.version.number + (status.version.build_snapshot ? '-SNAPSHOT' : ''); + return this.versionCache; } +} +exports.KbnClientVersion = KbnClientVersion; - // resolve the link, then start over - p = pathModule.resolve(resolvedLink, p.slice(pos)); - start(); - } - - if (cache) cache[original] = p; - - return p; -}; - - -exports.realpath = function realpath(p, cache, cb) { - if (typeof cb !== 'function') { - cb = maybeCallback(cache); - cache = null; - } - // make p is absolute - p = pathModule.resolve(p); +/***/ }), +/* 484 */ +/***/ (function(module, exports, __webpack_require__) { - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return process.nextTick(cb.bind(null, null, cache[p])); - } +"use strict"; - var original = p, - seenLinks = {}, - knownHard = {}; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const kbn_client_requester_1 = __webpack_require__(438); +class KbnClientSavedObjects { + constructor(log, requester) { + this.log = log; + this.requester = requester; + } + /** + * Run the saved objects migration + */ + async migrate() { + this.log.debug('Migrating saved objects'); + return await this.requester.request({ + description: 'migrate saved objects', + path: kbn_client_requester_1.uriencode `/internal/saved_objects/_migrate`, + method: 'POST', + body: {}, + }); + } + /** + * Get an object + */ + async get(options) { + this.log.debug('Gettings saved object: %j', options); + return await this.requester.request({ + description: 'get saved object', + path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, + method: 'GET', + }); + } + /** + * Create a saved object + */ + async create(options) { + this.log.debug('Creating saved object: %j', options); + return await this.requester.request({ + description: 'update saved object', + path: options.id + ? kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}` + : kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}`, + query: { + overwrite: options.overwrite, + }, + method: 'POST', + body: { + attributes: options.attributes, + migrationVersion: options.migrationVersion, + references: options.references, + }, + }); + } + /** + * Update a saved object + */ + async update(options) { + this.log.debug('Updating saved object: %j', options); + return await this.requester.request({ + description: 'update saved object', + path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, + query: { + overwrite: options.overwrite, + }, + method: 'PUT', + body: { + attributes: options.attributes, + migrationVersion: options.migrationVersion, + references: options.references, + }, + }); + } + /** + * Delete an object + */ + async delete(options) { + this.log.debug('Deleting saved object %s/%s', options); + return await this.requester.request({ + description: 'delete saved object', + path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, + method: 'DELETE', + }); + } +} +exports.KbnClientSavedObjects = KbnClientSavedObjects; - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - start(); +/***/ }), +/* 485 */ +/***/ (function(module, exports, __webpack_require__) { - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; +"use strict"; - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs.lstat(base, function(err) { - if (err) return cb(err); - knownHard[base] = true; - LOOP(); - }); - } else { - process.nextTick(LOOP); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const kbn_client_requester_1 = __webpack_require__(438); +class KbnClientUiSettings { + constructor(log, requester, defaults) { + this.log = log; + this.requester = requester; + this.defaults = defaults; } - } - - // walk down the path, swapping out linked pathparts for their real - // values - function LOOP() { - // stop if scanned past end of path - if (pos >= p.length) { - if (cache) cache[original] = p; - return cb(null, p); + async get(setting) { + var _a; + const all = await this.getAll(); + const value = (_a = all[setting]) === null || _a === void 0 ? void 0 : _a.userValue; + this.log.verbose('uiSettings.value: %j', value); + return value; } - - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; - - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - return process.nextTick(LOOP); + /** + * Gets defaultIndex from the config doc. + */ + async getDefaultIndex() { + return await this.get('defaultIndex'); } - - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // known symbolic link. no need to stat again. - return gotResolvedLink(cache[base]); + /** + * Unset a uiSetting + */ + async unset(setting) { + return await this.requester.request({ + path: kbn_client_requester_1.uriencode `/api/kibana/settings/${setting}`, + method: 'DELETE', + }); } - - return fs.lstat(base, gotStat); - } - - function gotStat(err, stat) { - if (err) return cb(err); - - // if not a symlink, skip to the next path part - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - return process.nextTick(LOOP); + /** + * Replace all uiSettings with the `doc` values, `doc` is merged + * with some defaults + */ + async replace(doc, { retries = 5 } = {}) { + this.log.debug('replacing kibana config doc: %j', doc); + const changes = { + ...this.defaults, + ...doc, + }; + for (const [name, { isOverridden }] of Object.entries(await this.getAll())) { + if (!isOverridden && !changes.hasOwnProperty(name)) { + changes[name] = null; + } + } + await this.requester.request({ + method: 'POST', + path: '/api/kibana/settings', + body: { changes }, + retries, + }); } - - // stat & read the link if not read before - // call gotTarget as soon as the link target is known - // dev/ino always return 0 on windows, so skip the check. - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - return gotTarget(null, seenLinks[id], base); - } + /** + * Add fields to the config doc (like setting timezone and defaultIndex) + */ + async update(updates) { + this.log.debug('applying update to kibana config: %j', updates); + await this.requester.request({ + path: '/api/kibana/settings', + method: 'POST', + body: { + changes: updates, + }, + }); } - fs.stat(base, function(err) { - if (err) return cb(err); + async getAll() { + const resp = await this.requester.request({ + path: '/api/kibana/settings', + method: 'GET', + }); + return resp.settings; + } +} +exports.KbnClientUiSettings = KbnClientUiSettings; - fs.readlink(base, function(err, target) { - if (!isWindows) seenLinks[id] = target; - gotTarget(err, target); - }); - }); - } - function gotTarget(err, target, base) { - if (err) return cb(err); +/***/ }), +/* 486 */ +/***/ (function(module, exports, __webpack_require__) { - var resolvedLink = pathModule.resolve(previous, target); - if (cache) cache[base] = resolvedLink; - gotResolvedLink(resolvedLink); - } +"use strict"; - function gotResolvedLink(resolvedLink) { - // resolve the link, then start over - p = pathModule.resolve(resolvedLink, p.slice(pos)); - start(); - } -}; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +tslib_1.__exportStar(__webpack_require__(487), exports); /***/ }), -/* 506 */ +/* 487 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = minimatch -minimatch.Minimatch = Minimatch - -var path = { sep: '/' } -try { - path = __webpack_require__(16) -} catch (er) {} - -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = __webpack_require__(507) - -var plTypes = { - '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, - '?': { open: '(?:', close: ')?' }, - '+': { open: '(?:', close: ')+' }, - '*': { open: '(?:', close: ')*' }, - '@': { open: '(?:', close: ')' } -} +"use strict"; -// any single thing other than / -// don't need to escape / when using new RegExp() -var qmark = '[^/]' - -// * => any number of characters -var star = qmark + '*?' +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const util_1 = __webpack_require__(397); +const axios_1 = tslib_1.__importDefault(__webpack_require__(440)); +function parseConfig(log) { + const configJson = process.env.KIBANA_CI_STATS_CONFIG; + if (!configJson) { + log.debug('KIBANA_CI_STATS_CONFIG environment variable not found, disabling CiStatsReporter'); + return; + } + let config; + try { + config = JSON.parse(configJson); + } + catch (_) { + // handled below + } + if (typeof config === 'object' && config !== null) { + return validateConfig(log, config); + } + log.warning('KIBANA_CI_STATS_CONFIG is invalid, stats will not be reported'); + return; +} +function validateConfig(log, config) { + const validApiUrl = typeof config.apiUrl === 'string' && config.apiUrl.length !== 0; + if (!validApiUrl) { + log.warning('KIBANA_CI_STATS_CONFIG is missing a valid api url, stats will not be reported'); + return; + } + const validApiToken = typeof config.apiToken === 'string' && config.apiToken.length !== 0; + if (!validApiToken) { + log.warning('KIBANA_CI_STATS_CONFIG is missing a valid api token, stats will not be reported'); + return; + } + const validId = typeof config.buildId === 'string' && config.buildId.length !== 0; + if (!validId) { + log.warning('KIBANA_CI_STATS_CONFIG is missing a valid build id, stats will not be reported'); + return; + } + return config; +} +class CiStatsReporter { + constructor(config, log) { + this.config = config; + this.log = log; + } + static fromEnv(log) { + return new CiStatsReporter(parseConfig(log), log); + } + isEnabled() { + return !!this.config; + } + async metrics(metrics) { + var _a, _b, _c, _d; + if (!this.config) { + return; + } + let attempt = 0; + const maxAttempts = 5; + const bodySummary = metrics + .map(({ group, id, value }) => `[${group}/${id}=${value}]`) + .join(' '); + while (true) { + attempt += 1; + try { + await axios_1.default.request({ + method: 'POST', + url: '/v1/metrics', + baseURL: this.config.apiUrl, + headers: { + Authorization: `token ${this.config.apiToken}`, + }, + data: { + buildId: this.config.buildId, + metrics, + }, + }); + return; + } + catch (error) { + if (!((_a = error) === null || _a === void 0 ? void 0 : _a.request)) { + // not an axios error, must be a usage error that we should notify user about + throw error; + } + if (((_b = error) === null || _b === void 0 ? void 0 : _b.response) && error.response.status !== 502) { + // error response from service was received so warn the user and move on + this.log.warning(`error recording metric [status=${error.response.status}] [resp=${util_1.inspect(error.response.data)}] ${bodySummary}`); + return; + } + if (attempt === maxAttempts) { + this.log.warning(`failed to reach kibana-ci-stats service too many times, unable to record metric ${bodySummary}`); + return; + } + // we failed to reach the backend and we have remaining attempts, lets retry after a short delay + const reason = ((_d = (_c = error) === null || _c === void 0 ? void 0 : _c.response) === null || _d === void 0 ? void 0 : _d.status) ? `${error.response.status} response` + : 'no response'; + this.log.warning(`failed to reach kibana-ci-stats service [reason=${reason}], retrying in ${attempt} seconds`); + await new Promise((resolve) => setTimeout(resolve, attempt * 1000)); + } + } + } +} +exports.CiStatsReporter = CiStatsReporter; -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' +/***/ }), +/* 488 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -// characters that need to be escaped in RegExp. -var reSpecials = charSet('().*{}+?[]^$\\!') +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commands", function() { return commands; }); +/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(489); +/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(581); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(686); +/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(687); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split('').reduce(function (set, c) { - set[c] = true - return set - }, {}) -} -// normalizes slashes. -var slashSplit = /\/+/ -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} -function ext (a, b) { - a = a || {} - b = b || {} - var t = {} - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - return t -} +const commands = { + bootstrap: _bootstrap__WEBPACK_IMPORTED_MODULE_0__["BootstrapCommand"], + clean: _clean__WEBPACK_IMPORTED_MODULE_1__["CleanCommand"], + run: _run__WEBPACK_IMPORTED_MODULE_2__["RunCommand"], + watch: _watch__WEBPACK_IMPORTED_MODULE_3__["WatchCommand"] +}; -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch +/***/ }), +/* 489 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var orig = minimatch +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCommand", function() { return BootstrapCommand; }); +/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(490); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(500); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(501); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(502); +/* harmony import */ var _utils_project_checksums__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(575); +/* harmony import */ var _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(580); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - } - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - return m -} -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -} -function minimatch (p, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - if (!options) options = {} +const BootstrapCommand = { + description: 'Install dependencies and crosslink projects', + name: 'bootstrap', - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false - } + async run(projects, projectGraph, { + options, + kbn + }) { + const batchedProjectsByWorkspace = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph, { + batchByWorkspace: true + }); + const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph); + const extraArgs = [...(options['frozen-lockfile'] === true ? ['--frozen-lockfile'] : []), ...(options['prefer-offline'] === true ? ['--prefer-offline'] : [])]; - // "" only matches "" - if (pattern.trim() === '') return p === '' + for (const batch of batchedProjectsByWorkspace) { + for (const project of batch) { + if (project.isWorkspaceProject) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].verbose(`Skipping workspace project: ${project.name}`); + continue; + } - return new Minimatch(pattern, options).match(p) -} + if (project.hasDependencies()) { + await project.installDependencies({ + extraArgs + }); + } + } + } -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options) - } + await Object(_utils_link_project_executables__WEBPACK_IMPORTED_MODULE_0__["linkProjectExecutables"])(projects, projectGraph); + /** + * At the end of the bootstrapping process we call all `kbn:bootstrap` scripts + * in the list of projects. We do this because some projects need to be + * transpiled before they can be used. Ideally we shouldn't do this unless we + * have to, as it will slow down the bootstrapping process. + */ - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } + const checksums = await Object(_utils_project_checksums__WEBPACK_IMPORTED_MODULE_4__["getAllChecksums"])(kbn, _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"]); + const caches = new Map(); + let cachedProjectCount = 0; - if (!options) options = {} - pattern = pattern.trim() + for (const project of projects.values()) { + if (project.hasScript('kbn:bootstrap')) { + const file = new _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_5__["BootstrapCacheFile"](kbn, project, checksums); + const valid = options.cache && file.isValid(); - // windows support: need to use /, not \ - if (path.sep !== '/') { - pattern = pattern.split(path.sep).join('/') - } + if (valid) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`[${project.name}] cache up to date`); + } - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false + caches.set(project, { + file, + valid + }); + cachedProjectCount += 1; + } + } - // make the set of regexps etc. - this.make() -} + if (cachedProjectCount > 0) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`${cachedProjectCount} bootsrap builds are cached`); + } -Minimatch.prototype.debug = function () {} + await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async project => { + const cache = caches.get(project); -Minimatch.prototype.make = make -function make () { - // don't do it more than once. - if (this._made) return + if (cache && !cache.valid) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`[${project.name}] running [kbn:bootstrap] script`); + cache.file.delete(); + await project.runScriptStreaming('kbn:bootstrap'); + cache.file.write(); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${project.name}] bootstrap complete`); + } + }); + } - var pattern = this.pattern - var options = this.options +}; - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } +/***/ }), +/* 490 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - // step 1: figure out negation, etc. - this.parseNegate() +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkProjectExecutables", function() { return linkProjectExecutables; }); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(491); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(500); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ - // step 2: expand braces - var set = this.globSet = this.braceExpand() - if (options.debug) this.debug = console.error - this.debug(this.pattern, set) - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) +/** + * Yarn does not link the executables from dependencies that are installed + * using `link:` https://github.com/yarnpkg/yarn/pull/5046 + * + * We simulate this functionality by walking through each project's project + * dependencies, and manually linking their executables if defined. The logic + * for linking was mostly adapted from lerna: https://github.com/lerna/lerna/blob/1d7eb9eeff65d5a7de64dea73613b1bf6bfa8d57/src/PackageUtilities.js#L348 + */ +async function linkProjectExecutables(projectsByName, projectGraph) { + _log__WEBPACK_IMPORTED_MODULE_2__["log"].debug(`Linking package executables`); - this.debug(this.pattern, set) + for (const [projectName, projectDeps] of projectGraph) { + const project = projectsByName.get(projectName); + const binsDir = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(project.nodeModulesLocation, '.bin'); - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) + for (const projectDep of projectDeps) { + const executables = projectDep.getExecutables(); - this.debug(this.pattern, set) + for (const name of Object.keys(executables)) { + const srcPath = executables[name]; // existing logic from lerna -- ensure that the bin we are going to + // point to exists or ignore it - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return s.indexOf(false) === -1 - }) + if (!(await Object(_fs__WEBPACK_IMPORTED_MODULE_1__["isFile"])(srcPath))) { + continue; + } - this.debug(this.pattern, set) + const dest = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(binsDir, name); // Get relative project path with normalized path separators. - this.set = set + const projectRelativePath = Object(path__WEBPACK_IMPORTED_MODULE_0__["relative"])(project.path, srcPath).split(path__WEBPACK_IMPORTED_MODULE_0__["sep"]).join('/'); + _log__WEBPACK_IMPORTED_MODULE_2__["log"].debug(`[${project.name}] ${name} -> ${projectRelativePath}`); + await Object(_fs__WEBPACK_IMPORTED_MODULE_1__["mkdirp"])(Object(path__WEBPACK_IMPORTED_MODULE_0__["dirname"])(dest)); + await Object(_fs__WEBPACK_IMPORTED_MODULE_1__["createSymlink"])(srcPath, dest, 'exec'); + await Object(_fs__WEBPACK_IMPORTED_MODULE_1__["chmod"])(dest, '755'); + } + } + } } -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - var negate = false - var options = this.options - var negateOffset = 0 +/***/ }), +/* 491 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (options.nonegate) return +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readFile", function() { return readFile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "chmod", function() { return chmod; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mkdirp", function() { return mkdirp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unlink", function() { return unlink; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyDirectory", function() { return copyDirectory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSymlink", function() { return isSymlink; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDirectory", function() { return isDirectory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFile", function() { return isFile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSymlink", function() { return createSymlink; }); +/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(492); +/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cmd_shim__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(349); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(499); +/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ncp__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(397); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_4__); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ - for (var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === '!' - ; i++) { - negate = !negate - negateOffset++ - } - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return braceExpand(pattern, options) -} -Minimatch.prototype.braceExpand = braceExpand -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options - } else { - options = {} - } - } +const lstat = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.lstat); +const readFile = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.readFile); +const symlink = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.symlink); +const chmod = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.chmod); +const cmdShim = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(cmd_shim__WEBPACK_IMPORTED_MODULE_0___default.a); +const mkdir = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.mkdir); +const mkdirp = async path => await mkdir(path, { + recursive: true +}); +const unlink = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.unlink); +const copyDirectory = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(ncp__WEBPACK_IMPORTED_MODULE_2__["ncp"]); - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern +async function statTest(path, block) { + try { + return block((await lstat(path))); + } catch (e) { + if (e.code === 'ENOENT') { + return false; + } - if (typeof pattern === 'undefined') { - throw new TypeError('undefined pattern') + throw e; } +} +/** + * Test if a path points to a symlink. + * @param path + */ - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - return expand(pattern) +async function isSymlink(path) { + return await statTest(path, stats => stats.isSymbolicLink()); } +/** + * Test if a path points to a directory. + * @param path + */ -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - if (pattern.length > 1024 * 64) { - throw new TypeError('pattern is too long') - } - - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === '**') return GLOBSTAR - if (pattern === '') return '' +async function isDirectory(path) { + return await statTest(path, stats => stats.isDirectory()); +} +/** + * Test if a path points to a regular file. + * @param path + */ - var re = '' - var hasMagic = !!options.nocase - var escaping = false - // ? => one single character - var patternListStack = [] - var negativeLists = [] - var stateChar - var inClass = false - var reClassStart = -1 - var classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)' - var self = this +async function isFile(path) { + return await statTest(path, stats => stats.isFile()); +} +/** + * Create a symlink at dest that points to src. Adapted from + * https://github.com/lerna/lerna/blob/2f1b87d9e2295f587e4ac74269f714271d8ed428/src/FileSystemUtilities.js#L103. + * + * @param src + * @param dest + * @param type 'dir', 'file', 'junction', or 'exec'. 'exec' on + * windows will use the `cmd-shim` module since symlinks can't be used + * for executable files on windows. + */ - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case '*': - re += star - hasMagic = true - break - case '?': - re += qmark - hasMagic = true - break - default: - re += '\\' + stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false +async function createSymlink(src, dest, type) { + if (process.platform === 'win32') { + if (type === 'exec') { + await cmdShim(src, dest); + } else { + await forceCreate(src, dest, type); } + } else { + const posixType = type === 'exec' ? 'file' : type; + const relativeSource = Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(Object(path__WEBPACK_IMPORTED_MODULE_3__["dirname"])(dest), src); + await forceCreate(relativeSource, dest, posixType); } +} - for (var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i++) { - this.debug('%s\t%s %s %j', pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += '\\' + c - escaping = false - continue +async function forceCreate(src, dest, type) { + try { + // If something exists at `dest` we need to remove it first. + await unlink(dest); + } catch (error) { + if (error.code !== 'ENOENT') { + throw error; } + } - switch (c) { - case '/': - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case '\\': - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case '?': - case '*': - case '+': - case '@': - case '!': - this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === '!' && i === classStart + 1) c = '^' - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case '(': - if (inClass) { - re += '(' - continue - } - - if (!stateChar) { - re += '\\(' - continue - } - - patternListStack.push({ - type: stateChar, - start: i - 1, - reStart: re.length, - open: plTypes[stateChar].open, - close: plTypes[stateChar].close - }) - // negation is (?:(?!js)[^/]*) - re += stateChar === '!' ? '(?:(?!(?:' : '(?:' - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ')': - if (inClass || !patternListStack.length) { - re += '\\)' - continue - } - - clearStateChar() - hasMagic = true - var pl = patternListStack.pop() - // negation is (?:(?!js)[^/]*) - // The others are (?:) - re += pl.close - if (pl.type === '!') { - negativeLists.push(pl) - } - pl.reEnd = re.length - continue - - case '|': - if (inClass || !patternListStack.length || escaping) { - re += '\\|' - escaping = false - continue - } - - clearStateChar() - re += '|' - continue + await symlink(src, dest, type); +} - // these are mostly the same in regexp and glob - case '[': - // swallow any state-tracking char before the [ - clearStateChar() +/***/ }), +/* 492 */ +/***/ (function(module, exports, __webpack_require__) { - if (inClass) { - re += '\\' + c - continue - } +// On windows, create a .cmd file. +// Read the #! in the file to see what it uses. The vast majority +// of the time, this will be either: +// "#!/usr/bin/env " +// or: +// "#! " +// +// Write a binroot/pkg.bin + ".cmd" file that has this line in it: +// @ %~dp0 %* - inClass = true - classStart = i - reClassStart = re.length - re += c - continue +module.exports = cmdShim +cmdShim.ifExists = cmdShimIfExists - case ']': - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += '\\' + c - escaping = false - continue - } +var fs = __webpack_require__(493) - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - if (inClass) { - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i) - try { - RegExp('[' + cs + ']') - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' - hasMagic = hasMagic || sp[1] - inClass = false - continue - } - } +var mkdir = __webpack_require__(497) + , path = __webpack_require__(4) + , toBatchSyntax = __webpack_require__(498) + , shebangExpr = /^#\!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+=[^ \t]+\s+)*\s*([^ \t]+)(.*)$/ - // finish up the class. - hasMagic = true - inClass = false - re += c - continue +function cmdShimIfExists (from, to, cb) { + fs.stat(from, function (er) { + if (er) return cb() + cmdShim(from, to, cb) + }) +} - default: - // swallow any state char that wasn't consumed - clearStateChar() +// Try to unlink, but ignore errors. +// Any problems will surface later. +function rm (path, cb) { + fs.unlink(path, function(er) { + cb() + }) +} - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === '^' && inClass)) { - re += '\\' - } +function cmdShim (from, to, cb) { + fs.stat(from, function (er, stat) { + if (er) + return cb(er) - re += c + cmdShim_(from, to, cb) + }) +} - } // switch - } // for +function cmdShim_ (from, to, cb) { + var then = times(2, next, cb) + rm(to, then) + rm(to + ".cmd", then) - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - cs = pattern.substr(classStart + 1) - sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] - hasMagic = hasMagic || sp[1] + function next(er) { + writeShim(from, to, cb) } +} - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + pl.open.length) - this.debug('setting tail', re, pl) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = '\\' - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + '|' +function writeShim (from, to, cb) { + // make a cmd file and a sh script + // First, check if the bin is a #! of some sort. + // If not, then assume it's something that'll be compiled, or some other + // sort of script, and just call it directly. + mkdir(path.dirname(to), function (er) { + if (er) + return cb(er) + fs.readFile(from, "utf8", function (er, data) { + if (er) return writeShim_(from, to, null, null, cb) + var firstLine = data.trim().split(/\r*\n/)[0] + , shebang = firstLine.match(shebangExpr) + if (!shebang) return writeShim_(from, to, null, null, null, cb) + var vars = shebang[1] || "" + , prog = shebang[2] + , args = shebang[3] || "" + return writeShim_(from, to, prog, args, vars, cb) }) + }) +} - this.debug('tail=%j\n %s', tail, tail, pl, re) - var t = pl.type === '*' ? star - : pl.type === '?' ? qmark - : '\\' + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) + t + '\\(' + tail - } - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += '\\\\' +function writeShim_ (from, to, prog, args, variables, cb) { + var shTarget = path.relative(path.dirname(to), from) + , target = shTarget.split("/").join("\\") + , longProg + , shProg = prog && prog.split("\\").join("/") + , shLongProg + , pwshProg = shProg && "\"" + shProg + "$exe\"" + , pwshLongProg + shTarget = shTarget.split("\\").join("/") + args = args || "" + variables = variables || "" + if (!prog) { + prog = "\"%~dp0\\" + target + "\"" + shProg = "\"$basedir/" + shTarget + "\"" + pwshProg = shProg + args = "" + target = "" + shTarget = "" + } else { + longProg = "\"%~dp0\\" + prog + ".exe\"" + shLongProg = "\"$basedir/" + prog + "\"" + pwshLongProg = "\"$basedir/" + prog + "$exe\"" + target = "\"%~dp0\\" + target + "\"" + shTarget = "\"$basedir/" + shTarget + "\"" } - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case '.': - case '[': - case '(': addPatternStart = true + // @SETLOCAL + // + // @IF EXIST "%~dp0\node.exe" ( + // @SET "_prog=%~dp0\node.exe" + // ) ELSE ( + // @SET "_prog=node" + // @SET PATHEXT=%PATHEXT:;.JS;=;% + // ) + // + // "%_prog%" "%~dp0\.\node_modules\npm\bin\npm-cli.js" %* + // @ENDLOCAL + var cmd + if (longProg) { + shLongProg = shLongProg.trim(); + args = args.trim(); + var variableDeclarationsAsBatch = toBatchSyntax.convertToSetCommands(variables) + cmd = "@SETLOCAL\r\n" + + variableDeclarationsAsBatch + + "\r\n" + + "@IF EXIST " + longProg + " (\r\n" + + " @SET \"_prog=" + longProg.replace(/(^")|("$)/g, '') + "\"\r\n" + + ") ELSE (\r\n" + + " @SET \"_prog=" + prog.replace(/(^")|("$)/g, '') + "\"\r\n" + + " @SET PATHEXT=%PATHEXT:;.JS;=;%\r\n" + + ")\r\n" + + "\r\n" + + "\"%_prog%\" " + args + " " + target + " %*\r\n" + + '@ENDLOCAL\r\n' + } else { + cmd = "@" + prog + " " + args + " " + target + " %*\r\n" } - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n] - - var nlBefore = re.slice(0, nl.reStart) - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) - var nlAfter = re.slice(nl.reEnd) - - nlLast += nlAfter - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1 - var cleanAfter = nlAfter - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') - } - nlAfter = cleanAfter + // #!/bin/sh + // basedir=`dirname "$0"` + // + // case `uname` in + // *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; + // esac + // + // if [ -x "$basedir/node.exe" ]; then + // "$basedir/node.exe" "$basedir/node_modules/npm/bin/npm-cli.js" "$@" + // ret=$? + // else + // node "$basedir/node_modules/npm/bin/npm-cli.js" "$@" + // ret=$? + // fi + // exit $ret - var dollar = '' - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$' - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast - re = newRe - } + var sh = "#!/bin/sh\n" - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && hasMagic) { - re = '(?=.)' + re - } + sh = sh + + "basedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\,/,g')\")\n" + + "\n" + + "case `uname` in\n" + + " *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w \"$basedir\"`;;\n" + + "esac\n" + + "\n" - if (addPatternStart) { - re = patternStart + re + if (shLongProg) { + sh = sh + + "if [ -x "+shLongProg+" ]; then\n" + + " " + variables + shLongProg + " " + args + " " + shTarget + " \"$@\"\n" + + " ret=$?\n" + + "else \n" + + " " + variables + shProg + " " + args + " " + shTarget + " \"$@\"\n" + + " ret=$?\n" + + "fi\n" + + "exit $ret\n" + } else { + sh = sh + + shProg + " " + args + " " + shTarget + " \"$@\"\n" + + "exit $?\n" } - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [re, hasMagic] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) + // #!/usr/bin/env pwsh + // $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + // + // $ret=0 + // $exe = "" + // if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + // # Fix case when both the Windows and Linux builds of Node + // # are installed in the same directory + // $exe = ".exe" + // } + // if (Test-Path "$basedir/node") { + // & "$basedir/node$exe" "$basedir/node_modules/npm/bin/npm-cli.js" $args + // $ret=$LASTEXITCODE + // } else { + // & "node$exe" "$basedir/node_modules/npm/bin/npm-cli.js" $args + // $ret=$LASTEXITCODE + // } + // exit $ret + var pwsh = "#!/usr/bin/env pwsh\n" + + "$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n" + + "\n" + + "$exe=\"\"\n" + + "if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n" + + " # Fix case when both the Windows and Linux builds of Node\n" + + " # are installed in the same directory\n" + + " $exe=\".exe\"\n" + + "}\n" + if (shLongProg) { + pwsh = pwsh + + "$ret=0\n" + + "if (Test-Path " + pwshLongProg + ") {\n" + + " & " + pwshLongProg + " " + args + " " + shTarget + " $args\n" + + " $ret=$LASTEXITCODE\n" + + "} else {\n" + + " & " + pwshProg + " " + args + " " + shTarget + " $args\n" + + " $ret=$LASTEXITCODE\n" + + "}\n" + + "exit $ret\n" + } else { + pwsh = pwsh + + "& " + pwshProg + " " + args + " " + shTarget + " $args\n" + + "exit $LASTEXITCODE\n" } - var flags = options.nocase ? 'i' : '' - try { - var regExp = new RegExp('^' + re + '$', flags) - } catch (er) { - // If it was an invalid regular expression, then it can't match - // anything. This trick looks for a character after the end of - // the string, which is of course impossible, except in multi-line - // mode, but it's not a /m regex. - return new RegExp('$.') + var then = times(3, next, cb) + fs.writeFile(to + ".ps1", pwsh, "utf8", then) + fs.writeFile(to + ".cmd", cmd, "utf8", then) + fs.writeFile(to, sh, "utf8", then) + function next () { + chmodShim(to, cb) } - - regExp._glob = pattern - regExp._src = re - - return regExp } -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() +function chmodShim (to, cb) { + var then = times(2, cb, cb) + fs.chmod(to, "0755", then) + fs.chmod(to + ".cmd", "0755", then) + fs.chmod(to + ".ps1", "0755", then) } -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) { - this.regexp = false - return this.regexp +function times(n, ok, cb) { + var errState = null + return function(er) { + if (!errState) { + if (er) + cb(errState = er) + else if (--n === 0) + ok() + } } - var options = this.options +} - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - var flags = options.nocase ? 'i' : '' - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === 'string') ? regExpEscape(p) - : p._src - }).join('\\\/') - }).join('|') +/***/ }), +/* 493 */ +/***/ (function(module, exports, __webpack_require__) { - // must match entire pattern - // ending in a * or ** will make it less strict. - re = '^(?:' + re + ')$' +var fs = __webpack_require__(349) +var polyfills = __webpack_require__(494) +var legacy = __webpack_require__(495) +var clone = __webpack_require__(496) - // can match anything, as long as it's not this. - if (this.negate) re = '^(?!' + re + ').*$' +var util = __webpack_require__(397) - try { - this.regexp = new RegExp(re, flags) - } catch (ex) { - this.regexp = false - } - return this.regexp -} +/* istanbul ignore next - node 0.x polyfill */ +var gracefulQueue +var previousSymbol -minimatch.match = function (list, pattern, options) { - options = options || {} - var mm = new Minimatch(pattern, options) - list = list.filter(function (f) { - return mm.match(f) - }) - if (mm.options.nonull && !list.length) { - list.push(pattern) - } - return list +/* istanbul ignore else - node 0.x polyfill */ +if (typeof Symbol === 'function' && typeof Symbol.for === 'function') { + gracefulQueue = Symbol.for('graceful-fs.queue') + // This is used in testing by future versions + previousSymbol = Symbol.for('graceful-fs.previous') +} else { + gracefulQueue = '___graceful-fs.queue' + previousSymbol = '___graceful-fs.previous' } -Minimatch.prototype.match = match -function match (f, partial) { - this.debug('match', f, this.pattern) - // short-circuit in the case of busted things. - // comments, etc. - if (this.comment) return false - if (this.empty) return f === '' - - if (f === '/' && partial) return true - - var options = this.options +function noop () {} - // windows: need to use /, not \ - if (path.sep !== '/') { - f = f.split(path.sep).join('/') +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) } - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, 'split', f) +// Once time initialization +if (!global[gracefulQueue]) { + // This queue can be shared by multiple loaded instances + var queue = [] + Object.defineProperty(global, gracefulQueue, { + get: function() { + return queue + } + }) - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. + // Patch fs.close/closeSync to shared queue version, because we need + // to retry() whenever a close happens *anywhere* in the program. + // This is essential when multiple graceful-fs instances are + // in play at the same time. + fs.close = (function (fs$close) { + function close (fd, cb) { + return fs$close.call(fs, fd, function (err) { + // This function uses the graceful-fs shared queue + if (!err) { + retry() + } - var set = this.set - this.debug(this.pattern, 'set', set) + if (typeof cb === 'function') + cb.apply(this, arguments) + }) + } - // Find the basename of the path by looking for the last non-empty segment - var filename - var i - for (i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } + Object.defineProperty(close, previousSymbol, { + value: fs$close + }) + return close + })(fs.close) - for (i = 0; i < set.length; i++) { - var pattern = set[i] - var file = f - if (options.matchBase && pattern.length === 1) { - file = [filename] - } - var hit = this.matchOne(file, pattern, partial) - if (hit) { - if (options.flipNegate) return true - return !this.negate + fs.closeSync = (function (fs$closeSync) { + function closeSync (fd) { + // This function uses the graceful-fs shared queue + fs$closeSync.apply(fs, arguments) + retry() } - } - // didn't get any hits. this is success if it's a negative - // pattern, failure otherwise. - if (options.flipNegate) return false - return this.negate + Object.defineProperty(closeSync, previousSymbol, { + value: fs$closeSync + }) + return closeSync + })(fs.closeSync) + + if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(global[gracefulQueue]) + __webpack_require__(371).equal(global[gracefulQueue].length, 0) + }) + } } -// set partial to true to test if, for example, -// "/a/b" matches the start of "/*/b/*/d" -// Partial means, if you run out of file before you run -// out of pattern, then that's fine, as long as all -// the parts match. -Minimatch.prototype.matchOne = function (file, pattern, partial) { - var options = this.options +module.exports = patch(clone(fs)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module.exports = patch(fs) + fs.__patched = true; +} - this.debug('matchOne', - { 'this': this, file: file, pattern: pattern }) +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch - this.debug('matchOne', file.length, pattern.length) + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null - for (var fi = 0, - pi = 0, - fl = file.length, - pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi++, pi++) { - this.debug('matchOne loop') - var p = pattern[pi] - var f = file[fi] + return go$readFile(path, options, cb) - this.debug(pattern, p, f) + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) + return go$writeFile(path, data, options, cb) - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - var pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) return false + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } - return true - } - - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr] + }) + } + } - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr) - break - } + return go$appendFile(path, data, options, cb) - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr++ + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } - } - - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr) - if (fr === fl) return true - } - return false + }) } + } - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === 'string') { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase() - } else { - hit = f === p - } - this.debug('string match', p, f, hit) + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) } else { - hit = f.match(p) - this.debug('pattern match', p, f, hit) + cb = options } + args.push(go$readdir$cb) - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') - return emptyFileEnd - } + return go$readdir(args) - // should be unreachable. - throw new Error('wtf?') -} + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, '$1') -} + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } -/***/ }), -/* 507 */ -/***/ (function(module, exports, __webpack_require__) { + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } -var concatMap = __webpack_require__(508); -var balanced = __webpack_require__(509); + var fs$ReadStream = fs.ReadStream + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + } -module.exports = expandTop; + var fs$WriteStream = fs.WriteStream + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + } -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); + Object.defineProperty(fs, 'ReadStream', { + get: function () { + return ReadStream + }, + set: function (val) { + ReadStream = val + }, + enumerable: true, + configurable: true + }) + Object.defineProperty(fs, 'WriteStream', { + get: function () { + return WriteStream + }, + set: function (val) { + WriteStream = val + }, + enumerable: true, + configurable: true + }) - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); + // legacy names + var FileReadStream = ReadStream + Object.defineProperty(fs, 'FileReadStream', { + get: function () { + return FileReadStream + }, + set: function (val) { + FileReadStream = val + }, + enumerable: true, + configurable: true + }) + var FileWriteStream = WriteStream + Object.defineProperty(fs, 'FileWriteStream', { + get: function () { + return FileWriteStream + }, + set: function (val) { + FileWriteStream = val + }, + enumerable: true, + configurable: true + }) - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) } - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() - // I don't know why Bash 4.3 does this, but it does. - // Anything starting with {} will have the first two bytes preserved - // but *only* at the top level, so {},a}b will not expand to anything, - // but a{},b}c will be expanded to [a}c,abc]. - // One could argue that this is a bug in Bash, but since the goal of - // this module is to match Bash's rules, we escape a leading {} - if (str.substr(0, 2) === '{}') { - str = '\\{\\}' + str.substr(2); + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) } - return expand(escapeBraces(str), true).map(unescapeBraces); -} - -function identity(e) { - return e; -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str, isTop) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = m.body.indexOf(',') >= 0; - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*\}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) } - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post, false) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) } - } + }) } - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; + function createReadStream (path, options) { + return new fs.ReadStream(path, options) + } - var N; + function createWriteStream (path, options) { + return new fs.WriteStream(path, options) + } - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null - N = []; + return go$open(path, flags, mode, cb) - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el, false) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); + }) } } - return expansions; + return fs } +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + global[gracefulQueue].push(elem) +} - -/***/ }), -/* 508 */ -/***/ (function(module, exports) { - -module.exports = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; +function retry () { + var elem = global[gracefulQueue].shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } +} /***/ }), -/* 509 */ +/* 494 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var constants = __webpack_require__(411) -module.exports = balanced; -function balanced(a, b, str) { - if (a instanceof RegExp) a = maybeMatch(a, str); - if (b instanceof RegExp) b = maybeMatch(b, str); +var origCwd = process.cwd +var cwd = null - var r = range(a, b, str); +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - return r && { - start: r[0], - end: r[1], - pre: str.slice(0, r[0]), - body: str.slice(r[0] + a.length, r[1]), - post: str.slice(r[1] + b.length) - }; +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd } +try { + process.cwd() +} catch (er) {} -function maybeMatch(reg, str) { - var m = str.match(reg); - return m ? m[0] : null; +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) } -balanced.range = range; -function range(a, b, str) { - var begs, beg, left, right, result; - var ai = str.indexOf(a); - var bi = str.indexOf(b, ai + 1); - var i = ai; - - if (ai >= 0 && bi > 0) { - begs = []; - left = str.length; - - while (i >= 0 && !result) { - if (i == ai) { - begs.push(i); - ai = str.indexOf(a, i + 1); - } else if (begs.length == 1) { - result = [ begs.pop(), bi ]; - } else { - beg = begs.pop(); - if (beg < left) { - left = beg; - right = bi; - } +module.exports = patch - bi = str.indexOf(b, i + 1); - } +function patch (fs) { + // (re-)implement some things that are known busted or missing. - i = ai < bi && ai >= 0 ? ai : bi; - } + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } - if (begs.length) { - result = [ left, right ]; - } + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) } - return result; -} + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) -/***/ }), -/* 510 */ -/***/ (function(module, exports, __webpack_require__) { + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) -try { - var util = __webpack_require__(29); - /* istanbul ignore next */ - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; -} catch (e) { - /* istanbul ignore next */ - module.exports = __webpack_require__(511); -} + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) -/***/ }), -/* 511 */ -/***/ (function(module, exports) { + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }) + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) + + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) } - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor + fs.lchmodSync = function () {} + } + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) } + fs.lchownSync = function () {} } -} - - -/***/ }), -/* 512 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } -function posix(path) { - return path.charAt(0) === '/'; -} + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { + function read (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } -function win32(path) { - // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 - var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - var result = splitDeviceRe.exec(path); - var device = result[1] || ''; - var isUnc = Boolean(device && device.charAt(1) !== ':'); - - // UNC paths are always absolute - return Boolean(result[2] || isUnc); -} - -module.exports = process.platform === 'win32' ? win32 : posix; -module.exports.posix = posix; -module.exports.win32 = win32; + // This ensures `util.promisify` works as it does for native `fs.read`. + read.__proto__ = fs$read + return read + })(fs.read) + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) -/***/ }), -/* 513 */ -/***/ (function(module, exports, __webpack_require__) { + function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } -module.exports = globSync -globSync.GlobSync = GlobSync + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) -var fs = __webpack_require__(23) -var rp = __webpack_require__(504) -var minimatch = __webpack_require__(506) -var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(503).Glob -var util = __webpack_require__(29) -var path = __webpack_require__(16) -var assert = __webpack_require__(30) -var isAbsolute = __webpack_require__(512) -var common = __webpack_require__(514) -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + } -function globSync (pattern, options) { - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') + function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } - return new GlobSync(pattern, options).found -} + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } -function GlobSync (pattern, options) { - if (!pattern) - throw new Error('must provide pattern') + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } + } - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') + function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } - if (!(this instanceof GlobSync)) - return new GlobSync(pattern, options) + function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } + } + } - setopts(this, pattern, options) - if (this.noprocess) - return this + function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } - var n = this.minimatch.set.length - this.matches = new Array(n) - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false) + function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } } - this._finish() -} -GlobSync.prototype._finish = function () { - assert(this instanceof GlobSync) - if (this.realpath) { - var self = this - this.matches.forEach(function (matchset, index) { - var set = self.matches[index] = Object.create(null) - for (var p in matchset) { - try { - p = self._makeAbs(p) - var real = rp.realpathSync(p, self.realpathCache) - set[real] = true - } catch (er) { - if (er.syscall === 'stat') - set[self._makeAbs(p)] = true - else - throw er + function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + function callback (er, stats) { + if (stats) { + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 } + if (cb) cb.apply(this, arguments) } - }) + return options ? orig.call(fs, target, options, callback) + : orig.call(fs, target, callback) + } } - common.finish(this) -} - - -GlobSync.prototype._process = function (pattern, index, inGlobStar) { - assert(this instanceof GlobSync) - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ + function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, options) { + var stats = options ? orig.call(fs, target, options) + : orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; + } } - // now n is the index of the first one that is *not* a string. - // See if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index) - return + // ENOSYS means that the fs doesn't support the op. Just ignore + // that, because it doesn't matter. + // + // if there's no getuid, or if getuid() is something other + // than 0, and the error is EINVAL or EPERM, then just ignore + // it. + // + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // + // When running as root, or if other types of errors are + // encountered, then it's strict. + function chownErOk (er) { + if (!er) + return true - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break + if (er.code === "ENOSYS") + return true - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false } +} - var remain = pattern.slice(n) - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix +/***/ }), +/* 495 */ +/***/ (function(module, exports, __webpack_require__) { - var abs = this._makeAbs(read) +var Stream = __webpack_require__(382).Stream - //if ignored, skip processing - if (childrenIgnored(this, read)) - return +module.exports = legacy - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar) -} +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream + } + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { - var entries = this._readdir(abs, inGlobStar) + Stream.call(this); - // if the abs isn't a dir, then nothing can match! - if (!entries) - return + var self = this; - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return + options = options || {}; - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) + if (this.encoding) this.setEncoding(this.encoding); - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix.slice(-1) !== '/') - e = prefix + '/' + e - else - e = prefix + e + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); } - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) + if (this.start > this.end) { + throw new Error('start must be <= end'); } - this._emitMatch(index, e) + + this.pos = this.start; } - // This was the last one, and no stats were needed - return - } - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) - newPattern = [prefix, e] - else - newPattern = [e] - this._process(newPattern.concat(remain), index, inGlobStar) - } -} + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } -GlobSync.prototype._emitMatch = function (index, e) { - if (isIgnored(this, e)) - return + self.fd = fd; + self.emit('open', fd); + self._read(); + }) + } - var abs = this._makeAbs(e) + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); - if (this.mark) - e = this._mark(e) + Stream.call(this); - if (this.absolute) { - e = abs - } + this.path = path; + this.fd = null; + this.writable = true; - if (this.matches[index][e]) - return + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } + options = options || {}; - this.matches[index][e] = true + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } - if (this.stat) - this._stat(e) -} + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } + this.pos = this.start; + } -GlobSync.prototype._readdirInGlobStar = function (abs) { - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false) + this.busy = false; + this._queue = []; - var entries - var lstat - var stat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er.code === 'ENOENT') { - // lstat failed, doesn't exist - return null + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); } } +} - var isSym = lstat && lstat.isSymbolicLink() - this.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) - this.cache[abs] = 'FILE' - else - entries = this._readdir(abs, false) - return entries -} +/***/ }), +/* 496 */ +/***/ (function(module, exports, __webpack_require__) { -GlobSync.prototype._readdir = function (abs, inGlobStar) { - var entries +"use strict"; - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs) - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return null +module.exports = clone - if (Array.isArray(c)) - return c - } +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj - try { - return this._readdirEntries(abs, fs.readdirSync(abs)) - } catch (er) { - this._readdirError(abs, er) - return null - } -} - -GlobSync.prototype._readdirEntries = function (abs, entries) { - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) - this.cache[abs] = entries + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) - // mark and cache dir-ness - return entries + return copy } -GlobSync.prototype._readdirError = function (f, er) { - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - throw error - } - break - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break +/***/ }), +/* 497 */ +/***/ (function(module, exports, __webpack_require__) { - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) - throw er - if (!this.silent) - console.error('glob error', er) - break - } -} +var path = __webpack_require__(4); +var fs = __webpack_require__(349); +var _0777 = parseInt('0777', 8); -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; - var entries = this._readdir(abs, inGlobStar) +function mkdirP (p, opts, f, made) { + if (typeof opts === 'function') { + f = opts; + opts = {}; + } + else if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 & (~process.umask()); + } + if (!made) made = null; + + var cb = f || function () {}; + p = path.resolve(p); + + xfs.mkdir(p, mode, function (er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case 'ENOENT': + if (path.dirname(p) === p) return cb(er); + mkdirP(path.dirname(p), opts, function (er, made) { + if (er) cb(er, made); + else mkdirP(p, opts, cb, made); + }); + break; - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + xfs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original error be the failure reason. + if (er2 || !stat.isDirectory()) cb(er, made) + else cb(null, made); + }); + break; + } + }); +} - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) +mkdirP.sync = function sync (p, opts, made) { + if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 & (~process.umask()); + } + if (!made) made = null; - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false) + p = path.resolve(p); - var len = entries.length - var isSym = this.symlinks[abs] + try { + xfs.mkdirSync(p, mode); + made = made || p; + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + made = sync(path.dirname(p), opts, made); + sync(p, opts, made); + break; - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + var stat; + try { + stat = xfs.statSync(p); + } + catch (err1) { + throw err0; + } + if (!stat.isDirectory()) throw err0; + break; + } + } - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue + return made; +}; - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true) - var below = gspref.concat(entries[i], remain) - this._process(below, index, true) - } -} +/***/ }), +/* 498 */ +/***/ (function(module, exports) { -GlobSync.prototype._processSimple = function (prefix, index) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var exists = this._stat(prefix) +exports.replaceDollarWithPercentPair = replaceDollarWithPercentPair +exports.convertToSetCommand = convertToSetCommand +exports.convertToSetCommands = convertToSetCommands + +function convertToSetCommand(key, value) { + var line = "" + key = key || "" + key = key.trim() + value = value || "" + value = value.trim() + if(key && value && value.length > 0) { + line = "@SET " + key + "=" + replaceDollarWithPercentPair(value) + "\r\n" + } + return line +} + +function extractVariableValuePairs(declarations) { + var pairs = {} + declarations.map(function(declaration) { + var split = declaration.split("=") + pairs[split[0]]=split[1] + }) + return pairs +} + +function convertToSetCommands(variableString) { + var variableValuePairs = extractVariableValuePairs(variableString.split(" ")) + var variableDeclarationsAsBatch = "" + Object.keys(variableValuePairs).forEach(function (key) { + variableDeclarationsAsBatch += convertToSetCommand(key, variableValuePairs[key]) + }) + return variableDeclarationsAsBatch +} + +function replaceDollarWithPercentPair(value) { + var dollarExpressions = /\$\{?([^\$@#\?\- \t{}:]+)\}?/g + var result = "" + var startIndex = 0 + value = value || "" + do { + var match = dollarExpressions.exec(value) + if(match) { + var betweenMatches = value.substring(startIndex, match.index) || "" + result += betweenMatches + "%" + match[1] + "%" + startIndex = dollarExpressions.lastIndex + } + } while (dollarExpressions.lastIndex > 0) + result += value.substr(startIndex) + return result +} + + - if (!this.matches[index]) - this.matches[index] = Object.create(null) - // If it doesn't exist, then just mark the lack of results - if (!exists) - return +/***/ }), +/* 499 */ +/***/ (function(module, exports, __webpack_require__) { - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } +var fs = __webpack_require__(349), + path = __webpack_require__(4); - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') +module.exports = ncp; +ncp.ncp = ncp; - // Mark this as a match - this._emitMatch(index, prefix) -} +function ncp (source, dest, options, callback) { + var cback = callback; -// Returns either 'DIR', 'FILE', or false -GlobSync.prototype._stat = function (f) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' + if (!callback) { + cback = options; + options = {}; + } - if (f.length > this.maxLength) - return false + var basePath = process.cwd(), + currentPath = path.resolve(basePath, source), + targetPath = path.resolve(basePath, dest), + filter = options.filter, + rename = options.rename, + transform = options.transform, + clobber = options.clobber !== false, + modified = options.modified, + dereference = options.dereference, + errs = null, + started = 0, + finished = 0, + running = 0, + limit = options.limit || ncp.limit || 16; - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] + limit = (limit < 1) ? 1 : (limit > 512) ? 512 : limit; - if (Array.isArray(c)) - c = 'DIR' + startCopy(currentPath); + + function startCopy(source) { + started++; + if (filter) { + if (filter instanceof RegExp) { + if (!filter.test(source)) { + return cb(true); + } + } + else if (typeof filter === 'function') { + if (!filter(source)) { + return cb(true); + } + } + } + return getStats(source); + } - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return c + function getStats(source) { + var stat = dereference ? fs.stat : fs.lstat; + if (running >= limit) { + return setImmediate(function () { + getStats(source); + }); + } + running++; + stat(source, function (err, stats) { + var item = {}; + if (err) { + return onError(err); + } - if (needDir && c === 'FILE') - return false + // We need to get the mode from the stats object and preserve it. + item.name = source; + item.mode = stats.mode; + item.mtime = stats.mtime; //modified time + item.atime = stats.atime; //access time - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. + if (stats.isDirectory()) { + return onDir(item); + } + else if (stats.isFile()) { + return onFile(item); + } + else if (stats.isSymbolicLink()) { + // Symlinks don't really need to know about the mode. + return onLink(source); + } + }); } - var exists - var stat = this.statCache[abs] - if (!stat) { - var lstat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return false - } + function onFile(file) { + var target = file.name.replace(currentPath, targetPath); + if(rename) { + target = rename(target); } - - if (lstat && lstat.isSymbolicLink()) { - try { - stat = fs.statSync(abs) - } catch (er) { - stat = lstat + isWritable(target, function (writable) { + if (writable) { + return copyFile(file, target); + } + if(clobber) { + rmFile(target, function () { + copyFile(file, target); + }); + } + if (modified) { + var stat = dereference ? fs.stat : fs.lstat; + stat(target, function(err, stats) { + //if souce modified time greater to target modified time copy file + if (file.mtime.getTime()>stats.mtime.getTime()) + copyFile(file, target); + else return cb(); + }); + } + else { + return cb(); } + }); + } + + function copyFile(file, target) { + var readStream = fs.createReadStream(file.name), + writeStream = fs.createWriteStream(target, { mode: file.mode }); + + readStream.on('error', onError); + writeStream.on('error', onError); + + if(transform) { + transform(readStream, writeStream, file); } else { - stat = lstat + writeStream.on('open', function() { + readStream.pipe(writeStream); + }); } + writeStream.once('finish', function() { + if (modified) { + //target file modified date sync. + fs.utimesSync(target, file.atime, file.mtime); + cb(); + } + else cb(); + }); } - this.statCache[abs] = stat - - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' + function rmFile(file, done) { + fs.unlink(file, function (err) { + if (err) { + return onError(err); + } + return done(); + }); + } - this.cache[abs] = this.cache[abs] || c + function onDir(dir) { + var target = dir.name.replace(currentPath, targetPath); + isWritable(target, function (writable) { + if (writable) { + return mkDir(dir, target); + } + copyDir(dir.name); + }); + } - if (needDir && c === 'FILE') - return false + function mkDir(dir, target) { + fs.mkdir(target, dir.mode, function (err) { + if (err) { + return onError(err); + } + copyDir(dir.name); + }); + } - return c -} + function copyDir(dir) { + fs.readdir(dir, function (err, items) { + if (err) { + return onError(err); + } + items.forEach(function (item) { + startCopy(path.join(dir, item)); + }); + return cb(); + }); + } -GlobSync.prototype._mark = function (p) { - return common.mark(this, p) -} + function onLink(link) { + var target = link.replace(currentPath, targetPath); + fs.readlink(link, function (err, resolvedPath) { + if (err) { + return onError(err); + } + checkLink(resolvedPath, target); + }); + } -GlobSync.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} + function checkLink(resolvedPath, target) { + if (dereference) { + resolvedPath = path.resolve(basePath, resolvedPath); + } + isWritable(target, function (writable) { + if (writable) { + return makeLink(resolvedPath, target); + } + fs.readlink(target, function (err, targetDest) { + if (err) { + return onError(err); + } + if (dereference) { + targetDest = path.resolve(basePath, targetDest); + } + if (targetDest === resolvedPath) { + return cb(); + } + return rmFile(target, function () { + makeLink(resolvedPath, target); + }); + }); + }); + } + function makeLink(linkPath, target) { + fs.symlink(linkPath, target, function (err) { + if (err) { + return onError(err); + } + return cb(); + }); + } -/***/ }), -/* 514 */ -/***/ (function(module, exports, __webpack_require__) { - -exports.alphasort = alphasort -exports.alphasorti = alphasorti -exports.setopts = setopts -exports.ownProp = ownProp -exports.makeAbs = makeAbs -exports.finish = finish -exports.mark = mark -exports.isIgnored = isIgnored -exports.childrenIgnored = childrenIgnored - -function ownProp (obj, field) { - return Object.prototype.hasOwnProperty.call(obj, field) -} - -var path = __webpack_require__(16) -var minimatch = __webpack_require__(506) -var isAbsolute = __webpack_require__(512) -var Minimatch = minimatch.Minimatch - -function alphasorti (a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()) -} - -function alphasort (a, b) { - return a.localeCompare(b) -} - -function setupIgnores (self, options) { - self.ignore = options.ignore || [] - - if (!Array.isArray(self.ignore)) - self.ignore = [self.ignore] - - if (self.ignore.length) { - self.ignore = self.ignore.map(ignoreMap) - } -} - -// ignore patterns are always in dot:true mode. -function ignoreMap (pattern) { - var gmatcher = null - if (pattern.slice(-3) === '/**') { - var gpattern = pattern.replace(/(\/\*\*)+$/, '') - gmatcher = new Minimatch(gpattern, { dot: true }) - } - - return { - matcher: new Minimatch(pattern, { dot: true }), - gmatcher: gmatcher + function isWritable(path, done) { + fs.lstat(path, function (err) { + if (err) { + if (err.code === 'ENOENT') return done(true); + return done(false); + } + return done(false); + }); } -} - -function setopts (self, pattern, options) { - if (!options) - options = {} - // base-matching: just use globstar for that. - if (options.matchBase && -1 === pattern.indexOf("/")) { - if (options.noglobstar) { - throw new Error("base matching requires globstar") + function onError(err) { + if (options.stopOnError) { + return cback(err); } - pattern = "**/" + pattern - } - - self.silent = !!options.silent - self.pattern = pattern - self.strict = options.strict !== false - self.realpath = !!options.realpath - self.realpathCache = options.realpathCache || Object.create(null) - self.follow = !!options.follow - self.dot = !!options.dot - self.mark = !!options.mark - self.nodir = !!options.nodir - if (self.nodir) - self.mark = true - self.sync = !!options.sync - self.nounique = !!options.nounique - self.nonull = !!options.nonull - self.nosort = !!options.nosort - self.nocase = !!options.nocase - self.stat = !!options.stat - self.noprocess = !!options.noprocess - self.absolute = !!options.absolute - - self.maxLength = options.maxLength || Infinity - self.cache = options.cache || Object.create(null) - self.statCache = options.statCache || Object.create(null) - self.symlinks = options.symlinks || Object.create(null) - - setupIgnores(self, options) - - self.changedCwd = false - var cwd = process.cwd() - if (!ownProp(options, "cwd")) - self.cwd = cwd - else { - self.cwd = path.resolve(options.cwd) - self.changedCwd = self.cwd !== cwd - } - - self.root = options.root || path.resolve(self.cwd, "/") - self.root = path.resolve(self.root) - if (process.platform === "win32") - self.root = self.root.replace(/\\/g, "/") - - // TODO: is an absolute `cwd` supposed to be resolved against `root`? - // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') - self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) - if (process.platform === "win32") - self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") - self.nomount = !!options.nomount - - // disable comments and negation in Minimatch. - // Note that they are not supported in Glob itself anyway. - options.nonegate = true - options.nocomment = true - - self.minimatch = new Minimatch(pattern, options) - self.options = self.minimatch.options -} - -function finish (self) { - var nou = self.nounique - var all = nou ? [] : Object.create(null) - - for (var i = 0, l = self.matches.length; i < l; i ++) { - var matches = self.matches[i] - if (!matches || Object.keys(matches).length === 0) { - if (self.nonull) { - // do like the shell, and spit out the literal glob - var literal = self.minimatch.globSet[i] - if (nou) - all.push(literal) - else - all[literal] = true - } - } else { - // had matches - var m = Object.keys(matches) - if (nou) - all.push.apply(all, m) - else - m.forEach(function (m) { - all[m] = true - }) + else if (!errs && options.errs) { + errs = fs.createWriteStream(options.errs); } - } - - if (!nou) - all = Object.keys(all) - - if (!self.nosort) - all = all.sort(self.nocase ? alphasorti : alphasort) - - // at *some* point we statted all of these - if (self.mark) { - for (var i = 0; i < all.length; i++) { - all[i] = self._mark(all[i]) + else if (!errs) { + errs = []; } - if (self.nodir) { - all = all.filter(function (e) { - var notDir = !(/\/$/.test(e)) - var c = self.cache[e] || self.cache[makeAbs(self, e)] - if (notDir && c) - notDir = c !== 'DIR' && !Array.isArray(c) - return notDir - }) + if (typeof errs.write === 'undefined') { + errs.push(err); } + else { + errs.write(err.stack + '\n\n'); + } + return cb(); } - if (self.ignore.length) - all = all.filter(function(m) { - return !isIgnored(self, m) - }) - - self.found = all -} - -function mark (self, p) { - var abs = makeAbs(self, p) - var c = self.cache[abs] - var m = p - if (c) { - var isDir = c === 'DIR' || Array.isArray(c) - var slash = p.slice(-1) === '/' - - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) - - if (m !== p) { - var mabs = makeAbs(self, m) - self.statCache[mabs] = self.statCache[abs] - self.cache[mabs] = self.cache[abs] + function cb(skipped) { + if (!skipped) running--; + finished++; + if ((started === finished) && (running === 0)) { + if (cback !== undefined ) { + return errs ? cback(errs) : cback(null); + } } } - - return m } -// lotta situps... -function makeAbs (self, f) { - var abs = f - if (f.charAt(0) === '/') { - abs = path.join(self.root, f) - } else if (isAbsolute(f) || f === '') { - abs = f - } else if (self.changedCwd) { - abs = path.resolve(self.cwd, f) - } else { - abs = path.resolve(f) - } - - if (process.platform === 'win32') - abs = abs.replace(/\\/g, '/') - return abs -} -// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -function isIgnored (self, path) { - if (!self.ignore.length) - return false +/***/ }), +/* 500 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return self.ignore.some(function(item) { - return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) - }) -} +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Log", function() { return Log; }); +/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); +/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["LogLevel"]; }); -function childrenIgnored (self, path) { - if (!self.ignore.length) - return false +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - return self.ignore.some(function(item) { - return !!(item.gmatcher && item.gmatcher.match(path)) - }) -} +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ -/***/ }), -/* 515 */ -/***/ (function(module, exports, __webpack_require__) { +class Log extends _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["ToolingLog"] { + constructor() { + super(); -var wrappy = __webpack_require__(405) -var reqs = Object.create(null) -var once = __webpack_require__(404) + _defineProperty(this, "logLevel", void 0); -module.exports = wrappy(inflight) + this.setLogLevel('info'); + } -function inflight (key, cb) { - if (reqs[key]) { - reqs[key].push(cb) - return null - } else { - reqs[key] = [cb] - return makeres(key) + setLogLevel(level) { + this.logLevel = Object(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["parseLogLevel"])(level); + this.setWriters([new _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["ToolingLogTextWriter"]({ + level: this.logLevel.name, + writeTo: process.stdout + })]); } -} -function makeres (key) { - return once(function RES () { - var cbs = reqs[key] - var len = cbs.length - var args = slice(arguments) + wouldLogLevel(level) { + return this.logLevel.flags[level]; + } - // XXX It's somewhat ambiguous whether a new callback added in this - // pass should be queued for later execution if something in the - // list of callbacks throws, or if it should just be discarded. - // However, it's such an edge case that it hardly matters, and either - // choice is likely as surprising as the other. - // As it happens, we do go ahead and schedule it for later execution. - try { - for (var i = 0; i < len; i++) { - cbs[i].apply(null, args) - } - } finally { - if (cbs.length > len) { - // added more in the interim. - // de-zalgo, just in case, but don't call again. - cbs.splice(0, len) - process.nextTick(function () { - RES.apply(null, args) - }) - } else { - delete reqs[key] - } - } - }) } -function slice (args) { - var length = args.length - var array = [] - - for (var i = 0; i < length; i++) array[i] = args[i] - return array -} +const log = new Log(); /***/ }), -/* 516 */ +/* 501 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CliError", function() { return CliError; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parallelizeBatches", function() { return parallelizeBatches; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parallelize", function() { return parallelize; }); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -47570,39 +44042,65 @@ __webpack_require__.r(__webpack_exports__); * specific language governing permissions and limitations * under the License. */ -class CliError extends Error { - constructor(message, meta = {}) { - super(message); - this.meta = meta; +async function parallelizeBatches(batches, fn) { + for (const batch of batches) { + // We need to make sure the entire batch has completed before we can move on + // to the next batch + await parallelize(batch, fn); + } +} +async function parallelize(items, fn, concurrency = 4) { + if (items.length === 0) { + return; } + return new Promise((resolve, reject) => { + let activePromises = 0; + const values = items.slice(0); + + async function scheduleItem(item) { + activePromises++; + + try { + await fn(item); + activePromises--; + + if (values.length > 0) { + // We have more work to do, so we schedule the next promise + scheduleItem(values.shift()); + } else if (activePromises === 0) { + // We have no more values left, and all items have completed, so we've + // completed all the work. + resolve(); + } + } catch (error) { + reject(error); + } + } + + values.splice(0, concurrency).map(scheduleItem); + }); } /***/ }), -/* 517 */ +/* 502 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return Project; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(23); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(29); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(516); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(518); -/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(563); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getProjects", function() { return getProjects; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProjectGraph", function() { return buildProjectGraph; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "topologicallyBatchProjects", function() { return topologicallyBatchProjects; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "includeTransitiveProjects", function() { return includeTransitiveProjects; }); +/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(503); +/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(397); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(516); +/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(517); +/* harmony import */ var _workspaces__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(573); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -47627,6243 +44125,8760 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope +const glob = Object(util__WEBPACK_IMPORTED_MODULE_2__["promisify"])(glob__WEBPACK_IMPORTED_MODULE_0___default.a); +/** a Map of project names to Project instances */ +async function getProjects(rootPath, projectsPathsPatterns, { + include = [], + exclude = [] +} = {}) { + const projects = new Map(); + const workspaceProjectsPaths = await Object(_workspaces__WEBPACK_IMPORTED_MODULE_5__["workspacePackagePaths"])(rootPath); -class Project { - static async fromPath(path) { - const pkgJson = await Object(_package_json__WEBPACK_IMPORTED_MODULE_6__["readPackageJson"])(path); - return new Project(pkgJson, path); - } - /** parsed package.json */ + for (const pattern of projectsPathsPatterns) { + const pathsToProcess = await packagesFromGlobPattern({ + pattern, + rootPath + }); + for (const filePath of pathsToProcess) { + const projectConfigPath = normalize(filePath); + const projectDir = path__WEBPACK_IMPORTED_MODULE_1___default.a.dirname(projectConfigPath); + const project = await _project__WEBPACK_IMPORTED_MODULE_4__["Project"].fromPath(projectDir); - constructor(packageJson, projectPath) { - _defineProperty(this, "json", void 0); + if (workspaceProjectsPaths.indexOf(filePath) >= 0) { + project.isWorkspaceProject = true; + } - _defineProperty(this, "packageJsonLocation", void 0); + const excludeProject = exclude.includes(project.name) || include.length > 0 && !include.includes(project.name); - _defineProperty(this, "nodeModulesLocation", void 0); + if (excludeProject) { + continue; + } - _defineProperty(this, "targetLocation", void 0); + if (projects.has(project.name)) { + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`There are multiple projects with the same name [${project.name}]`, { + name: project.name, + paths: [project.path, projects.get(project.name).path] + }); + } - _defineProperty(this, "path", void 0); + projects.set(project.name, project); + } + } - _defineProperty(this, "version", void 0); + return projects; +} - _defineProperty(this, "allDependencies", void 0); +function packagesFromGlobPattern({ + pattern, + rootPath +}) { + const globOptions = { + cwd: rootPath, + // Should throw in case of unusual errors when reading the file system + strict: true, + // Always returns absolute paths for matched files + absolute: true, + // Do not match ** against multiple filenames + // (This is only specified because we currently don't have a need for it.) + noglobstar: true + }; + return glob(path__WEBPACK_IMPORTED_MODULE_1___default.a.join(pattern, 'package.json'), globOptions); +} // https://github.com/isaacs/node-glob/blob/master/common.js#L104 +// glob always returns "\\" as "/" in windows, so everyone +// gets normalized because we can't have nice things. - _defineProperty(this, "productionDependencies", void 0); - _defineProperty(this, "devDependencies", void 0); +function normalize(dir) { + return path__WEBPACK_IMPORTED_MODULE_1___default.a.normalize(dir); +} - _defineProperty(this, "scripts", void 0); +function buildProjectGraph(projects) { + const projectGraph = new Map(); - _defineProperty(this, "isWorkspaceRoot", false); + for (const project of projects.values()) { + const projectDeps = []; + const dependencies = project.allDependencies; - _defineProperty(this, "isWorkspaceProject", false); + for (const depName of Object.keys(dependencies)) { + if (projects.has(depName)) { + const dep = projects.get(depName); + const dependentProjectIsInWorkspace = project.isWorkspaceProject || project.json.name === 'kibana'; + project.ensureValidProjectDependency(dep, dependentProjectIsInWorkspace); + projectDeps.push(dep); + } + } - this.json = Object.freeze(packageJson); - this.path = projectPath; - this.packageJsonLocation = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, 'package.json'); - this.nodeModulesLocation = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, 'node_modules'); - this.targetLocation = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, 'target'); - this.version = this.json.version; - this.productionDependencies = this.json.dependencies || {}; - this.devDependencies = this.json.devDependencies || {}; - this.allDependencies = _objectSpread({}, this.devDependencies, {}, this.productionDependencies); - this.isWorkspaceRoot = this.json.hasOwnProperty('workspaces'); - this.scripts = this.json.scripts || {}; + projectGraph.set(project.name, projectDeps); } - get name() { - return this.json.name; - } + return projectGraph; +} +function topologicallyBatchProjects(projectsToBatch, projectGraph, { + batchByWorkspace = false +} = {}) { + // We're going to be chopping stuff out of this list, so copy it. + const projectsLeftToBatch = new Set(projectsToBatch.keys()); + const batches = []; - ensureValidProjectDependency(project, dependentProjectIsInWorkspace) { - const versionInPackageJson = this.allDependencies[project.name]; - let expectedVersionInPackageJson; + if (batchByWorkspace) { + const workspaceRootProject = Array.from(projectsToBatch.values()).find(p => p.isWorkspaceRoot); - if (dependentProjectIsInWorkspace) { - expectedVersionInPackageJson = project.json.version; - } else { - const relativePathToProject = normalizePath(path__WEBPACK_IMPORTED_MODULE_2___default.a.relative(this.path, project.path)); - expectedVersionInPackageJson = `link:${relativePathToProject}`; - } // No issues! + if (!workspaceRootProject) { + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`There was no yarn workspace root found.`); + } // Push in the workspace root first. - if (versionInPackageJson === expectedVersionInPackageJson) { - return; - } + batches.push([workspaceRootProject]); + projectsLeftToBatch.delete(workspaceRootProject.name); // In the next batch, push in all workspace projects. - let problemMsg; + const workspaceBatch = []; - if (Object(_package_json__WEBPACK_IMPORTED_MODULE_6__["isLinkDependency"])(versionInPackageJson) && dependentProjectIsInWorkspace) { - problemMsg = `but should be using a workspace`; - } else if (Object(_package_json__WEBPACK_IMPORTED_MODULE_6__["isLinkDependency"])(versionInPackageJson)) { - problemMsg = `using 'link:', but the path is wrong`; - } else { - problemMsg = `but it's not using the local package`; - } + for (const projectName of projectsLeftToBatch) { + const project = projectsToBatch.get(projectName); - throw new _errors__WEBPACK_IMPORTED_MODULE_4__["CliError"](`[${this.name}] depends on [${project.name}] ${problemMsg}. Update its package.json to the expected value below.`, { - actual: `"${project.name}": "${versionInPackageJson}"`, - expected: `"${project.name}": "${expectedVersionInPackageJson}"`, - package: `${this.name} (${this.packageJsonLocation})` - }); - } + if (project.isWorkspaceProject) { + workspaceBatch.push(project); + projectsLeftToBatch.delete(projectName); + } + } - getBuildConfig() { - return this.json.kibana && this.json.kibana.build || {}; + batches.push(workspaceBatch); } - /** - * Returns the directory that should be copied into the Kibana build artifact. - * This config can be specified to only include the project's build artifacts - * instead of everything located in the project directory. - */ + while (projectsLeftToBatch.size > 0) { + // Get all projects that have no remaining dependencies within the repo + // that haven't yet been picked. + const batch = []; - getIntermediateBuildDirectory() { - return path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, this.getBuildConfig().intermediateBuildDirectory || '.'); - } - - getCleanConfig() { - return this.json.kibana && this.json.kibana.clean || {}; - } + for (const projectName of projectsLeftToBatch) { + const projectDeps = projectGraph.get(projectName); + const needsDependenciesBatched = projectDeps.some(dep => projectsLeftToBatch.has(dep.name)); - hasScript(name) { - return name in this.scripts; - } + if (!needsDependenciesBatched) { + batch.push(projectsToBatch.get(projectName)); + } + } // If we weren't able to find a project with no remaining dependencies, + // then we've encountered a cycle in the dependency graph. - getExecutables() { - const raw = this.json.bin; - if (!raw) { - return {}; - } + const hasCycles = batch.length === 0; - if (typeof raw === 'string') { - return { - [this.name]: path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, raw) - }; + if (hasCycles) { + const cycleProjectNames = [...projectsLeftToBatch]; + const message = 'Encountered a cycle in the dependency graph. Projects in cycle are:\n' + cycleProjectNames.join(', '); + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](message); } - if (typeof raw === 'object') { - const binsConfig = {}; + batches.push(batch); + batch.forEach(project => projectsLeftToBatch.delete(project.name)); + } - for (const binName of Object.keys(raw)) { - binsConfig[binName] = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, raw[binName]); - } + return batches; +} +function includeTransitiveProjects(subsetOfProjects, allProjects, { + onlyProductionDependencies = false +} = {}) { + const projectsWithDependents = new Map(); // the current list of packages we are expanding using breadth-first-search - return binsConfig; - } + const toProcess = [...subsetOfProjects]; - throw new _errors__WEBPACK_IMPORTED_MODULE_4__["CliError"](`[${this.name}] has an invalid "bin" field in its package.json, ` + `expected an object or a string`, { - binConfig: Object(util__WEBPACK_IMPORTED_MODULE_3__["inspect"])(raw), - package: `${this.name} (${this.packageJsonLocation})` + while (toProcess.length > 0) { + const project = toProcess.shift(); + const dependencies = onlyProductionDependencies ? project.productionDependencies : project.allDependencies; + Object.keys(dependencies).forEach(dep => { + if (allProjects.has(dep)) { + toProcess.push(allProjects.get(dep)); + } }); + projectsWithDependents.set(project.name, project); } - async runScript(scriptName, args = []) { - _log__WEBPACK_IMPORTED_MODULE_5__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`\n\nRunning script [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(scriptName)}] in [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(this.name)}]:\n`)); - return Object(_scripts__WEBPACK_IMPORTED_MODULE_7__["runScriptInPackage"])(scriptName, args, this); - } - - runScriptStreaming(scriptName, args = []) { - return Object(_scripts__WEBPACK_IMPORTED_MODULE_7__["runScriptInPackageStreaming"])(scriptName, args, this); - } - - hasDependencies() { - return Object.keys(this.allDependencies).length > 0; - } + return projectsWithDependents; +} - async installDependencies({ - extraArgs - }) { - _log__WEBPACK_IMPORTED_MODULE_5__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`\n\nInstalling dependencies in [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(this.name)}]:\n`)); - await Object(_scripts__WEBPACK_IMPORTED_MODULE_7__["installInDir"])(this.path, extraArgs); - await this.removeExtraneousNodeModules(); - } - /** - * Yarn workspaces symlinks workspace projects to the root node_modules, even - * when there is no depenency on the project. This results in unnecicary, and - * often duplicated code in the build archives. - */ +/***/ }), +/* 503 */ +/***/ (function(module, exports, __webpack_require__) { +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. - async removeExtraneousNodeModules() { - // this is only relevant for the root workspace - if (!this.isWorkspaceRoot) { - return; - } +module.exports = glob - const workspacesInfo = await Object(_scripts__WEBPACK_IMPORTED_MODULE_7__["yarnWorkspacesInfo"])(this.path); - const unusedWorkspaces = new Set(Object.keys(workspacesInfo)); // check for any cross-project dependency +var fs = __webpack_require__(349) +var rp = __webpack_require__(504) +var minimatch = __webpack_require__(506) +var Minimatch = minimatch.Minimatch +var inherits = __webpack_require__(510) +var EE = __webpack_require__(373).EventEmitter +var path = __webpack_require__(4) +var assert = __webpack_require__(371) +var isAbsolute = __webpack_require__(512) +var globSync = __webpack_require__(513) +var common = __webpack_require__(514) +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = __webpack_require__(515) +var util = __webpack_require__(397) +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored - for (const name of Object.keys(workspacesInfo)) { - const workspace = workspacesInfo[name]; - workspace.workspaceDependencies.forEach(w => unusedWorkspaces.delete(w)); - } +var once = __webpack_require__(378) - unusedWorkspaces.forEach(name => { - const { - dependencies, - devDependencies - } = this.json; - const nodeModulesPath = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.nodeModulesLocation, name); - const isDependency = dependencies && dependencies.hasOwnProperty(name); - const isDevDependency = devDependencies && devDependencies.hasOwnProperty(name); +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} - if (!isDependency && !isDevDependency && fs__WEBPACK_IMPORTED_MODULE_1___default.a.existsSync(nodeModulesPath)) { - _log__WEBPACK_IMPORTED_MODULE_5__["log"].write(`No dependency on ${name}, removing link in node_modules`); - fs__WEBPACK_IMPORTED_MODULE_1___default.a.unlinkSync(nodeModulesPath); - } - }); + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) } -} // We normalize all path separators to `/` in generated files - -function normalizePath(path) { - return path.replace(/[\\\/]+/g, '/'); + return new Glob(pattern, options, cb) } -/***/ }), -/* 518 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readPackageJson", function() { return readPackageJson; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "writePackageJson", function() { return writePackageJson; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLinkDependency", function() { return isLinkDependency; }); -/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(519); -/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(read_pkg__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(545); -/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(write_pkg__WEBPACK_IMPORTED_MODULE_1__); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ +// old api surface +glob.glob = glob +function extend (origin, add) { + if (add === null || typeof add !== 'object') { + return origin + } -function readPackageJson(cwd) { - return read_pkg__WEBPACK_IMPORTED_MODULE_0___default()({ - cwd, - normalize: false - }); -} -function writePackageJson(path, json) { - return write_pkg__WEBPACK_IMPORTED_MODULE_1___default()(path, json); + var keys = Object.keys(add) + var i = keys.length + while (i--) { + origin[keys[i]] = add[keys[i]] + } + return origin } -const isLinkDependency = depVersion => depVersion.startsWith('link:'); - -/***/ }), -/* 519 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; +glob.hasMagic = function (pattern, options_) { + var options = extend({}, options_) + options.noprocess = true -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const parseJson = __webpack_require__(520); + var g = new Glob(pattern, options) + var set = g.minimatch.set -const readFileAsync = promisify(fs.readFile); + if (!pattern) + return false -module.exports = async options => { - options = { - cwd: process.cwd(), - normalize: true, - ...options - }; + if (set.length > 1) + return true - const filePath = path.resolve(options.cwd, 'package.json'); - const json = parseJson(await readFileAsync(filePath, 'utf8')); + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } - if (options.normalize) { - __webpack_require__(521)(json); - } + return false +} - return json; -}; +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } -module.exports.sync = options => { - options = { - cwd: process.cwd(), - normalize: true, - ...options - }; + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } - const filePath = path.resolve(options.cwd, 'package.json'); - const json = parseJson(fs.readFileSync(filePath, 'utf8')); + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) - if (options.normalize) { - __webpack_require__(521)(json); - } + setopts(this, pattern, options) + this._didRealPath = false - return json; -}; + // process each pattern in the minimatch set + var n = this.minimatch.set.length + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) -/***/ }), -/* 520 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } -"use strict"; + var self = this + this._processing = 0 -const errorEx = __webpack_require__(429); -const fallback = __webpack_require__(431); -const {default: LinesAndColumns} = __webpack_require__(432); -const {codeFrameColumns} = __webpack_require__(433); + this._emitQueue = [] + this._processQueue = [] + this.paused = false -const JSONError = errorEx('JSONError', { - fileName: errorEx.append('in %s'), - codeFrame: errorEx.append('\n\n%s\n') -}); + if (this.noprocess) + return this -module.exports = (string, reviver, filename) => { - if (typeof reviver === 'string') { - filename = reviver; - reviver = null; - } + if (n === 0) + return done() - try { - try { - return JSON.parse(string, reviver); - } catch (error) { - fallback(string, reviver); - throw error; - } - } catch (error) { - error.message = error.message.replace(/\n/g, ''); - const indexMatch = error.message.match(/in JSON at position (\d+) while parsing near/); + var sync = true + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + sync = false - const jsonError = new JSONError(error); - if (filename) { - jsonError.fileName = filename; - } + function done () { + --self._processing + if (self._processing <= 0) { + if (sync) { + process.nextTick(function () { + self._finish() + }) + } else { + self._finish() + } + } + } +} - if (indexMatch && indexMatch.length > 0) { - const lines = new LinesAndColumns(string); - const index = Number(indexMatch[1]); - const location = lines.locationForIndex(index); +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return - const codeFrame = codeFrameColumns( - string, - {start: {line: location.line + 1, column: location.column + 1}}, - {highlightCode: true} - ); + if (this.realpath && !this._didRealpath) + return this._realpath() - jsonError.codeFrame = codeFrame; - } + common.finish(this) + this.emit('end', this.found) +} - throw jsonError; - } -}; +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + this._didRealpath = true -/***/ }), -/* 521 */ -/***/ (function(module, exports, __webpack_require__) { + var n = this.matches.length + if (n === 0) + return this._finish() -module.exports = normalize + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) -var fixer = __webpack_require__(522) -normalize.fixer = fixer + function next () { + if (--n === 0) + self._finish() + } +} -var makeWarning = __webpack_require__(543) +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() -var fieldsToFix = ['name','version','description','repository','modules','scripts' - ,'files','bin','man','bugs','keywords','readme','homepage','license'] -var otherThingsToFix = ['dependencies','people', 'typos'] + var found = Object.keys(matchset) + var self = this + var n = found.length -var thingsToFix = fieldsToFix.map(function(fieldName) { - return ucFirst(fieldName) + "Field" -}) -// two ways to do this in CoffeeScript on only one line, sub-70 chars: -// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field" -// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix) -thingsToFix = thingsToFix.concat(otherThingsToFix) + if (n === 0) + return cb() -function normalize (data, warn, strict) { - if(warn === true) warn = null, strict = true - if(!strict) strict = false - if(!warn || data.private) warn = function(msg) { /* noop */ } + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + rp.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here - if (data.scripts && - data.scripts.install === "node-gyp rebuild" && - !data.scripts.preinstall) { - data.gypfile = true - } - fixer.warn = function() { warn(makeWarning.apply(null, arguments)) } - thingsToFix.forEach(function(thingName) { - fixer["fix" + ucFirst(thingName)](data, strict) + if (--n === 0) { + self.matches[index] = set + cb() + } + }) }) - data._id = data.name + "@" + data.version } -function ucFirst (string) { - return string.charAt(0).toUpperCase() + string.slice(1); +Glob.prototype._mark = function (p) { + return common.mark(this, p) } +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} -/***/ }), -/* 522 */ -/***/ (function(module, exports, __webpack_require__) { +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} -var semver = __webpack_require__(523) -var validateLicense = __webpack_require__(524); -var hostedGitInfo = __webpack_require__(529) -var isBuiltinModule = __webpack_require__(532).isCore -var depTypes = ["dependencies","devDependencies","optionalDependencies"] -var extractDescription = __webpack_require__(541) -var url = __webpack_require__(452) -var typos = __webpack_require__(542) +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} -var fixer = module.exports = { - // default warning function - warn: function() {}, - - fixRepositoryField: function(data) { - if (data.repositories) { - this.warn("repositories"); - data.repository = data.repositories[0] - } - if (!data.repository) return this.warn("missingRepository") - if (typeof data.repository === "string") { - data.repository = { - type: "git", - url: data.repository +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) } } - var r = data.repository.url || "" - if (r) { - var hosted = hostedGitInfo.fromUrl(r) - if (hosted) { - r = data.repository.url - = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString() + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) } } + } +} - if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { - this.warn("brokenGitUrl", r) - } +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return } -, fixTypos: function(data) { - Object.keys(typos.topLevel).forEach(function (d) { - if (data.hasOwnProperty(d)) { - this.warn("typo", d, typos.topLevel[d]) - } - }, this) + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ } + // now n is the index of the first one that is *not* a string. -, fixScriptsField: function(data) { - if (!data.scripts) return - if (typeof data.scripts !== "object") { - this.warn("nonObjectScripts") - delete data.scripts + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) return - } - Object.keys(data.scripts).forEach(function (k) { - if (typeof data.scripts[k] !== "string") { - this.warn("nonStringScript") - delete data.scripts[k] - } else if (typos.script[k] && !data.scripts[typos.script[k]]) { - this.warn("typo", k, typos.script[k], "scripts") - } - }, this) - } -, fixFilesField: function(data) { - var files = data.files - if (files && !Array.isArray(files)) { - this.warn("nonArrayFiles") - delete data.files - } else if (data.files) { - data.files = data.files.filter(function(file) { - if (!file || typeof file !== "string") { - this.warn("invalidFilename", file) - return false - } else { - return true - } - }, this) - } + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break } -, fixBinField: function(data) { - if (!data.bin) return; - if (typeof data.bin === "string") { - var b = {} - var match - if (match = data.name.match(/^@[^/]+[/](.*)$/)) { - b[match[1]] = data.bin + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) } else { - b[data.name] = data.bin + m = e.match(pn) } - data.bin = b + if (m) + matchedEntries.push(e) } } -, fixManField: function(data) { - if (!data.man) return; - if (typeof data.man === "string") { - data.man = [ data.man ] - } - } -, fixBundleDependenciesField: function(data) { - var bdd = "bundledDependencies" - var bd = "bundleDependencies" - if (data[bdd] && !data[bd]) { - data[bd] = data[bdd] - delete data[bdd] - } - if (data[bd] && !Array.isArray(data[bd])) { - this.warn("nonArrayBundleDependencies") - delete data[bd] - } else if (data[bd]) { - data[bd] = data[bd].filter(function(bd) { - if (!bd || typeof bd !== 'string') { - this.warn("nonStringBundleDependency", bd) - return false - } else { - if (!data.dependencies) { - data.dependencies = {} - } - if (!data.dependencies.hasOwnProperty(bd)) { - this.warn("nonDependencyBundleDependency", bd) - data.dependencies[bd] = "*" - } - return true - } - }, this) - } - } + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) -, fixDependencies: function(data, strict) { - var loose = !strict - objectifyDeps(data, this.warn) - addOptionalDepsToDeps(data, this.warn) - this.fixBundleDependenciesField(data) + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() - ;['dependencies','devDependencies'].forEach(function(deps) { - if (!(deps in data)) return - if (!data[deps] || typeof data[deps] !== "object") { - this.warn("nonObjectDependencies", deps) - delete data[deps] - return + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e } - Object.keys(data[deps]).forEach(function (d) { - var r = data[deps][d] - if (typeof r !== 'string') { - this.warn("nonStringDependency", d, JSON.stringify(r)) - delete data[deps][d] - } - var hosted = hostedGitInfo.fromUrl(data[deps][d]) - if (hosted) data[deps][d] = hosted.toString() - }, this) - }, this) - } -, fixModulesField: function (data) { - if (data.modules) { - this.warn("deprecatedModules") - delete data.modules + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) } + // This was the last one, and no stats were needed + return cb() } -, fixKeywordsField: function (data) { - if (typeof data.keywords === "string") { - data.keywords = data.keywords.split(/,\s+/) - } - if (data.keywords && !Array.isArray(data.keywords)) { - delete data.keywords - this.warn("nonArrayKeywords") - } else if (data.keywords) { - data.keywords = data.keywords.filter(function(kw) { - if (typeof kw !== "string" || !kw) { - this.warn("nonStringKeyword"); - return false - } else { - return true - } - }, this) + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e } + this._process([e].concat(remain), index, inGlobStar, cb) } + cb() +} -, fixVersionField: function(data, strict) { - // allow "loose" semver 1.0 versions in non-strict mode - // enforce strict semver 2.0 compliance in strict mode - var loose = !strict - if (!data.version) { - data.version = "" - return true - } - if (!semver.valid(data.version, loose)) { - throw new Error('Invalid version: "'+ data.version + '"') - } - data.version = semver.clean(data.version, loose) - return true - } +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return -, fixPeople: function(data) { - modifyPeople(data, unParsePerson) - modifyPeople(data, parsePerson) - } + if (isIgnored(this, e)) + return -, fixNameField: function(data, options) { - if (typeof options === "boolean") options = {strict: options} - else if (typeof options === "undefined") options = {} - var strict = options.strict - if (!data.name && !strict) { - data.name = "" - return - } - if (typeof data.name !== "string") { - throw new Error("name field must be a string.") - } - if (!strict) - data.name = data.name.trim() - ensureValidName(data.name, strict, options.allowLegacyCase) - if (isBuiltinModule(data.name)) - this.warn("conflictingName", data.name) + if (this.paused) { + this._emitQueue.push([index, e]) + return } + var abs = isAbsolute(e) ? e : this._makeAbs(e) -, fixDescriptionField: function (data) { - if (data.description && typeof data.description !== 'string') { - this.warn("nonStringDescription") - delete data.description - } - if (data.readme && !data.description) - data.description = extractDescription(data.readme) - if(data.description === undefined) delete data.description; - if (!data.description) this.warn("missingDescription") - } + if (this.mark) + e = this._mark(e) -, fixReadmeField: function (data) { - if (!data.readme) { - this.warn("missingReadme") - data.readme = "ERROR: No README data found!" - } - } + if (this.absolute) + e = abs -, fixBugsField: function(data) { - if (!data.bugs && data.repository && data.repository.url) { - var hosted = hostedGitInfo.fromUrl(data.repository.url) - if(hosted && hosted.bugs()) { - data.bugs = {url: hosted.bugs()} - } - } - else if(data.bugs) { - var emailRe = /^.+@.*\..+$/ - if(typeof data.bugs == "string") { - if(emailRe.test(data.bugs)) - data.bugs = {email:data.bugs} - else if(url.parse(data.bugs).protocol) - data.bugs = {url: data.bugs} - else - this.warn("nonEmailUrlBugsString") - } - else { - bugsTypos(data.bugs, this.warn) - var oldBugs = data.bugs - data.bugs = {} - if(oldBugs.url) { - if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) - data.bugs.url = oldBugs.url - else - this.warn("nonUrlBugsUrlField") - } - if(oldBugs.email) { - if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) - data.bugs.email = oldBugs.email - else - this.warn("nonEmailBugsEmailField") - } - } - if(!data.bugs.email && !data.bugs.url) { - delete data.bugs - this.warn("emptyNormalizedBugs") - } - } + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return } -, fixHomepageField: function(data) { - if (!data.homepage && data.repository && data.repository.url) { - var hosted = hostedGitInfo.fromUrl(data.repository.url) - if (hosted && hosted.docs()) data.homepage = hosted.docs() - } - if (!data.homepage) return + this.matches[index][e] = true - if(typeof data.homepage !== "string") { - this.warn("nonUrlHomepage") - return delete data.homepage - } - if(!url.parse(data.homepage).protocol) { - data.homepage = "http://" + data.homepage - } - } + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) -, fixLicenseField: function(data) { - if (!data.license) { - return this.warn("missingLicense") - } else{ - if ( - typeof(data.license) !== 'string' || - data.license.length < 1 || - data.license.trim() === '' - ) { - this.warn("invalidLicense") - } else { - if (!validateLicense(data.license).validForNewPackages) - this.warn("invalidLicense") - } - } - } + this.emit('match', e) } -function isValidScopedPackageName(spec) { - if (spec.charAt(0) !== '@') return false +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return - var rest = spec.slice(1).split('/') - if (rest.length !== 2) return false + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) - return rest[0] && rest[1] && - rest[0] === encodeURIComponent(rest[0]) && - rest[1] === encodeURIComponent(rest[1]) -} + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) -function isCorrectlyEncodedName(spec) { - return !spec.match(/[\/@\s\+%:]/) && - spec === encodeURIComponent(spec) -} + if (lstatcb) + fs.lstat(abs, lstatcb) -function ensureValidName (name, strict, allowLegacyCase) { - if (name.charAt(0) === "." || - !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) || - (strict && (!allowLegacyCase) && name !== name.toLowerCase()) || - name.toLowerCase() === "node_modules" || - name.toLowerCase() === "favicon.ico") { - throw new Error("Invalid name: " + JSON.stringify(name)) + function lstatcb_ (er, lstat) { + if (er && er.code === 'ENOENT') + return cb() + + var isSym = lstat && lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && lstat && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) } } -function modifyPeople (data, fn) { - if (data.author) data.author = fn(data.author) - ;["maintainers", "contributors"].forEach(function (set) { - if (!Array.isArray(data[set])) return; - data[set] = data[set].map(fn) - }) - return data -} +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return -function unParsePerson (person) { - if (typeof person === "string") return person - var name = person.name || "" - var u = person.url || person.web - var url = u ? (" ("+u+")") : "" - var e = person.email || person.mail - var email = e ? (" <"+e+">") : "" - return name+email+url -} + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return -function parsePerson (person) { - if (typeof person !== "string") return person - var name = person.match(/^([^\(<]+)/) - var url = person.match(/\(([^\)]+)\)/) - var email = person.match(/<([^>]+)>/) - var obj = {} - if (name && name[0].trim()) obj.name = name[0].trim() - if (email) obj.email = email[1]; - if (url) obj.url = url[1]; - return obj -} + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) -function addOptionalDepsToDeps (data, warn) { - var o = data.optionalDependencies - if (!o) return; - var d = data.dependencies || {} - Object.keys(o).forEach(function (k) { - d[k] = o[k] - }) - data.dependencies = d -} + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() -function depObjectify (deps, type, warn) { - if (!deps) return {} - if (typeof deps === "string") { - deps = deps.trim().split(/[\n\r\s\t ,]+/) + if (Array.isArray(c)) + return cb(null, c) } - if (!Array.isArray(deps)) return deps - warn("deprecatedArrayDependencies", type) - var o = {} - deps.filter(function (d) { - return typeof d === "string" - }).forEach(function(d) { - d = d.trim().split(/(:?[@\s><=])/) - var dn = d.shift() - var dv = d.join("") - dv = dv.trim() - dv = dv.replace(/^@/, "") - o[dn] = dv - }) - return o -} -function objectifyDeps (data, warn) { - depTypes.forEach(function (type) { - if (!data[type]) return; - data[type] = depObjectify(data[type], type, warn) - }) + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) } -function bugsTypos(bugs, warn) { - if (!bugs) return - Object.keys(bugs).forEach(function (k) { - if (typos.bugs[k]) { - warn("typo", k, typos.bugs[k], "bugs") - bugs[typos.bugs[k]] = bugs[k] - delete bugs[k] - } - }) +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } } +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return -/***/ }), -/* 523 */ -/***/ (function(module, exports) { - -exports = module.exports = SemVer - -var debug -/* istanbul ignore next */ -if (typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG)) { - debug = function () { - var args = Array.prototype.slice.call(arguments, 0) - args.unshift('SEMVER') - console.log.apply(console, args) + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } } -} else { - debug = function () {} -} -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -exports.SEMVER_SPEC_VERSION = '2.0.0' + this.cache[abs] = entries + return cb(null, entries) +} -var MAX_LENGTH = 256 -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return -// Max safe segment length for coercion. -var MAX_SAFE_COMPONENT_LENGTH = 16 + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + this.emit('error', error) + this.abort() + } + break -// The actual regexps go on exports.re -var re = exports.re = [] -var src = exports.src = [] -var R = 0 + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. + return cb() +} -var NUMERICIDENTIFIER = R++ -src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' -var NUMERICIDENTIFIERLOOSE = R++ -src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. -var NONNUMERICIDENTIFIER = R++ -src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) -// ## Main Version -// Three dot-separated numeric identifiers. + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() -var MAINVERSION = R++ -src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')' + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) -var MAINVERSIONLOOSE = R++ -src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')' + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. + var isSym = this.symlinks[abs] + var len = entries.length -var PRERELEASEIDENTIFIER = R++ -src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + - '|' + src[NONNUMERICIDENTIFIER] + ')' + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() -var PRERELEASEIDENTIFIERLOOSE = R++ -src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + - '|' + src[NONNUMERICIDENTIFIER] + ')' + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) -var PRERELEASE = R++ -src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + - '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } -var PRERELEASELOOSE = R++ -src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + - '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' + cb() +} -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { -var BUILDIDENTIFIER = R++ -src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' + //console.error('ps2', prefix, exists) -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. + if (!this.matches[index]) + this.matches[index] = Object.create(null) -var BUILD = R++ -src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + - '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') -var FULL = R++ -var FULLPLAIN = 'v?' + src[MAINVERSION] + - src[PRERELEASE] + '?' + - src[BUILD] + '?' + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} -src[FULL] = '^' + FULLPLAIN + '$' +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + - src[PRERELEASELOOSE] + '?' + - src[BUILD] + '?' + if (f.length > this.maxLength) + return cb() -var LOOSE = R++ -src[LOOSE] = '^' + LOOSEPLAIN + '$' + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] -var GTLT = R++ -src[GTLT] = '((?:<|>)?=?)' + if (Array.isArray(c)) + c = 'DIR' -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -var XRANGEIDENTIFIERLOOSE = R++ -src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' -var XRANGEIDENTIFIER = R++ -src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) -var XRANGEPLAIN = R++ -src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:' + src[PRERELEASE] + ')?' + - src[BUILD] + '?' + - ')?)?' + if (needDir && c === 'FILE') + return cb() -var XRANGEPLAINLOOSE = R++ -src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:' + src[PRERELEASELOOSE] + ')?' + - src[BUILD] + '?' + - ')?)?' + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } -var XRANGE = R++ -src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' -var XRANGELOOSE = R++ -src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -var COERCE = R++ -src[COERCE] = '(?:^|[^\\d])' + - '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:$|[^\\d])' + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) -// Tilde ranges. -// Meaning is "reasonably at or greater than" -var LONETILDE = R++ -src[LONETILDE] = '(?:~>?)' + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} -var TILDETRIM = R++ -src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' -re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') -var tildeTrimReplace = '$1~' +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { + this.statCache[abs] = false + return cb() + } -var TILDE = R++ -src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' -var TILDELOOSE = R++ -src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat -// Caret ranges. -// Meaning is "at least and backwards compatible with" -var LONECARET = R++ -src[LONECARET] = '(?:\\^)' + if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) + return cb(null, false, stat) -var CARETTRIM = R++ -src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' -re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') -var caretTrimReplace = '$1^' + var c = true + if (stat) + c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c -var CARET = R++ -src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' -var CARETLOOSE = R++ -src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' + if (needDir && c === 'FILE') + return cb() -// A simple gt/lt/eq thing, or just "" to indicate "any version" -var COMPARATORLOOSE = R++ -src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' -var COMPARATOR = R++ -src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + return cb(null, c, stat) +} -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -var COMPARATORTRIM = R++ -src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + - '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' -// this one has to use the /g flag -re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') -var comparatorTrimReplace = '$1$2$3' +/***/ }), +/* 504 */ +/***/ (function(module, exports, __webpack_require__) { -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -var HYPHENRANGE = R++ -src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAIN] + ')' + - '\\s*$' +module.exports = realpath +realpath.realpath = realpath +realpath.sync = realpathSync +realpath.realpathSync = realpathSync +realpath.monkeypatch = monkeypatch +realpath.unmonkeypatch = unmonkeypatch -var HYPHENRANGELOOSE = R++ -src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s*$' +var fs = __webpack_require__(349) +var origRealpath = fs.realpath +var origRealpathSync = fs.realpathSync -// Star ranges basically just allow anything at all. -var STAR = R++ -src[STAR] = '(<|>)?=?\\s*\\*' +var version = process.version +var ok = /^v[0-5]\./.test(version) +var old = __webpack_require__(505) -// Compile to actual regexp objects. -// All are flag-free, unless they were created above with a flag. -for (var i = 0; i < R; i++) { - debug(i, src[i]) - if (!re[i]) { - re[i] = new RegExp(src[i]) - } +function newError (er) { + return er && er.syscall === 'realpath' && ( + er.code === 'ELOOP' || + er.code === 'ENOMEM' || + er.code === 'ENAMETOOLONG' + ) } -exports.parse = parse -function parse (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null +function realpath (p, cache, cb) { + if (ok) { + return origRealpath(p, cache, cb) } - if (version.length > MAX_LENGTH) { - return null + if (typeof cache === 'function') { + cb = cache + cache = null } + origRealpath(p, cache, function (er, result) { + if (newError(er)) { + old.realpath(p, cache, cb) + } else { + cb(er, result) + } + }) +} - var r = options.loose ? re[LOOSE] : re[FULL] - if (!r.test(version)) { - return null +function realpathSync (p, cache) { + if (ok) { + return origRealpathSync(p, cache) } try { - return new SemVer(version, options) + return origRealpathSync(p, cache) } catch (er) { - return null + if (newError(er)) { + return old.realpathSync(p, cache) + } else { + throw er + } } } -exports.valid = valid -function valid (version, options) { - var v = parse(version, options) - return v ? v.version : null +function monkeypatch () { + fs.realpath = realpath + fs.realpathSync = realpathSync } -exports.clean = clean -function clean (version, options) { - var s = parse(version.trim().replace(/^[=v]+/, ''), options) - return s ? s.version : null +function unmonkeypatch () { + fs.realpath = origRealpath + fs.realpathSync = origRealpathSync } -exports.SemVer = SemVer - -function SemVer (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - if (version instanceof SemVer) { - if (version.loose === options.loose) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') - } - - if (!(this instanceof SemVer)) { - return new SemVer(version, options) - } - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose +/***/ }), +/* 505 */ +/***/ (function(module, exports, __webpack_require__) { - var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - if (!m) { - throw new TypeError('Invalid Version: ' + version) - } +var pathModule = __webpack_require__(4); +var isWindows = process.platform === 'win32'; +var fs = __webpack_require__(349); - this.raw = version +// JavaScript implementation of realpath, ported from node pre-v6 - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] +var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } +function rethrow() { + // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and + // is fairly slow to generate. + var callback; + if (DEBUG) { + var backtrace = new Error; + callback = debugCallback; + } else + callback = missingCallback; - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } + return callback; - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') + function debugCallback(err) { + if (err) { + backtrace.message = err.message; + err = backtrace; + missingCallback(err); + } } - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map(function (id) { - if (/^[0-9]+$/.test(id)) { - var num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } + function missingCallback(err) { + if (err) { + if (process.throwDeprecation) + throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs + else if (!process.noDeprecation) { + var msg = 'fs: missing callback ' + (err.stack || err.message); + if (process.traceDeprecation) + console.trace(msg); + else + console.error(msg); } - return id - }) + } } +} - this.build = m[5] ? m[5].split('.') : [] - this.format() +function maybeCallback(cb) { + return typeof cb === 'function' ? cb : rethrow(); } -SemVer.prototype.format = function () { - this.version = this.major + '.' + this.minor + '.' + this.patch - if (this.prerelease.length) { - this.version += '-' + this.prerelease.join('.') - } - return this.version +var normalize = pathModule.normalize; + +// Regexp that finds the next partion of a (partial) path +// result is [base_with_slash, base], e.g. ['somedir/', 'somedir'] +if (isWindows) { + var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; +} else { + var nextPartRe = /(.*?)(?:[\/]+|$)/g; } -SemVer.prototype.toString = function () { - return this.version +// Regex to find the device root, including trailing slash. E.g. 'c:\\'. +if (isWindows) { + var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; +} else { + var splitRootRe = /^[\/]*/; } -SemVer.prototype.compare = function (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) +exports.realpathSync = function realpathSync(p, cache) { + // make p is absolute + p = pathModule.resolve(p); + + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return cache[p]; } - return this.compareMain(other) || this.comparePre(other) -} + var original = p, + seenLinks = {}, + knownHard = {}; -SemVer.prototype.compareMain = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } + // current character position in p + var pos; + // the partial path so far, including a trailing slash if any + var current; + // the partial path without a trailing slash (except when pointing at a root) + var base; + // the partial path scanned in the previous round, with slash + var previous; - return compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) -} + start(); -SemVer.prototype.comparePre = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } + function start() { + // Skip over roots + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ''; - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 + // On windows, check that the root exists. On unix there is no need. + if (isWindows && !knownHard[base]) { + fs.lstatSync(base); + knownHard[base] = true; + } } - var i = 0 - do { - var a = this.prerelease[i] - var b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) + // walk down the path, swapping out linked pathparts for their real + // values + // NB: p.length changes. + while (pos < p.length) { + // find the next part + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; + + // continue if not a symlink + if (knownHard[base] || (cache && cache[base] === base)) { + continue; } - } while (++i) -} -// preminor will bump the version up to the next minor release, and immediately -// down to pre-release. premajor and prepatch work the same way. -SemVer.prototype.inc = function (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) + var resolvedLink; + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + // some known symbolic link. no need to stat again. + resolvedLink = cache[base]; + } else { + var stat = fs.lstatSync(base); + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) cache[base] = base; + continue; } - this.inc('pre', identifier) - break - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if (this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - var i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) + // read the link if it wasn't read before + // dev/ino always return 0 on windows, so skip the check. + var linkTarget = null; + if (!isWindows) { + var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + linkTarget = seenLinks[id]; } } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } + if (linkTarget === null) { + fs.statSync(base); + linkTarget = fs.readlinkSync(base); } - break + resolvedLink = pathModule.resolve(previous, linkTarget); + // track this, if given a cache. + if (cache) cache[base] = resolvedLink; + if (!isWindows) seenLinks[id] = linkTarget; + } - default: - throw new Error('invalid increment argument: ' + release) + // resolve the link, then start over + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); } - this.format() - this.raw = this.version - return this -} -exports.inc = inc -function inc (version, release, loose, identifier) { - if (typeof (loose) === 'string') { - identifier = loose - loose = undefined - } + if (cache) cache[original] = p; - try { - return new SemVer(version, loose).inc(release, identifier).version - } catch (er) { - return null - } -} + return p; +}; -exports.diff = diff -function diff (version1, version2) { - if (eq(version1, version2)) { - return null - } else { - var v1 = parse(version1) - var v2 = parse(version2) - var prefix = '' - if (v1.prerelease.length || v2.prerelease.length) { - prefix = 'pre' - var defaultResult = 'prerelease' - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key - } - } - } - return defaultResult // may be undefined - } -} -exports.compareIdentifiers = compareIdentifiers +exports.realpath = function realpath(p, cache, cb) { + if (typeof cb !== 'function') { + cb = maybeCallback(cache); + cache = null; + } -var numeric = /^[0-9]+$/ -function compareIdentifiers (a, b) { - var anum = numeric.test(a) - var bnum = numeric.test(b) + // make p is absolute + p = pathModule.resolve(p); - if (anum && bnum) { - a = +a - b = +b + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return process.nextTick(cb.bind(null, null, cache[p])); } - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} + var original = p, + seenLinks = {}, + knownHard = {}; -exports.rcompareIdentifiers = rcompareIdentifiers -function rcompareIdentifiers (a, b) { - return compareIdentifiers(b, a) -} + // current character position in p + var pos; + // the partial path so far, including a trailing slash if any + var current; + // the partial path without a trailing slash (except when pointing at a root) + var base; + // the partial path scanned in the previous round, with slash + var previous; -exports.major = major -function major (a, loose) { - return new SemVer(a, loose).major -} + start(); -exports.minor = minor -function minor (a, loose) { - return new SemVer(a, loose).minor -} + function start() { + // Skip over roots + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ''; -exports.patch = patch -function patch (a, loose) { - return new SemVer(a, loose).patch -} + // On windows, check that the root exists. On unix there is no need. + if (isWindows && !knownHard[base]) { + fs.lstat(base, function(err) { + if (err) return cb(err); + knownHard[base] = true; + LOOP(); + }); + } else { + process.nextTick(LOOP); + } + } -exports.compare = compare -function compare (a, b, loose) { - return new SemVer(a, loose).compare(new SemVer(b, loose)) -} + // walk down the path, swapping out linked pathparts for their real + // values + function LOOP() { + // stop if scanned past end of path + if (pos >= p.length) { + if (cache) cache[original] = p; + return cb(null, p); + } -exports.compareLoose = compareLoose -function compareLoose (a, b) { - return compare(a, b, true) -} + // find the next part + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; -exports.rcompare = rcompare -function rcompare (a, b, loose) { - return compare(b, a, loose) -} + // continue if not a symlink + if (knownHard[base] || (cache && cache[base] === base)) { + return process.nextTick(LOOP); + } -exports.sort = sort -function sort (list, loose) { - return list.sort(function (a, b) { - return exports.compare(a, b, loose) - }) -} - -exports.rsort = rsort -function rsort (list, loose) { - return list.sort(function (a, b) { - return exports.rcompare(a, b, loose) - }) -} - -exports.gt = gt -function gt (a, b, loose) { - return compare(a, b, loose) > 0 -} + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + // known symbolic link. no need to stat again. + return gotResolvedLink(cache[base]); + } -exports.lt = lt -function lt (a, b, loose) { - return compare(a, b, loose) < 0 -} + return fs.lstat(base, gotStat); + } -exports.eq = eq -function eq (a, b, loose) { - return compare(a, b, loose) === 0 -} + function gotStat(err, stat) { + if (err) return cb(err); -exports.neq = neq -function neq (a, b, loose) { - return compare(a, b, loose) !== 0 -} + // if not a symlink, skip to the next path part + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) cache[base] = base; + return process.nextTick(LOOP); + } -exports.gte = gte -function gte (a, b, loose) { - return compare(a, b, loose) >= 0 -} + // stat & read the link if not read before + // call gotTarget as soon as the link target is known + // dev/ino always return 0 on windows, so skip the check. + if (!isWindows) { + var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + return gotTarget(null, seenLinks[id], base); + } + } + fs.stat(base, function(err) { + if (err) return cb(err); -exports.lte = lte -function lte (a, b, loose) { - return compare(a, b, loose) <= 0 -} + fs.readlink(base, function(err, target) { + if (!isWindows) seenLinks[id] = target; + gotTarget(err, target); + }); + }); + } -exports.cmp = cmp -function cmp (a, op, b, loose) { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b + function gotTarget(err, target, base) { + if (err) return cb(err); - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b + var resolvedLink = pathModule.resolve(previous, target); + if (cache) cache[base] = resolvedLink; + gotResolvedLink(resolvedLink); + } - case '': - case '=': - case '==': - return eq(a, b, loose) + function gotResolvedLink(resolvedLink) { + // resolve the link, then start over + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } +}; - case '!=': - return neq(a, b, loose) - case '>': - return gt(a, b, loose) +/***/ }), +/* 506 */ +/***/ (function(module, exports, __webpack_require__) { - case '>=': - return gte(a, b, loose) +module.exports = minimatch +minimatch.Minimatch = Minimatch - case '<': - return lt(a, b, loose) +var path = { sep: '/' } +try { + path = __webpack_require__(4) +} catch (er) {} - case '<=': - return lte(a, b, loose) +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = __webpack_require__(507) - default: - throw new TypeError('Invalid operator: ' + op) - } +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } } -exports.Comparator = Comparator -function Comparator (comp, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } +// * => any number of characters +var star = qmark + '*?' - if (!(this instanceof Comparator)) { - return new Comparator(comp, options) - } +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') - debug('comp', this) +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) } -var ANY = {} -Comparator.prototype.parse = function (comp) { - var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var m = comp.match(r) - - if (!m) { - throw new TypeError('Invalid comparator: ' + comp) - } - - this.operator = m[1] - if (this.operator === '=') { - this.operator = '' - } +// normalizes slashes. +var slashSplit = /\/+/ - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) } } -Comparator.prototype.toString = function () { - return this.value +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t } -Comparator.prototype.test = function (version) { - debug('Comparator.test', version, this.options.loose) +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch - if (this.semver === ANY) { - return true + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) } - if (typeof version === 'string') { - version = new SemVer(version, this.options) + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) } - return cmp(version, this.operator, this.semver, this.options) + return m } -Comparator.prototype.intersects = function (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') } - var rangeTmp + if (!options) options = {} - if (this.operator === '') { - rangeTmp = new Range(comp.value, options) - return satisfies(this.value, rangeTmp, options) - } else if (comp.operator === '') { - rangeTmp = new Range(this.value, options) - return satisfies(comp.semver, rangeTmp, options) + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false } - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - var sameSemVer = this.semver.version === comp.semver.version - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - ((this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<')) - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - ((this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>')) + // "" only matches "" + if (pattern.trim() === '') return p === '' - return sameDirectionIncreasing || sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || oppositeDirectionsGreaterThan + return new Minimatch(pattern, options).match(p) } -exports.Range = Range -function Range (range, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) } - if (range instanceof Range) { - if (range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease) { - return range - } else { - return new Range(range.raw, options) - } + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') } - if (range instanceof Comparator) { - return new Range(range.value, options) - } + if (!options) options = {} + pattern = pattern.trim() - if (!(this instanceof Range)) { - return new Range(range, options) + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') } this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range.split(/\s*\|\|\s*/).map(function (range) { - return this.parseRange(range.trim()) - }, this).filter(function (c) { - // throw out any that are not relevant for whatever reason - return c.length - }) - - if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + range) - } + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false - this.format() + // make the set of regexps etc. + this.make() } -Range.prototype.format = function () { - this.range = this.set.map(function (comps) { - return comps.join(' ').trim() - }).join('||').trim() - return this.range -} +Minimatch.prototype.debug = function () {} -Range.prototype.toString = function () { - return this.range -} +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return -Range.prototype.parseRange = function (range) { - var loose = this.options.loose - range = range.trim() - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] - range = range.replace(hr, hyphenReplace) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[COMPARATORTRIM]) + var pattern = this.pattern + var options = this.options - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[TILDETRIM], tildeTrimReplace) + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[CARETTRIM], caretTrimReplace) + // step 1: figure out negation, etc. + this.parseNegate() - // normalize spaces - range = range.split(/\s+/).join(' ') + // step 2: expand braces + var set = this.globSet = this.braceExpand() - // At this point, the range is completely trimmed and - // ready to be split into comparators. + if (options.debug) this.debug = console.error - var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var set = range.split(' ').map(function (comp) { - return parseComparator(comp, this.options) - }, this).join(' ').split(/\s+/) - if (this.options.loose) { - // in loose mode, throw out any that are not valid comparators - set = set.filter(function (comp) { - return !!comp.match(compRe) - }) - } - set = set.map(function (comp) { - return new Comparator(comp, this.options) - }, this) + this.debug(this.pattern, set) - return set -} + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) -Range.prototype.intersects = function (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } + this.debug(this.pattern, set) - return this.set.some(function (thisComparators) { - return thisComparators.every(function (thisComparator) { - return range.set.some(function (rangeComparators) { - return rangeComparators.every(function (rangeComparator) { - return thisComparator.intersects(rangeComparator, options) - }) - }) - }) - }) -} + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) -// Mostly just for testing and legacy API reasons -exports.toComparators = toComparators -function toComparators (range, options) { - return new Range(range, options).set.map(function (comp) { - return comp.map(function (c) { - return c.value - }).join(' ').trim().split(' ') + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 }) -} -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -function parseComparator (comp, options) { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} + this.debug(this.pattern, set) -function isX (id) { - return !id || id.toLowerCase() === 'x' || id === '*' + this.set = set } -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 -function replaceTildes (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceTilde(comp, options) - }).join(' ') -} +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 -function replaceTilde (comp, options) { - var r = options.loose ? re[TILDELOOSE] : re[TILDE] - return comp.replace(r, function (_, M, m, p, pr) { - debug('tilde', comp, _, M, m, p, pr) - var ret + if (options.nonegate) return - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0 - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else if (pr) { - debug('replaceTilde pr', pr) - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } else { - // ~1.2.3 == >=1.2.3 <1.3.0 - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } - debug('tilde return', ret) - return ret - }) + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate } -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 -// ^1.2.3 --> >=1.2.3 <2.0.0 -// ^1.2.0 --> >=1.2.0 <2.0.0 -function replaceCarets (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceCaret(comp, options) - }).join(' ') +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) } -function replaceCaret (comp, options) { - debug('caret', comp, options) - var r = options.loose ? re[CARETLOOSE] : re[CARET] - return comp.replace(r, function (_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr) - var ret +Minimatch.prototype.braceExpand = braceExpand - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - if (M === '0') { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else { - ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + (+M + 1) + '.0.0' - } +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + (+M + 1) + '.0.0' - } - } - - debug('caret return', ret) - return ret - }) -} - -function replaceXRanges (comp, options) { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map(function (comp) { - return replaceXRange(comp, options) - }).join(' ') -} - -function replaceXRange (comp, options) { - comp = comp.trim() - var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] - return comp.replace(r, function (ret, gtlt, M, m, p, pr) { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - var xM = isX(M) - var xm = xM || isX(m) - var xp = xm || isX(p) - var anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - ret = gtlt + M + '.' + m + '.' + p - } else if (xm) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (xp) { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + options = {} } + } - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -function replaceStars (comp, options) { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[STAR], '') -} + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern -// This function is passed to string.replace(re[HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0 -function hyphenReplace ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = '>=' + fM + '.0.0' - } else if (isX(fp)) { - from = '>=' + fM + '.' + fm + '.0' - } else { - from = '>=' + from + if (typeof pattern === 'undefined') { + throw new TypeError('undefined pattern') } - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = '<' + (+tM + 1) + '.0.0' - } else if (isX(tp)) { - to = '<' + tM + '.' + (+tm + 1) + '.0' - } else if (tpr) { - to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr - } else { - to = '<=' + to + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] } - return (from + ' ' + to).trim() + return expand(pattern) } -// if ANY of the sets match ALL of its comparators, then pass -Range.prototype.test = function (version) { - if (!version) { - return false +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError('pattern is too long') } - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } + var options = this.options - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false -} + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' -function testSet (set, version, options) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false } } - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === ANY) { - continue - } + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) - if (set[i].semver.prerelease.length > 0) { - var allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue } - // Version has a -pre, but it's not one of the ones we like. - return false - } + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false - return true -} + case '\\': + clearStateChar() + escaping = true + continue -exports.satisfies = satisfies -function satisfies (version, range, options) { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) -exports.maxSatisfying = maxSatisfying -function maxSatisfying (versions, range, options) { - var max = null - var maxSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v - maxSV = new SemVer(max, options) - } - } - }) - return max -} + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } -exports.minSatisfying = minSatisfying -function minSatisfying (versions, range, options) { - var min = null - var minSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v - minSV = new SemVer(min, options) - } - } - }) - return min -} + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue -exports.minVersion = minVersion -function minVersion (range, loose) { - range = new Range(range, loose) + case '(': + if (inClass) { + re += '(' + continue + } - var minver = new SemVer('0.0.0') - if (range.test(minver)) { - return minver - } + if (!stateChar) { + re += '\\(' + continue + } - minver = new SemVer('0.0.0-0') - if (range.test(minver)) { - return minver - } + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue - minver = null - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } - comparators.forEach(function (comparator) { - // Clone to avoid manipulating the comparator's semver object. - var compver = new SemVer(comparator.semver.version) - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++ - } else { - compver.prerelease.push(0) - } - compver.raw = compver.format() - /* fallthrough */ - case '': - case '>=': - if (!minver || gt(minver, compver)) { - minver = compver - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error('Unexpected operation: ' + comparator.operator) - } - }) - } + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue - if (minver && range.test(minver)) { - return minver - } + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } - return null -} + clearStateChar() + re += '|' + continue -exports.validRange = validRange -function validRange (range, options) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).range || '*' - } catch (er) { - return null - } -} + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() -// Determine if version is less than all the versions possible in the range -exports.ltr = ltr -function ltr (version, range, options) { - return outside(version, range, '<', options) -} + if (inClass) { + re += '\\' + c + continue + } -// Determine if version is greater than all the versions possible in the range. -exports.gtr = gtr -function gtr (version, range, options) { - return outside(version, range, '>', options) -} + inClass = true + classStart = i + reClassStart = re.length + re += c + continue -exports.outside = outside -function outside (version, range, hilo, options) { - version = new SemVer(version, options) - range = new Range(range, options) + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } - var gtfn, ltefn, ltfn, comp, ecomp - switch (hilo) { - case '>': - gtfn = gt - ltefn = lte - ltfn = lt - comp = '>' - ecomp = '>=' - break - case '<': - gtfn = lt - ltefn = gte - ltfn = gt - comp = '<' - ecomp = '<=' - break - default: - throw new TypeError('Must provide a hilo val of "<" or ">"') - } + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } - // If it satisifes the range it is not outside - if (satisfies(version, range, options)) { - return false - } + // finish up the class. + hasMagic = true + inClass = false + re += c + continue - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. + default: + // swallow any state char that wasn't consumed + clearStateChar() - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } - var high = null - var low = null + re += c - comparators.forEach(function (comparator) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') - } - high = high || comparator - low = low || comparator - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' }) - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false - } + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ((!low.operator || low.operator === comp) && - ltefn(version, low.semver)) { - return false - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false - } + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail } - return true -} - -exports.prerelease = prerelease -function prerelease (version, options) { - var parsed = parse(version, options) - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null -} -exports.intersects = intersects -function intersects (r1, r2, options) { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2) -} - -exports.coerce = coerce -function coerce (version) { - if (version instanceof SemVer) { - return version + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' } - if (typeof version !== 'string') { - return null + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true } - var match = version.match(re[COERCE]) + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] - if (match == null) { - return null + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe } - return parse(match[1] + - '.' + (match[2] || '0') + - '.' + (match[3] || '0')) -} + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + if (addPatternStart) { + re = patternStart + re + } -/***/ }), -/* 524 */ -/***/ (function(module, exports, __webpack_require__) { + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } -var parse = __webpack_require__(525); -var correct = __webpack_require__(527); + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } -var genericWarning = ( - 'license should be ' + - 'a valid SPDX license expression (without "LicenseRef"), ' + - '"UNLICENSED", or ' + - '"SEE LICENSE IN "' -); + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } -var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; + regExp._glob = pattern + regExp._src = re -function startsWith(prefix, string) { - return string.slice(0, prefix.length) === prefix; + return regExp } -function usesLicenseRef(ast) { - if (ast.hasOwnProperty('license')) { - var license = ast.license; - return ( - startsWith('LicenseRef', license) || - startsWith('DocumentRef', license) - ); - } else { - return ( - usesLicenseRef(ast.left) || - usesLicenseRef(ast.right) - ); - } +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() } -module.exports = function(argument) { - var ast; +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp - try { - ast = parse(argument); - } catch (e) { - var match - if ( - argument === 'UNLICENSED' || - argument === 'UNLICENCED' - ) { - return { - validForOldPackages: true, - validForNewPackages: true, - unlicensed: true - }; - } else if (match = fileReferenceRE.exec(argument)) { - return { - validForOldPackages: true, - validForNewPackages: true, - inFile: match[1] - }; - } else { - var result = { - validForOldPackages: false, - validForNewPackages: false, - warnings: [genericWarning] - }; - var corrected = correct(argument); - if (corrected) { - result.warnings.push( - 'license is similar to the valid expression "' + corrected + '"' - ); - } - return result; - } - } + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set - if (usesLicenseRef(ast)) { - return { - validForNewPackages: false, - validForOldPackages: false, - spdx: true, - warnings: [genericWarning] - }; - } else { - return { - validForNewPackages: true, - validForOldPackages: true, - spdx: true - }; + if (!set.length) { + this.regexp = false + return this.regexp } -}; + var options = this.options + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' -/***/ }), -/* 525 */ -/***/ (function(module, exports, __webpack_require__) { + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') -var parser = __webpack_require__(526).parser + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' -module.exports = function (argument) { - return parser.parse(argument) + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp } +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} -/***/ }), -/* 526 */ -/***/ (function(module, exports, __webpack_require__) { +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' -/* WEBPACK VAR INJECTION */(function(module) {/* parser generated by jison 0.4.17 */ -/* - Returns a Parser object of the following structure: + if (f === '/' && partial) return true - Parser: { - yy: {} + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') } - Parser.prototype: { - yy: {}, - trace: function(), - symbols_: {associative list: name ==> number}, - terminals_: {associative list: number ==> name}, - productions_: [...], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), - table: [...], - defaultActions: {...}, - parseError: function(str, hash), - parse: function(input), + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) - lexer: { - EOF: 1, - parseError: function(str, hash), - setInput: function(input), - input: function(), - unput: function(str), - more: function(), - less: function(n), - pastInput: function(), - upcomingInput: function(), - showPosition: function(), - test_match: function(regex_match_array, rule_index), - next: function(), - lex: function(), - begin: function(condition), - popState: function(), - _currentRules: function(), - topState: function(), - pushState: function(condition), + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. - options: { - ranges: boolean (optional: true ==> token location info will include a .range[] member) - flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) - backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) - }, + var set = this.set + this.debug(this.pattern, 'set', set) - performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), - rules: [...], - conditions: {associative list: name ==> set}, + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate } } + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} - token location info (@$, _$, etc.): { - first_line: n, - last_line: n, - first_column: n, - last_column: n, - range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) - } +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) - the parseError function receives a 'hash' object with these members for lexer and parser errors: { - text: (matched text) - token: (the produced terminal token, if any) - line: (yylineno) - } - while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { - loc: (yylloc) - expected: (string describing the set of expected tokens) - recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) - } -*/ -var spdxparse = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17]; -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"}, -productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]], -performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { -/* this == yyval */ + this.debug('matchOne', file.length, pattern.length) -var $0 = $$.length - 1; -switch (yystate) { -case 1: -return this.$ = $$[$0-1] -break; -case 2: case 4: case 5: -this.$ = {license: yytext} -break; -case 3: -this.$ = {license: $$[$0-1], plus: true} -break; -case 6: -this.$ = $$[$0] -break; -case 7: -this.$ = {exception: $$[$0]} -this.$.license = $$[$0-2].license -if ($$[$0-2].hasOwnProperty('plus')) { - this.$.plus = $$[$0-2].plus -} -break; -case 8: -this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]} -break; -case 9: -this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]} -break; -case 10: -this.$ = $$[$0-1] -break; -} -}, -table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])], -defaultActions: {8:[2,1]}, -parseError: function parseError(str, hash) { - if (hash.recoverable) { - this.trace(str); - } else { - function _parseError (msg, hash) { - this.message = msg; - this.hash = hash; - } - _parseError.prototype = Error; + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] - throw new _parseError(str, hash); - } -}, -parse: function parse(input) { - var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - var args = lstack.slice.call(arguments, 1); - var lexer = Object.create(this.lexer); - var sharedState = { yy: {} }; - for (var k in this.yy) { - if (Object.prototype.hasOwnProperty.call(this.yy, k)) { - sharedState.yy[k] = this.yy[k]; + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false } - } - lexer.setInput(input, sharedState.yy); - sharedState.yy.lexer = lexer; - sharedState.yy.parser = this; - if (typeof lexer.yylloc == 'undefined') { - lexer.yylloc = {}; - } - var yyloc = lexer.yylloc; - lstack.push(yyloc); - var ranges = lexer.options && lexer.options.ranges; - if (typeof sharedState.yy.parseError === 'function') { - this.parseError = sharedState.yy.parseError; - } else { - this.parseError = Object.getPrototypeOf(this).parseError; - } - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - _token_stack: - var lex = function () { - var token; - token = lexer.lex() || EOF; - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - }; - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true } else { - if (symbol === null || typeof symbol == 'undefined') { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === 'undefined' || !action.length || !action[0]) { - var errStr = ''; - expected = []; - for (p in table[state]) { - if (this.terminals_[p] && p > TERROR) { - expected.push('\'' + this.terminals_[p] + '\''); - } - } - if (lexer.showPosition) { - errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; - } else { - errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); - } - this.parseError(errStr, { - text: lexer.match, - token: this.terminals_[symbol] || symbol, - line: lexer.yylineno, - loc: yyloc, - expected: expected - }); - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(lexer.yytext); - lstack.push(lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = lexer.yyleng; - yytext = lexer.yytext; - yylineno = lexer.yylineno; - yyloc = lexer.yylloc; - if (recovering > 0) { - recovering--; - } - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { - first_line: lstack[lstack.length - (len || 1)].first_line, - last_line: lstack[lstack.length - 1].last_line, - first_column: lstack[lstack.length - (len || 1)].first_column, - last_column: lstack[lstack.length - 1].last_column - }; - if (ranges) { - yyval._$.range = [ - lstack[lstack.length - (len || 1)].range[0], - lstack[lstack.length - 1].range[1] - ]; - } - r = this.performAction.apply(yyval, [ - yytext, - yyleng, - yylineno, - sharedState.yy, - action[1], - vstack, - lstack - ].concat(args)); - if (typeof r !== 'undefined') { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false } - return true; -}}; -/* generated by jison-lex 0.3.4 */ -var lexer = (function(){ -var lexer = ({ -EOF:1, + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, + if (!hit) return false + } -// resets the lexer, sets new input -setInput:function (input, yy) { - this.yy = yy || this.yy || {}; - this._input = input; - this._more = this._backtrack = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = { - first_line: 1, - first_column: 0, - last_line: 1, - last_column: 0 - }; - if (this.options.ranges) { - this.yylloc.range = [0,0]; - } - this.offset = 0; - return this; - }, + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* -// consumes and returns one char from the input -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) { - this.yylloc.range[1]++; - } + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } - this._input = this._input.slice(1); - return ch; - }, + // should be unreachable. + throw new Error('wtf?') +} -// unshifts one char (or a string) into the input -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} - if (lines.length - 1) { - this.yylineno -= lines.length - 1; - } - var r = this.yylloc.range; - this.yylloc = { - first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) - + oldLines[oldLines.length - lines.length].length - lines[0].length : - this.yylloc.first_column - len - }; +/***/ }), +/* 507 */ +/***/ (function(module, exports, __webpack_require__) { - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - this.yyleng = this.yytext.length; - return this; - }, +var concatMap = __webpack_require__(508); +var balanced = __webpack_require__(509); -// When called from action, caches matched text and appends it on next action -more:function () { - this._more = true; - return this; - }, +module.exports = expandTop; -// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. -reject:function () { - if (this.options.backtrack_lexer) { - this._backtrack = true; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; - } - return this; - }, +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} -// retain first n characters of the match -less:function (n) { - this.unput(this.match.slice(n)); - }, +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} -// displays already matched input, i.e. for error messages -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} -// displays upcoming input, i.e. for error messages -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); - }, -// displays the character position where the lexing error occurred, i.e. for error messages -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; -// test the lexed token: return FALSE when not a match, otherwise return token -test_match:function (match, indexed_rule) { - var token, - lines, - backup; + var parts = []; + var m = balanced('{', '}', str); - if (this.options.backtrack_lexer) { - // save context - backup = { - yylineno: this.yylineno, - yylloc: { - first_line: this.yylloc.first_line, - last_line: this.last_line, - first_column: this.yylloc.first_column, - last_column: this.yylloc.last_column - }, - yytext: this.yytext, - match: this.match, - matches: this.matches, - matched: this.matched, - yyleng: this.yyleng, - offset: this.offset, - _more: this._more, - _input: this._input, - yy: this.yy, - conditionStack: this.conditionStack.slice(0), - done: this.done - }; - if (this.options.ranges) { - backup.yylloc.range = this.yylloc.range.slice(0); - } - } + if (!m) + return str.split(','); - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno += lines.length; - } - this.yylloc = { - first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? - lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : - this.yylloc.last_column + match[0].length - }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._backtrack = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) { - this.done = false; - } - if (token) { - return token; - } else if (this._backtrack) { - // recover context - for (var k in backup) { - this[k] = backup[k]; - } - return false; // rule action called reject() implying the next rule should be tested instead. - } - return false; - }, + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); -// return next match in input -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) { - this.done = true; - } + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } - var token, - match, - tempMatch, - index; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (this.options.backtrack_lexer) { - token = this.test_match(tempMatch, rules[i]); - if (token !== false) { - return token; - } else if (this._backtrack) { - match = false; - continue; // rule action called reject() implying a rule MISmatch. - } else { - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - } else if (!this.options.flex) { - break; - } - } - } - if (match) { - token = this.test_match(match, rules[index]); - if (token !== false) { - return token; - } - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); - } - }, + parts.push.apply(parts, p); -// return next match that has a token -lex:function lex() { - var r = this.next(); - if (r) { - return r; - } else { - return this.lex(); + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } } - }, + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } -// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) -begin:function begin(condition) { - this.conditionStack.push(condition); - }, + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } -// pop the previously active lexer condition state off the condition stack -popState:function popState() { - var n = this.conditionStack.length - 1; - if (n > 0) { - return this.conditionStack.pop(); - } else { - return this.conditionStack[0]; + return expansions; +} + + + +/***/ }), +/* 508 */ +/***/ (function(module, exports) { + +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + + +/***/ }), +/* 509 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; } - }, -// produce the lexer rule set which is active for the currently active lexer condition state -_currentRules:function _currentRules() { - if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - } else { - return this.conditions["INITIAL"].rules; + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} + + +/***/ }), +/* 510 */ +/***/ (function(module, exports, __webpack_require__) { + +try { + var util = __webpack_require__(397); + /* istanbul ignore next */ + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + /* istanbul ignore next */ + module.exports = __webpack_require__(511); +} + + +/***/ }), +/* 511 */ +/***/ (function(module, exports) { + +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true } - }, + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} -// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available -topState:function topState(n) { - n = this.conditionStack.length - 1 - Math.abs(n || 0); - if (n >= 0) { - return this.conditionStack[n]; - } else { - return "INITIAL"; + +/***/ }), +/* 512 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; + + +/***/ }), +/* 513 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = __webpack_require__(349) +var rp = __webpack_require__(504) +var minimatch = __webpack_require__(506) +var Minimatch = minimatch.Minimatch +var Glob = __webpack_require__(503).Glob +var util = __webpack_require__(397) +var path = __webpack_require__(4) +var assert = __webpack_require__(371) +var isAbsolute = __webpack_require__(512) +var common = __webpack_require__(514) +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = rp.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er } - }, + } + }) + } + common.finish(this) +} -// alias for begin(condition) -pushState:function pushState(condition) { - this.begin(condition); - }, -// return the number of states currently on the stack -stateStackSize:function stateStackSize() { - return this.conditionStack.length; - }, -options: {}, -performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { -var YYSTATE=YY_START; -switch($avoiding_name_collisions) { -case 0:return 5 -break; -case 1:/* skip whitespace */ -break; -case 2:return 8 -break; -case 3:return 16 -break; -case 4:return 17 -break; -case 5:return 11 -break; -case 6:return 10 -break; -case 7:return 9 -break; -case 8:return 14 -break; -case 9:return 15 -break; -case 10:return 12 -break; -case 11:return 7 -break; -case 12:return 7 -break; -case 13:return 7 -break; -case 14:return 7 -break; -case 15:return 7 -break; -case 16:return 7 -break; -case 17:return 7 -break; -case 18:return 7 -break; -case 19:return 7 -break; -case 20:return 7 -break; -case 21:return 7 -break; -case 22:return 7 -break; -case 23:return 7 -break; -case 24:return 13 -break; -case 25:return 13 -break; -case 26:return 13 -break; -case 27:return 13 -break; -case 28:return 13 -break; -case 29:return 13 -break; -case 30:return 13 -break; -case 31:return 13 -break; -case 32:return 7 -break; -case 33:return 13 -break; -case 34:return 7 -break; -case 35:return 13 -break; -case 36:return 7 -break; -case 37:return 13 -break; -case 38:return 13 -break; -case 39:return 7 -break; -case 40:return 13 -break; -case 41:return 13 -break; -case 42:return 13 -break; -case 43:return 13 -break; -case 44:return 13 -break; -case 45:return 7 -break; -case 46:return 13 -break; -case 47:return 7 -break; -case 48:return 7 -break; -case 49:return 7 -break; -case 50:return 7 -break; -case 51:return 7 -break; -case 52:return 7 -break; -case 53:return 7 -break; -case 54:return 7 -break; -case 55:return 7 -break; -case 56:return 7 -break; -case 57:return 7 -break; -case 58:return 7 -break; -case 59:return 7 -break; -case 60:return 7 -break; -case 61:return 7 -break; -case 62:return 7 -break; -case 63:return 13 -break; -case 64:return 7 -break; -case 65:return 7 -break; -case 66:return 13 -break; -case 67:return 7 -break; -case 68:return 7 -break; -case 69:return 7 -break; -case 70:return 7 -break; -case 71:return 7 -break; -case 72:return 7 -break; -case 73:return 13 -break; -case 74:return 7 -break; -case 75:return 13 -break; -case 76:return 7 -break; -case 77:return 7 -break; -case 78:return 7 -break; -case 79:return 7 -break; -case 80:return 7 -break; -case 81:return 7 -break; -case 82:return 7 -break; -case 83:return 7 -break; -case 84:return 7 -break; -case 85:return 7 -break; -case 86:return 7 -break; -case 87:return 7 -break; -case 88:return 7 -break; -case 89:return 7 -break; -case 90:return 7 -break; -case 91:return 7 -break; -case 92:return 7 -break; -case 93:return 7 -break; -case 94:return 7 -break; -case 95:return 7 -break; -case 96:return 7 -break; -case 97:return 7 -break; -case 98:return 7 -break; -case 99:return 7 -break; -case 100:return 7 -break; -case 101:return 7 -break; -case 102:return 7 -break; -case 103:return 7 -break; -case 104:return 7 -break; -case 105:return 7 -break; -case 106:return 7 -break; -case 107:return 7 -break; -case 108:return 7 -break; -case 109:return 7 -break; -case 110:return 7 -break; -case 111:return 7 -break; -case 112:return 7 -break; -case 113:return 7 -break; -case 114:return 7 -break; -case 115:return 7 -break; -case 116:return 7 -break; -case 117:return 7 -break; -case 118:return 7 -break; -case 119:return 7 -break; -case 120:return 7 -break; -case 121:return 7 -break; -case 122:return 7 -break; -case 123:return 7 -break; -case 124:return 7 -break; -case 125:return 7 -break; -case 126:return 7 -break; -case 127:return 7 -break; -case 128:return 7 -break; -case 129:return 7 -break; -case 130:return 7 -break; -case 131:return 7 -break; -case 132:return 7 -break; -case 133:return 7 -break; -case 134:return 7 -break; -case 135:return 7 -break; -case 136:return 7 -break; -case 137:return 7 -break; -case 138:return 7 -break; -case 139:return 7 -break; -case 140:return 7 -break; -case 141:return 7 -break; -case 142:return 7 -break; -case 143:return 7 -break; -case 144:return 7 -break; -case 145:return 7 -break; -case 146:return 7 -break; -case 147:return 7 -break; -case 148:return 7 -break; -case 149:return 7 -break; -case 150:return 7 -break; -case 151:return 7 -break; -case 152:return 7 -break; -case 153:return 7 -break; -case 154:return 7 -break; -case 155:return 7 -break; -case 156:return 7 -break; -case 157:return 7 -break; -case 158:return 7 -break; -case 159:return 7 -break; -case 160:return 7 -break; -case 161:return 7 -break; -case 162:return 7 -break; -case 163:return 7 -break; -case 164:return 7 -break; -case 165:return 7 -break; -case 166:return 7 -break; -case 167:return 7 -break; -case 168:return 7 -break; -case 169:return 7 -break; -case 170:return 7 -break; -case 171:return 7 -break; -case 172:return 7 -break; -case 173:return 7 -break; -case 174:return 7 -break; -case 175:return 7 -break; -case 176:return 7 -break; -case 177:return 7 -break; -case 178:return 7 -break; -case 179:return 7 -break; -case 180:return 7 -break; -case 181:return 7 -break; -case 182:return 7 -break; -case 183:return 7 -break; -case 184:return 7 -break; -case 185:return 7 -break; -case 186:return 7 -break; -case 187:return 7 -break; -case 188:return 7 -break; -case 189:return 7 -break; -case 190:return 7 -break; -case 191:return 7 -break; -case 192:return 7 -break; -case 193:return 7 -break; -case 194:return 7 -break; -case 195:return 7 -break; -case 196:return 7 -break; -case 197:return 7 -break; -case 198:return 7 -break; -case 199:return 7 -break; -case 200:return 7 -break; -case 201:return 7 -break; -case 202:return 7 -break; -case 203:return 7 -break; -case 204:return 7 -break; -case 205:return 7 -break; -case 206:return 7 -break; -case 207:return 7 -break; -case 208:return 7 -break; -case 209:return 7 -break; -case 210:return 7 -break; -case 211:return 7 -break; -case 212:return 7 -break; -case 213:return 7 -break; -case 214:return 7 -break; -case 215:return 7 -break; -case 216:return 7 -break; -case 217:return 7 -break; -case 218:return 7 -break; -case 219:return 7 -break; -case 220:return 7 -break; -case 221:return 7 -break; -case 222:return 7 -break; -case 223:return 7 -break; -case 224:return 7 -break; -case 225:return 7 -break; -case 226:return 7 -break; -case 227:return 7 -break; -case 228:return 7 -break; -case 229:return 7 -break; -case 230:return 7 -break; -case 231:return 7 -break; -case 232:return 7 -break; -case 233:return 7 -break; -case 234:return 7 -break; -case 235:return 7 -break; -case 236:return 7 -break; -case 237:return 7 -break; -case 238:return 7 -break; -case 239:return 7 -break; -case 240:return 7 -break; -case 241:return 7 -break; -case 242:return 7 -break; -case 243:return 7 -break; -case 244:return 7 -break; -case 245:return 7 -break; -case 246:return 7 -break; -case 247:return 7 -break; -case 248:return 7 -break; -case 249:return 7 -break; -case 250:return 7 -break; -case 251:return 7 -break; -case 252:return 7 -break; -case 253:return 7 -break; -case 254:return 7 -break; -case 255:return 7 -break; -case 256:return 7 -break; -case 257:return 7 -break; -case 258:return 7 -break; -case 259:return 7 -break; -case 260:return 7 -break; -case 261:return 7 -break; -case 262:return 7 -break; -case 263:return 7 -break; -case 264:return 7 -break; -case 265:return 7 -break; -case 266:return 7 -break; -case 267:return 7 -break; -case 268:return 7 -break; -case 269:return 7 -break; -case 270:return 7 -break; -case 271:return 7 -break; -case 272:return 7 -break; -case 273:return 7 -break; -case 274:return 7 -break; -case 275:return 7 -break; -case 276:return 7 -break; -case 277:return 7 -break; -case 278:return 7 -break; -case 279:return 7 -break; -case 280:return 7 -break; -case 281:return 7 -break; -case 282:return 7 -break; -case 283:return 7 -break; -case 284:return 7 -break; -case 285:return 7 -break; -case 286:return 7 -break; -case 287:return 7 -break; -case 288:return 7 -break; -case 289:return 7 -break; -case 290:return 7 -break; -case 291:return 7 -break; -case 292:return 7 -break; -case 293:return 7 -break; -case 294:return 7 -break; -case 295:return 7 -break; -case 296:return 7 -break; -case 297:return 7 -break; -case 298:return 7 -break; -case 299:return 7 -break; -case 300:return 7 -break; -case 301:return 7 -break; -case 302:return 7 -break; -case 303:return 7 -break; -case 304:return 7 -break; -case 305:return 7 -break; -case 306:return 7 -break; -case 307:return 7 -break; -case 308:return 7 -break; -case 309:return 7 -break; -case 310:return 7 -break; -case 311:return 7 -break; -case 312:return 7 -break; -case 313:return 7 -break; -case 314:return 7 -break; -case 315:return 7 -break; -case 316:return 7 -break; -case 317:return 7 -break; -case 318:return 7 -break; -case 319:return 7 -break; -case 320:return 7 -break; -case 321:return 7 -break; -case 322:return 7 -break; -case 323:return 7 -break; -case 324:return 7 -break; -case 325:return 7 -break; -case 326:return 7 -break; -case 327:return 7 -break; -case 328:return 7 -break; -case 329:return 7 -break; -case 330:return 7 -break; -case 331:return 7 -break; -case 332:return 7 -break; -case 333:return 7 -break; -case 334:return 7 -break; -case 335:return 7 -break; -case 336:return 7 -break; -case 337:return 7 -break; -case 338:return 7 -break; -case 339:return 7 -break; -case 340:return 7 -break; -case 341:return 7 -break; -case 342:return 7 -break; -case 343:return 7 -break; -case 344:return 7 -break; -case 345:return 7 -break; -case 346:return 7 -break; -case 347:return 7 -break; -case 348:return 7 -break; -case 349:return 7 -break; -case 350:return 7 -break; -case 351:return 7 -break; -case 352:return 7 -break; -case 353:return 7 -break; -case 354:return 7 -break; -case 355:return 7 -break; -case 356:return 7 -break; -case 357:return 7 -break; -case 358:return 7 -break; -case 359:return 7 -break; -case 360:return 7 -break; -case 361:return 7 -break; -case 362:return 7 -break; -case 363:return 7 -break; -case 364:return 7 -break; +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + if (isIgnored(this, e)) + return + + var abs = this._makeAbs(e) + + if (this.mark) + e = this._mark(e) + + if (this.absolute) { + e = abs + } + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + if (er.code === 'ENOENT') { + // lstat failed, doesn't exist + return null + } + } + + var isSym = lstat && lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && lstat && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + throw error + } + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { + this.statCache[abs] = false + return false + } + } + + if (lstat && lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = true + if (stat) + c = stat.isDirectory() ? 'DIR' : 'FILE' + + this.cache[abs] = this.cache[abs] || c + + if (needDir && c === 'FILE') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + + +/***/ }), +/* 514 */ +/***/ (function(module, exports, __webpack_require__) { + +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = __webpack_require__(4) +var minimatch = __webpack_require__(506) +var isAbsolute = __webpack_require__(512) +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +// ignore patterns are always in dot:true mode. +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern, { dot: true }) + } + + return { + matcher: new Minimatch(pattern, { dot: true }), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + self.absolute = !!options.absolute + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = path.resolve(options.cwd) + self.changedCwd = self.cwd !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + // TODO: is an absolute `cwd` supposed to be resolved against `root`? + // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') + self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) + if (process.platform === "win32") + self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") + self.nomount = !!options.nomount + + // disable comments and negation in Minimatch. + // Note that they are not supported in Glob itself anyway. + options.nonegate = true + options.nocomment = true + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + var notDir = !(/\/$/.test(e)) + var c = self.cache[e] || self.cache[makeAbs(self, e)] + if (notDir && c) + notDir = c !== 'DIR' && !Array.isArray(c) + return notDir + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + + if (process.platform === 'win32') + abs = abs.replace(/\\/g, '/') + + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + + +/***/ }), +/* 515 */ +/***/ (function(module, exports, __webpack_require__) { + +var wrappy = __webpack_require__(379) +var reqs = Object.create(null) +var once = __webpack_require__(378) + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + + // XXX It's somewhat ambiguous whether a new callback added in this + // pass should be queued for later execution if something in the + // list of callbacks throws, or if it should just be discarded. + // However, it's such an edge case that it hardly matters, and either + // choice is likely as surprising as the other. + // As it happens, we do go ahead and schedule it for later execution. + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + } finally { + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} + + +/***/ }), +/* 516 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CliError", function() { return CliError; }); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +class CliError extends Error { + constructor(message, meta = {}) { + super(message); + this.meta = meta; + } + +} + +/***/ }), +/* 517 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return Project; }); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(349); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(397); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(516); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(500); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(518); +/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(563); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + + + + + + + +class Project { + static async fromPath(path) { + const pkgJson = await Object(_package_json__WEBPACK_IMPORTED_MODULE_5__["readPackageJson"])(path); + return new Project(pkgJson, path); + } + /** parsed package.json */ + + + constructor(packageJson, projectPath) { + _defineProperty(this, "json", void 0); + + _defineProperty(this, "packageJsonLocation", void 0); + + _defineProperty(this, "nodeModulesLocation", void 0); + + _defineProperty(this, "targetLocation", void 0); + + _defineProperty(this, "path", void 0); + + _defineProperty(this, "version", void 0); + + _defineProperty(this, "allDependencies", void 0); + + _defineProperty(this, "productionDependencies", void 0); + + _defineProperty(this, "devDependencies", void 0); + + _defineProperty(this, "scripts", void 0); + + _defineProperty(this, "isWorkspaceRoot", false); + + _defineProperty(this, "isWorkspaceProject", false); + + this.json = Object.freeze(packageJson); + this.path = projectPath; + this.packageJsonLocation = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, 'package.json'); + this.nodeModulesLocation = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, 'node_modules'); + this.targetLocation = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, 'target'); + this.version = this.json.version; + this.productionDependencies = this.json.dependencies || {}; + this.devDependencies = this.json.devDependencies || {}; + this.allDependencies = _objectSpread({}, this.devDependencies, {}, this.productionDependencies); + this.isWorkspaceRoot = this.json.hasOwnProperty('workspaces'); + this.scripts = this.json.scripts || {}; + } + + get name() { + return this.json.name; + } + + ensureValidProjectDependency(project, dependentProjectIsInWorkspace) { + const versionInPackageJson = this.allDependencies[project.name]; + let expectedVersionInPackageJson; + + if (dependentProjectIsInWorkspace) { + expectedVersionInPackageJson = project.json.version; + } else { + const relativePathToProject = normalizePath(path__WEBPACK_IMPORTED_MODULE_1___default.a.relative(this.path, project.path)); + expectedVersionInPackageJson = `link:${relativePathToProject}`; + } // No issues! + + + if (versionInPackageJson === expectedVersionInPackageJson) { + return; + } + + let problemMsg; + + if (Object(_package_json__WEBPACK_IMPORTED_MODULE_5__["isLinkDependency"])(versionInPackageJson) && dependentProjectIsInWorkspace) { + problemMsg = `but should be using a workspace`; + } else if (Object(_package_json__WEBPACK_IMPORTED_MODULE_5__["isLinkDependency"])(versionInPackageJson)) { + problemMsg = `using 'link:', but the path is wrong`; + } else { + problemMsg = `but it's not using the local package`; + } + + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`[${this.name}] depends on [${project.name}] ${problemMsg}. Update its package.json to the expected value below.`, { + actual: `"${project.name}": "${versionInPackageJson}"`, + expected: `"${project.name}": "${expectedVersionInPackageJson}"`, + package: `${this.name} (${this.packageJsonLocation})` + }); + } + + getBuildConfig() { + return this.json.kibana && this.json.kibana.build || {}; + } + /** + * Returns the directory that should be copied into the Kibana build artifact. + * This config can be specified to only include the project's build artifacts + * instead of everything located in the project directory. + */ + + + getIntermediateBuildDirectory() { + return path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, this.getBuildConfig().intermediateBuildDirectory || '.'); + } + + getCleanConfig() { + return this.json.kibana && this.json.kibana.clean || {}; + } + + hasScript(name) { + return name in this.scripts; + } + + getExecutables() { + const raw = this.json.bin; + + if (!raw) { + return {}; + } + + if (typeof raw === 'string') { + return { + [this.name]: path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, raw) + }; + } + + if (typeof raw === 'object') { + const binsConfig = {}; + + for (const binName of Object.keys(raw)) { + binsConfig[binName] = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, raw[binName]); + } + + return binsConfig; + } + + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`[${this.name}] has an invalid "bin" field in its package.json, ` + `expected an object or a string`, { + binConfig: Object(util__WEBPACK_IMPORTED_MODULE_2__["inspect"])(raw), + package: `${this.name} (${this.packageJsonLocation})` + }); + } + + async runScript(scriptName, args = []) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"].info(`Running script [${scriptName}] in [${this.name}]:`); + return Object(_scripts__WEBPACK_IMPORTED_MODULE_6__["runScriptInPackage"])(scriptName, args, this); + } + + runScriptStreaming(scriptName, options = {}) { + return Object(_scripts__WEBPACK_IMPORTED_MODULE_6__["runScriptInPackageStreaming"])({ + script: scriptName, + args: options.args || [], + pkg: this, + debug: options.debug + }); + } + + hasDependencies() { + return Object.keys(this.allDependencies).length > 0; + } + + async installDependencies({ + extraArgs + }) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"].info(`[${this.name}] running yarn`); + _log__WEBPACK_IMPORTED_MODULE_4__["log"].write(''); + await Object(_scripts__WEBPACK_IMPORTED_MODULE_6__["installInDir"])(this.path, extraArgs); + _log__WEBPACK_IMPORTED_MODULE_4__["log"].write(''); + await this.removeExtraneousNodeModules(); + } + /** + * Yarn workspaces symlinks workspace projects to the root node_modules, even + * when there is no depenency on the project. This results in unnecicary, and + * often duplicated code in the build archives. + */ + + + async removeExtraneousNodeModules() { + // this is only relevant for the root workspace + if (!this.isWorkspaceRoot) { + return; + } + + const workspacesInfo = await Object(_scripts__WEBPACK_IMPORTED_MODULE_6__["yarnWorkspacesInfo"])(this.path); + const unusedWorkspaces = new Set(Object.keys(workspacesInfo)); // check for any cross-project dependency + + for (const name of Object.keys(workspacesInfo)) { + const workspace = workspacesInfo[name]; + workspace.workspaceDependencies.forEach(w => unusedWorkspaces.delete(w)); + } + + unusedWorkspaces.forEach(name => { + const { + dependencies, + devDependencies + } = this.json; + const nodeModulesPath = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.nodeModulesLocation, name); + const isDependency = dependencies && dependencies.hasOwnProperty(name); + const isDevDependency = devDependencies && devDependencies.hasOwnProperty(name); + + if (!isDependency && !isDevDependency && fs__WEBPACK_IMPORTED_MODULE_0___default.a.existsSync(nodeModulesPath)) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"].debug(`No dependency on ${name}, removing link in node_modules`); + fs__WEBPACK_IMPORTED_MODULE_0___default.a.unlinkSync(nodeModulesPath); + } + }); + } + +} // We normalize all path separators to `/` in generated files + +function normalizePath(path) { + return path.replace(/[\\\/]+/g, '/'); +} + +/***/ }), +/* 518 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readPackageJson", function() { return readPackageJson; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "writePackageJson", function() { return writePackageJson; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLinkDependency", function() { return isLinkDependency; }); +/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(519); +/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(read_pkg__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(545); +/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(write_pkg__WEBPACK_IMPORTED_MODULE_1__); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + + +function readPackageJson(cwd) { + return read_pkg__WEBPACK_IMPORTED_MODULE_0___default()({ + cwd, + normalize: false + }); +} +function writePackageJson(path, json) { + return write_pkg__WEBPACK_IMPORTED_MODULE_1___default()(path, json); +} +const isLinkDependency = depVersion => depVersion.startsWith('link:'); + +/***/ }), +/* 519 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const parseJson = __webpack_require__(520); + +const readFileAsync = promisify(fs.readFile); + +module.exports = async options => { + options = { + cwd: process.cwd(), + normalize: true, + ...options + }; + + const filePath = path.resolve(options.cwd, 'package.json'); + const json = parseJson(await readFileAsync(filePath, 'utf8')); + + if (options.normalize) { + __webpack_require__(521)(json); + } + + return json; +}; + +module.exports.sync = options => { + options = { + cwd: process.cwd(), + normalize: true, + ...options + }; + + const filePath = path.resolve(options.cwd, 'package.json'); + const json = parseJson(fs.readFileSync(filePath, 'utf8')); + + if (options.normalize) { + __webpack_require__(521)(json); + } + + return json; +}; + + +/***/ }), +/* 520 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const errorEx = __webpack_require__(416); +const fallback = __webpack_require__(418); +const {default: LinesAndColumns} = __webpack_require__(419); +const {codeFrameColumns} = __webpack_require__(420); + +const JSONError = errorEx('JSONError', { + fileName: errorEx.append('in %s'), + codeFrame: errorEx.append('\n\n%s\n') +}); + +module.exports = (string, reviver, filename) => { + if (typeof reviver === 'string') { + filename = reviver; + reviver = null; + } + + try { + try { + return JSON.parse(string, reviver); + } catch (error) { + fallback(string, reviver); + throw error; + } + } catch (error) { + error.message = error.message.replace(/\n/g, ''); + const indexMatch = error.message.match(/in JSON at position (\d+) while parsing near/); + + const jsonError = new JSONError(error); + if (filename) { + jsonError.fileName = filename; + } + + if (indexMatch && indexMatch.length > 0) { + const lines = new LinesAndColumns(string); + const index = Number(indexMatch[1]); + const location = lines.locationForIndex(index); + + const codeFrame = codeFrameColumns( + string, + {start: {line: location.line + 1, column: location.column + 1}}, + {highlightCode: true} + ); + + jsonError.codeFrame = codeFrame; + } + + throw jsonError; + } +}; + + +/***/ }), +/* 521 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = normalize + +var fixer = __webpack_require__(522) +normalize.fixer = fixer + +var makeWarning = __webpack_require__(543) + +var fieldsToFix = ['name','version','description','repository','modules','scripts' + ,'files','bin','man','bugs','keywords','readme','homepage','license'] +var otherThingsToFix = ['dependencies','people', 'typos'] + +var thingsToFix = fieldsToFix.map(function(fieldName) { + return ucFirst(fieldName) + "Field" +}) +// two ways to do this in CoffeeScript on only one line, sub-70 chars: +// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field" +// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix) +thingsToFix = thingsToFix.concat(otherThingsToFix) + +function normalize (data, warn, strict) { + if(warn === true) warn = null, strict = true + if(!strict) strict = false + if(!warn || data.private) warn = function(msg) { /* noop */ } + + if (data.scripts && + data.scripts.install === "node-gyp rebuild" && + !data.scripts.preinstall) { + data.gypfile = true + } + fixer.warn = function() { warn(makeWarning.apply(null, arguments)) } + thingsToFix.forEach(function(thingName) { + fixer["fix" + ucFirst(thingName)](data, strict) + }) + data._id = data.name + "@" + data.version +} + +function ucFirst (string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + + +/***/ }), +/* 522 */ +/***/ (function(module, exports, __webpack_require__) { + +var semver = __webpack_require__(523) +var validateLicense = __webpack_require__(524); +var hostedGitInfo = __webpack_require__(529) +var isBuiltinModule = __webpack_require__(532).isCore +var depTypes = ["dependencies","devDependencies","optionalDependencies"] +var extractDescription = __webpack_require__(541) +var url = __webpack_require__(439) +var typos = __webpack_require__(542) + +var fixer = module.exports = { + // default warning function + warn: function() {}, + + fixRepositoryField: function(data) { + if (data.repositories) { + this.warn("repositories"); + data.repository = data.repositories[0] + } + if (!data.repository) return this.warn("missingRepository") + if (typeof data.repository === "string") { + data.repository = { + type: "git", + url: data.repository + } + } + var r = data.repository.url || "" + if (r) { + var hosted = hostedGitInfo.fromUrl(r) + if (hosted) { + r = data.repository.url + = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString() + } + } + + if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { + this.warn("brokenGitUrl", r) + } + } + +, fixTypos: function(data) { + Object.keys(typos.topLevel).forEach(function (d) { + if (data.hasOwnProperty(d)) { + this.warn("typo", d, typos.topLevel[d]) + } + }, this) + } + +, fixScriptsField: function(data) { + if (!data.scripts) return + if (typeof data.scripts !== "object") { + this.warn("nonObjectScripts") + delete data.scripts + return + } + Object.keys(data.scripts).forEach(function (k) { + if (typeof data.scripts[k] !== "string") { + this.warn("nonStringScript") + delete data.scripts[k] + } else if (typos.script[k] && !data.scripts[typos.script[k]]) { + this.warn("typo", k, typos.script[k], "scripts") + } + }, this) + } + +, fixFilesField: function(data) { + var files = data.files + if (files && !Array.isArray(files)) { + this.warn("nonArrayFiles") + delete data.files + } else if (data.files) { + data.files = data.files.filter(function(file) { + if (!file || typeof file !== "string") { + this.warn("invalidFilename", file) + return false + } else { + return true + } + }, this) + } + } + +, fixBinField: function(data) { + if (!data.bin) return; + if (typeof data.bin === "string") { + var b = {} + var match + if (match = data.name.match(/^@[^/]+[/](.*)$/)) { + b[match[1]] = data.bin + } else { + b[data.name] = data.bin + } + data.bin = b + } + } + +, fixManField: function(data) { + if (!data.man) return; + if (typeof data.man === "string") { + data.man = [ data.man ] + } + } +, fixBundleDependenciesField: function(data) { + var bdd = "bundledDependencies" + var bd = "bundleDependencies" + if (data[bdd] && !data[bd]) { + data[bd] = data[bdd] + delete data[bdd] + } + if (data[bd] && !Array.isArray(data[bd])) { + this.warn("nonArrayBundleDependencies") + delete data[bd] + } else if (data[bd]) { + data[bd] = data[bd].filter(function(bd) { + if (!bd || typeof bd !== 'string') { + this.warn("nonStringBundleDependency", bd) + return false + } else { + if (!data.dependencies) { + data.dependencies = {} + } + if (!data.dependencies.hasOwnProperty(bd)) { + this.warn("nonDependencyBundleDependency", bd) + data.dependencies[bd] = "*" + } + return true + } + }, this) + } + } + +, fixDependencies: function(data, strict) { + var loose = !strict + objectifyDeps(data, this.warn) + addOptionalDepsToDeps(data, this.warn) + this.fixBundleDependenciesField(data) + + ;['dependencies','devDependencies'].forEach(function(deps) { + if (!(deps in data)) return + if (!data[deps] || typeof data[deps] !== "object") { + this.warn("nonObjectDependencies", deps) + delete data[deps] + return + } + Object.keys(data[deps]).forEach(function (d) { + var r = data[deps][d] + if (typeof r !== 'string') { + this.warn("nonStringDependency", d, JSON.stringify(r)) + delete data[deps][d] + } + var hosted = hostedGitInfo.fromUrl(data[deps][d]) + if (hosted) data[deps][d] = hosted.toString() + }, this) + }, this) + } + +, fixModulesField: function (data) { + if (data.modules) { + this.warn("deprecatedModules") + delete data.modules + } + } + +, fixKeywordsField: function (data) { + if (typeof data.keywords === "string") { + data.keywords = data.keywords.split(/,\s+/) + } + if (data.keywords && !Array.isArray(data.keywords)) { + delete data.keywords + this.warn("nonArrayKeywords") + } else if (data.keywords) { + data.keywords = data.keywords.filter(function(kw) { + if (typeof kw !== "string" || !kw) { + this.warn("nonStringKeyword"); + return false + } else { + return true + } + }, this) + } + } + +, fixVersionField: function(data, strict) { + // allow "loose" semver 1.0 versions in non-strict mode + // enforce strict semver 2.0 compliance in strict mode + var loose = !strict + if (!data.version) { + data.version = "" + return true + } + if (!semver.valid(data.version, loose)) { + throw new Error('Invalid version: "'+ data.version + '"') + } + data.version = semver.clean(data.version, loose) + return true + } + +, fixPeople: function(data) { + modifyPeople(data, unParsePerson) + modifyPeople(data, parsePerson) + } + +, fixNameField: function(data, options) { + if (typeof options === "boolean") options = {strict: options} + else if (typeof options === "undefined") options = {} + var strict = options.strict + if (!data.name && !strict) { + data.name = "" + return + } + if (typeof data.name !== "string") { + throw new Error("name field must be a string.") + } + if (!strict) + data.name = data.name.trim() + ensureValidName(data.name, strict, options.allowLegacyCase) + if (isBuiltinModule(data.name)) + this.warn("conflictingName", data.name) + } + + +, fixDescriptionField: function (data) { + if (data.description && typeof data.description !== 'string') { + this.warn("nonStringDescription") + delete data.description + } + if (data.readme && !data.description) + data.description = extractDescription(data.readme) + if(data.description === undefined) delete data.description; + if (!data.description) this.warn("missingDescription") + } + +, fixReadmeField: function (data) { + if (!data.readme) { + this.warn("missingReadme") + data.readme = "ERROR: No README data found!" + } + } + +, fixBugsField: function(data) { + if (!data.bugs && data.repository && data.repository.url) { + var hosted = hostedGitInfo.fromUrl(data.repository.url) + if(hosted && hosted.bugs()) { + data.bugs = {url: hosted.bugs()} + } + } + else if(data.bugs) { + var emailRe = /^.+@.*\..+$/ + if(typeof data.bugs == "string") { + if(emailRe.test(data.bugs)) + data.bugs = {email:data.bugs} + else if(url.parse(data.bugs).protocol) + data.bugs = {url: data.bugs} + else + this.warn("nonEmailUrlBugsString") + } + else { + bugsTypos(data.bugs, this.warn) + var oldBugs = data.bugs + data.bugs = {} + if(oldBugs.url) { + if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) + data.bugs.url = oldBugs.url + else + this.warn("nonUrlBugsUrlField") + } + if(oldBugs.email) { + if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) + data.bugs.email = oldBugs.email + else + this.warn("nonEmailBugsEmailField") + } + } + if(!data.bugs.email && !data.bugs.url) { + delete data.bugs + this.warn("emptyNormalizedBugs") + } + } + } + +, fixHomepageField: function(data) { + if (!data.homepage && data.repository && data.repository.url) { + var hosted = hostedGitInfo.fromUrl(data.repository.url) + if (hosted && hosted.docs()) data.homepage = hosted.docs() + } + if (!data.homepage) return + + if(typeof data.homepage !== "string") { + this.warn("nonUrlHomepage") + return delete data.homepage + } + if(!url.parse(data.homepage).protocol) { + data.homepage = "http://" + data.homepage + } + } + +, fixLicenseField: function(data) { + if (!data.license) { + return this.warn("missingLicense") + } else{ + if ( + typeof(data.license) !== 'string' || + data.license.length < 1 || + data.license.trim() === '' + ) { + this.warn("invalidLicense") + } else { + if (!validateLicense(data.license).validForNewPackages) + this.warn("invalidLicense") + } + } + } +} + +function isValidScopedPackageName(spec) { + if (spec.charAt(0) !== '@') return false + + var rest = spec.slice(1).split('/') + if (rest.length !== 2) return false + + return rest[0] && rest[1] && + rest[0] === encodeURIComponent(rest[0]) && + rest[1] === encodeURIComponent(rest[1]) +} + +function isCorrectlyEncodedName(spec) { + return !spec.match(/[\/@\s\+%:]/) && + spec === encodeURIComponent(spec) +} + +function ensureValidName (name, strict, allowLegacyCase) { + if (name.charAt(0) === "." || + !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) || + (strict && (!allowLegacyCase) && name !== name.toLowerCase()) || + name.toLowerCase() === "node_modules" || + name.toLowerCase() === "favicon.ico") { + throw new Error("Invalid name: " + JSON.stringify(name)) + } +} + +function modifyPeople (data, fn) { + if (data.author) data.author = fn(data.author) + ;["maintainers", "contributors"].forEach(function (set) { + if (!Array.isArray(data[set])) return; + data[set] = data[set].map(fn) + }) + return data +} + +function unParsePerson (person) { + if (typeof person === "string") return person + var name = person.name || "" + var u = person.url || person.web + var url = u ? (" ("+u+")") : "" + var e = person.email || person.mail + var email = e ? (" <"+e+">") : "" + return name+email+url +} + +function parsePerson (person) { + if (typeof person !== "string") return person + var name = person.match(/^([^\(<]+)/) + var url = person.match(/\(([^\)]+)\)/) + var email = person.match(/<([^>]+)>/) + var obj = {} + if (name && name[0].trim()) obj.name = name[0].trim() + if (email) obj.email = email[1]; + if (url) obj.url = url[1]; + return obj +} + +function addOptionalDepsToDeps (data, warn) { + var o = data.optionalDependencies + if (!o) return; + var d = data.dependencies || {} + Object.keys(o).forEach(function (k) { + d[k] = o[k] + }) + data.dependencies = d +} + +function depObjectify (deps, type, warn) { + if (!deps) return {} + if (typeof deps === "string") { + deps = deps.trim().split(/[\n\r\s\t ,]+/) + } + if (!Array.isArray(deps)) return deps + warn("deprecatedArrayDependencies", type) + var o = {} + deps.filter(function (d) { + return typeof d === "string" + }).forEach(function(d) { + d = d.trim().split(/(:?[@\s><=])/) + var dn = d.shift() + var dv = d.join("") + dv = dv.trim() + dv = dv.replace(/^@/, "") + o[dn] = dv + }) + return o +} + +function objectifyDeps (data, warn) { + depTypes.forEach(function (type) { + if (!data[type]) return; + data[type] = depObjectify(data[type], type, warn) + }) +} + +function bugsTypos(bugs, warn) { + if (!bugs) return + Object.keys(bugs).forEach(function (k) { + if (typos.bugs[k]) { + warn("typo", k, typos.bugs[k], "bugs") + bugs[typos.bugs[k]] = bugs[k] + delete bugs[k] + } + }) +} + + +/***/ }), +/* 523 */ +/***/ (function(module, exports) { + +exports = module.exports = SemVer + +var debug +/* istanbul ignore next */ +if (typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG)) { + debug = function () { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift('SEMVER') + console.log.apply(console, args) + } +} else { + debug = function () {} +} + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0' + +var MAX_LENGTH = 256 +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || + /* istanbul ignore next */ 9007199254740991 + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16 + +// The actual regexps go on exports.re +var re = exports.re = [] +var src = exports.src = [] +var R = 0 + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++ +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' +var NUMERICIDENTIFIERLOOSE = R++ +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++ +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++ +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')' + +var MAINVERSIONLOOSE = R++ +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')' + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++ +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')' + +var PRERELEASEIDENTIFIERLOOSE = R++ +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')' + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++ +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' + +var PRERELEASELOOSE = R++ +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++ +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++ +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++ +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?' + +src[FULL] = '^' + FULLPLAIN + '$' + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?' + +var LOOSE = R++ +src[LOOSE] = '^' + LOOSEPLAIN + '$' + +var GTLT = R++ +src[GTLT] = '((?:<|>)?=?)' + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++ +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' +var XRANGEIDENTIFIER = R++ +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' + +var XRANGEPLAIN = R++ +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?' + +var XRANGEPLAINLOOSE = R++ +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?' + +var XRANGE = R++ +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' +var XRANGELOOSE = R++ +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++ +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])' + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++ +src[LONETILDE] = '(?:~>?)' + +var TILDETRIM = R++ +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') +var tildeTrimReplace = '$1~' + +var TILDE = R++ +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' +var TILDELOOSE = R++ +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++ +src[LONECARET] = '(?:\\^)' + +var CARETTRIM = R++ +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') +var caretTrimReplace = '$1^' + +var CARET = R++ +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' +var CARETLOOSE = R++ +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++ +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' +var COMPARATOR = R++ +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++ +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') +var comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++ +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$' + +var HYPHENRANGELOOSE = R++ +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$' + +// Star ranges basically just allow anything at all. +var STAR = R++ +src[STAR] = '(<|>)?=?\\s*\\*' + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]) + if (!re[i]) { + re[i] = new RegExp(src[i]) + } +} + +exports.parse = parse +function parse (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + if (version.length > MAX_LENGTH) { + return null + } + + var r = options.loose ? re[LOOSE] : re[FULL] + if (!r.test(version)) { + return null + } + + try { + return new SemVer(version, options) + } catch (er) { + return null + } +} + +exports.valid = valid +function valid (version, options) { + var v = parse(version, options) + return v ? v.version : null +} + +exports.clean = clean +function clean (version, options) { + var s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} + +exports.SemVer = SemVer + +function SemVer (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + if (version instanceof SemVer) { + if (version.loose === options.loose) { + return version + } else { + version = version.version + } + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version) + } + + if (version.length > MAX_LENGTH) { + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + } + + if (!(this instanceof SemVer)) { + return new SemVer(version, options) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + + var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) + + if (!m) { + throw new TypeError('Invalid Version: ' + version) + } + + this.raw = version + + // these are actually numbers + this.major = +m[1] + this.minor = +m[2] + this.patch = +m[3] + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') + } + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') + } + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') + } + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = [] + } else { + this.prerelease = m[4].split('.').map(function (id) { + if (/^[0-9]+$/.test(id)) { + var num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num + } + } + return id + }) + } + + this.build = m[5] ? m[5].split('.') : [] + this.format() } -}, -rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/], -conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}} -}); -return lexer; -})(); -parser.lexer = lexer; -function Parser () { - this.yy = {}; + +SemVer.prototype.format = function () { + this.version = this.major + '.' + this.minor + '.' + this.patch + if (this.prerelease.length) { + this.version += '-' + this.prerelease.join('.') + } + return this.version } -Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); +SemVer.prototype.toString = function () { + return this.version +} + +SemVer.prototype.compare = function (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return this.compareMain(other) || this.comparePre(other) +} + +SemVer.prototype.compareMain = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) +} + +SemVer.prototype.comparePre = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 + } + + var i = 0 + do { + var a = this.prerelease[i] + var b = other.prerelease[i] + debug('prerelease compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) +} + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function (release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0 + this.patch = 0 + this.minor = 0 + this.major++ + this.inc('pre', identifier) + break + case 'preminor': + this.prerelease.length = 0 + this.patch = 0 + this.minor++ + this.inc('pre', identifier) + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0 + this.inc('patch', identifier) + this.inc('pre', identifier) + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier) + } + this.inc('pre', identifier) + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0) { + this.major++ + } + this.minor = 0 + this.patch = 0 + this.prerelease = [] + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++ + } + this.patch = 0 + this.prerelease = [] + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++ + } + this.prerelease = [] + break + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) { + this.prerelease = [0] + } else { + var i = this.prerelease.length + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++ + i = -2 + } + } + if (i === -1) { + // didn't increment anything + this.prerelease.push(0) + } + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) { + this.prerelease = [identifier, 0] + } + } else { + this.prerelease = [identifier, 0] + } + } + break + + default: + throw new Error('invalid increment argument: ' + release) + } + this.format() + this.raw = this.version + return this +} + +exports.inc = inc +function inc (version, release, loose, identifier) { + if (typeof (loose) === 'string') { + identifier = loose + loose = undefined + } + + try { + return new SemVer(version, loose).inc(release, identifier).version + } catch (er) { + return null + } +} + +exports.diff = diff +function diff (version1, version2) { + if (eq(version1, version2)) { + return null + } else { + var v1 = parse(version1) + var v2 = parse(version2) + var prefix = '' + if (v1.prerelease.length || v2.prerelease.length) { + prefix = 'pre' + var defaultResult = 'prerelease' + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return prefix + key + } + } + } + return defaultResult // may be undefined + } +} + +exports.compareIdentifiers = compareIdentifiers + +var numeric = /^[0-9]+$/ +function compareIdentifiers (a, b) { + var anum = numeric.test(a) + var bnum = numeric.test(b) + + if (anum && bnum) { + a = +a + b = +b + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +exports.rcompareIdentifiers = rcompareIdentifiers +function rcompareIdentifiers (a, b) { + return compareIdentifiers(b, a) +} + +exports.major = major +function major (a, loose) { + return new SemVer(a, loose).major +} + +exports.minor = minor +function minor (a, loose) { + return new SemVer(a, loose).minor +} + +exports.patch = patch +function patch (a, loose) { + return new SemVer(a, loose).patch +} + +exports.compare = compare +function compare (a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)) +} + +exports.compareLoose = compareLoose +function compareLoose (a, b) { + return compare(a, b, true) +} + +exports.rcompare = rcompare +function rcompare (a, b, loose) { + return compare(b, a, loose) +} + +exports.sort = sort +function sort (list, loose) { + return list.sort(function (a, b) { + return exports.compare(a, b, loose) + }) +} + +exports.rsort = rsort +function rsort (list, loose) { + return list.sort(function (a, b) { + return exports.rcompare(a, b, loose) + }) +} + +exports.gt = gt +function gt (a, b, loose) { + return compare(a, b, loose) > 0 +} + +exports.lt = lt +function lt (a, b, loose) { + return compare(a, b, loose) < 0 +} + +exports.eq = eq +function eq (a, b, loose) { + return compare(a, b, loose) === 0 +} + +exports.neq = neq +function neq (a, b, loose) { + return compare(a, b, loose) !== 0 +} + +exports.gte = gte +function gte (a, b, loose) { + return compare(a, b, loose) >= 0 +} + +exports.lte = lte +function lte (a, b, loose) { + return compare(a, b, loose) <= 0 +} + +exports.cmp = cmp +function cmp (a, op, b, loose) { + switch (op) { + case '===': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a === b + + case '!==': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError('Invalid operator: ' + op) + } +} + +exports.Comparator = Comparator +function Comparator (comp, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + if (!(this instanceof Comparator)) { + return new Comparator(comp, options) + } + + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version + } + + debug('comp', this) +} + +var ANY = {} +Comparator.prototype.parse = function (comp) { + var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var m = comp.match(r) + + if (!m) { + throw new TypeError('Invalid comparator: ' + comp) + } + + this.operator = m[1] + if (this.operator === '=') { + this.operator = '' + } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY + } else { + this.semver = new SemVer(m[2], this.options.loose) + } +} + +Comparator.prototype.toString = function () { + return this.value +} + +Comparator.prototype.test = function (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY) { + return true + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + return cmp(version, this.operator, this.semver, this.options) +} + +Comparator.prototype.intersects = function (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + var rangeTmp + + if (this.operator === '') { + rangeTmp = new Range(comp.value, options) + return satisfies(this.value, rangeTmp, options) + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, options) + return satisfies(comp.semver, rangeTmp, options) + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>') + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<') + var sameSemVer = this.semver.version === comp.semver.version + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<=') + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, options) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')) + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, options) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')) + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +} + +exports.Range = Range +function Range (range, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (range instanceof Range) { + if (range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + return new Range(range.value, options) + } + + if (!(this instanceof Range)) { + return new Range(range, options) + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // First, split based on boolean or || + this.raw = range + this.set = range.split(/\s*\|\|\s*/).map(function (range) { + return this.parseRange(range.trim()) + }, this).filter(function (c) { + // throw out any that are not relevant for whatever reason + return c.length + }) -if (true) { -exports.parser = spdxparse; -exports.Parser = spdxparse.Parser; -exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); }; -exports.main = function commonjsMain(args) { - if (!args[1]) { - console.log('Usage: '+args[0]+' FILE'); - process.exit(1); - } - var source = __webpack_require__(23).readFileSync(__webpack_require__(16).normalize(args[1]), "utf8"); - return exports.parser.parse(source); -}; -if ( true && __webpack_require__.c[__webpack_require__.s] === module) { - exports.main(process.argv.slice(1)); + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range) + } + + this.format() } + +Range.prototype.format = function () { + this.range = this.set.map(function (comps) { + return comps.join(' ').trim() + }).join('||').trim() + return this.range } -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) +Range.prototype.toString = function () { + return this.range +} -/***/ }), -/* 527 */ -/***/ (function(module, exports, __webpack_require__) { +Range.prototype.parseRange = function (range) { + var loose = this.options.loose + range = range.trim() + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] + range = range.replace(hr, hyphenReplace) + debug('hyphen replace', range) + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range, re[COMPARATORTRIM]) -var licenseIDs = __webpack_require__(528); + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace) -function valid(string) { - return licenseIDs.indexOf(string) > -1; -} + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace) -// Common transpositions of license identifier acronyms -var transpositions = [ - ['APGL', 'AGPL'], - ['Gpl', 'GPL'], - ['GLP', 'GPL'], - ['APL', 'Apache'], - ['ISD', 'ISC'], - ['GLP', 'GPL'], - ['IST', 'ISC'], - ['Claude', 'Clause'], - [' or later', '+'], - [' International', ''], - ['GNU', 'GPL'], - ['GUN', 'GPL'], - ['+', ''], - ['GNU GPL', 'GPL'], - ['GNU/GPL', 'GPL'], - ['GNU GLP', 'GPL'], - ['GNU General Public License', 'GPL'], - ['Gnu public license', 'GPL'], - ['GNU Public License', 'GPL'], - ['GNU GENERAL PUBLIC LICENSE', 'GPL'], - ['MTI', 'MIT'], - ['Mozilla Public License', 'MPL'], - ['WTH', 'WTF'], - ['-License', ''] -]; + // normalize spaces + range = range.split(/\s+/).join(' ') -var TRANSPOSED = 0; -var CORRECT = 1; + // At this point, the range is completely trimmed and + // ready to be split into comparators. -// Simple corrections to nearly valid identifiers. -var transforms = [ - // e.g. 'mit' - function(argument) { - return argument.toUpperCase(); - }, - // e.g. 'MIT ' - function(argument) { - return argument.trim(); - }, - // e.g. 'M.I.T.' - function(argument) { - return argument.replace(/\./g, ''); - }, - // e.g. 'Apache- 2.0' - function(argument) { - return argument.replace(/\s+/g, ''); - }, - // e.g. 'CC BY 4.0'' - function(argument) { - return argument.replace(/\s+/g, '-'); - }, - // e.g. 'LGPLv2.1' - function(argument) { - return argument.replace('v', '-'); - }, - // e.g. 'Apache 2.0' - function(argument) { - return argument.replace(/,?\s*(\d)/, '-$1'); - }, - // e.g. 'GPL 2' - function(argument) { - return argument.replace(/,?\s*(\d)/, '-$1.0'); - }, - // e.g. 'Apache Version 2.0' - function(argument) { - return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2'); - }, - // e.g. 'Apache Version 2' - function(argument) { - return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0'); - }, - // e.g. 'ZLIB' - function(argument) { - return argument[0].toUpperCase() + argument.slice(1); - }, - // e.g. 'MPL/2.0' - function(argument) { - return argument.replace('/', '-'); - }, - // e.g. 'Apache 2' - function(argument) { - return argument - .replace(/\s*V\s*(\d)/, '-$1') - .replace(/(\d)$/, '$1.0'); - }, - // e.g. 'GPL-2.0-' - function(argument) { - return argument.slice(0, argument.length - 1); - }, - // e.g. 'GPL2' - function(argument) { - return argument.replace(/(\d)$/, '-$1.0'); - }, - // e.g. 'BSD 3' - function(argument) { - return argument.replace(/(-| )?(\d)$/, '-$2-Clause'); - }, - // e.g. 'BSD clause 3' - function(argument) { - return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause'); - }, - // e.g. 'BY-NC-4.0' - function(argument) { - return 'CC-' + argument; - }, - // e.g. 'BY-NC' - function(argument) { - return 'CC-' + argument + '-4.0'; - }, - // e.g. 'Attribution-NonCommercial' - function(argument) { - return argument - .replace('Attribution', 'BY') - .replace('NonCommercial', 'NC') - .replace('NoDerivatives', 'ND') - .replace(/ (\d)/, '-$1') - .replace(/ ?International/, ''); - }, - // e.g. 'Attribution-NonCommercial' - function(argument) { - return 'CC-' + - argument - .replace('Attribution', 'BY') - .replace('NonCommercial', 'NC') - .replace('NoDerivatives', 'ND') - .replace(/ (\d)/, '-$1') - .replace(/ ?International/, '') + - '-4.0'; + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var set = range.split(' ').map(function (comp) { + return parseComparator(comp, this.options) + }, this).join(' ').split(/\s+/) + if (this.options.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function (comp) { + return !!comp.match(compRe) + }) } -]; - -// If all else fails, guess that strings containing certain substrings -// meant to identify certain licenses. -var lastResorts = [ - ['UNLI', 'Unlicense'], - ['WTF', 'WTFPL'], - ['2 CLAUSE', 'BSD-2-Clause'], - ['2-CLAUSE', 'BSD-2-Clause'], - ['3 CLAUSE', 'BSD-3-Clause'], - ['3-CLAUSE', 'BSD-3-Clause'], - ['AFFERO', 'AGPL-3.0'], - ['AGPL', 'AGPL-3.0'], - ['APACHE', 'Apache-2.0'], - ['ARTISTIC', 'Artistic-2.0'], - ['Affero', 'AGPL-3.0'], - ['BEER', 'Beerware'], - ['BOOST', 'BSL-1.0'], - ['BSD', 'BSD-2-Clause'], - ['ECLIPSE', 'EPL-1.0'], - ['FUCK', 'WTFPL'], - ['GNU', 'GPL-3.0'], - ['LGPL', 'LGPL-3.0'], - ['GPL', 'GPL-3.0'], - ['MIT', 'MIT'], - ['MPL', 'MPL-2.0'], - ['X11', 'X11'], - ['ZLIB', 'Zlib'] -]; + set = set.map(function (comp) { + return new Comparator(comp, this.options) + }, this) -var SUBSTRING = 0; -var IDENTIFIER = 1; + return set +} -var validTransformation = function(identifier) { - for (var i = 0; i < transforms.length; i++) { - var transformed = transforms[i](identifier); - if (transformed !== identifier && valid(transformed)) { - return transformed; - } +Range.prototype.intersects = function (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') } - return null; -}; -var validLastResort = function(identifier) { - var upperCased = identifier.toUpperCase(); - for (var i = 0; i < lastResorts.length; i++) { - var lastResort = lastResorts[i]; - if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { - return lastResort[IDENTIFIER]; - } - } - return null; -}; + return this.set.some(function (thisComparators) { + return thisComparators.every(function (thisComparator) { + return range.set.some(function (rangeComparators) { + return rangeComparators.every(function (rangeComparator) { + return thisComparator.intersects(rangeComparator, options) + }) + }) + }) + }) +} -var anyCorrection = function(identifier, check) { - for (var i = 0; i < transpositions.length; i++) { - var transposition = transpositions[i]; - var transposed = transposition[TRANSPOSED]; - if (identifier.indexOf(transposed) > -1) { - var corrected = identifier.replace( - transposed, - transposition[CORRECT] - ); - var checked = check(corrected); - if (checked !== null) { - return checked; - } +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators +function toComparators (range, options) { + return new Range(range, options).set.map(function (comp) { + return comp.map(function (c) { + return c.value + }).join(' ').trim().split(' ') + }) +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator (comp, options) { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp +} + +function isX (id) { + return !id || id.toLowerCase() === 'x' || id === '*' +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceTilde(comp, options) + }).join(' ') +} + +function replaceTilde (comp, options) { + var r = options.loose ? re[TILDELOOSE] : re[TILDE] + return comp.replace(r, function (_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else if (pr) { + debug('replaceTilde pr', pr) + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } else { + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' } - } - return null; -}; -module.exports = function(identifier) { - identifier = identifier.replace(/\+$/, ''); - if (valid(identifier)) { - return identifier; - } - var transformed = validTransformation(identifier); - if (transformed !== null) { - return transformed; - } - transformed = anyCorrection(identifier, function(argument) { - if (valid(argument)) { - return argument; + debug('tilde return', ret) + return ret + }) +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceCaret(comp, options) + }).join(' ') +} + +function replaceCaret (comp, options) { + debug('caret', comp, options) + var r = options.loose ? re[CARETLOOSE] : re[CARET] + return comp.replace(r, function (_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + if (M === '0') { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else { + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' + } + } else if (pr) { + debug('replaceCaret pr', pr) + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + (+M + 1) + '.0.0' + } + } else { + debug('no pr') + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0' + } } - return validTransformation(argument); - }); - if (transformed !== null) { - return transformed; - } - transformed = validLastResort(identifier); - if (transformed !== null) { - return transformed; - } - transformed = anyCorrection(identifier, validLastResort); - if (transformed !== null) { - return transformed; - } - return null; -}; + debug('caret return', ret) + return ret + }) +} -/***/ }), -/* 528 */ -/***/ (function(module) { +function replaceXRanges (comp, options) { + debug('replaceXRanges', comp, options) + return comp.split(/\s+/).map(function (comp) { + return replaceXRange(comp, options) + }).join(' ') +} -module.exports = JSON.parse("[\"Glide\",\"Abstyles\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"AMPAS\",\"APL-1.0\",\"Adobe-Glyph\",\"APAFML\",\"Adobe-2006\",\"AGPL-1.0\",\"Afmparse\",\"Aladdin\",\"ADSL\",\"AMDPLPA\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"AML\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0\",\"Artistic-1.0-Perl\",\"Artistic-1.0-cl8\",\"Artistic-2.0\",\"AAL\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"BSL-1.0\",\"Borceux\",\"BSD-2-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-3-Clause\",\"BSD-3-Clause-Clear\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSD-3-Clause-Attribution\",\"0BSD\",\"BSD-4-Clause-UC\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"MIT-CMU\",\"CNRI-Jython\",\"CNRI-Python\",\"CNRI-Python-GPL-Compatible\",\"CPOL-1.02\",\"CDDL-1.0\",\"CDDL-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CATOSL-1.1\",\"Condor-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"WTFPL\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"EPL-1.0\",\"ECL-1.0\",\"ECL-2.0\",\"eGenix\",\"EFL-1.0\",\"EFL-2.0\",\"MIT-advertising\",\"MIT-enna\",\"Entessa\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"Eurosym\",\"Fair\",\"MIT-feh\",\"Frameworx-1.0\",\"FreeImage\",\"FTL\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"Giftware\",\"GL2PS\",\"Glulxe\",\"AGPL-3.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0\",\"GPL-3.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"LGPL-2.0\",\"gnuplot\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"IPL-1.0\",\"ICU\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"IJG\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"Latex2e\",\"BSD-3-Clause-LBNL\",\"Leptonica\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LAL-1.2\",\"LAL-1.3\",\"LiLiQ-P-1.1\",\"LiLiQ-Rplus-1.1\",\"LiLiQ-R-1.1\",\"LPL-1.02\",\"LPL-1.0\",\"MakeIndex\",\"MTLL\",\"MS-PL\",\"MS-RL\",\"MirOS\",\"MITNFA\",\"MIT\",\"Motosoto\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0\",\"MPL-2.0-no-copyleft-exception\",\"mpich2\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NetCDF\",\"NGPL\",\"NOSL\",\"NPL-1.0\",\"NPL-1.1\",\"Newsletr\",\"NLPL\",\"Nokia\",\"NPOSL-3.0\",\"NLOD-1.0\",\"Noweb\",\"NRL\",\"NTP\",\"Nunit\",\"OCLC-2.0\",\"ODbL-1.0\",\"PDDL-1.0\",\"OCCT-PL\",\"OGTSL\",\"OLDAP-2.2.2\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0\",\"OLDAP-2.0.1\",\"OLDAP-2.1\",\"OLDAP-2.2\",\"OLDAP-2.2.1\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OPL-1.0\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"OpenSSL\",\"OSET-PL-2.1\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"QPL-1.0\",\"Qhull\",\"Rdisc\",\"RPSL-1.0\",\"RPL-1.1\",\"RPL-1.5\",\"RHeCos-1.1\",\"RSCPL\",\"RSA-MD\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"SWL\",\"SMPPL\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"OFL-1.0\",\"OFL-1.1\",\"SimPL-2.0\",\"Sleepycat\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SMLNJ\",\"SugarCRM-1.1.3\",\"SISSL\",\"SISSL-1.2\",\"SPL-1.0\",\"Watcom-1.0\",\"TCL\",\"Unlicense\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-TOU\",\"UPL-1.0\",\"NCSA\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C\",\"Wsuipa\",\"Xnet\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"Zlib\",\"zlib-acknowledgement\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"eCos-2.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"StandardML-NJ\",\"WXwindows\"]"); +function replaceXRange (comp, options) { + comp = comp.trim() + var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] + return comp.replace(r, function (ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + var xM = isX(M) + var xm = xM || isX(m) + var xp = xm || isX(p) + var anyX = xp -/***/ }), -/* 529 */ -/***/ (function(module, exports, __webpack_require__) { + if (gtlt === '=' && anyX) { + gtlt = '' + } -"use strict"; + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 -var url = __webpack_require__(452) -var gitHosts = __webpack_require__(530) -var GitHost = module.exports = __webpack_require__(531) + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + m = +m + 1 + p = 0 + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<' + if (xm) { + M = +M + 1 + } else { + m = +m + 1 + } + } -var protocolToRepresentationMap = { - 'git+ssh': 'sshurl', - 'git+https': 'https', - 'ssh': 'sshurl', - 'git': 'git' -} + ret = gtlt + M + '.' + m + '.' + p + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } -function protocolToRepresentation (protocol) { - if (protocol.substr(-1) === ':') protocol = protocol.slice(0, -1) - return protocolToRepresentationMap[protocol] || protocol -} + debug('xRange return', ret) -var authProtocols = { - 'git:': true, - 'https:': true, - 'git+https:': true, - 'http:': true, - 'git+http:': true + return ret + }) } -var cache = {} +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars (comp, options) { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], '') +} -module.exports.fromUrl = function (giturl, opts) { - var key = giturl + JSON.stringify(opts || {}) +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + if (isX(fM)) { + from = '' + } else if (isX(fm)) { + from = '>=' + fM + '.0.0' + } else if (isX(fp)) { + from = '>=' + fM + '.' + fm + '.0' + } else { + from = '>=' + from + } - if (!(key in cache)) { - cache[key] = fromUrl(giturl, opts) + if (isX(tM)) { + to = '' + } else if (isX(tm)) { + to = '<' + (+tM + 1) + '.0.0' + } else if (isX(tp)) { + to = '<' + tM + '.' + (+tm + 1) + '.0' + } else if (tpr) { + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr + } else { + to = '<=' + to } - return cache[key] + return (from + ' ' + to).trim() } -function fromUrl (giturl, opts) { - if (giturl == null || giturl === '') return - var url = fixupUnqualifiedGist( - isGitHubShorthand(giturl) ? 'github:' + giturl : giturl - ) - var parsed = parseGitUrl(url) - var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)')) - var matches = Object.keys(gitHosts).map(function (gitHostName) { - try { - var gitHostInfo = gitHosts[gitHostName] - var auth = null - if (parsed.auth && authProtocols[parsed.protocol]) { - auth = decodeURIComponent(parsed.auth) - } - var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null - var user = null - var project = null - var defaultRepresentation = null - if (shortcutMatch && shortcutMatch[1] === gitHostName) { - user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2]) - project = decodeURIComponent(shortcutMatch[3]) - defaultRepresentation = 'shortcut' - } else { - if (parsed.host !== gitHostInfo.domain) return - if (!gitHostInfo.protocols_re.test(parsed.protocol)) return - if (!parsed.path) return - var pathmatch = gitHostInfo.pathmatch - var matched = parsed.path.match(pathmatch) - if (!matched) return - if (matched[1] != null) user = decodeURIComponent(matched[1].replace(/^:/, '')) - if (matched[2] != null) project = decodeURIComponent(matched[2]) - defaultRepresentation = protocolToRepresentation(parsed.protocol) - } - return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts) - } catch (ex) { - if (!(ex instanceof URIError)) throw ex - } - }).filter(function (gitHostInfo) { return gitHostInfo }) - if (matches.length !== 1) return - return matches[0] -} +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function (version) { + if (!version) { + return false + } -function isGitHubShorthand (arg) { - // Note: This does not fully test the git ref format. - // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html - // - // The only way to do this properly would be to shell out to - // git-check-ref-format, and as this is a fast sync function, - // we don't want to do that. Just let git fail if it turns - // out that the commit-ish is invalid. - // GH usernames cannot start with . or - - return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg) -} + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } -function fixupUnqualifiedGist (giturl) { - // necessary for round-tripping gists - var parsed = url.parse(giturl) - if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) { - return parsed.protocol + '/' + parsed.host - } else { - return giturl + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } } + return false } -function parseGitUrl (giturl) { - if (typeof giturl !== 'string') giturl = '' + giturl - var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/) - if (!matched) return url.parse(giturl) - return { - protocol: 'git+ssh:', - slashes: true, - auth: matched[1], - host: matched[2], - port: null, - hostname: matched[2], - hash: matched[4], - search: null, - query: null, - pathname: '/' + matched[3], - path: '/' + matched[3], - href: 'git+ssh://' + matched[1] + '@' + matched[2] + - '/' + matched[3] + (matched[4] || '') +function testSet (set, version, options) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } } -} + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === ANY) { + continue + } -/***/ }), -/* 530 */ -/***/ (function(module, exports, __webpack_require__) { + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } + } -"use strict"; + // Version has a -pre, but it's not one of the ones we like. + return false + } + return true +} -var gitHosts = module.exports = { - github: { - // First two are insecure and generally shouldn't be used any more, but - // they are still supported. - 'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'github.com', - 'treepath': 'tree', - 'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}', - 'bugstemplate': 'https://{domain}/{user}/{project}/issues', - 'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}', - 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' - }, - bitbucket: { - 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'bitbucket.org', - 'treepath': 'src', - 'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz' - }, - gitlab: { - 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'gitlab.com', - 'treepath': 'tree', - 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#README', - 'bugstemplate': 'https://{domain}/{user}/{project}/issues', - 'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}' - }, - gist: { - 'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'gist.github.com', - 'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]+)(?:[.]git)?$/, - 'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}', - 'bugstemplate': 'https://{domain}/{project}', - 'gittemplate': 'git://{domain}/{project}.git{#committish}', - 'sshtemplate': 'git@{domain}:/{project}.git{#committish}', - 'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}', - 'browsetemplate': 'https://{domain}/{project}{/committish}', - 'docstemplate': 'https://{domain}/{project}{/committish}', - 'httpstemplate': 'git+https://{domain}/{project}.git{#committish}', - 'shortcuttemplate': '{type}:{project}{#committish}', - 'pathtemplate': '{project}{#committish}', - 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' +exports.satisfies = satisfies +function satisfies (version, range, options) { + try { + range = new Range(range, options) + } catch (er) { + return false } + return range.test(version) } -var gitHostDefaults = { - 'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}', - 'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}', - 'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}', - 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme', - 'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}', - 'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}', - 'shortcuttemplate': '{type}:{user}/{project}{#committish}', - 'pathtemplate': '{user}/{project}{#committish}', - 'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/ +exports.maxSatisfying = maxSatisfying +function maxSatisfying (versions, range, options) { + var max = null + var maxSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max } -Object.keys(gitHosts).forEach(function (name) { - Object.keys(gitHostDefaults).forEach(function (key) { - if (gitHosts[name][key]) return - gitHosts[name][key] = gitHostDefaults[key] +exports.minSatisfying = minSatisfying +function minSatisfying (versions, range, options) { + var min = null + var minSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } }) - gitHosts[name].protocols_re = RegExp('^(' + - gitHosts[name].protocols.map(function (protocol) { - return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1') - }).join('|') + '):$') -}) + return min +} +exports.minVersion = minVersion +function minVersion (range, loose) { + range = new Range(range, loose) -/***/ }), -/* 531 */ -/***/ (function(module, exports, __webpack_require__) { + var minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } -"use strict"; + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } -var gitHosts = __webpack_require__(530) -var extend = Object.assign || __webpack_require__(29)._extend + minver = null + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] -var GitHost = module.exports = function (type, user, auth, project, committish, defaultRepresentation, opts) { - var gitHostInfo = this - gitHostInfo.type = type - Object.keys(gitHosts[type]).forEach(function (key) { - gitHostInfo[key] = gitHosts[type][key] - }) - gitHostInfo.user = user - gitHostInfo.auth = auth - gitHostInfo.project = project - gitHostInfo.committish = committish - gitHostInfo.default = defaultRepresentation - gitHostInfo.opts = opts || {} -} -GitHost.prototype = {} + comparators.forEach(function (comparator) { + // Clone to avoid manipulating the comparator's semver object. + var compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!minver || gt(minver, compver)) { + minver = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error('Unexpected operation: ' + comparator.operator) + } + }) + } -GitHost.prototype.hash = function () { - return this.committish ? '#' + this.committish : '' + if (minver && range.test(minver)) { + return minver + } + + return null } -GitHost.prototype._fill = function (template, opts) { - if (!template) return - var vars = extend({}, opts) - opts = extend(extend({}, this.opts), opts) - var self = this - Object.keys(this).forEach(function (key) { - if (self[key] != null && vars[key] == null) vars[key] = self[key] - }) - var rawAuth = vars.auth - var rawComittish = vars.committish - Object.keys(vars).forEach(function (key) { - vars[key] = encodeURIComponent(vars[key]) - }) - vars['auth@'] = rawAuth ? rawAuth + '@' : '' - if (opts.noCommittish) { - vars['#committish'] = '' - vars['/tree/committish'] = '' - vars['/comittish'] = '' - vars.comittish = '' - } else { - vars['#committish'] = rawComittish ? '#' + rawComittish : '' - vars['/tree/committish'] = vars.committish - ? '/' + vars.treepath + '/' + vars.committish - : '' - vars['/committish'] = vars.committish ? '/' + vars.committish : '' - vars.committish = vars.committish || 'master' - } - var res = template - Object.keys(vars).forEach(function (key) { - res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key]) - }) - if (opts.noGitPlus) { - return res.replace(/^git[+]/, '') - } else { - return res +exports.validRange = validRange +function validRange (range, options) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null } } -GitHost.prototype.ssh = function (opts) { - return this._fill(this.sshtemplate, opts) +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr +function ltr (version, range, options) { + return outside(version, range, '<', options) } -GitHost.prototype.sshurl = function (opts) { - return this._fill(this.sshurltemplate, opts) +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr +function gtr (version, range, options) { + return outside(version, range, '>', options) } -GitHost.prototype.browse = function (opts) { - return this._fill(this.browsetemplate, opts) -} +exports.outside = outside +function outside (version, range, hilo, options) { + version = new SemVer(version, options) + range = new Range(range, options) -GitHost.prototype.docs = function (opts) { - return this._fill(this.docstemplate, opts) -} + var gtfn, ltefn, ltfn, comp, ecomp + switch (hilo) { + case '>': + gtfn = gt + ltefn = lte + ltfn = lt + comp = '>' + ecomp = '>=' + break + case '<': + gtfn = lt + ltefn = gte + ltfn = gt + comp = '<' + ecomp = '<=' + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } -GitHost.prototype.bugs = function (opts) { - return this._fill(this.bugstemplate, opts) -} + // If it satisifes the range it is not outside + if (satisfies(version, range, options)) { + return false + } -GitHost.prototype.https = function (opts) { - return this._fill(this.httpstemplate, opts) -} + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. -GitHost.prototype.git = function (opts) { - return this._fill(this.gittemplate, opts) -} + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] -GitHost.prototype.shortcut = function (opts) { - return this._fill(this.shortcuttemplate, opts) -} + var high = null + var low = null -GitHost.prototype.path = function (opts) { - return this._fill(this.pathtemplate, opts) -} + comparators.forEach(function (comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator + } + }) -GitHost.prototype.tarball = function (opts) { - return this._fill(this.tarballtemplate, opts) + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false + } + } + return true } -GitHost.prototype.file = function (P, opts) { - return this._fill(this.filetemplate, extend({ - path: P.replace(/^[/]+/g, '') - }, opts)) +exports.prerelease = prerelease +function prerelease (version, options) { + var parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null } -GitHost.prototype.getDefaultRepresentation = function () { - return this.default +exports.intersects = intersects +function intersects (r1, r2, options) { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2) } -GitHost.prototype.toString = function (opts) { - return (this[this.default] || this.sshurl).call(this, opts) -} +exports.coerce = coerce +function coerce (version) { + if (version instanceof SemVer) { + return version + } + if (typeof version !== 'string') { + return null + } -/***/ }), -/* 532 */ -/***/ (function(module, exports, __webpack_require__) { + var match = version.match(re[COERCE]) -var core = __webpack_require__(533); -var async = __webpack_require__(535); -async.core = core; -async.isCore = function isCore(x) { return core[x]; }; -async.sync = __webpack_require__(540); + if (match == null) { + return null + } -exports = async; -module.exports = async; + return parse(match[1] + + '.' + (match[2] || '0') + + '.' + (match[3] || '0')) +} /***/ }), -/* 533 */ +/* 524 */ /***/ (function(module, exports, __webpack_require__) { -var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; +var parse = __webpack_require__(525); +var correct = __webpack_require__(527); -function specifierIncluded(specifier) { - var parts = specifier.split(' '); - var op = parts.length > 1 ? parts[0] : '='; - var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); +var genericWarning = ( + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "' +); - for (var i = 0; i < 3; ++i) { - var cur = Number(current[i] || 0); - var ver = Number(versionParts[i] || 0); - if (cur === ver) { - continue; // eslint-disable-line no-restricted-syntax, no-continue - } - if (op === '<') { - return cur < ver; - } else if (op === '>=') { - return cur >= ver; - } else { - return false; - } - } - return op === '>='; -} +var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; -function matchesRange(range) { - var specifiers = range.split(/ ?&& ?/); - if (specifiers.length === 0) { return false; } - for (var i = 0; i < specifiers.length; ++i) { - if (!specifierIncluded(specifiers[i])) { return false; } - } - return true; +function startsWith(prefix, string) { + return string.slice(0, prefix.length) === prefix; } -function versionIncluded(specifierValue) { - if (typeof specifierValue === 'boolean') { return specifierValue; } - if (specifierValue && typeof specifierValue === 'object') { - for (var i = 0; i < specifierValue.length; ++i) { - if (matchesRange(specifierValue[i])) { return true; } - } - return false; - } - return matchesRange(specifierValue); +function usesLicenseRef(ast) { + if (ast.hasOwnProperty('license')) { + var license = ast.license; + return ( + startsWith('LicenseRef', license) || + startsWith('DocumentRef', license) + ); + } else { + return ( + usesLicenseRef(ast.left) || + usesLicenseRef(ast.right) + ); + } } -var data = __webpack_require__(534); +module.exports = function(argument) { + var ast; -var core = {}; -for (var mod in data) { // eslint-disable-line no-restricted-syntax - if (Object.prototype.hasOwnProperty.call(data, mod)) { - core[mod] = versionIncluded(data[mod]); + try { + ast = parse(argument); + } catch (e) { + var match + if ( + argument === 'UNLICENSED' || + argument === 'UNLICENCED' + ) { + return { + validForOldPackages: true, + validForNewPackages: true, + unlicensed: true + }; + } else if (match = fileReferenceRE.exec(argument)) { + return { + validForOldPackages: true, + validForNewPackages: true, + inFile: match[1] + }; + } else { + var result = { + validForOldPackages: false, + validForNewPackages: false, + warnings: [genericWarning] + }; + var corrected = correct(argument); + if (corrected) { + result.warnings.push( + 'license is similar to the valid expression "' + corrected + '"' + ); + } + return result; } -} -module.exports = core; + } + + if (usesLicenseRef(ast)) { + return { + validForNewPackages: false, + validForOldPackages: false, + spdx: true, + warnings: [genericWarning] + }; + } else { + return { + validForNewPackages: true, + validForOldPackages: true, + spdx: true + }; + } +}; /***/ }), -/* 534 */ -/***/ (function(module) { +/* 525 */ +/***/ (function(module, exports, __webpack_require__) { + +var parser = __webpack_require__(526).parser + +module.exports = function (argument) { + return parser.parse(argument) +} -module.exports = JSON.parse("{\"assert\":true,\"async_hooks\":\">= 8\",\"buffer_ieee754\":\"< 0.9.7\",\"buffer\":true,\"child_process\":true,\"cluster\":true,\"console\":true,\"constants\":true,\"crypto\":true,\"_debugger\":\"< 8\",\"dgram\":true,\"dns\":true,\"domain\":true,\"events\":true,\"freelist\":\"< 6\",\"fs\":true,\"fs/promises\":\">= 10 && < 10.1\",\"_http_agent\":\">= 0.11.1\",\"_http_client\":\">= 0.11.1\",\"_http_common\":\">= 0.11.1\",\"_http_incoming\":\">= 0.11.1\",\"_http_outgoing\":\">= 0.11.1\",\"_http_server\":\">= 0.11.1\",\"http\":true,\"http2\":\">= 8.8\",\"https\":true,\"inspector\":\">= 8.0.0\",\"_linklist\":\"< 8\",\"module\":true,\"net\":true,\"node-inspect/lib/_inspect\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_client\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_repl\":\">= 7.6.0\",\"os\":true,\"path\":true,\"perf_hooks\":\">= 8.5\",\"process\":\">= 1\",\"punycode\":true,\"querystring\":true,\"readline\":true,\"repl\":true,\"smalloc\":\">= 0.11.5 && < 3\",\"_stream_duplex\":\">= 0.9.4\",\"_stream_transform\":\">= 0.9.4\",\"_stream_wrap\":\">= 1.4.1\",\"_stream_passthrough\":\">= 0.9.4\",\"_stream_readable\":\">= 0.9.4\",\"_stream_writable\":\">= 0.9.4\",\"stream\":true,\"string_decoder\":true,\"sys\":true,\"timers\":true,\"_tls_common\":\">= 0.11.13\",\"_tls_legacy\":\">= 0.11.3 && < 10\",\"_tls_wrap\":\">= 0.11.3\",\"tls\":true,\"trace_events\":\">= 10\",\"tty\":true,\"url\":true,\"util\":true,\"v8/tools/arguments\":\">= 10\",\"v8/tools/codemap\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/consarray\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/csvparser\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/logreader\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/profile_view\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/splaytree\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8\":\">= 1\",\"vm\":true,\"worker_threads\":\">= 11.7\",\"zlib\":true}"); /***/ }), -/* 535 */ +/* 526 */ /***/ (function(module, exports, __webpack_require__) { -var core = __webpack_require__(533); -var fs = __webpack_require__(23); -var path = __webpack_require__(16); -var caller = __webpack_require__(536); -var nodeModulesPaths = __webpack_require__(537); -var normalizeOptions = __webpack_require__(539); +/* WEBPACK VAR INJECTION */(function(module) {/* parser generated by jison 0.4.17 */ +/* + Returns a Parser object of the following structure: -var defaultIsFile = function isFile(file, cb) { - fs.stat(file, function (err, stat) { - if (!err) { - return cb(null, stat.isFile() || stat.isFIFO()); - } - if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); - return cb(err); - }); -}; + Parser: { + yy: {} + } -module.exports = function resolve(x, options, callback) { - var cb = callback; - var opts = options; - if (typeof options === 'function') { - cb = opts; - opts = {}; - } - if (typeof x !== 'string') { - var err = new TypeError('Path must be a string.'); - return process.nextTick(function () { - cb(err); - }); + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, } + } - opts = normalizeOptions(x, opts); - var isFile = opts.isFile || defaultIsFile; - var readFile = opts.readFile || fs.readFile; + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } - var extensions = opts.extensions || ['.js']; - var basedir = opts.basedir || path.dirname(caller()); - var parent = opts.filename || basedir; - opts.paths = opts.paths || []; + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var spdxparse = (function(){ +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17]; +var parser = {trace: function trace() { }, +yy: {}, +symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1}, +terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"}, +productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ - // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory - var absoluteStart = path.resolve(basedir); +var $0 = $$.length - 1; +switch (yystate) { +case 1: +return this.$ = $$[$0-1] +break; +case 2: case 4: case 5: +this.$ = {license: yytext} +break; +case 3: +this.$ = {license: $$[$0-1], plus: true} +break; +case 6: +this.$ = $$[$0] +break; +case 7: +this.$ = {exception: $$[$0]} +this.$.license = $$[$0-2].license +if ($$[$0-2].hasOwnProperty('plus')) { + this.$.plus = $$[$0-2].plus +} +break; +case 8: +this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]} +break; +case 9: +this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]} +break; +case 10: +this.$ = $$[$0-1] +break; +} +}, +table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])], +defaultActions: {8:[2,1]}, +parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + function _parseError (msg, hash) { + this.message = msg; + this.hash = hash; + } + _parseError.prototype = Error; - if (opts.preserveSymlinks === false) { - fs.realpath(absoluteStart, function (realPathErr, realStart) { - if (realPathErr && realPathErr.code !== 'ENOENT') cb(err); - else init(realPathErr ? absoluteStart : realStart); - }); + throw new _parseError(str, hash); + } +}, +parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; + lstack.push(yyloc); + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; } else { - init(absoluteStart); + this.parseError = Object.getPrototypeOf(this).parseError; } - - var res; - function init(basedir) { - if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { - res = path.resolve(basedir, x); - if (x === '..' || x.slice(-1) === '/') res += '/'; - if ((/\/$/).test(x) && res === basedir) { - loadAsDirectory(res, opts.package, onfile); - } else loadAsFile(res, opts.package, onfile); - } else loadNodeModules(x, basedir, function (err, n, pkg) { - if (err) cb(err); - else if (n) cb(null, n, pkg); - else if (core[x]) return cb(null, x); - else { - var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - moduleError.code = 'MODULE_NOT_FOUND'; - cb(moduleError); - } - }); + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; } - - function onfile(err, m, pkg) { - if (err) cb(err); - else if (m) cb(null, m, pkg); - else loadAsDirectory(res, function (err, d, pkg) { - if (err) cb(err); - else if (d) cb(null, d, pkg); - else { - var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - moduleError.code = 'MODULE_NOT_FOUND'; - cb(moduleError); + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; } - }); + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == 'undefined') { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } + } + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; + } else { + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); + } + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } } + return true; +}}; +/* generated by jison-lex 0.3.4 */ +var lexer = (function(){ +var lexer = ({ + +EOF:1, + +parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + +// resets the lexer, sets new input +setInput:function (input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0,0]; + } + this.offset = 0; + return this; + }, - function loadAsFile(x, thePackage, callback) { - var loadAsFilePackage = thePackage; - var cb = callback; - if (typeof loadAsFilePackage === 'function') { - cb = loadAsFilePackage; - loadAsFilePackage = undefined; +// consumes and returns one char from the input +input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; } - var exts = [''].concat(extensions); - load(exts, x, loadAsFilePackage); + this._input = this._input.slice(1); + return ch; + }, - function load(exts, x, loadPackage) { - if (exts.length === 0) return cb(null, undefined, loadPackage); - var file = x + exts[0]; +// unshifts one char (or a string) into the input +unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); - var pkg = loadPackage; - if (pkg) onpkg(null, pkg); - else loadpkg(path.dirname(file), onpkg); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); - function onpkg(err, pkg_, dir) { - pkg = pkg_; - if (err) return cb(err); - if (dir && pkg && opts.pathFilter) { - var rfile = path.relative(dir, file); - var rel = rfile.slice(0, rfile.length - exts[0].length); - var r = opts.pathFilter(pkg, x, rel); - if (r) return load( - [''].concat(extensions.slice()), - path.resolve(dir, r), - pkg - ); - } - isFile(file, onex); - } - function onex(err, ex) { - if (err) return cb(err); - if (ex) return cb(null, file, pkg); - load(exts.slice(1), x, pkg); - } + if (lines.length - 1) { + this.yylineno -= lines.length - 1; } - } + var r = this.yylloc.range; - function loadpkg(dir, cb) { - if (dir === '' || dir === '/') return cb(null); - if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { - return cb(null); - } - if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null); + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + + oldLines[oldLines.length - lines.length].length - lines[0].length : + this.yylloc.first_column - len + }; - var pkgfile = path.join(dir, 'package.json'); - isFile(pkgfile, function (err, ex) { - // on err, ex is false - if (!ex) return loadpkg(path.dirname(dir), cb); + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, - readFile(pkgfile, function (err, body) { - if (err) cb(err); - try { var pkg = JSON.parse(body); } catch (jsonErr) {} +// When called from action, caches matched text and appends it on next action +more:function () { + this._more = true; + return this; + }, - if (pkg && opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } - cb(null, pkg, dir); +// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. +reject:function () { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno }); - }); - } - function loadAsDirectory(x, loadAsDirectoryPackage, callback) { - var cb = callback; - var fpkg = loadAsDirectoryPackage; - if (typeof fpkg === 'function') { - cb = fpkg; - fpkg = opts.package; } + return this; + }, - var pkgfile = path.join(x, 'package.json'); - isFile(pkgfile, function (err, ex) { - if (err) return cb(err); - if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb); - - readFile(pkgfile, function (err, body) { - if (err) return cb(err); - try { - var pkg = JSON.parse(body); - } catch (jsonErr) {} - - if (opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } - - if (pkg.main) { - if (typeof pkg.main !== 'string') { - var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); - mainError.code = 'INVALID_PACKAGE_MAIN'; - return cb(mainError); - } - if (pkg.main === '.' || pkg.main === './') { - pkg.main = 'index'; - } - loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) { - if (err) return cb(err); - if (m) return cb(null, m, pkg); - if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb); +// retain first n characters of the match +less:function (n) { + this.unput(this.match.slice(n)); + }, - var dir = path.resolve(x, pkg.main); - loadAsDirectory(dir, pkg, function (err, n, pkg) { - if (err) return cb(err); - if (n) return cb(null, n, pkg); - loadAsFile(path.join(x, 'index'), pkg, cb); - }); - }); - return; - } +// displays already matched input, i.e. for error messages +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, - loadAsFile(path.join(x, '/index'), pkg, cb); - }); - }); - } +// displays upcoming input, i.e. for error messages +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, - function processDirs(cb, dirs) { - if (dirs.length === 0) return cb(null, undefined); - var dir = dirs[0]; +// displays the character position where the lexing error occurred, i.e. for error messages +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, - var file = path.join(dir, x); - loadAsFile(file, opts.package, onfile); +// test the lexed token: return FALSE when not a match, otherwise return token +test_match:function (match, indexed_rule) { + var token, + lines, + backup; - function onfile(err, m, pkg) { - if (err) return cb(err); - if (m) return cb(null, m, pkg); - loadAsDirectory(path.join(dir, x), opts.package, ondir); + if (this.options.backtrack_lexer) { + // save context + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } } - function ondir(err, n, pkg) { - if (err) return cb(err); - if (n) return cb(null, n, pkg); - processDirs(cb, dirs.slice(1)); + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; } - } - function loadNodeModules(x, start, cb) { - processDirs(cb, nodeModulesPaths(start, opts, x)); - } -}; + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? + lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : + this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + // recover context + for (var k in backup) { + this[k] = backup[k]; + } + return false; // rule action called reject() implying the next rule should be tested instead. + } + return false; + }, +// return next match in input +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } -/***/ }), -/* 536 */ -/***/ (function(module, exports) { + var token, + match, + tempMatch, + index; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; // rule action called reject() implying a rule MISmatch. + } else { + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, -module.exports = function () { - // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi - var origPrepareStackTrace = Error.prepareStackTrace; - Error.prepareStackTrace = function (_, stack) { return stack; }; - var stack = (new Error()).stack; - Error.prepareStackTrace = origPrepareStackTrace; - return stack[2].getFileName(); -}; +// return next match that has a token +lex:function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, +// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) +begin:function begin(condition) { + this.conditionStack.push(condition); + }, -/***/ }), -/* 537 */ -/***/ (function(module, exports, __webpack_require__) { +// pop the previously active lexer condition state off the condition stack +popState:function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, -var path = __webpack_require__(16); -var parse = path.parse || __webpack_require__(538); +// produce the lexer rule set which is active for the currently active lexer condition state +_currentRules:function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, -var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { - var prefix = '/'; - if ((/^([A-Za-z]:)/).test(absoluteStart)) { - prefix = ''; - } else if ((/^\\\\/).test(absoluteStart)) { - prefix = '\\\\'; - } +// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available +topState:function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, - var paths = [absoluteStart]; - var parsed = parse(absoluteStart); - while (parsed.dir !== paths[paths.length - 1]) { - paths.push(parsed.dir); - parsed = parse(parsed.dir); - } +// alias for begin(condition) +pushState:function pushState(condition) { + this.begin(condition); + }, - return paths.reduce(function (dirs, aPath) { - return dirs.concat(modules.map(function (moduleDir) { - return path.join(prefix, aPath, moduleDir); - })); - }, []); -}; +// return the number of states currently on the stack +stateStackSize:function stateStackSize() { + return this.conditionStack.length; + }, +options: {}, +performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { +var YYSTATE=YY_START; +switch($avoiding_name_collisions) { +case 0:return 5 +break; +case 1:/* skip whitespace */ +break; +case 2:return 8 +break; +case 3:return 16 +break; +case 4:return 17 +break; +case 5:return 11 +break; +case 6:return 10 +break; +case 7:return 9 +break; +case 8:return 14 +break; +case 9:return 15 +break; +case 10:return 12 +break; +case 11:return 7 +break; +case 12:return 7 +break; +case 13:return 7 +break; +case 14:return 7 +break; +case 15:return 7 +break; +case 16:return 7 +break; +case 17:return 7 +break; +case 18:return 7 +break; +case 19:return 7 +break; +case 20:return 7 +break; +case 21:return 7 +break; +case 22:return 7 +break; +case 23:return 7 +break; +case 24:return 13 +break; +case 25:return 13 +break; +case 26:return 13 +break; +case 27:return 13 +break; +case 28:return 13 +break; +case 29:return 13 +break; +case 30:return 13 +break; +case 31:return 13 +break; +case 32:return 7 +break; +case 33:return 13 +break; +case 34:return 7 +break; +case 35:return 13 +break; +case 36:return 7 +break; +case 37:return 13 +break; +case 38:return 13 +break; +case 39:return 7 +break; +case 40:return 13 +break; +case 41:return 13 +break; +case 42:return 13 +break; +case 43:return 13 +break; +case 44:return 13 +break; +case 45:return 7 +break; +case 46:return 13 +break; +case 47:return 7 +break; +case 48:return 7 +break; +case 49:return 7 +break; +case 50:return 7 +break; +case 51:return 7 +break; +case 52:return 7 +break; +case 53:return 7 +break; +case 54:return 7 +break; +case 55:return 7 +break; +case 56:return 7 +break; +case 57:return 7 +break; +case 58:return 7 +break; +case 59:return 7 +break; +case 60:return 7 +break; +case 61:return 7 +break; +case 62:return 7 +break; +case 63:return 13 +break; +case 64:return 7 +break; +case 65:return 7 +break; +case 66:return 13 +break; +case 67:return 7 +break; +case 68:return 7 +break; +case 69:return 7 +break; +case 70:return 7 +break; +case 71:return 7 +break; +case 72:return 7 +break; +case 73:return 13 +break; +case 74:return 7 +break; +case 75:return 13 +break; +case 76:return 7 +break; +case 77:return 7 +break; +case 78:return 7 +break; +case 79:return 7 +break; +case 80:return 7 +break; +case 81:return 7 +break; +case 82:return 7 +break; +case 83:return 7 +break; +case 84:return 7 +break; +case 85:return 7 +break; +case 86:return 7 +break; +case 87:return 7 +break; +case 88:return 7 +break; +case 89:return 7 +break; +case 90:return 7 +break; +case 91:return 7 +break; +case 92:return 7 +break; +case 93:return 7 +break; +case 94:return 7 +break; +case 95:return 7 +break; +case 96:return 7 +break; +case 97:return 7 +break; +case 98:return 7 +break; +case 99:return 7 +break; +case 100:return 7 +break; +case 101:return 7 +break; +case 102:return 7 +break; +case 103:return 7 +break; +case 104:return 7 +break; +case 105:return 7 +break; +case 106:return 7 +break; +case 107:return 7 +break; +case 108:return 7 +break; +case 109:return 7 +break; +case 110:return 7 +break; +case 111:return 7 +break; +case 112:return 7 +break; +case 113:return 7 +break; +case 114:return 7 +break; +case 115:return 7 +break; +case 116:return 7 +break; +case 117:return 7 +break; +case 118:return 7 +break; +case 119:return 7 +break; +case 120:return 7 +break; +case 121:return 7 +break; +case 122:return 7 +break; +case 123:return 7 +break; +case 124:return 7 +break; +case 125:return 7 +break; +case 126:return 7 +break; +case 127:return 7 +break; +case 128:return 7 +break; +case 129:return 7 +break; +case 130:return 7 +break; +case 131:return 7 +break; +case 132:return 7 +break; +case 133:return 7 +break; +case 134:return 7 +break; +case 135:return 7 +break; +case 136:return 7 +break; +case 137:return 7 +break; +case 138:return 7 +break; +case 139:return 7 +break; +case 140:return 7 +break; +case 141:return 7 +break; +case 142:return 7 +break; +case 143:return 7 +break; +case 144:return 7 +break; +case 145:return 7 +break; +case 146:return 7 +break; +case 147:return 7 +break; +case 148:return 7 +break; +case 149:return 7 +break; +case 150:return 7 +break; +case 151:return 7 +break; +case 152:return 7 +break; +case 153:return 7 +break; +case 154:return 7 +break; +case 155:return 7 +break; +case 156:return 7 +break; +case 157:return 7 +break; +case 158:return 7 +break; +case 159:return 7 +break; +case 160:return 7 +break; +case 161:return 7 +break; +case 162:return 7 +break; +case 163:return 7 +break; +case 164:return 7 +break; +case 165:return 7 +break; +case 166:return 7 +break; +case 167:return 7 +break; +case 168:return 7 +break; +case 169:return 7 +break; +case 170:return 7 +break; +case 171:return 7 +break; +case 172:return 7 +break; +case 173:return 7 +break; +case 174:return 7 +break; +case 175:return 7 +break; +case 176:return 7 +break; +case 177:return 7 +break; +case 178:return 7 +break; +case 179:return 7 +break; +case 180:return 7 +break; +case 181:return 7 +break; +case 182:return 7 +break; +case 183:return 7 +break; +case 184:return 7 +break; +case 185:return 7 +break; +case 186:return 7 +break; +case 187:return 7 +break; +case 188:return 7 +break; +case 189:return 7 +break; +case 190:return 7 +break; +case 191:return 7 +break; +case 192:return 7 +break; +case 193:return 7 +break; +case 194:return 7 +break; +case 195:return 7 +break; +case 196:return 7 +break; +case 197:return 7 +break; +case 198:return 7 +break; +case 199:return 7 +break; +case 200:return 7 +break; +case 201:return 7 +break; +case 202:return 7 +break; +case 203:return 7 +break; +case 204:return 7 +break; +case 205:return 7 +break; +case 206:return 7 +break; +case 207:return 7 +break; +case 208:return 7 +break; +case 209:return 7 +break; +case 210:return 7 +break; +case 211:return 7 +break; +case 212:return 7 +break; +case 213:return 7 +break; +case 214:return 7 +break; +case 215:return 7 +break; +case 216:return 7 +break; +case 217:return 7 +break; +case 218:return 7 +break; +case 219:return 7 +break; +case 220:return 7 +break; +case 221:return 7 +break; +case 222:return 7 +break; +case 223:return 7 +break; +case 224:return 7 +break; +case 225:return 7 +break; +case 226:return 7 +break; +case 227:return 7 +break; +case 228:return 7 +break; +case 229:return 7 +break; +case 230:return 7 +break; +case 231:return 7 +break; +case 232:return 7 +break; +case 233:return 7 +break; +case 234:return 7 +break; +case 235:return 7 +break; +case 236:return 7 +break; +case 237:return 7 +break; +case 238:return 7 +break; +case 239:return 7 +break; +case 240:return 7 +break; +case 241:return 7 +break; +case 242:return 7 +break; +case 243:return 7 +break; +case 244:return 7 +break; +case 245:return 7 +break; +case 246:return 7 +break; +case 247:return 7 +break; +case 248:return 7 +break; +case 249:return 7 +break; +case 250:return 7 +break; +case 251:return 7 +break; +case 252:return 7 +break; +case 253:return 7 +break; +case 254:return 7 +break; +case 255:return 7 +break; +case 256:return 7 +break; +case 257:return 7 +break; +case 258:return 7 +break; +case 259:return 7 +break; +case 260:return 7 +break; +case 261:return 7 +break; +case 262:return 7 +break; +case 263:return 7 +break; +case 264:return 7 +break; +case 265:return 7 +break; +case 266:return 7 +break; +case 267:return 7 +break; +case 268:return 7 +break; +case 269:return 7 +break; +case 270:return 7 +break; +case 271:return 7 +break; +case 272:return 7 +break; +case 273:return 7 +break; +case 274:return 7 +break; +case 275:return 7 +break; +case 276:return 7 +break; +case 277:return 7 +break; +case 278:return 7 +break; +case 279:return 7 +break; +case 280:return 7 +break; +case 281:return 7 +break; +case 282:return 7 +break; +case 283:return 7 +break; +case 284:return 7 +break; +case 285:return 7 +break; +case 286:return 7 +break; +case 287:return 7 +break; +case 288:return 7 +break; +case 289:return 7 +break; +case 290:return 7 +break; +case 291:return 7 +break; +case 292:return 7 +break; +case 293:return 7 +break; +case 294:return 7 +break; +case 295:return 7 +break; +case 296:return 7 +break; +case 297:return 7 +break; +case 298:return 7 +break; +case 299:return 7 +break; +case 300:return 7 +break; +case 301:return 7 +break; +case 302:return 7 +break; +case 303:return 7 +break; +case 304:return 7 +break; +case 305:return 7 +break; +case 306:return 7 +break; +case 307:return 7 +break; +case 308:return 7 +break; +case 309:return 7 +break; +case 310:return 7 +break; +case 311:return 7 +break; +case 312:return 7 +break; +case 313:return 7 +break; +case 314:return 7 +break; +case 315:return 7 +break; +case 316:return 7 +break; +case 317:return 7 +break; +case 318:return 7 +break; +case 319:return 7 +break; +case 320:return 7 +break; +case 321:return 7 +break; +case 322:return 7 +break; +case 323:return 7 +break; +case 324:return 7 +break; +case 325:return 7 +break; +case 326:return 7 +break; +case 327:return 7 +break; +case 328:return 7 +break; +case 329:return 7 +break; +case 330:return 7 +break; +case 331:return 7 +break; +case 332:return 7 +break; +case 333:return 7 +break; +case 334:return 7 +break; +case 335:return 7 +break; +case 336:return 7 +break; +case 337:return 7 +break; +case 338:return 7 +break; +case 339:return 7 +break; +case 340:return 7 +break; +case 341:return 7 +break; +case 342:return 7 +break; +case 343:return 7 +break; +case 344:return 7 +break; +case 345:return 7 +break; +case 346:return 7 +break; +case 347:return 7 +break; +case 348:return 7 +break; +case 349:return 7 +break; +case 350:return 7 +break; +case 351:return 7 +break; +case 352:return 7 +break; +case 353:return 7 +break; +case 354:return 7 +break; +case 355:return 7 +break; +case 356:return 7 +break; +case 357:return 7 +break; +case 358:return 7 +break; +case 359:return 7 +break; +case 360:return 7 +break; +case 361:return 7 +break; +case 362:return 7 +break; +case 363:return 7 +break; +case 364:return 7 +break; +} +}, +rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/], +conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}} +}); +return lexer; +})(); +parser.lexer = lexer; +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})(); -module.exports = function nodeModulesPaths(start, opts, request) { - var modules = opts && opts.moduleDirectory - ? [].concat(opts.moduleDirectory) - : ['node_modules']; - if (opts && typeof opts.paths === 'function') { - return opts.paths( - request, - start, - function () { return getNodeModulesDirs(start, modules); }, - opts - ); +if (true) { +exports.parser = spdxparse; +exports.Parser = spdxparse.Parser; +exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); }; +exports.main = function commonjsMain(args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); } - - var dirs = getNodeModulesDirs(start, modules); - return opts && opts.paths ? dirs.concat(opts.paths) : dirs; + var source = __webpack_require__(349).readFileSync(__webpack_require__(4).normalize(args[1]), "utf8"); + return exports.parser.parse(source); }; - - -/***/ }), -/* 538 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var isWindows = process.platform === 'win32'; - -// Regex to split a windows path into three parts: [*, device, slash, -// tail] windows-only -var splitDeviceRe = - /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - -// Regex to split the tail part of the above into [*, dir, basename, ext] -var splitTailRe = - /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; - -var win32 = {}; - -// Function to split a filename into [root, dir, basename, ext] -function win32SplitPath(filename) { - // Separate device+slash from tail - var result = splitDeviceRe.exec(filename), - device = (result[1] || '') + (result[2] || ''), - tail = result[3] || ''; - // Split the tail into dir, basename and extension - var result2 = splitTailRe.exec(tail), - dir = result2[1], - basename = result2[2], - ext = result2[3]; - return [device, dir, basename, ext]; +if ( true && __webpack_require__.c[__webpack_require__.s] === module) { + exports.main(process.argv.slice(1)); } - -win32.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); - } - var allParts = win32SplitPath(pathString); - if (!allParts || allParts.length !== 4) { - throw new TypeError("Invalid path '" + pathString + "'"); - } - return { - root: allParts[0], - dir: allParts[0] + allParts[1].slice(0, -1), - base: allParts[2], - ext: allParts[3], - name: allParts[2].slice(0, allParts[2].length - allParts[3].length) - }; -}; - - - -// Split a filename into [root, dir, basename, ext], unix version -// 'root' is just a slash, or nothing. -var splitPathRe = - /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; -var posix = {}; - - -function posixSplitPath(filename) { - return splitPathRe.exec(filename).slice(1); } - -posix.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); - } - var allParts = posixSplitPath(pathString); - if (!allParts || allParts.length !== 4) { - throw new TypeError("Invalid path '" + pathString + "'"); - } - allParts[1] = allParts[1] || ''; - allParts[2] = allParts[2] || ''; - allParts[3] = allParts[3] || ''; - - return { - root: allParts[0], - dir: allParts[0] + allParts[1].slice(0, -1), - base: allParts[2], - ext: allParts[3], - name: allParts[2].slice(0, allParts[2].length - allParts[3].length) - }; -}; - - -if (isWindows) - module.exports = win32.parse; -else /* posix */ - module.exports = posix.parse; - -module.exports.posix = posix.parse; -module.exports.win32 = win32.parse; - - -/***/ }), -/* 539 */ -/***/ (function(module, exports) { - -module.exports = function (x, opts) { - /** - * This file is purposefully a passthrough. It's expected that third-party - * environments will override it at runtime in order to inject special logic - * into `resolve` (by manipulating the options). One such example is the PnP - * code path in Yarn. - */ - - return opts || {}; -}; - +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) /***/ }), -/* 540 */ +/* 527 */ /***/ (function(module, exports, __webpack_require__) { -var core = __webpack_require__(533); -var fs = __webpack_require__(23); -var path = __webpack_require__(16); -var caller = __webpack_require__(536); -var nodeModulesPaths = __webpack_require__(537); -var normalizeOptions = __webpack_require__(539); - -var defaultIsFile = function isFile(file) { - try { - var stat = fs.statSync(file); - } catch (e) { - if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; - throw e; - } - return stat.isFile() || stat.isFIFO(); -}; - -module.exports = function (x, options) { - if (typeof x !== 'string') { - throw new TypeError('Path must be a string.'); - } - var opts = normalizeOptions(x, options); - - var isFile = opts.isFile || defaultIsFile; - var readFileSync = opts.readFileSync || fs.readFileSync; - - var extensions = opts.extensions || ['.js']; - var basedir = opts.basedir || path.dirname(caller()); - var parent = opts.filename || basedir; - - opts.paths = opts.paths || []; +var licenseIDs = __webpack_require__(528); - // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory - var absoluteStart = path.resolve(basedir); +function valid(string) { + return licenseIDs.indexOf(string) > -1; +} - if (opts.preserveSymlinks === false) { - try { - absoluteStart = fs.realpathSync(absoluteStart); - } catch (realPathErr) { - if (realPathErr.code !== 'ENOENT') { - throw realPathErr; - } - } - } +// Common transpositions of license identifier acronyms +var transpositions = [ + ['APGL', 'AGPL'], + ['Gpl', 'GPL'], + ['GLP', 'GPL'], + ['APL', 'Apache'], + ['ISD', 'ISC'], + ['GLP', 'GPL'], + ['IST', 'ISC'], + ['Claude', 'Clause'], + [' or later', '+'], + [' International', ''], + ['GNU', 'GPL'], + ['GUN', 'GPL'], + ['+', ''], + ['GNU GPL', 'GPL'], + ['GNU/GPL', 'GPL'], + ['GNU GLP', 'GPL'], + ['GNU General Public License', 'GPL'], + ['Gnu public license', 'GPL'], + ['GNU Public License', 'GPL'], + ['GNU GENERAL PUBLIC LICENSE', 'GPL'], + ['MTI', 'MIT'], + ['Mozilla Public License', 'MPL'], + ['WTH', 'WTF'], + ['-License', ''] +]; - if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { - var res = path.resolve(absoluteStart, x); - if (x === '..' || x.slice(-1) === '/') res += '/'; - var m = loadAsFileSync(res) || loadAsDirectorySync(res); - if (m) return m; - } else { - var n = loadNodeModulesSync(x, absoluteStart); - if (n) return n; - } +var TRANSPOSED = 0; +var CORRECT = 1; - if (core[x]) return x; +// Simple corrections to nearly valid identifiers. +var transforms = [ + // e.g. 'mit' + function(argument) { + return argument.toUpperCase(); + }, + // e.g. 'MIT ' + function(argument) { + return argument.trim(); + }, + // e.g. 'M.I.T.' + function(argument) { + return argument.replace(/\./g, ''); + }, + // e.g. 'Apache- 2.0' + function(argument) { + return argument.replace(/\s+/g, ''); + }, + // e.g. 'CC BY 4.0'' + function(argument) { + return argument.replace(/\s+/g, '-'); + }, + // e.g. 'LGPLv2.1' + function(argument) { + return argument.replace('v', '-'); + }, + // e.g. 'Apache 2.0' + function(argument) { + return argument.replace(/,?\s*(\d)/, '-$1'); + }, + // e.g. 'GPL 2' + function(argument) { + return argument.replace(/,?\s*(\d)/, '-$1.0'); + }, + // e.g. 'Apache Version 2.0' + function(argument) { + return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2'); + }, + // e.g. 'Apache Version 2' + function(argument) { + return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0'); + }, + // e.g. 'ZLIB' + function(argument) { + return argument[0].toUpperCase() + argument.slice(1); + }, + // e.g. 'MPL/2.0' + function(argument) { + return argument.replace('/', '-'); + }, + // e.g. 'Apache 2' + function(argument) { + return argument + .replace(/\s*V\s*(\d)/, '-$1') + .replace(/(\d)$/, '$1.0'); + }, + // e.g. 'GPL-2.0-' + function(argument) { + return argument.slice(0, argument.length - 1); + }, + // e.g. 'GPL2' + function(argument) { + return argument.replace(/(\d)$/, '-$1.0'); + }, + // e.g. 'BSD 3' + function(argument) { + return argument.replace(/(-| )?(\d)$/, '-$2-Clause'); + }, + // e.g. 'BSD clause 3' + function(argument) { + return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause'); + }, + // e.g. 'BY-NC-4.0' + function(argument) { + return 'CC-' + argument; + }, + // e.g. 'BY-NC' + function(argument) { + return 'CC-' + argument + '-4.0'; + }, + // e.g. 'Attribution-NonCommercial' + function(argument) { + return argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, ''); + }, + // e.g. 'Attribution-NonCommercial' + function(argument) { + return 'CC-' + + argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, '') + + '-4.0'; + } +]; - var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - err.code = 'MODULE_NOT_FOUND'; - throw err; +// If all else fails, guess that strings containing certain substrings +// meant to identify certain licenses. +var lastResorts = [ + ['UNLI', 'Unlicense'], + ['WTF', 'WTFPL'], + ['2 CLAUSE', 'BSD-2-Clause'], + ['2-CLAUSE', 'BSD-2-Clause'], + ['3 CLAUSE', 'BSD-3-Clause'], + ['3-CLAUSE', 'BSD-3-Clause'], + ['AFFERO', 'AGPL-3.0'], + ['AGPL', 'AGPL-3.0'], + ['APACHE', 'Apache-2.0'], + ['ARTISTIC', 'Artistic-2.0'], + ['Affero', 'AGPL-3.0'], + ['BEER', 'Beerware'], + ['BOOST', 'BSL-1.0'], + ['BSD', 'BSD-2-Clause'], + ['ECLIPSE', 'EPL-1.0'], + ['FUCK', 'WTFPL'], + ['GNU', 'GPL-3.0'], + ['LGPL', 'LGPL-3.0'], + ['GPL', 'GPL-3.0'], + ['MIT', 'MIT'], + ['MPL', 'MPL-2.0'], + ['X11', 'X11'], + ['ZLIB', 'Zlib'] +]; - function loadAsFileSync(x) { - var pkg = loadpkg(path.dirname(x)); +var SUBSTRING = 0; +var IDENTIFIER = 1; - if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { - var rfile = path.relative(pkg.dir, x); - var r = opts.pathFilter(pkg.pkg, x, rfile); - if (r) { - x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign - } - } +var validTransformation = function(identifier) { + for (var i = 0; i < transforms.length; i++) { + var transformed = transforms[i](identifier); + if (transformed !== identifier && valid(transformed)) { + return transformed; + } + } + return null; +}; - if (isFile(x)) { - return x; - } +var validLastResort = function(identifier) { + var upperCased = identifier.toUpperCase(); + for (var i = 0; i < lastResorts.length; i++) { + var lastResort = lastResorts[i]; + if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { + return lastResort[IDENTIFIER]; + } + } + return null; +}; - for (var i = 0; i < extensions.length; i++) { - var file = x + extensions[i]; - if (isFile(file)) { - return file; - } - } +var anyCorrection = function(identifier, check) { + for (var i = 0; i < transpositions.length; i++) { + var transposition = transpositions[i]; + var transposed = transposition[TRANSPOSED]; + if (identifier.indexOf(transposed) > -1) { + var corrected = identifier.replace( + transposed, + transposition[CORRECT] + ); + var checked = check(corrected); + if (checked !== null) { + return checked; + } } + } + return null; +}; - function loadpkg(dir) { - if (dir === '' || dir === '/') return; - if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { - return; - } - if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; +module.exports = function(identifier) { + identifier = identifier.replace(/\+$/, ''); + if (valid(identifier)) { + return identifier; + } + var transformed = validTransformation(identifier); + if (transformed !== null) { + return transformed; + } + transformed = anyCorrection(identifier, function(argument) { + if (valid(argument)) { + return argument; + } + return validTransformation(argument); + }); + if (transformed !== null) { + return transformed; + } + transformed = validLastResort(identifier); + if (transformed !== null) { + return transformed; + } + transformed = anyCorrection(identifier, validLastResort); + if (transformed !== null) { + return transformed; + } + return null; +}; - var pkgfile = path.join(dir, 'package.json'); - if (!isFile(pkgfile)) { - return loadpkg(path.dirname(dir)); - } +/***/ }), +/* 528 */ +/***/ (function(module) { - var body = readFileSync(pkgfile); +module.exports = JSON.parse("[\"Glide\",\"Abstyles\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"AMPAS\",\"APL-1.0\",\"Adobe-Glyph\",\"APAFML\",\"Adobe-2006\",\"AGPL-1.0\",\"Afmparse\",\"Aladdin\",\"ADSL\",\"AMDPLPA\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"AML\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0\",\"Artistic-1.0-Perl\",\"Artistic-1.0-cl8\",\"Artistic-2.0\",\"AAL\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"BSL-1.0\",\"Borceux\",\"BSD-2-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-3-Clause\",\"BSD-3-Clause-Clear\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSD-3-Clause-Attribution\",\"0BSD\",\"BSD-4-Clause-UC\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"MIT-CMU\",\"CNRI-Jython\",\"CNRI-Python\",\"CNRI-Python-GPL-Compatible\",\"CPOL-1.02\",\"CDDL-1.0\",\"CDDL-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CATOSL-1.1\",\"Condor-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"WTFPL\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"EPL-1.0\",\"ECL-1.0\",\"ECL-2.0\",\"eGenix\",\"EFL-1.0\",\"EFL-2.0\",\"MIT-advertising\",\"MIT-enna\",\"Entessa\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"Eurosym\",\"Fair\",\"MIT-feh\",\"Frameworx-1.0\",\"FreeImage\",\"FTL\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"Giftware\",\"GL2PS\",\"Glulxe\",\"AGPL-3.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0\",\"GPL-3.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"LGPL-2.0\",\"gnuplot\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"IPL-1.0\",\"ICU\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"IJG\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"Latex2e\",\"BSD-3-Clause-LBNL\",\"Leptonica\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LAL-1.2\",\"LAL-1.3\",\"LiLiQ-P-1.1\",\"LiLiQ-Rplus-1.1\",\"LiLiQ-R-1.1\",\"LPL-1.02\",\"LPL-1.0\",\"MakeIndex\",\"MTLL\",\"MS-PL\",\"MS-RL\",\"MirOS\",\"MITNFA\",\"MIT\",\"Motosoto\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0\",\"MPL-2.0-no-copyleft-exception\",\"mpich2\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NetCDF\",\"NGPL\",\"NOSL\",\"NPL-1.0\",\"NPL-1.1\",\"Newsletr\",\"NLPL\",\"Nokia\",\"NPOSL-3.0\",\"NLOD-1.0\",\"Noweb\",\"NRL\",\"NTP\",\"Nunit\",\"OCLC-2.0\",\"ODbL-1.0\",\"PDDL-1.0\",\"OCCT-PL\",\"OGTSL\",\"OLDAP-2.2.2\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0\",\"OLDAP-2.0.1\",\"OLDAP-2.1\",\"OLDAP-2.2\",\"OLDAP-2.2.1\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OPL-1.0\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"OpenSSL\",\"OSET-PL-2.1\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"QPL-1.0\",\"Qhull\",\"Rdisc\",\"RPSL-1.0\",\"RPL-1.1\",\"RPL-1.5\",\"RHeCos-1.1\",\"RSCPL\",\"RSA-MD\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"SWL\",\"SMPPL\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"OFL-1.0\",\"OFL-1.1\",\"SimPL-2.0\",\"Sleepycat\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SMLNJ\",\"SugarCRM-1.1.3\",\"SISSL\",\"SISSL-1.2\",\"SPL-1.0\",\"Watcom-1.0\",\"TCL\",\"Unlicense\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-TOU\",\"UPL-1.0\",\"NCSA\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C\",\"Wsuipa\",\"Xnet\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"Zlib\",\"zlib-acknowledgement\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"eCos-2.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"StandardML-NJ\",\"WXwindows\"]"); - try { - var pkg = JSON.parse(body); - } catch (jsonErr) {} +/***/ }), +/* 529 */ +/***/ (function(module, exports, __webpack_require__) { - if (pkg && opts.packageFilter) { - pkg = opts.packageFilter(pkg, dir); - } +"use strict"; - return { pkg: pkg, dir: dir }; - } +var url = __webpack_require__(439) +var gitHosts = __webpack_require__(530) +var GitHost = module.exports = __webpack_require__(531) - function loadAsDirectorySync(x) { - var pkgfile = path.join(x, '/package.json'); - if (isFile(pkgfile)) { - try { - var body = readFileSync(pkgfile, 'UTF8'); - var pkg = JSON.parse(body); - } catch (e) {} +var protocolToRepresentationMap = { + 'git+ssh': 'sshurl', + 'git+https': 'https', + 'ssh': 'sshurl', + 'git': 'git' +} - if (opts.packageFilter) { - pkg = opts.packageFilter(pkg, x); - } +function protocolToRepresentation (protocol) { + if (protocol.substr(-1) === ':') protocol = protocol.slice(0, -1) + return protocolToRepresentationMap[protocol] || protocol +} - if (pkg.main) { - if (typeof pkg.main !== 'string') { - var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); - mainError.code = 'INVALID_PACKAGE_MAIN'; - throw mainError; - } - if (pkg.main === '.' || pkg.main === './') { - pkg.main = 'index'; - } - try { - var m = loadAsFileSync(path.resolve(x, pkg.main)); - if (m) return m; - var n = loadAsDirectorySync(path.resolve(x, pkg.main)); - if (n) return n; - } catch (e) {} - } - } +var authProtocols = { + 'git:': true, + 'https:': true, + 'git+https:': true, + 'http:': true, + 'git+http:': true +} - return loadAsFileSync(path.join(x, '/index')); - } +var cache = {} - function loadNodeModulesSync(x, start) { - var dirs = nodeModulesPaths(start, opts, x); - for (var i = 0; i < dirs.length; i++) { - var dir = dirs[i]; - var m = loadAsFileSync(path.join(dir, '/', x)); - if (m) return m; - var n = loadAsDirectorySync(path.join(dir, '/', x)); - if (n) return n; - } - } -}; +module.exports.fromUrl = function (giturl, opts) { + var key = giturl + JSON.stringify(opts || {}) + if (!(key in cache)) { + cache[key] = fromUrl(giturl, opts) + } -/***/ }), -/* 541 */ -/***/ (function(module, exports) { + return cache[key] +} -module.exports = extractDescription +function fromUrl (giturl, opts) { + if (giturl == null || giturl === '') return + var url = fixupUnqualifiedGist( + isGitHubShorthand(giturl) ? 'github:' + giturl : giturl + ) + var parsed = parseGitUrl(url) + var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)')) + var matches = Object.keys(gitHosts).map(function (gitHostName) { + try { + var gitHostInfo = gitHosts[gitHostName] + var auth = null + if (parsed.auth && authProtocols[parsed.protocol]) { + auth = decodeURIComponent(parsed.auth) + } + var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null + var user = null + var project = null + var defaultRepresentation = null + if (shortcutMatch && shortcutMatch[1] === gitHostName) { + user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2]) + project = decodeURIComponent(shortcutMatch[3]) + defaultRepresentation = 'shortcut' + } else { + if (parsed.host !== gitHostInfo.domain) return + if (!gitHostInfo.protocols_re.test(parsed.protocol)) return + if (!parsed.path) return + var pathmatch = gitHostInfo.pathmatch + var matched = parsed.path.match(pathmatch) + if (!matched) return + if (matched[1] != null) user = decodeURIComponent(matched[1].replace(/^:/, '')) + if (matched[2] != null) project = decodeURIComponent(matched[2]) + defaultRepresentation = protocolToRepresentation(parsed.protocol) + } + return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts) + } catch (ex) { + if (!(ex instanceof URIError)) throw ex + } + }).filter(function (gitHostInfo) { return gitHostInfo }) + if (matches.length !== 1) return + return matches[0] +} -// Extracts description from contents of a readme file in markdown format -function extractDescription (d) { - if (!d) return; - if (d === "ERROR: No README data found!") return; - // the first block of text before the first heading - // that isn't the first line heading - d = d.trim().split('\n') - for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++); - var l = d.length - for (var e = s + 1; e < l && d[e].trim(); e ++); - return d.slice(s, e).join(' ').trim() +function isGitHubShorthand (arg) { + // Note: This does not fully test the git ref format. + // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html + // + // The only way to do this properly would be to shell out to + // git-check-ref-format, and as this is a fast sync function, + // we don't want to do that. Just let git fail if it turns + // out that the commit-ish is invalid. + // GH usernames cannot start with . or - + return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg) } +function fixupUnqualifiedGist (giturl) { + // necessary for round-tripping gists + var parsed = url.parse(giturl) + if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) { + return parsed.protocol + '/' + parsed.host + } else { + return giturl + } +} -/***/ }), -/* 542 */ -/***/ (function(module) { +function parseGitUrl (giturl) { + if (typeof giturl !== 'string') giturl = '' + giturl + var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/) + if (!matched) return url.parse(giturl) + return { + protocol: 'git+ssh:', + slashes: true, + auth: matched[1], + host: matched[2], + port: null, + hostname: matched[2], + hash: matched[4], + search: null, + query: null, + pathname: '/' + matched[3], + path: '/' + matched[3], + href: 'git+ssh://' + matched[1] + '@' + matched[2] + + '/' + matched[3] + (matched[4] || '') + } +} -module.exports = JSON.parse("{\"topLevel\":{\"dependancies\":\"dependencies\",\"dependecies\":\"dependencies\",\"depdenencies\":\"dependencies\",\"devEependencies\":\"devDependencies\",\"depends\":\"dependencies\",\"dev-dependencies\":\"devDependencies\",\"devDependences\":\"devDependencies\",\"devDepenencies\":\"devDependencies\",\"devdependencies\":\"devDependencies\",\"repostitory\":\"repository\",\"repo\":\"repository\",\"prefereGlobal\":\"preferGlobal\",\"hompage\":\"homepage\",\"hampage\":\"homepage\",\"autohr\":\"author\",\"autor\":\"author\",\"contributers\":\"contributors\",\"publicationConfig\":\"publishConfig\",\"script\":\"scripts\"},\"bugs\":{\"web\":\"url\",\"name\":\"url\"},\"script\":{\"server\":\"start\",\"tests\":\"test\"}}"); /***/ }), -/* 543 */ +/* 530 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(29) -var messages = __webpack_require__(544) +"use strict"; -module.exports = function() { - var args = Array.prototype.slice.call(arguments, 0) - var warningName = args.shift() - if (warningName == "typo") { - return makeTypoWarning.apply(null,args) - } - else { - var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'" - args.unshift(msgTemplate) - return util.format.apply(null, args) - } -} -function makeTypoWarning (providedName, probableName, field) { - if (field) { - providedName = field + "['" + providedName + "']" - probableName = field + "['" + probableName + "']" +var gitHosts = module.exports = { + github: { + // First two are insecure and generally shouldn't be used any more, but + // they are still supported. + 'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'github.com', + 'treepath': 'tree', + 'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}', + 'bugstemplate': 'https://{domain}/{user}/{project}/issues', + 'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}', + 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' + }, + bitbucket: { + 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'bitbucket.org', + 'treepath': 'src', + 'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz' + }, + gitlab: { + 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'gitlab.com', + 'treepath': 'tree', + 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#README', + 'bugstemplate': 'https://{domain}/{user}/{project}/issues', + 'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}' + }, + gist: { + 'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'gist.github.com', + 'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]+)(?:[.]git)?$/, + 'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}', + 'bugstemplate': 'https://{domain}/{project}', + 'gittemplate': 'git://{domain}/{project}.git{#committish}', + 'sshtemplate': 'git@{domain}:/{project}.git{#committish}', + 'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}', + 'browsetemplate': 'https://{domain}/{project}{/committish}', + 'docstemplate': 'https://{domain}/{project}{/committish}', + 'httpstemplate': 'git+https://{domain}/{project}.git{#committish}', + 'shortcuttemplate': '{type}:{project}{#committish}', + 'pathtemplate': '{project}{#committish}', + 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' } - return util.format(messages.typo, providedName, probableName) } +var gitHostDefaults = { + 'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}', + 'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}', + 'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}', + 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme', + 'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}', + 'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}', + 'shortcuttemplate': '{type}:{user}/{project}{#committish}', + 'pathtemplate': '{user}/{project}{#committish}', + 'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/ +} -/***/ }), -/* 544 */ -/***/ (function(module) { +Object.keys(gitHosts).forEach(function (name) { + Object.keys(gitHostDefaults).forEach(function (key) { + if (gitHosts[name][key]) return + gitHosts[name][key] = gitHostDefaults[key] + }) + gitHosts[name].protocols_re = RegExp('^(' + + gitHosts[name].protocols.map(function (protocol) { + return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1') + }).join('|') + '):$') +}) -module.exports = JSON.parse("{\"repositories\":\"'repositories' (plural) Not supported. Please pick one as the 'repository' field\",\"missingRepository\":\"No repository field.\",\"brokenGitUrl\":\"Probably broken git url: %s\",\"nonObjectScripts\":\"scripts must be an object\",\"nonStringScript\":\"script values must be string commands\",\"nonArrayFiles\":\"Invalid 'files' member\",\"invalidFilename\":\"Invalid filename in 'files' list: %s\",\"nonArrayBundleDependencies\":\"Invalid 'bundleDependencies' list. Must be array of package names\",\"nonStringBundleDependency\":\"Invalid bundleDependencies member: %s\",\"nonDependencyBundleDependency\":\"Non-dependency in bundleDependencies: %s\",\"nonObjectDependencies\":\"%s field must be an object\",\"nonStringDependency\":\"Invalid dependency: %s %s\",\"deprecatedArrayDependencies\":\"specifying %s as array is deprecated\",\"deprecatedModules\":\"modules field is deprecated\",\"nonArrayKeywords\":\"keywords should be an array of strings\",\"nonStringKeyword\":\"keywords should be an array of strings\",\"conflictingName\":\"%s is also the name of a node core module.\",\"nonStringDescription\":\"'description' field should be a string\",\"missingDescription\":\"No description\",\"missingReadme\":\"No README data\",\"missingLicense\":\"No license field.\",\"nonEmailUrlBugsString\":\"Bug string field must be url, email, or {email,url}\",\"nonUrlBugsUrlField\":\"bugs.url field must be a string url. Deleted.\",\"nonEmailBugsEmailField\":\"bugs.email field must be a string email. Deleted.\",\"emptyNormalizedBugs\":\"Normalized value of bugs field is an empty object. Deleted.\",\"nonUrlHomepage\":\"homepage field must be a string url. Deleted.\",\"invalidLicense\":\"license should be a valid SPDX license expression\",\"typo\":\"%s should probably be %s.\"}"); /***/ }), -/* 545 */ +/* 531 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const writeJsonFile = __webpack_require__(546); -const sortKeys = __webpack_require__(558); - -const dependencyKeys = new Set([ - 'dependencies', - 'devDependencies', - 'optionalDependencies', - 'peerDependencies' -]); - -function normalize(packageJson) { - const result = {}; - - for (const key of Object.keys(packageJson)) { - if (!dependencyKeys.has(key)) { - result[key] = packageJson[key]; - } else if (Object.keys(packageJson[key]).length !== 0) { - result[key] = sortKeys(packageJson[key]); - } - } +var gitHosts = __webpack_require__(530) +var extend = Object.assign || __webpack_require__(397)._extend - return result; +var GitHost = module.exports = function (type, user, auth, project, committish, defaultRepresentation, opts) { + var gitHostInfo = this + gitHostInfo.type = type + Object.keys(gitHosts[type]).forEach(function (key) { + gitHostInfo[key] = gitHosts[type][key] + }) + gitHostInfo.user = user + gitHostInfo.auth = auth + gitHostInfo.project = project + gitHostInfo.committish = committish + gitHostInfo.default = defaultRepresentation + gitHostInfo.opts = opts || {} } +GitHost.prototype = {} -module.exports = async (filePath, data, options) => { - if (typeof filePath !== 'string') { - options = data; - data = filePath; - filePath = '.'; - } +GitHost.prototype.hash = function () { + return this.committish ? '#' + this.committish : '' +} - options = { - normalize: true, - ...options, - detectIndent: true - }; +GitHost.prototype._fill = function (template, opts) { + if (!template) return + var vars = extend({}, opts) + opts = extend(extend({}, this.opts), opts) + var self = this + Object.keys(this).forEach(function (key) { + if (self[key] != null && vars[key] == null) vars[key] = self[key] + }) + var rawAuth = vars.auth + var rawComittish = vars.committish + Object.keys(vars).forEach(function (key) { + vars[key] = encodeURIComponent(vars[key]) + }) + vars['auth@'] = rawAuth ? rawAuth + '@' : '' + if (opts.noCommittish) { + vars['#committish'] = '' + vars['/tree/committish'] = '' + vars['/comittish'] = '' + vars.comittish = '' + } else { + vars['#committish'] = rawComittish ? '#' + rawComittish : '' + vars['/tree/committish'] = vars.committish + ? '/' + vars.treepath + '/' + vars.committish + : '' + vars['/committish'] = vars.committish ? '/' + vars.committish : '' + vars.committish = vars.committish || 'master' + } + var res = template + Object.keys(vars).forEach(function (key) { + res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key]) + }) + if (opts.noGitPlus) { + return res.replace(/^git[+]/, '') + } else { + return res + } +} - filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); +GitHost.prototype.ssh = function (opts) { + return this._fill(this.sshtemplate, opts) +} - data = options.normalize ? normalize(data) : data; +GitHost.prototype.sshurl = function (opts) { + return this._fill(this.sshurltemplate, opts) +} - return writeJsonFile(filePath, data, options); -}; +GitHost.prototype.browse = function (opts) { + return this._fill(this.browsetemplate, opts) +} -module.exports.sync = (filePath, data, options) => { - if (typeof filePath !== 'string') { - options = data; - data = filePath; - filePath = '.'; - } +GitHost.prototype.docs = function (opts) { + return this._fill(this.docstemplate, opts) +} - options = { - normalize: true, - ...options, - detectIndent: true - }; +GitHost.prototype.bugs = function (opts) { + return this._fill(this.bugstemplate, opts) +} - filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); +GitHost.prototype.https = function (opts) { + return this._fill(this.httpstemplate, opts) +} - data = options.normalize ? normalize(data) : data; +GitHost.prototype.git = function (opts) { + return this._fill(this.gittemplate, opts) +} - writeJsonFile.sync(filePath, data, options); -}; +GitHost.prototype.shortcut = function (opts) { + return this._fill(this.shortcuttemplate, opts) +} +GitHost.prototype.path = function (opts) { + return this._fill(this.pathtemplate, opts) +} -/***/ }), -/* 546 */ -/***/ (function(module, exports, __webpack_require__) { +GitHost.prototype.tarball = function (opts) { + return this._fill(this.tarballtemplate, opts) +} -"use strict"; +GitHost.prototype.file = function (P, opts) { + return this._fill(this.filetemplate, extend({ + path: P.replace(/^[/]+/g, '') + }, opts)) +} -const path = __webpack_require__(16); -const fs = __webpack_require__(547); -const writeFileAtomic = __webpack_require__(551); -const sortKeys = __webpack_require__(558); -const makeDir = __webpack_require__(560); -const pify = __webpack_require__(561); -const detectIndent = __webpack_require__(562); +GitHost.prototype.getDefaultRepresentation = function () { + return this.default +} -const init = (fn, filePath, data, options) => { - if (!filePath) { - throw new TypeError('Expected a filepath'); - } +GitHost.prototype.toString = function (opts) { + return (this[this.default] || this.sshurl).call(this, opts) +} - if (data === undefined) { - throw new TypeError('Expected data to stringify'); - } - options = Object.assign({ - indent: '\t', - sortKeys: false - }, options); +/***/ }), +/* 532 */ +/***/ (function(module, exports, __webpack_require__) { - if (options.sortKeys) { - data = sortKeys(data, { - deep: true, - compare: typeof options.sortKeys === 'function' ? options.sortKeys : undefined - }); - } +var core = __webpack_require__(533); +var async = __webpack_require__(535); +async.core = core; +async.isCore = function isCore(x) { return core[x]; }; +async.sync = __webpack_require__(540); - return fn(filePath, data, options); -}; +exports = async; +module.exports = async; -const readFile = filePath => pify(fs.readFile)(filePath, 'utf8').catch(() => {}); -const main = (filePath, data, options) => { - return (options.detectIndent ? readFile(filePath) : Promise.resolve()) - .then(string => { - const indent = string ? detectIndent(string).indent : options.indent; - const json = JSON.stringify(data, options.replacer, indent); +/***/ }), +/* 533 */ +/***/ (function(module, exports, __webpack_require__) { - return pify(writeFileAtomic)(filePath, `${json}\n`, {mode: options.mode}); - }); -}; +var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; -const mainSync = (filePath, data, options) => { - let {indent} = options; +function specifierIncluded(specifier) { + var parts = specifier.split(' '); + var op = parts.length > 1 ? parts[0] : '='; + var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); - if (options.detectIndent) { - try { - const file = fs.readFileSync(filePath, 'utf8'); - indent = detectIndent(file).indent; - } catch (error) { - if (error.code !== 'ENOENT') { - throw error; - } - } - } + for (var i = 0; i < 3; ++i) { + var cur = Number(current[i] || 0); + var ver = Number(versionParts[i] || 0); + if (cur === ver) { + continue; // eslint-disable-line no-restricted-syntax, no-continue + } + if (op === '<') { + return cur < ver; + } else if (op === '>=') { + return cur >= ver; + } else { + return false; + } + } + return op === '>='; +} - const json = JSON.stringify(data, options.replacer, indent); +function matchesRange(range) { + var specifiers = range.split(/ ?&& ?/); + if (specifiers.length === 0) { return false; } + for (var i = 0; i < specifiers.length; ++i) { + if (!specifierIncluded(specifiers[i])) { return false; } + } + return true; +} - return writeFileAtomic.sync(filePath, `${json}\n`, {mode: options.mode}); -}; +function versionIncluded(specifierValue) { + if (typeof specifierValue === 'boolean') { return specifierValue; } + if (specifierValue && typeof specifierValue === 'object') { + for (var i = 0; i < specifierValue.length; ++i) { + if (matchesRange(specifierValue[i])) { return true; } + } + return false; + } + return matchesRange(specifierValue); +} -const writeJsonFile = (filePath, data, options) => { - return makeDir(path.dirname(filePath), {fs}) - .then(() => init(main, filePath, data, options)); -}; +var data = __webpack_require__(534); -module.exports = writeJsonFile; -// TODO: Remove this for the next major release -module.exports.default = writeJsonFile; -module.exports.sync = (filePath, data, options) => { - makeDir.sync(path.dirname(filePath), {fs}); - init(mainSync, filePath, data, options); -}; +var core = {}; +for (var mod in data) { // eslint-disable-line no-restricted-syntax + if (Object.prototype.hasOwnProperty.call(data, mod)) { + core[mod] = versionIncluded(data[mod]); + } +} +module.exports = core; /***/ }), -/* 547 */ -/***/ (function(module, exports, __webpack_require__) { +/* 534 */ +/***/ (function(module) { -var fs = __webpack_require__(23) -var polyfills = __webpack_require__(548) -var legacy = __webpack_require__(549) -var clone = __webpack_require__(550) +module.exports = JSON.parse("{\"assert\":true,\"async_hooks\":\">= 8\",\"buffer_ieee754\":\"< 0.9.7\",\"buffer\":true,\"child_process\":true,\"cluster\":true,\"console\":true,\"constants\":true,\"crypto\":true,\"_debugger\":\"< 8\",\"dgram\":true,\"dns\":true,\"domain\":true,\"events\":true,\"freelist\":\"< 6\",\"fs\":true,\"fs/promises\":\">= 10 && < 10.1\",\"_http_agent\":\">= 0.11.1\",\"_http_client\":\">= 0.11.1\",\"_http_common\":\">= 0.11.1\",\"_http_incoming\":\">= 0.11.1\",\"_http_outgoing\":\">= 0.11.1\",\"_http_server\":\">= 0.11.1\",\"http\":true,\"http2\":\">= 8.8\",\"https\":true,\"inspector\":\">= 8.0.0\",\"_linklist\":\"< 8\",\"module\":true,\"net\":true,\"node-inspect/lib/_inspect\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_client\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_repl\":\">= 7.6.0\",\"os\":true,\"path\":true,\"perf_hooks\":\">= 8.5\",\"process\":\">= 1\",\"punycode\":true,\"querystring\":true,\"readline\":true,\"repl\":true,\"smalloc\":\">= 0.11.5 && < 3\",\"_stream_duplex\":\">= 0.9.4\",\"_stream_transform\":\">= 0.9.4\",\"_stream_wrap\":\">= 1.4.1\",\"_stream_passthrough\":\">= 0.9.4\",\"_stream_readable\":\">= 0.9.4\",\"_stream_writable\":\">= 0.9.4\",\"stream\":true,\"string_decoder\":true,\"sys\":true,\"timers\":true,\"_tls_common\":\">= 0.11.13\",\"_tls_legacy\":\">= 0.11.3 && < 10\",\"_tls_wrap\":\">= 0.11.3\",\"tls\":true,\"trace_events\":\">= 10\",\"tty\":true,\"url\":true,\"util\":true,\"v8/tools/arguments\":\">= 10\",\"v8/tools/codemap\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/consarray\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/csvparser\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/logreader\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/profile_view\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/splaytree\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8\":\">= 1\",\"vm\":true,\"worker_threads\":\">= 11.7\",\"zlib\":true}"); -var queue = [] +/***/ }), +/* 535 */ +/***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(29) +var core = __webpack_require__(533); +var fs = __webpack_require__(349); +var path = __webpack_require__(4); +var caller = __webpack_require__(536); +var nodeModulesPaths = __webpack_require__(537); +var normalizeOptions = __webpack_require__(539); -function noop () {} +var defaultIsFile = function isFile(file, cb) { + fs.stat(file, function (err, stat) { + if (!err) { + return cb(null, stat.isFile() || stat.isFIFO()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); +}; -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } +module.exports = function resolve(x, options, callback) { + var cb = callback; + var opts = options; + if (typeof options === 'function') { + cb = opts; + opts = {}; + } + if (typeof x !== 'string') { + var err = new TypeError('Path must be a string.'); + return process.nextTick(function () { + cb(err); + }); + } -if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(queue) - __webpack_require__(30).equal(queue.length, 0) - }) -} + opts = normalizeOptions(x, opts); -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} + var isFile = opts.isFile || defaultIsFile; + var readFile = opts.readFile || fs.readFile; -// Always patch fs.close/closeSync, because we want to -// retry() whenever a close happens *anywhere* in the program. -// This is essential when multiple graceful-fs instances are -// in play at the same time. -module.exports.close = (function (fs$close) { return function (fd, cb) { - return fs$close.call(fs, fd, function (err) { - if (!err) - retry() + var extensions = opts.extensions || ['.js']; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; - if (typeof cb === 'function') - cb.apply(this, arguments) - }) -}})(fs.close) + opts.paths = opts.paths || []; -module.exports.closeSync = (function (fs$closeSync) { return function (fd) { - // Note that graceful-fs also retries when fs.closeSync() fails. - // Looks like a bug to me, although it's probably a harmless one. - var rval = fs$closeSync.apply(fs, arguments) - retry() - return rval -}})(fs.closeSync) + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = path.resolve(basedir); -// Only patch fs once, otherwise we'll run into a memory leak if -// graceful-fs is loaded multiple times, such as in test environments that -// reset the loaded modules between tests. -// We look for the string `graceful-fs` from the comment above. This -// way we are not adding any extra properties and it will detect if older -// versions of graceful-fs are installed. -if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { - fs.closeSync = module.exports.closeSync; - fs.close = module.exports.close; -} + if (opts.preserveSymlinks === false) { + fs.realpath(absoluteStart, function (realPathErr, realStart) { + if (realPathErr && realPathErr.code !== 'ENOENT') cb(err); + else init(realPathErr ? absoluteStart : realStart); + }); + } else { + init(absoluteStart); + } -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch - fs.FileReadStream = ReadStream; // Legacy name. - fs.FileWriteStream = WriteStream; // Legacy name. - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null + var res; + function init(basedir) { + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + res = path.resolve(basedir, x); + if (x === '..' || x.slice(-1) === '/') res += '/'; + if ((/\/$/).test(x) && res === basedir) { + loadAsDirectory(res, opts.package, onfile); + } else loadAsFile(res, opts.package, onfile); + } else loadNodeModules(x, basedir, function (err, n, pkg) { + if (err) cb(err); + else if (n) cb(null, n, pkg); + else if (core[x]) return cb(null, x); + else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } - return go$readFile(path, options, cb) + function onfile(err, m, pkg) { + if (err) cb(err); + else if (m) cb(null, m, pkg); + else loadAsDirectory(res, function (err, d, pkg) { + if (err) cb(err); + else if (d) cb(null, d, pkg); + else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + function loadAsFile(x, thePackage, callback) { + var loadAsFilePackage = thePackage; + var cb = callback; + if (typeof loadAsFilePackage === 'function') { + cb = loadAsFilePackage; + loadAsFilePackage = undefined; } - }) - } - } - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + var exts = [''].concat(extensions); + load(exts, x, loadAsFilePackage); - return go$writeFile(path, data, options, cb) + function load(exts, x, loadPackage) { + if (exts.length === 0) return cb(null, undefined, loadPackage); + var file = x + exts[0]; - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + var pkg = loadPackage; + if (pkg) onpkg(null, pkg); + else loadpkg(path.dirname(file), onpkg); + + function onpkg(err, pkg_, dir) { + pkg = pkg_; + if (err) return cb(err); + if (dir && pkg && opts.pathFilter) { + var rfile = path.relative(dir, file); + var rel = rfile.slice(0, rfile.length - exts[0].length); + var r = opts.pathFilter(pkg, x, rel); + if (r) return load( + [''].concat(extensions.slice()), + path.resolve(dir, r), + pkg + ); + } + isFile(file, onex); + } + function onex(err, ex) { + if (err) return cb(err); + if (ex) return cb(null, file, pkg); + load(exts.slice(1), x, pkg); + } } - }) } - } - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + function loadpkg(dir, cb) { + if (dir === '' || dir === '/') return cb(null); + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return cb(null); + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null); - return go$appendFile(path, data, options, cb) + var pkgfile = path.join(dir, 'package.json'); + isFile(pkgfile, function (err, ex) { + // on err, ex is false + if (!ex) return loadpkg(path.dirname(dir), cb); - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + readFile(pkgfile, function (err, body) { + if (err) cb(err); + try { var pkg = JSON.parse(body); } catch (jsonErr) {} - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } + cb(null, pkg, dir); + }); + }); } - args.push(go$readdir$cb) - return go$readdir(args) + function loadAsDirectory(x, loadAsDirectoryPackage, callback) { + var cb = callback; + var fpkg = loadAsDirectoryPackage; + if (typeof fpkg === 'function') { + cb = fpkg; + fpkg = opts.package; + } - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() + var pkgfile = path.join(x, 'package.json'); + isFile(pkgfile, function (err, ex) { + if (err) return cb(err); + if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb); - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) + readFile(pkgfile, function (err, body) { + if (err) return cb(err); + try { + var pkg = JSON.parse(body); + } catch (jsonErr) {} - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - } - } + if (opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + if (pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + return cb(mainError); + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb); - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + var dir = path.resolve(x, pkg.main); + loadAsDirectory(dir, pkg, function (err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + loadAsFile(path.join(x, 'index'), pkg, cb); + }); + }); + return; + } - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } + loadAsFile(path.join(x, '/index'), pkg, cb); + }); + }); + } - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } + function processDirs(cb, dirs) { + if (dirs.length === 0) return cb(null, undefined); + var dir = dirs[0]; - fs.ReadStream = ReadStream - fs.WriteStream = WriteStream + var file = path.join(dir, x); + loadAsFile(file, opts.package, onfile); - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } + function onfile(err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + loadAsDirectory(path.join(dir, x), opts.package, ondir); + } - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() + function ondir(err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + processDirs(cb, dirs.slice(1)); + } + } + function loadNodeModules(x, start, cb) { + processDirs(cb, nodeModulesPaths(start, opts, x)); + } +}; - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } +/***/ }), +/* 536 */ +/***/ (function(module, exports) { - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } +module.exports = function () { + // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi + var origPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = function (_, stack) { return stack; }; + var stack = (new Error()).stack; + Error.prepareStackTrace = origPrepareStackTrace; + return stack[2].getFileName(); +}; - function createReadStream (path, options) { - return new ReadStream(path, options) - } - function createWriteStream (path, options) { - return new WriteStream(path, options) - } +/***/ }), +/* 537 */ +/***/ (function(module, exports, __webpack_require__) { - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null +var path = __webpack_require__(4); +var parse = path.parse || __webpack_require__(538); - return go$open(path, flags, mode, cb) +var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { + var prefix = '/'; + if ((/^([A-Za-z]:)/).test(absoluteStart)) { + prefix = ''; + } else if ((/^\\\\/).test(absoluteStart)) { + prefix = '\\\\'; + } - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) + var paths = [absoluteStart]; + var parsed = parse(absoluteStart); + while (parsed.dir !== paths[paths.length - 1]) { + paths.push(parsed.dir); + parsed = parse(parsed.dir); } - } - return fs -} + return paths.reduce(function (dirs, aPath) { + return dirs.concat(modules.map(function (moduleDir) { + return path.join(prefix, aPath, moduleDir); + })); + }, []); +}; -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - queue.push(elem) -} +module.exports = function nodeModulesPaths(start, opts, request) { + var modules = opts && opts.moduleDirectory + ? [].concat(opts.moduleDirectory) + : ['node_modules']; -function retry () { - var elem = queue.shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } -} + if (opts && typeof opts.paths === 'function') { + return opts.paths( + request, + start, + function () { return getNodeModulesDirs(start, modules); }, + opts + ); + } + + var dirs = getNodeModulesDirs(start, modules); + return opts && opts.paths ? dirs.concat(opts.paths) : dirs; +}; /***/ }), -/* 548 */ +/* 538 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(25) +"use strict"; -var origCwd = process.cwd -var cwd = null -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform +var isWindows = process.platform === 'win32'; -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} +// Regex to split a windows path into three parts: [*, device, slash, +// tail] windows-only +var splitDeviceRe = + /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) -} +// Regex to split the tail part of the above into [*, dir, basename, ext] +var splitTailRe = + /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; -module.exports = patch +var win32 = {}; -function patch (fs) { - // (re-)implement some things that are known busted or missing. +// Function to split a filename into [root, dir, basename, ext] +function win32SplitPath(filename) { + // Separate device+slash from tail + var result = splitDeviceRe.exec(filename), + device = (result[1] || '') + (result[2] || ''), + tail = result[3] || ''; + // Split the tail into dir, basename and extension + var result2 = splitTailRe.exec(tail), + dir = result2[1], + basename = result2[2], + ext = result2[3]; + return [device, dir, basename, ext]; +} - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) +win32.parse = function(pathString) { + if (typeof pathString !== 'string') { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); } - - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) + var allParts = win32SplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); } + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; +}; - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. - - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var posix = {}; - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) +function posixSplitPath(filename) { + return splitPathRe.exec(filename).slice(1); +} - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} +posix.parse = function(pathString) { + if (typeof pathString !== 'string') { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} + var allParts = posixSplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); } + allParts[1] = allParts[1] || ''; + allParts[2] = allParts[2] || ''; + allParts[3] = allParts[3] || ''; - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; +}; - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - }})(fs.read) +if (isWindows) + module.exports = win32.parse; +else /* posix */ + module.exports = posix.parse; - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } - }})(fs.readSync) +module.exports.posix = posix.parse; +module.exports.win32 = win32.parse; - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) +/***/ }), +/* 539 */ +/***/ (function(module, exports) { - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } - } +module.exports = function (x, opts) { + /** + * This file is purposefully a passthrough. It's expected that third-party + * environments will override it at runtime in order to inject special logic + * into `resolve` (by manipulating the options). One such example is the PnP + * code path in Yarn. + */ - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } + return opts || {}; +}; - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } - } +/***/ }), +/* 540 */ +/***/ (function(module, exports, __webpack_require__) { - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) +var core = __webpack_require__(533); +var fs = __webpack_require__(349); +var path = __webpack_require__(4); +var caller = __webpack_require__(536); +var nodeModulesPaths = __webpack_require__(537); +var normalizeOptions = __webpack_require__(539); + +var defaultIsFile = function isFile(file) { + try { + var stat = fs.statSync(file); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; } - } + return stat.isFile() || stat.isFIFO(); +}; - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } +module.exports = function (x, options) { + if (typeof x !== 'string') { + throw new TypeError('Path must be a string.'); } - } + var opts = normalizeOptions(x, options); + var isFile = opts.isFile || defaultIsFile; + var readFileSync = opts.readFileSync || fs.readFileSync; - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + var extensions = opts.extensions || ['.js']; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; + + opts.paths = opts.paths || []; + + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = path.resolve(basedir); + + if (opts.preserveSymlinks === false) { + try { + absoluteStart = fs.realpathSync(absoluteStart); + } catch (realPathErr) { + if (realPathErr.code !== 'ENOENT') { + throw realPathErr; + } + } } - } - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + var res = path.resolve(absoluteStart, x); + if (x === '..' || x.slice(-1) === '/') res += '/'; + var m = loadAsFileSync(res) || loadAsDirectorySync(res); + if (m) return m; + } else { + var n = loadNodeModulesSync(x, absoluteStart); + if (n) return n; } - } + if (core[x]) return x; - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) - } - } + var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; + function loadAsFileSync(x) { + var pkg = loadpkg(path.dirname(x)); + + if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { + var rfile = path.relative(pkg.dir, x); + var r = opts.pathFilter(pkg.pkg, x, rfile); + if (r) { + x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign + } + } + + if (isFile(x)) { + return x; + } + + for (var i = 0; i < extensions.length; i++) { + var file = x + extensions[i]; + if (isFile(file)) { + return file; + } + } } - } - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true + function loadpkg(dir) { + if (dir === '' || dir === '/') return; + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return; + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; - if (er.code === "ENOSYS") - return true + var pkgfile = path.join(dir, 'package.json'); - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } + if (!isFile(pkgfile)) { + return loadpkg(path.dirname(dir)); + } - return false - } -} + var body = readFileSync(pkgfile); + try { + var pkg = JSON.parse(body); + } catch (jsonErr) {} -/***/ }), -/* 549 */ -/***/ (function(module, exports, __webpack_require__) { + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, dir); + } -var Stream = __webpack_require__(27).Stream + return { pkg: pkg, dir: dir }; + } -module.exports = legacy + function loadAsDirectorySync(x) { + var pkgfile = path.join(x, '/package.json'); + if (isFile(pkgfile)) { + try { + var body = readFileSync(pkgfile, 'UTF8'); + var pkg = JSON.parse(body); + } catch (e) {} -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } + if (opts.packageFilter) { + pkg = opts.packageFilter(pkg, x); + } - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); + if (pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + throw mainError; + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + try { + var m = loadAsFileSync(path.resolve(x, pkg.main)); + if (m) return m; + var n = loadAsDirectorySync(path.resolve(x, pkg.main)); + if (n) return n; + } catch (e) {} + } + } - Stream.call(this); + return loadAsFileSync(path.join(x, '/index')); + } - var self = this; + function loadNodeModulesSync(x, start) { + var dirs = nodeModulesPaths(start, opts, x); + for (var i = 0; i < dirs.length; i++) { + var dir = dirs[i]; + var m = loadAsFileSync(path.join(dir, '/', x)); + if (m) return m; + var n = loadAsDirectorySync(path.join(dir, '/', x)); + if (n) return n; + } + } +}; - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; +/***/ }), +/* 541 */ +/***/ (function(module, exports) { - options = options || {}; +module.exports = extractDescription - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } +// Extracts description from contents of a readme file in markdown format +function extractDescription (d) { + if (!d) return; + if (d === "ERROR: No README data found!") return; + // the first block of text before the first heading + // that isn't the first line heading + d = d.trim().split('\n') + for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++); + var l = d.length + for (var e = s + 1; e < l && d[e].trim(); e ++); + return d.slice(s, e).join(' ').trim() +} - if (this.encoding) this.setEncoding(this.encoding); - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } +/***/ }), +/* 542 */ +/***/ (function(module) { - if (this.start > this.end) { - throw new Error('start must be <= end'); - } +module.exports = JSON.parse("{\"topLevel\":{\"dependancies\":\"dependencies\",\"dependecies\":\"dependencies\",\"depdenencies\":\"dependencies\",\"devEependencies\":\"devDependencies\",\"depends\":\"dependencies\",\"dev-dependencies\":\"devDependencies\",\"devDependences\":\"devDependencies\",\"devDepenencies\":\"devDependencies\",\"devdependencies\":\"devDependencies\",\"repostitory\":\"repository\",\"repo\":\"repository\",\"prefereGlobal\":\"preferGlobal\",\"hompage\":\"homepage\",\"hampage\":\"homepage\",\"autohr\":\"author\",\"autor\":\"author\",\"contributers\":\"contributors\",\"publicationConfig\":\"publishConfig\",\"script\":\"scripts\"},\"bugs\":{\"web\":\"url\",\"name\":\"url\"},\"script\":{\"server\":\"start\",\"tests\":\"test\"}}"); - this.pos = this.start; - } +/***/ }), +/* 543 */ +/***/ (function(module, exports, __webpack_require__) { - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; - } +var util = __webpack_require__(397) +var messages = __webpack_require__(544) - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } +module.exports = function() { + var args = Array.prototype.slice.call(arguments, 0) + var warningName = args.shift() + if (warningName == "typo") { + return makeTypoWarning.apply(null,args) + } + else { + var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'" + args.unshift(msgTemplate) + return util.format.apply(null, args) + } +} - self.fd = fd; - self.emit('open', fd); - self._read(); - }) +function makeTypoWarning (providedName, probableName, field) { + if (field) { + providedName = field + "['" + providedName + "']" + probableName = field + "['" + probableName + "']" } + return util.format(messages.typo, providedName, probableName) +} - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); - Stream.call(this); +/***/ }), +/* 544 */ +/***/ (function(module) { - this.path = path; - this.fd = null; - this.writable = true; +module.exports = JSON.parse("{\"repositories\":\"'repositories' (plural) Not supported. Please pick one as the 'repository' field\",\"missingRepository\":\"No repository field.\",\"brokenGitUrl\":\"Probably broken git url: %s\",\"nonObjectScripts\":\"scripts must be an object\",\"nonStringScript\":\"script values must be string commands\",\"nonArrayFiles\":\"Invalid 'files' member\",\"invalidFilename\":\"Invalid filename in 'files' list: %s\",\"nonArrayBundleDependencies\":\"Invalid 'bundleDependencies' list. Must be array of package names\",\"nonStringBundleDependency\":\"Invalid bundleDependencies member: %s\",\"nonDependencyBundleDependency\":\"Non-dependency in bundleDependencies: %s\",\"nonObjectDependencies\":\"%s field must be an object\",\"nonStringDependency\":\"Invalid dependency: %s %s\",\"deprecatedArrayDependencies\":\"specifying %s as array is deprecated\",\"deprecatedModules\":\"modules field is deprecated\",\"nonArrayKeywords\":\"keywords should be an array of strings\",\"nonStringKeyword\":\"keywords should be an array of strings\",\"conflictingName\":\"%s is also the name of a node core module.\",\"nonStringDescription\":\"'description' field should be a string\",\"missingDescription\":\"No description\",\"missingReadme\":\"No README data\",\"missingLicense\":\"No license field.\",\"nonEmailUrlBugsString\":\"Bug string field must be url, email, or {email,url}\",\"nonUrlBugsUrlField\":\"bugs.url field must be a string url. Deleted.\",\"nonEmailBugsEmailField\":\"bugs.email field must be a string email. Deleted.\",\"emptyNormalizedBugs\":\"Normalized value of bugs field is an empty object. Deleted.\",\"nonUrlHomepage\":\"homepage field must be a string url. Deleted.\",\"invalidLicense\":\"license should be a valid SPDX license expression\",\"typo\":\"%s should probably be %s.\"}"); - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; +/***/ }), +/* 545 */ +/***/ (function(module, exports, __webpack_require__) { - options = options || {}; +"use strict"; - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } +const path = __webpack_require__(4); +const writeJsonFile = __webpack_require__(546); +const sortKeys = __webpack_require__(558); - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } +const dependencyKeys = new Set([ + 'dependencies', + 'devDependencies', + 'optionalDependencies', + 'peerDependencies' +]); - this.pos = this.start; - } +function normalize(packageJson) { + const result = {}; - this.busy = false; - this._queue = []; + for (const key of Object.keys(packageJson)) { + if (!dependencyKeys.has(key)) { + result[key] = packageJson[key]; + } else if (Object.keys(packageJson[key]).length !== 0) { + result[key] = sortKeys(packageJson[key]); + } + } - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); - } - } + return result; } +module.exports = async (filePath, data, options) => { + if (typeof filePath !== 'string') { + options = data; + data = filePath; + filePath = '.'; + } -/***/ }), -/* 550 */ -/***/ (function(module, exports, __webpack_require__) { + options = { + normalize: true, + ...options, + detectIndent: true + }; -"use strict"; + filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); + data = options.normalize ? normalize(data) : data; -module.exports = clone + return writeJsonFile(filePath, data, options); +}; -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj +module.exports.sync = (filePath, data, options) => { + if (typeof filePath !== 'string') { + options = data; + data = filePath; + filePath = '.'; + } - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + options = { + normalize: true, + ...options, + detectIndent: true + }; - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); - return copy -} + data = options.normalize ? normalize(data) : data; + + writeJsonFile.sync(filePath, data, options); +}; /***/ }), -/* 551 */ +/* 546 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = writeFile -module.exports.sync = writeFileSync -module.exports._getTmpname = getTmpname // for testing -module.exports._cleanupOnExit = cleanupOnExit - -var fs = __webpack_require__(552) -var MurmurHash3 = __webpack_require__(556) -var onExit = __webpack_require__(397) -var path = __webpack_require__(16) -var activeFiles = {} - -// if we run inside of a worker_thread, `process.pid` is not unique -/* istanbul ignore next */ -var threadId = (function getId () { - try { - var workerThreads = __webpack_require__(557) +const path = __webpack_require__(4); +const fs = __webpack_require__(547); +const writeFileAtomic = __webpack_require__(551); +const sortKeys = __webpack_require__(558); +const makeDir = __webpack_require__(560); +const pify = __webpack_require__(561); +const detectIndent = __webpack_require__(562); - /// if we are in main thread, this is set to `0` - return workerThreads.threadId - } catch (e) { - // worker_threads are not available, fallback to 0 - return 0 - } -})() +const init = (fn, filePath, data, options) => { + if (!filePath) { + throw new TypeError('Expected a filepath'); + } -var invocations = 0 -function getTmpname (filename) { - return filename + '.' + - MurmurHash3(__filename) - .hash(String(process.pid)) - .hash(String(threadId)) - .hash(String(++invocations)) - .result() -} + if (data === undefined) { + throw new TypeError('Expected data to stringify'); + } -function cleanupOnExit (tmpfile) { - return function () { - try { - fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile) - } catch (_) {} - } -} + options = Object.assign({ + indent: '\t', + sortKeys: false + }, options); -function writeFile (filename, data, options, callback) { - if (options) { - if (options instanceof Function) { - callback = options - options = {} - } else if (typeof options === 'string') { - options = { encoding: options } - } - } else { - options = {} - } + if (options.sortKeys) { + data = sortKeys(data, { + deep: true, + compare: typeof options.sortKeys === 'function' ? options.sortKeys : undefined + }); + } - var Promise = options.Promise || global.Promise - var truename - var fd - var tmpfile - /* istanbul ignore next -- The closure only gets called when onExit triggers */ - var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile)) - var absoluteName = path.resolve(filename) + return fn(filePath, data, options); +}; - new Promise(function serializeSameFile (resolve) { - // make a queue if it doesn't already exist - if (!activeFiles[absoluteName]) activeFiles[absoluteName] = [] +const readFile = filePath => pify(fs.readFile)(filePath, 'utf8').catch(() => {}); - activeFiles[absoluteName].push(resolve) // add this job to the queue - if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one - }).then(function getRealPath () { - return new Promise(function (resolve) { - fs.realpath(filename, function (_, realname) { - truename = realname || filename - tmpfile = getTmpname(truename) - resolve() - }) - }) - }).then(function stat () { - return new Promise(function stat (resolve) { - if (options.mode && options.chown) resolve() - else { - // Either mode or chown is not explicitly set - // Default behavior is to copy it from original file - fs.stat(truename, function (err, stats) { - if (err || !stats) resolve() - else { - options = Object.assign({}, options) +const main = (filePath, data, options) => { + return (options.detectIndent ? readFile(filePath) : Promise.resolve()) + .then(string => { + const indent = string ? detectIndent(string).indent : options.indent; + const json = JSON.stringify(data, options.replacer, indent); - if (options.mode == null) { - options.mode = stats.mode - } - if (options.chown == null && process.getuid) { - options.chown = { uid: stats.uid, gid: stats.gid } - } - resolve() - } - }) - } - }) - }).then(function thenWriteFile () { - return new Promise(function (resolve, reject) { - fs.open(tmpfile, 'w', options.mode, function (err, _fd) { - fd = _fd - if (err) reject(err) - else resolve() - }) - }) - }).then(function write () { - return new Promise(function (resolve, reject) { - if (Buffer.isBuffer(data)) { - fs.write(fd, data, 0, data.length, 0, function (err) { - if (err) reject(err) - else resolve() - }) - } else if (data != null) { - fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) { - if (err) reject(err) - else resolve() - }) - } else resolve() - }) - }).then(function syncAndClose () { - return new Promise(function (resolve, reject) { - if (options.fsync !== false) { - fs.fsync(fd, function (err) { - if (err) fs.close(fd, () => reject(err)) - else fs.close(fd, resolve) - }) - } else { - fs.close(fd, resolve) - } - }) - }).then(function chown () { - fd = null - if (options.chown) { - return new Promise(function (resolve, reject) { - fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) { - if (err) reject(err) - else resolve() - }) - }) - } - }).then(function chmod () { - if (options.mode) { - return new Promise(function (resolve, reject) { - fs.chmod(tmpfile, options.mode, function (err) { - if (err) reject(err) - else resolve() - }) - }) - } - }).then(function rename () { - return new Promise(function (resolve, reject) { - fs.rename(tmpfile, truename, function (err) { - if (err) reject(err) - else resolve() - }) - }) - }).then(function success () { - removeOnExitHandler() - callback() - }, function fail (err) { - return new Promise(resolve => { - return fd ? fs.close(fd, resolve) : resolve() - }).then(() => { - removeOnExitHandler() - fs.unlink(tmpfile, function () { - callback(err) - }) - }) - }).then(function checkQueue () { - activeFiles[absoluteName].shift() // remove the element added by serializeSameFile - if (activeFiles[absoluteName].length > 0) { - activeFiles[absoluteName][0]() // start next job if one is pending - } else delete activeFiles[absoluteName] - }) -} + return pify(writeFileAtomic)(filePath, `${json}\n`, {mode: options.mode}); + }); +}; -function writeFileSync (filename, data, options) { - if (typeof options === 'string') options = { encoding: options } - else if (!options) options = {} - try { - filename = fs.realpathSync(filename) - } catch (ex) { - // it's ok, it'll happen on a not yet existing file - } - var tmpfile = getTmpname(filename) +const mainSync = (filePath, data, options) => { + let {indent} = options; - if (!options.mode || !options.chown) { - // Either mode or chown is not explicitly set - // Default behavior is to copy it from original file - try { - var stats = fs.statSync(filename) - options = Object.assign({}, options) - if (!options.mode) { - options.mode = stats.mode - } - if (!options.chown && process.getuid) { - options.chown = { uid: stats.uid, gid: stats.gid } - } - } catch (ex) { - // ignore stat errors - } - } + if (options.detectIndent) { + try { + const file = fs.readFileSync(filePath, 'utf8'); + indent = detectIndent(file).indent; + } catch (error) { + if (error.code !== 'ENOENT') { + throw error; + } + } + } - var fd - var cleanup = cleanupOnExit(tmpfile) - var removeOnExitHandler = onExit(cleanup) + const json = JSON.stringify(data, options.replacer, indent); - try { - fd = fs.openSync(tmpfile, 'w', options.mode) - if (Buffer.isBuffer(data)) { - fs.writeSync(fd, data, 0, data.length, 0) - } else if (data != null) { - fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) - } - if (options.fsync !== false) { - fs.fsyncSync(fd) - } - fs.closeSync(fd) - if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) - if (options.mode) fs.chmodSync(tmpfile, options.mode) - fs.renameSync(tmpfile, filename) - removeOnExitHandler() - } catch (err) { - if (fd) { - try { - fs.closeSync(fd) - } catch (ex) { - // ignore close errors at this stage, error may have closed fd already. - } - } - removeOnExitHandler() - cleanup() - throw err - } -} + return writeFileAtomic.sync(filePath, `${json}\n`, {mode: options.mode}); +}; + +const writeJsonFile = (filePath, data, options) => { + return makeDir(path.dirname(filePath), {fs}) + .then(() => init(main, filePath, data, options)); +}; + +module.exports = writeJsonFile; +// TODO: Remove this for the next major release +module.exports.default = writeJsonFile; +module.exports.sync = (filePath, data, options) => { + makeDir.sync(path.dirname(filePath), {fs}); + init(mainSync, filePath, data, options); +}; /***/ }), -/* 552 */ +/* 547 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(23) -var polyfills = __webpack_require__(553) -var legacy = __webpack_require__(555) +var fs = __webpack_require__(349) +var polyfills = __webpack_require__(548) +var legacy = __webpack_require__(549) +var clone = __webpack_require__(550) + var queue = [] -var util = __webpack_require__(29) +var util = __webpack_require__(397) function noop () {} @@ -53880,21 +52895,21 @@ else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { process.on('exit', function() { debug(queue) - __webpack_require__(30).equal(queue.length, 0) + __webpack_require__(371).equal(queue.length, 0) }) } -module.exports = patch(__webpack_require__(554)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { - module.exports = patch(fs) +module.exports = patch(clone(fs)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module.exports = patch(fs) + fs.__patched = true; } // Always patch fs.close/closeSync, because we want to // retry() whenever a close happens *anywhere* in the program. // This is essential when multiple graceful-fs instances are // in play at the same time. -module.exports.close = -fs.close = (function (fs$close) { return function (fd, cb) { +module.exports.close = (function (fs$close) { return function (fd, cb) { return fs$close.call(fs, fd, function (err) { if (!err) retry() @@ -53904,8 +52919,7 @@ fs.close = (function (fs$close) { return function (fd, cb) { }) }})(fs.close) -module.exports.closeSync = -fs.closeSync = (function (fs$closeSync) { return function (fd) { +module.exports.closeSync = (function (fs$closeSync) { return function (fd) { // Note that graceful-fs also retries when fs.closeSync() fails. // Looks like a bug to me, although it's probably a harmless one. var rval = fs$closeSync.apply(fs, arguments) @@ -53913,6 +52927,17 @@ fs.closeSync = (function (fs$closeSync) { return function (fd) { return rval }})(fs.closeSync) +// Only patch fs once, otherwise we'll run into a memory leak if +// graceful-fs is loaded multiple times, such as in test environments that +// reset the loaded modules between tests. +// We look for the string `graceful-fs` from the comment above. This +// way we are not adding any extra properties and it will detect if older +// versions of graceful-fs are installed. +if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { + fs.closeSync = module.exports.closeSync; + fs.close = module.exports.close; +} + function patch (fs) { // Everything that references the open() function needs to be in here polyfills(fs) @@ -54004,6 +53029,7 @@ function patch (fs) { if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) enqueue([go$readdir, [args]]) + else { if (typeof cb === 'function') cb.apply(this, arguments) @@ -54023,12 +53049,16 @@ function patch (fs) { } var fs$ReadStream = fs.ReadStream - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + } var fs$WriteStream = fs.WriteStream - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + } fs.ReadStream = ReadStream fs.WriteStream = WriteStream @@ -54123,11 +53153,10 @@ function retry () { /***/ }), -/* 553 */ +/* 548 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(554) -var constants = __webpack_require__(25) +var constants = __webpack_require__(411) var origCwd = process.cwd var cwd = null @@ -54273,73 +53302,36 @@ function patch (fs) { } } }})(fs.readSync) -} - -function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } - - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) - - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } -} -function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) + function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) return } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) }) }) }) } - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. var threw = true + var ret try { - ret = fs.futimesSync(fd, at, mt) + ret = fs.fchmodSync(fd, mode) threw = false } finally { if (threw) { @@ -54352,145 +53344,154 @@ function patchLutimes (fs) { } return ret } - - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} } -} -function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } -} + function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } -function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} } } -} - -function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } } -} -function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er + function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } } } -} -function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) + function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } } -} -function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; + function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } } -} - -// ENOSYS means that the fs doesn't support the op. Just ignore -// that, because it doesn't matter. -// -// if there's no getuid, or if getuid() is something other -// than 0, and the error is EINVAL or EPERM, then just ignore -// it. -// -// This specific case is a silent failure in cp, install, tar, -// and most other unix tools that manage permissions. -// -// When running as root, or if other types of errors are -// encountered, then it's strict. -function chownErOk (er) { - if (!er) - return true - if (er.code === "ENOSYS") - return true - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true + function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, cb) { + return orig.call(fs, target, function (er, stats) { + if (!stats) return cb.apply(this, arguments) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + if (cb) cb.apply(this, arguments) + }) + } } - return false -} - - -/***/ }), -/* 554 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var fs = __webpack_require__(23) - -module.exports = clone(fs) + function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target) { + var stats = orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; + } + } -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj + // ENOSYS means that the fs doesn't support the op. Just ignore + // that, because it doesn't matter. + // + // if there's no getuid, or if getuid() is something other + // than 0, and the error is EINVAL or EPERM, then just ignore + // it. + // + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // + // When running as root, or if other types of errors are + // encountered, then it's strict. + function chownErOk (er) { + if (!er) + return true - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + if (er.code === "ENOSYS") + return true - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } - return copy + return false + } } /***/ }), -/* 555 */ +/* 549 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(27).Stream +var Stream = __webpack_require__(382).Stream module.exports = legacy @@ -54610,1452 +53611,1793 @@ function legacy (fs) { } -/***/ }), -/* 556 */ -/***/ (function(module, exports, __webpack_require__) { - -/** - * @preserve - * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) - * - * @author Jens Taylor - * @see http://github.com/homebrewing/brauhaus-diff - * @author Gary Court - * @see http://github.com/garycourt/murmurhash-js - * @author Austin Appleby - * @see http://sites.google.com/site/murmurhash/ - */ -(function(){ - var cache; - - // Call this function without `new` to use the cached object (good for - // single-threaded environments), or with `new` to create a new object. - // - // @param {string} key A UTF-16 or ASCII string - // @param {number} seed An optional positive integer - // @return {object} A MurmurHash3 object for incremental hashing - function MurmurHash3(key, seed) { - var m = this instanceof MurmurHash3 ? this : cache; - m.reset(seed) - if (typeof key === 'string' && key.length > 0) { - m.hash(key); - } - - if (m !== this) { - return m; - } - }; - - // Incrementally add a string to this hash - // - // @param {string} key A UTF-16 or ASCII string - // @return {object} this - MurmurHash3.prototype.hash = function(key) { - var h1, k1, i, top, len; - - len = key.length; - this.len += len; - - k1 = this.k1; - i = 0; - switch (this.rem) { - case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0; - case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0; - case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0; - case 3: - k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0; - k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0; - } - - this.rem = (len + this.rem) & 3; // & 3 is same as % 4 - len -= this.rem; - if (len > 0) { - h1 = this.h1; - while (1) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - - h1 ^= k1; - h1 = (h1 << 13) | (h1 >>> 19); - h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff; - - if (i >= len) { - break; - } - - k1 = ((key.charCodeAt(i++) & 0xffff)) ^ - ((key.charCodeAt(i++) & 0xffff) << 8) ^ - ((key.charCodeAt(i++) & 0xffff) << 16); - top = key.charCodeAt(i++); - k1 ^= ((top & 0xff) << 24) ^ - ((top & 0xff00) >> 8); - } - - k1 = 0; - switch (this.rem) { - case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16; - case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8; - case 1: k1 ^= (key.charCodeAt(i) & 0xffff); - } - - this.h1 = h1; - } - - this.k1 = k1; - return this; - }; - - // Get the result of this hash - // - // @return {number} The 32-bit hash - MurmurHash3.prototype.result = function() { - var k1, h1; - - k1 = this.k1; - h1 = this.h1; - - if (k1 > 0) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - h1 ^= k1; - } - - h1 ^= this.len; +/***/ }), +/* 550 */ +/***/ (function(module, exports, __webpack_require__) { - h1 ^= h1 >>> 16; - h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff; - h1 ^= h1 >>> 13; - h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff; - h1 ^= h1 >>> 16; +"use strict"; - return h1 >>> 0; - }; - // Reset the hash object for reuse - // - // @param {number} seed An optional positive integer - MurmurHash3.prototype.reset = function(seed) { - this.h1 = typeof seed === 'number' ? seed : 0; - this.rem = this.k1 = this.len = 0; - return this; - }; +module.exports = clone - // A cached object to use. This can be safely used if you're in a single- - // threaded environment, otherwise you need to create new hashes to use. - cache = new MurmurHash3(); +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj - if (true) { - module.exports = MurmurHash3; - } else {} -}()); + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) -/***/ }), -/* 557 */ -/***/ (function(module, exports) { + return copy +} -module.exports = require(undefined); /***/ }), -/* 558 */ +/* 551 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const isPlainObj = __webpack_require__(559); - -module.exports = (obj, opts) => { - if (!isPlainObj(obj)) { - throw new TypeError('Expected a plain object'); - } +module.exports = writeFile +module.exports.sync = writeFileSync +module.exports._getTmpname = getTmpname // for testing +module.exports._cleanupOnExit = cleanupOnExit - opts = opts || {}; +var fs = __webpack_require__(552) +var MurmurHash3 = __webpack_require__(556) +var onExit = __webpack_require__(370) +var path = __webpack_require__(4) +var activeFiles = {} - // DEPRECATED - if (typeof opts === 'function') { - throw new TypeError('Specify the compare function as an option instead'); - } +// if we run inside of a worker_thread, `process.pid` is not unique +/* istanbul ignore next */ +var threadId = (function getId () { + try { + var workerThreads = __webpack_require__(557) - const deep = opts.deep; - const seenInput = []; - const seenOutput = []; + /// if we are in main thread, this is set to `0` + return workerThreads.threadId + } catch (e) { + // worker_threads are not available, fallback to 0 + return 0 + } +})() - const sortKeys = x => { - const seenIndex = seenInput.indexOf(x); +var invocations = 0 +function getTmpname (filename) { + return filename + '.' + + MurmurHash3(__filename) + .hash(String(process.pid)) + .hash(String(threadId)) + .hash(String(++invocations)) + .result() +} - if (seenIndex !== -1) { - return seenOutput[seenIndex]; - } +function cleanupOnExit (tmpfile) { + return function () { + try { + fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile) + } catch (_) {} + } +} - const ret = {}; - const keys = Object.keys(x).sort(opts.compare); +function writeFile (filename, data, options, callback) { + if (options) { + if (options instanceof Function) { + callback = options + options = {} + } else if (typeof options === 'string') { + options = { encoding: options } + } + } else { + options = {} + } - seenInput.push(x); - seenOutput.push(ret); + var Promise = options.Promise || global.Promise + var truename + var fd + var tmpfile + /* istanbul ignore next -- The closure only gets called when onExit triggers */ + var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile)) + var absoluteName = path.resolve(filename) - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - const val = x[key]; + new Promise(function serializeSameFile (resolve) { + // make a queue if it doesn't already exist + if (!activeFiles[absoluteName]) activeFiles[absoluteName] = [] - if (deep && Array.isArray(val)) { - const retArr = []; + activeFiles[absoluteName].push(resolve) // add this job to the queue + if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one + }).then(function getRealPath () { + return new Promise(function (resolve) { + fs.realpath(filename, function (_, realname) { + truename = realname || filename + tmpfile = getTmpname(truename) + resolve() + }) + }) + }).then(function stat () { + return new Promise(function stat (resolve) { + if (options.mode && options.chown) resolve() + else { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + fs.stat(truename, function (err, stats) { + if (err || !stats) resolve() + else { + options = Object.assign({}, options) - for (let j = 0; j < val.length; j++) { - retArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j]; - } + if (options.mode == null) { + options.mode = stats.mode + } + if (options.chown == null && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + resolve() + } + }) + } + }) + }).then(function thenWriteFile () { + return new Promise(function (resolve, reject) { + fs.open(tmpfile, 'w', options.mode, function (err, _fd) { + fd = _fd + if (err) reject(err) + else resolve() + }) + }) + }).then(function write () { + return new Promise(function (resolve, reject) { + if (Buffer.isBuffer(data)) { + fs.write(fd, data, 0, data.length, 0, function (err) { + if (err) reject(err) + else resolve() + }) + } else if (data != null) { + fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) { + if (err) reject(err) + else resolve() + }) + } else resolve() + }) + }).then(function syncAndClose () { + return new Promise(function (resolve, reject) { + if (options.fsync !== false) { + fs.fsync(fd, function (err) { + if (err) fs.close(fd, () => reject(err)) + else fs.close(fd, resolve) + }) + } else { + fs.close(fd, resolve) + } + }) + }).then(function chown () { + fd = null + if (options.chown) { + return new Promise(function (resolve, reject) { + fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function chmod () { + if (options.mode) { + return new Promise(function (resolve, reject) { + fs.chmod(tmpfile, options.mode, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function rename () { + return new Promise(function (resolve, reject) { + fs.rename(tmpfile, truename, function (err) { + if (err) reject(err) + else resolve() + }) + }) + }).then(function success () { + removeOnExitHandler() + callback() + }, function fail (err) { + return new Promise(resolve => { + return fd ? fs.close(fd, resolve) : resolve() + }).then(() => { + removeOnExitHandler() + fs.unlink(tmpfile, function () { + callback(err) + }) + }) + }).then(function checkQueue () { + activeFiles[absoluteName].shift() // remove the element added by serializeSameFile + if (activeFiles[absoluteName].length > 0) { + activeFiles[absoluteName][0]() // start next job if one is pending + } else delete activeFiles[absoluteName] + }) +} - ret[key] = retArr; - continue; - } +function writeFileSync (filename, data, options) { + if (typeof options === 'string') options = { encoding: options } + else if (!options) options = {} + try { + filename = fs.realpathSync(filename) + } catch (ex) { + // it's ok, it'll happen on a not yet existing file + } + var tmpfile = getTmpname(filename) - ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val; - } + if (!options.mode || !options.chown) { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + try { + var stats = fs.statSync(filename) + options = Object.assign({}, options) + if (!options.mode) { + options.mode = stats.mode + } + if (!options.chown && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + } catch (ex) { + // ignore stat errors + } + } - return ret; - }; + var fd + var cleanup = cleanupOnExit(tmpfile) + var removeOnExitHandler = onExit(cleanup) - return sortKeys(obj); -}; + try { + fd = fs.openSync(tmpfile, 'w', options.mode) + if (Buffer.isBuffer(data)) { + fs.writeSync(fd, data, 0, data.length, 0) + } else if (data != null) { + fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) + } + if (options.fsync !== false) { + fs.fsyncSync(fd) + } + fs.closeSync(fd) + if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) + if (options.mode) fs.chmodSync(tmpfile, options.mode) + fs.renameSync(tmpfile, filename) + removeOnExitHandler() + } catch (err) { + if (fd) { + try { + fs.closeSync(fd) + } catch (ex) { + // ignore close errors at this stage, error may have closed fd already. + } + } + removeOnExitHandler() + cleanup() + throw err + } +} /***/ }), -/* 559 */ +/* 552 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var fs = __webpack_require__(349) +var polyfills = __webpack_require__(553) +var legacy = __webpack_require__(555) +var queue = [] -var toString = Object.prototype.toString; +var util = __webpack_require__(397) -module.exports = function (x) { - var prototype; - return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); -}; +function noop () {} +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } -/***/ }), -/* 560 */ -/***/ (function(module, exports, __webpack_require__) { +if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(queue) + __webpack_require__(371).equal(queue.length, 0) + }) +} -"use strict"; +module.exports = patch(__webpack_require__(554)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { + module.exports = patch(fs) +} -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const pify = __webpack_require__(561); -const semver = __webpack_require__(523); +// Always patch fs.close/closeSync, because we want to +// retry() whenever a close happens *anywhere* in the program. +// This is essential when multiple graceful-fs instances are +// in play at the same time. +module.exports.close = +fs.close = (function (fs$close) { return function (fd, cb) { + return fs$close.call(fs, fd, function (err) { + if (!err) + retry() -const defaults = { - mode: 0o777 & (~process.umask()), - fs -}; + if (typeof cb === 'function') + cb.apply(this, arguments) + }) +}})(fs.close) -const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); +module.exports.closeSync = +fs.closeSync = (function (fs$closeSync) { return function (fd) { + // Note that graceful-fs also retries when fs.closeSync() fails. + // Looks like a bug to me, although it's probably a harmless one. + var rval = fs$closeSync.apply(fs, arguments) + retry() + return rval +}})(fs.closeSync) -// https://github.com/nodejs/node/issues/8987 -// https://github.com/libuv/libuv/pull/1088 -const checkPath = pth => { - if (process.platform === 'win32') { - const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')); +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + fs.FileReadStream = ReadStream; // Legacy name. + fs.FileWriteStream = WriteStream; // Legacy name. + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null - if (pathHasInvalidWinCharacters) { - const error = new Error(`Path contains invalid characters: ${pth}`); - error.code = 'EINVAL'; - throw error; - } - } -}; + return go$readFile(path, options, cb) -const permissionError = pth => { - // This replicates the exception of `fs.mkdir` with native the - // `recusive` option when run on an invalid drive under Windows. - const error = new Error(`operation not permitted, mkdir '${pth}'`); - error.code = 'EPERM'; - error.errno = -4048; - error.path = pth; - error.syscall = 'mkdir'; - return error; -}; + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } -const makeDir = (input, options) => Promise.resolve().then(() => { - checkPath(input); - options = Object.assign({}, defaults, options); + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null - // TODO: Use util.promisify when targeting Node.js 8 - const mkdir = pify(options.fs.mkdir); - const stat = pify(options.fs.stat); + return go$writeFile(path, data, options, cb) - if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) { - const pth = path.resolve(input); + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$appendFile(path, data, options, cb) + + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) + } else { + cb = options + } + args.push(go$readdir$cb) + + return go$readdir(args) + + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() + + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } + + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } + + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } + + var fs$ReadStream = fs.ReadStream + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + + var fs$WriteStream = fs.WriteStream + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + + fs.ReadStream = ReadStream + fs.WriteStream = WriteStream - return mkdir(pth, { - mode: options.mode, - recursive: true - }).then(() => pth); - } + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } - const make = pth => { - return mkdir(pth, options.mode) - .then(() => pth) - .catch(error => { - if (error.code === 'EPERM') { - throw error; - } + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() - if (error.code === 'ENOENT') { - if (path.dirname(pth) === pth) { - throw permissionError(pth); - } + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } - if (error.message.includes('null bytes')) { - throw error; - } + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } - return make(path.dirname(pth)).then(() => make(pth)); - } + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } - return stat(pth) - .then(stats => stats.isDirectory() ? pth : Promise.reject()) - .catch(() => { - throw error; - }); - }); - }; + function createReadStream (path, options) { + return new ReadStream(path, options) + } - return make(path.resolve(input)); -}); + function createWriteStream (path, options) { + return new WriteStream(path, options) + } -module.exports = makeDir; -module.exports.default = makeDir; + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null -module.exports.sync = (input, options) => { - checkPath(input); - options = Object.assign({}, defaults, options); + return go$open(path, flags, mode, cb) - if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) { - const pth = path.resolve(input); + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } - fs.mkdirSync(pth, { - mode: options.mode, - recursive: true - }); + return fs +} - return pth; - } +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + queue.push(elem) +} - const make = pth => { - try { - options.fs.mkdirSync(pth, options.mode); - } catch (error) { - if (error.code === 'EPERM') { - throw error; - } +function retry () { + var elem = queue.shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } +} - if (error.code === 'ENOENT') { - if (path.dirname(pth) === pth) { - throw permissionError(pth); - } - if (error.message.includes('null bytes')) { - throw error; - } +/***/ }), +/* 553 */ +/***/ (function(module, exports, __webpack_require__) { - make(path.dirname(pth)); - return make(pth); - } +var fs = __webpack_require__(554) +var constants = __webpack_require__(411) - try { - if (!options.fs.statSync(pth).isDirectory()) { - throw new Error('The path is not a directory'); - } - } catch (_) { - throw error; - } - } +var origCwd = process.cwd +var cwd = null - return pth; - }; +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - return make(path.resolve(input)); -}; +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +try { + process.cwd() +} catch (er) {} +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} -/***/ }), -/* 561 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports = patch -"use strict"; +function patch (fs) { + // (re-)implement some things that are known busted or missing. + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } -const processFn = (fn, options) => function (...args) { - const P = options.promiseModule; + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } - return new P((resolve, reject) => { - if (options.multiArgs) { - args.push((...result) => { - if (options.errorFirst) { - if (result[0]) { - reject(result); - } else { - result.shift(); - resolve(result); - } - } else { - resolve(result); - } - }); - } else if (options.errorFirst) { - args.push((error, result) => { - if (error) { - reject(error); - } else { - resolve(result); - } - }); - } else { - args.push(resolve); - } + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. - fn.apply(this, args); - }); -}; + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) -module.exports = (input, options) => { - options = Object.assign({ - exclude: [/.+(Sync|Stream)$/], - errorFirst: true, - promiseModule: Promise - }, options); + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) - const objType = typeof input; - if (!(input !== null && (objType === 'object' || objType === 'function'))) { - throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objType}\``); - } + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) - const filter = key => { - const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); - return options.include ? options.include.some(match) : !options.exclude.some(match); - }; + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) - let ret; - if (objType === 'function') { - ret = function (...args) { - return options.excludeMain ? input(...args) : processFn(input, options).apply(this, args); - }; - } else { - ret = Object.create(Object.getPrototypeOf(input)); - } + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) - for (const key in input) { // eslint-disable-line guard-for-in - const property = input[key]; - ret[key] = typeof property === 'function' && filter(key) ? processFn(property, options) : property; - } + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) - return ret; -}; + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) + } + fs.lchmodSync = function () {} + } + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) + } + fs.lchownSync = function () {} + } + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. -/***/ }), -/* 562 */ -/***/ (function(module, exports, __webpack_require__) { + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } -"use strict"; + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + }})(fs.read) + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) +} -// detect either spaces or tabs but not both to properly handle tabs -// for indentation and spaces for alignment -const INDENT_RE = /^(?:( )+|\t+)/; +function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } -function getMostUsed(indents) { - let result = 0; - let maxUsed = 0; - let maxWeight = 0; + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) - for (const entry of indents) { - // TODO: use destructuring when targeting Node.js 6 - const key = entry[0]; - const val = entry[1]; + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } +} - const u = val[0]; - const w = val[1]; +function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } - if (u > maxUsed || (u === maxUsed && w > maxWeight)) { - maxUsed = u; - maxWeight = w; - result = Number(key); - } - } + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } - return result; + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } } -module.exports = str => { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } +function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } +} - // used to see if tabs or spaces are the most used - let tabs = 0; - let spaces = 0; +function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} - // remember the size of previous line's indentation - let prev = 0; - // remember how many indents/unindents as occurred for a given size - // and how much lines follow a given indentation - // - // indents = { - // 3: [1, 0], - // 4: [1, 5], - // 5: [1, 0], - // 12: [1, 0], - // } - const indents = new Map(); +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } +} - // pointer to the array of last used indent - let current; +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} - // whether the last action was an indent (opposed to an unindent) - let isIndent; - for (const line of str.split(/\n/g)) { - if (!line) { - // ignore empty lines - continue; - } +function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, cb) { + return orig.call(fs, target, function (er, stats) { + if (!stats) return cb.apply(this, arguments) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + if (cb) cb.apply(this, arguments) + }) + } +} - let indent; - const matches = line.match(INDENT_RE); +function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target) { + var stats = orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; + } +} - if (matches) { - indent = matches[0].length; +// ENOSYS means that the fs doesn't support the op. Just ignore +// that, because it doesn't matter. +// +// if there's no getuid, or if getuid() is something other +// than 0, and the error is EINVAL or EPERM, then just ignore +// it. +// +// This specific case is a silent failure in cp, install, tar, +// and most other unix tools that manage permissions. +// +// When running as root, or if other types of errors are +// encountered, then it's strict. +function chownErOk (er) { + if (!er) + return true - if (matches[1]) { - spaces++; - } else { - tabs++; - } - } else { - indent = 0; - } + if (er.code === "ENOSYS") + return true - const diff = indent - prev; - prev = indent; + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } - if (diff) { - // an indent or unindent has been detected + return false +} - isIndent = diff > 0; - current = indents.get(isIndent ? diff : -diff); +/***/ }), +/* 554 */ +/***/ (function(module, exports, __webpack_require__) { - if (current) { - current[0]++; - } else { - current = [1, 0]; - indents.set(diff, current); - } - } else if (current) { - // if the last action was an indent, increment the weight - current[1] += Number(isIndent); - } - } +"use strict"; - const amount = getMostUsed(indents); - let type; - let indent; - if (!amount) { - type = null; - indent = ''; - } else if (spaces >= tabs) { - type = 'space'; - indent = ' '.repeat(amount); - } else { - type = 'tab'; - indent = '\t'.repeat(amount); - } +var fs = __webpack_require__(349) - return { - amount, - type, - indent - }; -}; +module.exports = clone(fs) +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj -/***/ }), -/* 563 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installInDir", function() { return installInDir; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackage", function() { return runScriptInPackage; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackageStreaming", function() { return runScriptInPackageStreaming; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yarnWorkspacesInfo", function() { return yarnWorkspacesInfo; }); -/* harmony import */ var _child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(564); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) + return copy +} -/** - * Install all dependencies in the given directory - */ -async function installInDir(directory, extraArgs = []) { - const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any - // given time (e.g. to avoid conflicts). - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', options, { - cwd: directory - }); -} -/** - * Run script in the given directory - */ +/***/ }), +/* 555 */ +/***/ (function(module, exports, __webpack_require__) { -async function runScriptInPackage(script, args, pkg) { - const execOpts = { - cwd: pkg.path - }; - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['run', script, ...args], execOpts); -} -/** - * Run script in the given directory - */ +var Stream = __webpack_require__(382).Stream -function runScriptInPackageStreaming(script, args, pkg) { - const execOpts = { - cwd: pkg.path - }; - return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])('yarn', ['run', script, ...args], execOpts, { - prefix: pkg.name - }); -} -async function yarnWorkspacesInfo(directory) { - const { - stdout - } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['--json', 'workspaces', 'info'], { - cwd: directory, - stdio: 'pipe' - }); +module.exports = legacy - try { - return JSON.parse(JSON.parse(stdout).data); - } catch (error) { - throw new Error(`'yarn workspaces info --json' produced unexpected output: \n${stdout}`); +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream } -} -/***/ }), -/* 564 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawn", function() { return spawn; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawnStreaming", function() { return spawnStreaming; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(371); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var log_symbols__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(565); -/* harmony import */ var log_symbols__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(log_symbols__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(570); -/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + Stream.call(this); -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + var self = this; -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; + options = options || {}; + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + if (this.encoding) this.setEncoding(this.encoding); + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); + } -function generateColors() { - const colorWheel = [chalk__WEBPACK_IMPORTED_MODULE_0___default.a.cyan, chalk__WEBPACK_IMPORTED_MODULE_0___default.a.magenta, chalk__WEBPACK_IMPORTED_MODULE_0___default.a.blue, chalk__WEBPACK_IMPORTED_MODULE_0___default.a.yellow, chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green]; - const count = colorWheel.length; - let children = 0; - return () => colorWheel[children++ % count]; -} + if (this.start > this.end) { + throw new Error('start must be <= end'); + } -function spawn(command, args, opts) { - return execa__WEBPACK_IMPORTED_MODULE_1___default()(command, args, _objectSpread({ - stdio: 'inherit', - preferLocal: true - }, opts)); -} -const nextColor = generateColors(); -function spawnStreaming(command, args, opts, { - prefix -}) { - const spawned = execa__WEBPACK_IMPORTED_MODULE_1___default()(command, args, _objectSpread({ - stdio: ['ignore', 'pipe', 'pipe'], - preferLocal: true - }, opts)); - const color = nextColor(); - const prefixedStdout = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ - tag: `${color.bold(prefix)}:` - }); - const prefixedStderr = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ - mergeMultiline: true, - tag: `${log_symbols__WEBPACK_IMPORTED_MODULE_2___default.a.error} ${color.bold(prefix)}:` - }); - spawned.stdout.pipe(prefixedStdout).pipe(process.stdout); - spawned.stderr.pipe(prefixedStderr).pipe(process.stderr); - return spawned; -} + this.pos = this.start; + } -/***/ }), -/* 565 */ -/***/ (function(module, exports, __webpack_require__) { + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } -"use strict"; + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } -const chalk = __webpack_require__(566); + self.fd = fd; + self.emit('open', fd); + self._read(); + }) + } -const isSupported = process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); -const main = { - info: chalk.blue('ℹ'), - success: chalk.green('✔'), - warning: chalk.yellow('⚠'), - error: chalk.red('✖') -}; + Stream.call(this); -const fallbacks = { - info: chalk.blue('i'), - success: chalk.green('√'), - warning: chalk.yellow('‼'), - error: chalk.red('×') -}; + this.path = path; + this.fd = null; + this.writable = true; -module.exports = isSupported ? main : fallbacks; + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; + options = options || {}; -/***/ }), -/* 566 */ -/***/ (function(module, exports, __webpack_require__) { + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } -"use strict"; + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } -const escapeStringRegexp = __webpack_require__(3); -const ansiStyles = __webpack_require__(567); -const stdoutColor = __webpack_require__(568).stdout; + this.pos = this.start; + } -const template = __webpack_require__(569); + this.busy = false; + this._queue = []; -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); + } + } +} -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); +/***/ }), +/* 556 */ +/***/ (function(module, exports, __webpack_require__) { -const styles = Object.create(null); +/** + * @preserve + * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) + * + * @author Jens Taylor + * @see http://github.com/homebrewing/brauhaus-diff + * @author Gary Court + * @see http://github.com/garycourt/murmurhash-js + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + */ +(function(){ + var cache; -function applyOptions(obj, options) { - options = options || {}; + // Call this function without `new` to use the cached object (good for + // single-threaded environments), or with `new` to create a new object. + // + // @param {string} key A UTF-16 or ASCII string + // @param {number} seed An optional positive integer + // @return {object} A MurmurHash3 object for incremental hashing + function MurmurHash3(key, seed) { + var m = this instanceof MurmurHash3 ? this : cache; + m.reset(seed) + if (typeof key === 'string' && key.length > 0) { + m.hash(key); + } - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} + if (m !== this) { + return m; + } + }; -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); + // Incrementally add a string to this hash + // + // @param {string} key A UTF-16 or ASCII string + // @return {object} this + MurmurHash3.prototype.hash = function(key) { + var h1, k1, i, top, len; - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; + len = key.length; + this.len += len; - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + k1 = this.k1; + i = 0; + switch (this.rem) { + case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0; + case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0; + case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0; + case 3: + k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0; + k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0; + } - chalk.template.constructor = Chalk; + this.rem = (len + this.rem) & 3; // & 3 is same as % 4 + len -= this.rem; + if (len > 0) { + h1 = this.h1; + while (1) { + k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - return chalk.template; - } + h1 ^= k1; + h1 = (h1 << 13) | (h1 >>> 19); + h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff; - applyOptions(this, options); -} + if (i >= len) { + break; + } -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; -} + k1 = ((key.charCodeAt(i++) & 0xffff)) ^ + ((key.charCodeAt(i++) & 0xffff) << 8) ^ + ((key.charCodeAt(i++) & 0xffff) << 16); + top = key.charCodeAt(i++); + k1 ^= ((top & 0xff) << 24) ^ + ((top & 0xff00) >> 8); + } -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + k1 = 0; + switch (this.rem) { + case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16; + case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8; + case 1: k1 ^= (key.charCodeAt(i) & 0xffff); + } - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); - } - }; -} + this.h1 = h1; + } -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); - } -}; + this.k1 = k1; + return this; + }; -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } + // Get the result of this hash + // + // @return {number} The 32-bit hash + MurmurHash3.prototype.result = function() { + var k1, h1; + + k1 = this.k1; + h1 = this.h1; - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} + if (k1 > 0) { + k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; + h1 ^= k1; + } -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } + h1 ^= this.len; + + h1 ^= h1 >>> 16; + h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff; + h1 ^= h1 >>> 13; + h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff; + h1 ^= h1 >>> 16; - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} + return h1 >>> 0; + }; -const proto = Object.defineProperties(() => {}, styles); + // Reset the hash object for reuse + // + // @param {number} seed An optional positive integer + MurmurHash3.prototype.reset = function(seed) { + this.h1 = typeof seed === 'number' ? seed : 0; + this.rem = this.k1 = this.len = 0; + return this; + }; -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; + // A cached object to use. This can be safely used if you're in a single- + // threaded environment, otherwise you need to create new hashes to use. + cache = new MurmurHash3(); - builder._styles = _styles; - builder._empty = _empty; + if (true) { + module.exports = MurmurHash3; + } else {} +}()); - const self = this; - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); +/***/ }), +/* 557 */ +/***/ (function(module, exports) { - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); +module.exports = require(undefined); - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; +/***/ }), +/* 558 */ +/***/ (function(module, exports, __webpack_require__) { - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto +"use strict"; - return builder; -} +const isPlainObj = __webpack_require__(559); -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); +module.exports = (obj, opts) => { + if (!isPlainObj(obj)) { + throw new TypeError('Expected a plain object'); + } - if (argsLen === 0) { - return ''; + opts = opts || {}; + + // DEPRECATED + if (typeof opts === 'function') { + throw new TypeError('Specify the compare function as an option instead'); } - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; + const deep = opts.deep; + const seenInput = []; + const seenOutput = []; + + const sortKeys = x => { + const seenIndex = seenInput.indexOf(x); + + if (seenIndex !== -1) { + return seenOutput[seenIndex]; } - } - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + const ret = {}; + const keys = Object.keys(x).sort(opts.compare); - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + seenInput.push(x); + seenOutput.push(ret); - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = x[key]; - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); - } + if (deep && Array.isArray(val)) { + const retArr = []; - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + for (let j = 0; j < val.length; j++) { + retArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j]; + } - return str; -} + ret[key] = retArr; + continue; + } -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } + ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val; + } - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + return ret; + }; - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } + return sortKeys(obj); +}; - return template(chalk, parts.join('')); -} -Object.defineProperties(Chalk.prototype, styles); +/***/ }), +/* 559 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript +"use strict"; + +var toString = Object.prototype.toString; + +module.exports = function (x) { + var prototype; + return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); +}; /***/ }), -/* 567 */ +/* 560 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(6); -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const pify = __webpack_require__(561); +const semver = __webpack_require__(523); + +const defaults = { + mode: 0o777 & (~process.umask()), + fs }; -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; +const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); + +// https://github.com/nodejs/node/issues/8987 +// https://github.com/libuv/libuv/pull/1088 +const checkPath = pth => { + if (process.platform === 'win32') { + const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')); + + if (pathHasInvalidWinCharacters) { + const error = new Error(`Path contains invalid characters: ${pth}`); + error.code = 'EINVAL'; + throw error; + } + } }; -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +const permissionError = pth => { + // This replicates the exception of `fs.mkdir` with native the + // `recusive` option when run on an invalid drive under Windows. + const error = new Error(`operation not permitted, mkdir '${pth}'`); + error.code = 'EPERM'; + error.errno = -4048; + error.path = pth; + error.syscall = 'mkdir'; + return error; }; -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], +const makeDir = (input, options) => Promise.resolve().then(() => { + checkPath(input); + options = Object.assign({}, defaults, options); - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], + // TODO: Use util.promisify when targeting Node.js 8 + const mkdir = pify(options.fs.mkdir); + const stat = pify(options.fs.stat); - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; + if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) { + const pth = path.resolve(input); - // Fix humans - styles.color.grey = styles.color.gray; + return mkdir(pth, { + mode: options.mode, + recursive: true + }).then(() => pth); + } - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; + const make = pth => { + return mkdir(pth, options.mode) + .then(() => pth) + .catch(error => { + if (error.code === 'EPERM') { + throw error; + } - for (const styleName of Object.keys(group)) { - const style = group[styleName]; + if (error.code === 'ENOENT') { + if (path.dirname(pth) === pth) { + throw permissionError(pth); + } - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; + if (error.message.includes('null bytes')) { + throw error; + } - group[styleName] = styles[styleName]; + return make(path.dirname(pth)).then(() => make(pth)); + } - codes.set(style[0], style[1]); - } + return stat(pth) + .then(stats => stats.isDirectory() ? pth : Promise.reject()) + .catch(() => { + throw error; + }); + }); + }; - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); + return make(path.resolve(input)); +}); - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false +module.exports = makeDir; +module.exports.default = makeDir; + +module.exports.sync = (input, options) => { + checkPath(input); + options = Object.assign({}, defaults, options); + + if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) { + const pth = path.resolve(input); + + fs.mkdirSync(pth, { + mode: options.mode, + recursive: true }); + + return pth; } - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; + const make = pth => { + try { + options.fs.mkdirSync(pth, options.mode); + } catch (error) { + if (error.code === 'EPERM') { + throw error; + } - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; + if (error.code === 'ENOENT') { + if (path.dirname(pth) === pth) { + throw permissionError(pth); + } - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; + if (error.message.includes('null bytes')) { + throw error; + } - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; + make(path.dirname(pth)); + return make(pth); + } - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; + try { + if (!options.fs.statSync(pth).isDirectory()) { + throw new Error('The path is not a directory'); + } + } catch (_) { + throw error; + } } - const suite = colorConvert[key]; + return pth; + }; - if (key === 'ansi16') { - key = 'ansi'; - } + return make(path.resolve(input)); +}; - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } +/***/ }), +/* 561 */ +/***/ (function(module, exports, __webpack_require__) { - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); +"use strict"; + + +const processFn = (fn, options) => function (...args) { + const P = options.promiseModule; + + return new P((resolve, reject) => { + if (options.multiArgs) { + args.push((...result) => { + if (options.errorFirst) { + if (result[0]) { + reject(result); + } else { + result.shift(); + resolve(result); + } + } else { + resolve(result); + } + }); + } else if (options.errorFirst) { + args.push((error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); + } else { + args.push(resolve); } + + fn.apply(this, args); + }); +}; + +module.exports = (input, options) => { + options = Object.assign({ + exclude: [/.+(Sync|Stream)$/], + errorFirst: true, + promiseModule: Promise + }, options); + + const objType = typeof input; + if (!(input !== null && (objType === 'object' || objType === 'function'))) { + throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objType}\``); } - return styles; -} + const filter = key => { + const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); + return options.include ? options.include.some(match) : !options.exclude.some(match); + }; -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); + let ret; + if (objType === 'function') { + ret = function (...args) { + return options.excludeMain ? input(...args) : processFn(input, options).apply(this, args); + }; + } else { + ret = Object.create(Object.getPrototypeOf(input)); + } + + for (const key in input) { // eslint-disable-line guard-for-in + const property = input[key]; + ret[key] = typeof property === 'function' && filter(key) ? processFn(property, options) : property; + } + + return ret; +}; -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) /***/ }), -/* 568 */ +/* 562 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); -const env = process.env; +// detect either spaces or tabs but not both to properly handle tabs +// for indentation and spaces for alignment +const INDENT_RE = /^(?:( )+|\t+)/; -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} +function getMostUsed(indents) { + let result = 0; + let maxUsed = 0; + let maxWeight = 0; -function translateLevel(level) { - if (level === 0) { - return false; + for (const entry of indents) { + // TODO: use destructuring when targeting Node.js 6 + const key = entry[0]; + const val = entry[1]; + + const u = val[0]; + const w = val[1]; + + if (u > maxUsed || (u === maxUsed && w > maxWeight)) { + maxUsed = u; + maxWeight = w; + result = Number(key); + } } - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; + return result; } -function supportsColor(stream) { - if (forceColor === false) { - return 0; +module.exports = str => { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); } - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } + // used to see if tabs or spaces are the most used + let tabs = 0; + let spaces = 0; - if (hasFlag('color=256')) { - return 2; - } + // remember the size of previous line's indentation + let prev = 0; - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } + // remember how many indents/unindents as occurred for a given size + // and how much lines follow a given indentation + // + // indents = { + // 3: [1, 0], + // 4: [1, 5], + // 5: [1, 0], + // 12: [1, 0], + // } + const indents = new Map(); - const min = forceColor ? 1 : 0; + // pointer to the array of last used indent + let current; - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; + // whether the last action was an indent (opposed to an unindent) + let isIndent; + + for (const line of str.split(/\n/g)) { + if (!line) { + // ignore empty lines + continue; } - return 1; - } + let indent; + const matches = line.match(INDENT_RE); - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; + if (matches) { + indent = matches[0].length; + + if (matches[1]) { + spaces++; + } else { + tabs++; + } + } else { + indent = 0; } - return min; - } + const diff = indent - prev; + prev = indent; - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } + if (diff) { + // an indent or unindent has been detected - if (env.COLORTERM === 'truecolor') { - return 3; - } + isIndent = diff > 0; - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + current = indents.get(isIndent ? diff : -diff); - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default + if (current) { + current[0]++; + } else { + current = [1, 0]; + indents.set(diff, current); + } + } else if (current) { + // if the last action was an indent, increment the weight + current[1] += Number(isIndent); } } - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } - - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - - if ('COLORTERM' in env) { - return 1; - } + const amount = getMostUsed(indents); - if (env.TERM === 'dumb') { - return min; + let type; + let indent; + if (!amount) { + type = null; + indent = ''; + } else if (spaces >= tabs) { + type = 'space'; + indent = ' '.repeat(amount); + } else { + type = 'tab'; + indent = '\t'.repeat(amount); } - return min; -} - -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} - -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) + return { + amount, + type, + indent + }; }; /***/ }), -/* 569 */ -/***/ (function(module, exports, __webpack_require__) { +/* 563 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installInDir", function() { return installInDir; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackage", function() { return runScriptInPackage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackageStreaming", function() { return runScriptInPackageStreaming; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yarnWorkspacesInfo", function() { return yarnWorkspacesInfo; }); +/* harmony import */ var _child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(564); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; - -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); - } +/** + * Install all dependencies in the given directory + */ +async function installInDir(directory, extraArgs = []) { + const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any + // given time (e.g. to avoid conflicts). - return ESCAPES.get(c) || c; + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', options, { + cwd: directory + }); } +/** + * Run script in the given directory + */ -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; +async function runScriptInPackage(script, args, pkg) { + const execOpts = { + cwd: pkg.path + }; + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['run', script, ...args], execOpts); +} +/** + * Run script in the given directory + */ - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } +function runScriptInPackageStreaming({ + script, + args, + pkg, + debug +}) { + const execOpts = { + cwd: pkg.path + }; + return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])('yarn', ['run', script, ...args], execOpts, { + prefix: pkg.name, + debug + }); +} +async function yarnWorkspacesInfo(directory) { + const { + stdout + } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['--json', 'workspaces', 'info'], { + cwd: directory, + stdio: 'pipe' + }); - return results; + try { + return JSON.parse(JSON.parse(stdout).data); + } catch (error) { + throw new Error(`'yarn workspaces info --json' produced unexpected output: \n${stdout}`); + } } -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; +/***/ }), +/* 564 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const results = []; - let matches; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawn", function() { return spawn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawnStreaming", function() { return spawnStreaming; }); +/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(382); +/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stream__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(386); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(342); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(565); +/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(500); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - return results; -} +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ -function buildStyle(chalk, styles) { - const enabled = {}; - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } - return current; -} +const colorWheel = [chalk__WEBPACK_IMPORTED_MODULE_1___default.a.cyan, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.magenta, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.blue, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.yellow, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.green]; -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; +const getColor = () => { + const color = colorWheel.shift(); + colorWheel.push(color); + return color; +}; - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } +function spawn(command, args, opts) { + return execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ + stdio: 'inherit', + preferLocal: true + }, opts)); +} - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); +function streamToLog(debug = true) { + return new stream__WEBPACK_IMPORTED_MODULE_0__["Writable"]({ + objectMode: true, - chunks.push(chunk.join('')); + write(line, _, cb) { + if (line.endsWith('\n')) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line.slice(0, -1)); + } else { + _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line); + } - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } + cb(); + } - return chunks.join(''); -}; + }); +} +function spawnStreaming(command, args, opts, { + prefix, + debug +}) { + const spawned = execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ + stdio: ['ignore', 'pipe', 'pipe'], + preferLocal: true + }, opts)); + const color = getColor(); + const prefixedStdout = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ + tag: color.bold(prefix) + }); + const prefixedStderr = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ + mergeMultiline: true, + tag: color.bold(prefix) + }); + spawned.stdout.pipe(prefixedStdout).pipe(streamToLog(debug)); + spawned.stderr.pipe(prefixedStderr).pipe(streamToLog(debug)); + return spawned; +} /***/ }), -/* 570 */ +/* 565 */ /***/ (function(module, exports, __webpack_require__) { // Copyright IBM Corp. 2014,2018. All Rights Reserved. @@ -56063,12 +55405,12 @@ module.exports = (chalk, tmp) => { // This file is licensed under the Apache License 2.0. // License text available at https://opensource.org/licenses/Apache-2.0 -module.exports = __webpack_require__(571); -module.exports.cli = __webpack_require__(575); +module.exports = __webpack_require__(566); +module.exports.cli = __webpack_require__(570); /***/ }), -/* 571 */ +/* 566 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56079,13 +55421,13 @@ module.exports.cli = __webpack_require__(575); -var stream = __webpack_require__(27); -var util = __webpack_require__(29); -var fs = __webpack_require__(23); +var stream = __webpack_require__(382); +var util = __webpack_require__(397); +var fs = __webpack_require__(349); -var through = __webpack_require__(572); -var duplexer = __webpack_require__(573); -var StringDecoder = __webpack_require__(574).StringDecoder; +var through = __webpack_require__(567); +var duplexer = __webpack_require__(568); +var StringDecoder = __webpack_require__(569).StringDecoder; module.exports = Logger; @@ -56274,10 +55616,10 @@ function lineMerger(host) { /***/ }), -/* 572 */ +/* 567 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(27) +var Stream = __webpack_require__(382) // through // @@ -56388,10 +55730,10 @@ function through (write, end, opts) { /***/ }), -/* 573 */ +/* 568 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(27) +var Stream = __webpack_require__(382) var writeMethods = ["write", "end", "destroy"] var readMethods = ["resume", "pause"] var readEvents = ["data", "close"] @@ -56481,13 +55823,13 @@ function duplex(writer, reader) { /***/ }), -/* 574 */ +/* 569 */ /***/ (function(module, exports) { module.exports = require("string_decoder"); /***/ }), -/* 575 */ +/* 570 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56498,11 +55840,11 @@ module.exports = require("string_decoder"); -var minimist = __webpack_require__(576); -var path = __webpack_require__(16); +var minimist = __webpack_require__(571); +var path = __webpack_require__(4); -var Logger = __webpack_require__(571); -var pkg = __webpack_require__(577); +var Logger = __webpack_require__(566); +var pkg = __webpack_require__(572); module.exports = cli; @@ -56556,7 +55898,7 @@ function usage($0, p) { /***/ }), -/* 576 */ +/* 571 */ /***/ (function(module, exports) { module.exports = function (args, opts) { @@ -56798,13 +56140,13 @@ function isNumber (x) { /***/ }), -/* 577 */ +/* 572 */ /***/ (function(module) { module.exports = JSON.parse("{\"name\":\"strong-log-transformer\",\"version\":\"2.1.0\",\"description\":\"Stream transformer that prefixes lines with timestamps and other things.\",\"author\":\"Ryan Graham \",\"license\":\"Apache-2.0\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/strongloop/strong-log-transformer\"},\"keywords\":[\"logging\",\"streams\"],\"bugs\":{\"url\":\"https://github.com/strongloop/strong-log-transformer/issues\"},\"homepage\":\"https://github.com/strongloop/strong-log-transformer\",\"directories\":{\"test\":\"test\"},\"bin\":{\"sl-log-transformer\":\"bin/sl-log-transformer.js\"},\"main\":\"index.js\",\"scripts\":{\"test\":\"tap --100 test/test-*\"},\"dependencies\":{\"duplexer\":\"^0.1.1\",\"minimist\":\"^1.2.0\",\"through\":\"^2.3.4\"},\"devDependencies\":{\"tap\":\"^12.0.1\"},\"engines\":{\"node\":\">=4\"}}"); /***/ }), -/* 578 */ +/* 573 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56813,12 +56155,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyWorkspacePackages", function() { return copyWorkspacePackages; }); /* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(503); /* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(397); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(579); -/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(574); +/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(491); /* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(518); /* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(502); /* @@ -56912,13 +56254,13 @@ function packagesFromGlobPattern({ } /***/ }), -/* 579 */ +/* 574 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getProjectPaths", function() { return getProjectPaths; }); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); /* * Licensed to Elasticsearch B.V. under one or more contributor @@ -56982,21 +56324,21 @@ function getProjectPaths({ } /***/ }), -/* 580 */ +/* 575 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAllChecksums", function() { return getAllChecksums; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(23); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(349); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(581); +/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(576); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(397); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(371); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(342); /* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(582); +/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(577); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -57225,21 +56567,21 @@ async function getAllChecksums(kbn, log) { } /***/ }), -/* 581 */ +/* 576 */ /***/ (function(module, exports) { module.exports = require("crypto"); /***/ }), -/* 582 */ +/* 577 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readYarnLock", function() { return readYarnLock; }); -/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(583); +/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(578); /* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(491); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -57281,7 +56623,7 @@ async function readYarnLock(kbn) { } /***/ }), -/* 583 */ +/* 578 */ /***/ (function(module, exports, __webpack_require__) { module.exports = @@ -57357,7 +56699,7 @@ module.exports = /* 0 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(16); +module.exports = __webpack_require__(4); /***/ }), /* 1 */ @@ -57407,13 +56749,13 @@ exports.default = function (fn) { /* 2 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(29); +module.exports = __webpack_require__(397); /***/ }), /* 3 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(23); +module.exports = __webpack_require__(349); /***/ }), /* 4 */ @@ -58840,7 +58182,7 @@ module.exports = invariant; /* 9 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(581); +module.exports = __webpack_require__(576); /***/ }), /* 10 */, @@ -59266,7 +58608,7 @@ exports.default = Lockfile; /* 17 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(27); +module.exports = __webpack_require__(382); /***/ }), /* 18 */, @@ -59318,7 +58660,7 @@ function nullify(obj = {}) { /* 22 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(30); +module.exports = __webpack_require__(371); /***/ }), /* 23 */ @@ -59505,7 +58847,7 @@ module.exports = {}; /* 36 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(11); +module.exports = __webpack_require__(364); /***/ }), /* 37 */, @@ -59790,7 +59132,7 @@ exports.f = __webpack_require__(33) ? Object.defineProperty : function definePro /* 54 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(399); +module.exports = __webpack_require__(373); /***/ }), /* 55 */ @@ -61164,7 +60506,7 @@ function onceStrict (fn) { /* 63 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(584); +module.exports = __webpack_require__(579); /***/ }), /* 64 */, @@ -62102,7 +61444,7 @@ module.exports.win32 = win32; /* 79 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(484); +module.exports = __webpack_require__(471); /***/ }), /* 80 */, @@ -67559,21 +66901,21 @@ module.exports = process && support(supportLevel); /******/ ]); /***/ }), -/* 584 */ +/* 579 */ /***/ (function(module, exports) { module.exports = require("buffer"); /***/ }), -/* 585 */ +/* 580 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCacheFile", function() { return BootstrapCacheFile; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(23); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(349); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } @@ -67662,22 +67004,20 @@ class BootstrapCacheFile { } /***/ }), -/* 586 */ +/* 581 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CleanCommand", function() { return CleanCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(587); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(675); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(582); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(670); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(491); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(500); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -67701,7 +67041,6 @@ __webpack_require__.r(__webpack_exports__); - const CleanCommand = { description: 'Remove the node_modules and target directories from all projects.', name: 'clean', @@ -67710,17 +67049,17 @@ const CleanCommand = { const toDelete = []; for (const project of projects.values()) { - if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isDirectory"])(project.nodeModulesLocation)) { + if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_3__["isDirectory"])(project.nodeModulesLocation)) { toDelete.push({ cwd: project.path, - pattern: Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(project.path, project.nodeModulesLocation) + pattern: Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(project.path, project.nodeModulesLocation) }); } - if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isDirectory"])(project.targetLocation)) { + if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_3__["isDirectory"])(project.targetLocation)) { toDelete.push({ cwd: project.path, - pattern: Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(project.path, project.targetLocation) + pattern: Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(project.path, project.targetLocation) }); } @@ -67737,9 +67076,8 @@ const CleanCommand = { } if (toDelete.length === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold.green('\n\nNothing to delete')); + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].success('Nothing to delete'); } else { - _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold.red('\n\nDeleting:\n')); /** * In order to avoid patterns like `/build` in packages from accidentally * impacting files outside the package we use `process.chdir()` to change @@ -67749,7 +67087,6 @@ const CleanCommand = { * `del()` does support a `cwd` option, but it's only for resolving the * patterns and does not impact the cwd check. */ - const originalCwd = process.cwd(); try { @@ -67758,8 +67095,12 @@ const CleanCommand = { cwd } of toDelete) { process.chdir(cwd); - const promise = del__WEBPACK_IMPORTED_MODULE_1___default()(pattern); - ora__WEBPACK_IMPORTED_MODULE_2___default.a.promise(promise, Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(originalCwd, Object(path__WEBPACK_IMPORTED_MODULE_3__["join"])(cwd, String(pattern)))); + const promise = del__WEBPACK_IMPORTED_MODULE_0___default()(pattern); + + if (_utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].wouldLogLevel('info')) { + ora__WEBPACK_IMPORTED_MODULE_1___default.a.promise(promise, Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(originalCwd, Object(path__WEBPACK_IMPORTED_MODULE_2__["join"])(cwd, String(pattern)))); + } + await promise; } } finally { @@ -67771,21 +67112,21 @@ const CleanCommand = { }; /***/ }), -/* 587 */ +/* 582 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {promisify} = __webpack_require__(29); -const path = __webpack_require__(16); -const globby = __webpack_require__(588); -const isGlob = __webpack_require__(605); -const slash = __webpack_require__(666); -const gracefulFs = __webpack_require__(22); -const isPathCwd = __webpack_require__(668); -const isPathInside = __webpack_require__(669); -const rimraf = __webpack_require__(670); -const pMap = __webpack_require__(671); +const {promisify} = __webpack_require__(397); +const path = __webpack_require__(4); +const globby = __webpack_require__(583); +const isGlob = __webpack_require__(600); +const slash = __webpack_require__(661); +const gracefulFs = __webpack_require__(493); +const isPathCwd = __webpack_require__(663); +const isPathInside = __webpack_require__(664); +const rimraf = __webpack_require__(665); +const pMap = __webpack_require__(666); const rimrafP = promisify(rimraf); @@ -67899,19 +67240,19 @@ module.exports.sync = (patterns, {force, dryRun, cwd = process.cwd(), ...options /***/ }), -/* 588 */ +/* 583 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const arrayUnion = __webpack_require__(589); -const merge2 = __webpack_require__(590); -const glob = __webpack_require__(591); -const fastGlob = __webpack_require__(596); -const dirGlob = __webpack_require__(662); -const gitignore = __webpack_require__(664); -const {FilterStream, UniqueStream} = __webpack_require__(667); +const fs = __webpack_require__(349); +const arrayUnion = __webpack_require__(584); +const merge2 = __webpack_require__(585); +const glob = __webpack_require__(586); +const fastGlob = __webpack_require__(591); +const dirGlob = __webpack_require__(657); +const gitignore = __webpack_require__(659); +const {FilterStream, UniqueStream} = __webpack_require__(662); const DEFAULT_FILTER = () => false; @@ -68084,7 +67425,7 @@ module.exports.gitignore = gitignore; /***/ }), -/* 589 */ +/* 584 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68096,7 +67437,7 @@ module.exports = (...arguments_) => { /***/ }), -/* 590 */ +/* 585 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68108,7 +67449,7 @@ module.exports = (...arguments_) => { * Copyright (c) 2014-2016 Teambition * Licensed under the MIT license. */ -const Stream = __webpack_require__(27) +const Stream = __webpack_require__(382) const PassThrough = Stream.PassThrough const slice = Array.prototype.slice @@ -68210,7 +67551,7 @@ function pauseStreams (streams, options) { /***/ }), -/* 591 */ +/* 586 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -68255,27 +67596,27 @@ function pauseStreams (streams, options) { module.exports = glob -var fs = __webpack_require__(23) +var fs = __webpack_require__(349) var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(592) -var EE = __webpack_require__(399).EventEmitter -var path = __webpack_require__(16) -var assert = __webpack_require__(30) +var inherits = __webpack_require__(587) +var EE = __webpack_require__(373).EventEmitter +var path = __webpack_require__(4) +var assert = __webpack_require__(371) var isAbsolute = __webpack_require__(512) -var globSync = __webpack_require__(594) -var common = __webpack_require__(595) +var globSync = __webpack_require__(589) +var common = __webpack_require__(590) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp var inflight = __webpack_require__(515) -var util = __webpack_require__(29) +var util = __webpack_require__(397) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(404) +var once = __webpack_require__(378) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -69006,22 +68347,22 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 592 */ +/* 587 */ /***/ (function(module, exports, __webpack_require__) { try { - var util = __webpack_require__(29); + var util = __webpack_require__(397); /* istanbul ignore next */ if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(593); + module.exports = __webpack_require__(588); } /***/ }), -/* 593 */ +/* 588 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -69054,22 +68395,22 @@ if (typeof Object.create === 'function') { /***/ }), -/* 594 */ +/* 589 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(23) +var fs = __webpack_require__(349) var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(591).Glob -var util = __webpack_require__(29) -var path = __webpack_require__(16) -var assert = __webpack_require__(30) +var Glob = __webpack_require__(586).Glob +var util = __webpack_require__(397) +var path = __webpack_require__(4) +var assert = __webpack_require__(371) var isAbsolute = __webpack_require__(512) -var common = __webpack_require__(595) +var common = __webpack_require__(590) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -69546,7 +68887,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 595 */ +/* 590 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -69563,7 +68904,7 @@ function ownProp (obj, field) { return Object.prototype.hasOwnProperty.call(obj, field) } -var path = __webpack_require__(16) +var path = __webpack_require__(4) var minimatch = __webpack_require__(506) var isAbsolute = __webpack_require__(512) var Minimatch = minimatch.Minimatch @@ -69792,17 +69133,17 @@ function childrenIgnored (self, path) { /***/ }), -/* 596 */ +/* 591 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const taskManager = __webpack_require__(597); -const async_1 = __webpack_require__(625); -const stream_1 = __webpack_require__(658); -const sync_1 = __webpack_require__(659); -const settings_1 = __webpack_require__(661); -const utils = __webpack_require__(598); +const taskManager = __webpack_require__(592); +const async_1 = __webpack_require__(620); +const stream_1 = __webpack_require__(653); +const sync_1 = __webpack_require__(654); +const settings_1 = __webpack_require__(656); +const utils = __webpack_require__(593); function FastGlob(source, options) { try { assertPatternsInput(source); @@ -69860,13 +69201,13 @@ module.exports = FastGlob; /***/ }), -/* 597 */ +/* 592 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); +const utils = __webpack_require__(593); function generate(patterns, settings) { const positivePatterns = getPositivePatterns(patterns); const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); @@ -69934,28 +69275,28 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 598 */ +/* 593 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const array = __webpack_require__(599); +const array = __webpack_require__(594); exports.array = array; -const errno = __webpack_require__(600); +const errno = __webpack_require__(595); exports.errno = errno; -const fs = __webpack_require__(601); +const fs = __webpack_require__(596); exports.fs = fs; -const path = __webpack_require__(602); +const path = __webpack_require__(597); exports.path = path; -const pattern = __webpack_require__(603); +const pattern = __webpack_require__(598); exports.pattern = pattern; -const stream = __webpack_require__(624); +const stream = __webpack_require__(619); exports.stream = stream; /***/ }), -/* 599 */ +/* 594 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69968,7 +69309,7 @@ exports.flatten = flatten; /***/ }), -/* 600 */ +/* 595 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69981,7 +69322,7 @@ exports.isEnoentCodeError = isEnoentCodeError; /***/ }), -/* 601 */ +/* 596 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70006,13 +69347,13 @@ exports.createDirentFromStats = createDirentFromStats; /***/ }), -/* 602 */ +/* 597 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); +const path = __webpack_require__(4); /** * Designed to work only with simple paths: `dir\\file`. */ @@ -70027,16 +69368,16 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 603 */ +/* 598 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const globParent = __webpack_require__(604); -const isGlob = __webpack_require__(605); -const micromatch = __webpack_require__(607); +const path = __webpack_require__(4); +const globParent = __webpack_require__(599); +const isGlob = __webpack_require__(600); +const micromatch = __webpack_require__(602); const GLOBSTAR = '**'; function isStaticPattern(pattern) { return !isDynamicPattern(pattern); @@ -70125,15 +69466,15 @@ exports.matchAny = matchAny; /***/ }), -/* 604 */ +/* 599 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isGlob = __webpack_require__(605); -var pathPosixDirname = __webpack_require__(16).posix.dirname; -var isWin32 = __webpack_require__(11).platform() === 'win32'; +var isGlob = __webpack_require__(600); +var pathPosixDirname = __webpack_require__(4).posix.dirname; +var isWin32 = __webpack_require__(364).platform() === 'win32'; var slash = '/'; var backslash = /\\/g; @@ -70166,7 +69507,7 @@ module.exports = function globParent(str) { /***/ }), -/* 605 */ +/* 600 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -70176,7 +69517,7 @@ module.exports = function globParent(str) { * Released under the MIT License. */ -var isExtglob = __webpack_require__(606); +var isExtglob = __webpack_require__(601); var chars = { '{': '}', '(': ')', '[': ']'}; var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; @@ -70220,7 +69561,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 606 */ +/* 601 */ /***/ (function(module, exports) { /*! @@ -70246,16 +69587,16 @@ module.exports = function isExtglob(str) { /***/ }), -/* 607 */ +/* 602 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const util = __webpack_require__(29); -const braces = __webpack_require__(608); -const picomatch = __webpack_require__(618); -const utils = __webpack_require__(621); +const util = __webpack_require__(397); +const braces = __webpack_require__(603); +const picomatch = __webpack_require__(613); +const utils = __webpack_require__(616); const isEmptyString = val => typeof val === 'string' && (val === '' || val === './'); /** @@ -70720,16 +70061,16 @@ module.exports = micromatch; /***/ }), -/* 608 */ +/* 603 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const stringify = __webpack_require__(609); -const compile = __webpack_require__(611); -const expand = __webpack_require__(615); -const parse = __webpack_require__(616); +const stringify = __webpack_require__(604); +const compile = __webpack_require__(606); +const expand = __webpack_require__(610); +const parse = __webpack_require__(611); /** * Expand the given pattern or create a regex-compatible string. @@ -70897,13 +70238,13 @@ module.exports = braces; /***/ }), -/* 609 */ +/* 604 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(610); +const utils = __webpack_require__(605); module.exports = (ast, options = {}) => { let stringify = (node, parent = {}) => { @@ -70936,7 +70277,7 @@ module.exports = (ast, options = {}) => { /***/ }), -/* 610 */ +/* 605 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71055,14 +70396,14 @@ exports.flatten = (...args) => { /***/ }), -/* 611 */ +/* 606 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fill = __webpack_require__(612); -const utils = __webpack_require__(610); +const fill = __webpack_require__(607); +const utils = __webpack_require__(605); const compile = (ast, options = {}) => { let walk = (node, parent = {}) => { @@ -71119,7 +70460,7 @@ module.exports = compile; /***/ }), -/* 612 */ +/* 607 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71132,8 +70473,8 @@ module.exports = compile; -const util = __webpack_require__(29); -const toRegexRange = __webpack_require__(613); +const util = __webpack_require__(397); +const toRegexRange = __webpack_require__(608); const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); @@ -71375,7 +70716,7 @@ module.exports = fill; /***/ }), -/* 613 */ +/* 608 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71388,7 +70729,7 @@ module.exports = fill; -const isNumber = __webpack_require__(614); +const isNumber = __webpack_require__(609); const toRegexRange = (min, max, options) => { if (isNumber(min) === false) { @@ -71670,7 +71011,7 @@ module.exports = toRegexRange; /***/ }), -/* 614 */ +/* 609 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71695,15 +71036,15 @@ module.exports = function(num) { /***/ }), -/* 615 */ +/* 610 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fill = __webpack_require__(612); -const stringify = __webpack_require__(609); -const utils = __webpack_require__(610); +const fill = __webpack_require__(607); +const stringify = __webpack_require__(604); +const utils = __webpack_require__(605); const append = (queue = '', stash = '', enclose = false) => { let result = []; @@ -71815,13 +71156,13 @@ module.exports = expand; /***/ }), -/* 616 */ +/* 611 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const stringify = __webpack_require__(609); +const stringify = __webpack_require__(604); /** * Constants @@ -71843,7 +71184,7 @@ const { CHAR_SINGLE_QUOTE, /* ' */ CHAR_NO_BREAK_SPACE, CHAR_ZERO_WIDTH_NOBREAK_SPACE -} = __webpack_require__(617); +} = __webpack_require__(612); /** * parse @@ -72155,7 +71496,7 @@ module.exports = parse; /***/ }), -/* 617 */ +/* 612 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -72219,26 +71560,26 @@ module.exports = { /***/ }), -/* 618 */ +/* 613 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(619); +module.exports = __webpack_require__(614); /***/ }), -/* 619 */ +/* 614 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const scan = __webpack_require__(620); -const parse = __webpack_require__(623); -const utils = __webpack_require__(621); +const path = __webpack_require__(4); +const scan = __webpack_require__(615); +const parse = __webpack_require__(618); +const utils = __webpack_require__(616); /** * Creates a matcher function from one or more glob patterns. The @@ -72541,7 +71882,7 @@ picomatch.toRegex = (source, options) => { * @return {Object} */ -picomatch.constants = __webpack_require__(622); +picomatch.constants = __webpack_require__(617); /** * Expose "picomatch" @@ -72551,13 +71892,13 @@ module.exports = picomatch; /***/ }), -/* 620 */ +/* 615 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(621); +const utils = __webpack_require__(616); const { CHAR_ASTERISK, /* * */ @@ -72575,7 +71916,7 @@ const { CHAR_RIGHT_CURLY_BRACE, /* } */ CHAR_RIGHT_PARENTHESES, /* ) */ CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = __webpack_require__(622); +} = __webpack_require__(617); const isPathSeparator = code => { return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; @@ -72777,19 +72118,19 @@ module.exports = (input, options) => { /***/ }), -/* 621 */ +/* 616 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); +const path = __webpack_require__(4); const win32 = process.platform === 'win32'; const { REGEX_SPECIAL_CHARS, REGEX_SPECIAL_CHARS_GLOBAL, REGEX_REMOVE_BACKSLASH -} = __webpack_require__(622); +} = __webpack_require__(617); exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); @@ -72827,13 +72168,13 @@ exports.escapeLast = (input, char, lastIdx) => { /***/ }), -/* 622 */ +/* 617 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); +const path = __webpack_require__(4); const WIN_SLASH = '\\\\/'; const WIN_NO_SLASH = `[^${WIN_SLASH}]`; @@ -73013,14 +72354,14 @@ module.exports = { /***/ }), -/* 623 */ +/* 618 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(621); -const constants = __webpack_require__(622); +const utils = __webpack_require__(616); +const constants = __webpack_require__(617); /** * Constants @@ -73175,2463 +72516,3370 @@ const parse = (input, options) => { state.consumed += token.value || ''; }; - const increment = type => { - state[type]++; - stack.push(type); - }; + const increment = type => { + state[type]++; + stack.push(type); + }; + + const decrement = type => { + state[type]--; + stack.pop(); + }; + + /** + * Push tokens onto the tokens array. This helper speeds up + * tokenizing by 1) helping us avoid backtracking as much as possible, + * and 2) helping us avoid creating extra tokens when consecutive + * characters are plain text. This improves performance and simplifies + * lookbehinds. + */ + + const push = tok => { + if (prev.type === 'globstar') { + let isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); + let isExtglob = extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'); + if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { + state.output = state.output.slice(0, -prev.output.length); + prev.type = 'star'; + prev.value = '*'; + prev.output = star; + state.output += prev.output; + } + } + + if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) { + extglobs[extglobs.length - 1].inner += tok.value; + } + + if (tok.value || tok.output) append(tok); + if (prev && prev.type === 'text' && tok.type === 'text') { + prev.value += tok.value; + return; + } + + tok.prev = prev; + tokens.push(tok); + prev = tok; + }; + + const extglobOpen = (type, value) => { + let token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; + + token.prev = prev; + token.parens = state.parens; + token.output = state.output; + let output = (opts.capture ? '(' : '') + token.open; + + push({ type, value, output: state.output ? '' : ONE_CHAR }); + push({ type: 'paren', extglob: true, value: advance(), output }); + increment('parens'); + extglobs.push(token); + }; + + const extglobClose = token => { + let output = token.close + (opts.capture ? ')' : ''); + + if (token.type === 'negate') { + let extglobStar = star; + + if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { + extglobStar = globstar(opts); + } + + if (extglobStar !== star || eos() || /^\)+$/.test(input.slice(state.index + 1))) { + output = token.close = ')$))' + extglobStar; + } + + if (token.prev.type === 'bos' && eos()) { + state.negatedExtglob = true; + } + } + + push({ type: 'paren', extglob: true, value, output }); + decrement('parens'); + }; + + if (opts.fastpaths !== false && !/(^[*!]|[/{[()\]}"])/.test(input)) { + let backslashes = false; + + let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { + if (first === '\\') { + backslashes = true; + return m; + } + + if (first === '?') { + if (esc) { + return esc + first + (rest ? QMARK.repeat(rest.length) : ''); + } + if (index === 0) { + return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); + } + return QMARK.repeat(chars.length); + } + + if (first === '.') { + return DOT_LITERAL.repeat(chars.length); + } + + if (first === '*') { + if (esc) { + return esc + first + (rest ? star : ''); + } + return star; + } + return esc ? m : '\\' + m; + }); + + if (backslashes === true) { + if (opts.unescape === true) { + output = output.replace(/\\/g, ''); + } else { + output = output.replace(/\\+/g, m => { + return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); + }); + } + } + + state.output = output; + return state; + } + + /** + * Tokenize input until we reach end-of-string + */ + + while (!eos()) { + value = advance(); + + if (value === '\u0000') { + continue; + } + + /** + * Escaped characters + */ + + if (value === '\\') { + let next = peek(); + + if (next === '/' && opts.bash !== true) { + continue; + } + + if (next === '.' || next === ';') { + continue; + } + + if (!next) { + value += '\\'; + push({ type: 'text', value }); + continue; + } + + // collapse slashes to reduce potential for exploits + let match = /^\\+/.exec(input.slice(state.index + 1)); + let slashes = 0; + + if (match && match[0].length > 2) { + slashes = match[0].length; + state.index += slashes; + if (slashes % 2 !== 0) { + value += '\\'; + } + } + + if (opts.unescape === true) { + value = advance() || ''; + } else { + value += advance() || ''; + } + + if (state.brackets === 0) { + push({ type: 'text', value }); + continue; + } + } + + /** + * If we're inside a regex character class, continue + * until we reach the closing bracket. + */ + + if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { + if (opts.posix !== false && value === ':') { + let inner = prev.value.slice(1); + if (inner.includes('[')) { + prev.posix = true; + + if (inner.includes(':')) { + let idx = prev.value.lastIndexOf('['); + let pre = prev.value.slice(0, idx); + let rest = prev.value.slice(idx + 2); + let posix = POSIX_REGEX_SOURCE[rest]; + if (posix) { + prev.value = pre + posix; + state.backtrack = true; + advance(); + + if (!bos.output && tokens.indexOf(prev) === 1) { + bos.output = ONE_CHAR; + } + continue; + } + } + } + } + + if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { + value = '\\' + value; + } + + if (value === ']' && (prev.value === '[' || prev.value === '[^')) { + value = '\\' + value; + } + + if (opts.posix === true && value === '!' && prev.value === '[') { + value = '^'; + } + + prev.value += value; + append({ value }); + continue; + } + + /** + * If we're inside a quoted string, continue + * until we reach the closing double quote. + */ + + if (state.quotes === 1 && value !== '"') { + value = utils.escapeRegex(value); + prev.value += value; + append({ value }); + continue; + } + + /** + * Double quotes + */ + + if (value === '"') { + state.quotes = state.quotes === 1 ? 0 : 1; + if (opts.keepQuotes === true) { + push({ type: 'text', value }); + } + continue; + } + + /** + * Parentheses + */ + + if (value === '(') { + push({ type: 'paren', value }); + increment('parens'); + continue; + } + + if (value === ')') { + if (state.parens === 0 && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '(')); + } + + let extglob = extglobs[extglobs.length - 1]; + if (extglob && state.parens === extglob.parens + 1) { + extglobClose(extglobs.pop()); + continue; + } + + push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); + decrement('parens'); + continue; + } + + /** + * Brackets + */ + + if (value === '[') { + if (opts.nobracket === true || !input.slice(state.index + 1).includes(']')) { + if (opts.nobracket !== true && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('closing', ']')); + } + + value = '\\' + value; + } else { + increment('brackets'); + } + + push({ type: 'bracket', value }); + continue; + } + + if (value === ']') { + if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { + push({ type: 'text', value, output: '\\' + value }); + continue; + } + + if (state.brackets === 0) { + if (opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '[')); + } + + push({ type: 'text', value, output: '\\' + value }); + continue; + } + + decrement('brackets'); + + let prevValue = prev.value.slice(1); + if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { + value = '/' + value; + } + + prev.value += value; + append({ value }); + + // when literal brackets are explicitly disabled + // assume we should match with a regex character class + if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { + continue; + } + + let escaped = utils.escapeRegex(prev.value); + state.output = state.output.slice(0, -prev.value.length); + + // when literal brackets are explicitly enabled + // assume we should escape the brackets to match literal characters + if (opts.literalBrackets === true) { + state.output += escaped; + prev.value = escaped; + continue; + } + + // when the user specifies nothing, try to match both + prev.value = `(${capture}${escaped}|${prev.value})`; + state.output += prev.value; + continue; + } + + /** + * Braces + */ + + if (value === '{' && opts.nobrace !== true) { + push({ type: 'brace', value, output: '(' }); + increment('braces'); + continue; + } + + if (value === '}') { + if (opts.nobrace === true || state.braces === 0) { + push({ type: 'text', value, output: '\\' + value }); + continue; + } + + let output = ')'; + + if (state.dots === true) { + let arr = tokens.slice(); + let range = []; + + for (let i = arr.length - 1; i >= 0; i--) { + tokens.pop(); + if (arr[i].type === 'brace') { + break; + } + if (arr[i].type !== 'dots') { + range.unshift(arr[i].value); + } + } + + output = expandRange(range, opts); + state.backtrack = true; + } + + push({ type: 'brace', value, output }); + decrement('braces'); + continue; + } + + /** + * Pipes + */ + + if (value === '|') { + if (extglobs.length > 0) { + extglobs[extglobs.length - 1].conditions++; + } + push({ type: 'text', value }); + continue; + } - const decrement = type => { - state[type]--; - stack.pop(); - }; + /** + * Commas + */ - /** - * Push tokens onto the tokens array. This helper speeds up - * tokenizing by 1) helping us avoid backtracking as much as possible, - * and 2) helping us avoid creating extra tokens when consecutive - * characters are plain text. This improves performance and simplifies - * lookbehinds. - */ + if (value === ',') { + let output = value; - const push = tok => { - if (prev.type === 'globstar') { - let isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); - let isExtglob = extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'); - if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { - state.output = state.output.slice(0, -prev.output.length); - prev.type = 'star'; - prev.value = '*'; - prev.output = star; - state.output += prev.output; + if (state.braces > 0 && stack[stack.length - 1] === 'braces') { + output = '|'; } - } - if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) { - extglobs[extglobs.length - 1].inner += tok.value; + push({ type: 'comma', value, output }); + continue; } - if (tok.value || tok.output) append(tok); - if (prev && prev.type === 'text' && tok.type === 'text') { - prev.value += tok.value; - return; + /** + * Slashes + */ + + if (value === '/') { + // if the beginning of the glob is "./", advance the start + // to the current index, and don't add the "./" characters + // to the state. This greatly simplifies lookbehinds when + // checking for BOS characters like "!" and "." (not "./") + if (prev.type === 'dot' && state.index === 1) { + state.start = state.index + 1; + state.consumed = ''; + state.output = ''; + tokens.pop(); + prev = bos; // reset "prev" to the first token + continue; + } + + push({ type: 'slash', value, output: SLASH_LITERAL }); + continue; } - tok.prev = prev; - tokens.push(tok); - prev = tok; - }; + /** + * Dots + */ - const extglobOpen = (type, value) => { - let token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; + if (value === '.') { + if (state.braces > 0 && prev.type === 'dot') { + if (prev.value === '.') prev.output = DOT_LITERAL; + prev.type = 'dots'; + prev.output += value; + prev.value += value; + state.dots = true; + continue; + } - token.prev = prev; - token.parens = state.parens; - token.output = state.output; - let output = (opts.capture ? '(' : '') + token.open; + push({ type: 'dot', value, output: DOT_LITERAL }); + continue; + } - push({ type, value, output: state.output ? '' : ONE_CHAR }); - push({ type: 'paren', extglob: true, value: advance(), output }); - increment('parens'); - extglobs.push(token); - }; + /** + * Question marks + */ - const extglobClose = token => { - let output = token.close + (opts.capture ? ')' : ''); + if (value === '?') { + if (prev && prev.type === 'paren') { + let next = peek(); + let output = value; - if (token.type === 'negate') { - let extglobStar = star; + if (next === '<' && !utils.supportsLookbehinds()) { + throw new Error('Node.js v10 or higher is required for regex lookbehinds'); + } - if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { - extglobStar = globstar(opts); + if (prev.value === '(' && !/[!=<:]/.test(next) || (next === '<' && !/[!=]/.test(peek(2)))) { + output = '\\' + value; + } + + push({ type: 'text', value, output }); + continue; } - if (extglobStar !== star || eos() || /^\)+$/.test(input.slice(state.index + 1))) { - output = token.close = ')$))' + extglobStar; + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('qmark', value); + continue; } - if (token.prev.type === 'bos' && eos()) { - state.negatedExtglob = true; + if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { + push({ type: 'qmark', value, output: QMARK_NO_DOT }); + continue; } + + push({ type: 'qmark', value, output: QMARK }); + continue; } - push({ type: 'paren', extglob: true, value, output }); - decrement('parens'); - }; + /** + * Exclamation + */ - if (opts.fastpaths !== false && !/(^[*!]|[/{[()\]}"])/.test(input)) { - let backslashes = false; + if (value === '!') { + if (opts.noextglob !== true && peek() === '(') { + if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { + extglobOpen('negate', value); + continue; + } + } - let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { - if (first === '\\') { - backslashes = true; - return m; + if (opts.nonegate !== true && state.index === 0) { + negate(state); + continue; } + } - if (first === '?') { - if (esc) { - return esc + first + (rest ? QMARK.repeat(rest.length) : ''); - } - if (index === 0) { - return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); - } - return QMARK.repeat(chars.length); + /** + * Plus + */ + + if (value === '+') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('plus', value); + continue; } - if (first === '.') { - return DOT_LITERAL.repeat(chars.length); + if (prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) { + let output = prev.extglob === true ? '\\' + value : value; + push({ type: 'plus', value, output }); + continue; } - if (first === '*') { - if (esc) { - return esc + first + (rest ? star : ''); - } - return star; + // use regex behavior inside parens + if (state.parens > 0 && opts.regex !== false) { + push({ type: 'plus', value }); + continue; } - return esc ? m : '\\' + m; - }); - if (backslashes === true) { - if (opts.unescape === true) { - output = output.replace(/\\/g, ''); - } else { - output = output.replace(/\\+/g, m => { - return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); - }); + push({ type: 'plus', value: PLUS_LITERAL }); + continue; + } + + /** + * Plain text + */ + + if (value === '@') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + push({ type: 'at', value, output: '' }); + continue; } + + push({ type: 'text', value }); + continue; } - state.output = output; - return state; - } + /** + * Plain text + */ - /** - * Tokenize input until we reach end-of-string - */ + if (value !== '*') { + if (value === '$' || value === '^') { + value = '\\' + value; + } - while (!eos()) { - value = advance(); + let match = REGEX_NON_SPECIAL_CHAR.exec(input.slice(state.index + 1)); + if (match) { + value += match[0]; + state.index += match[0].length; + } - if (value === '\u0000') { + push({ type: 'text', value }); continue; } /** - * Escaped characters + * Stars */ - if (value === '\\') { - let next = peek(); + if (prev && (prev.type === 'globstar' || prev.star === true)) { + prev.type = 'star'; + prev.star = true; + prev.value += value; + prev.output = star; + state.backtrack = true; + state.consumed += value; + continue; + } - if (next === '/' && opts.bash !== true) { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('star', value); + continue; + } + + if (prev.type === 'star') { + if (opts.noglobstar === true) { + state.consumed += value; continue; } - if (next === '.' || next === ';') { + let prior = prev.prev; + let before = prior.prev; + let isStart = prior.type === 'slash' || prior.type === 'bos'; + let afterStar = before && (before.type === 'star' || before.type === 'globstar'); + + if (opts.bash === true && (!isStart || (!eos() && peek() !== '/'))) { + push({ type: 'star', value, output: '' }); continue; } - if (!next) { - value += '\\'; - push({ type: 'text', value }); + let isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); + let isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); + if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { + push({ type: 'star', value, output: '' }); continue; } - // collapse slashes to reduce potential for exploits - let match = /^\\+/.exec(input.slice(state.index + 1)); - let slashes = 0; - - if (match && match[0].length > 2) { - slashes = match[0].length; - state.index += slashes; - if (slashes % 2 !== 0) { - value += '\\'; + // strip consecutive `/**/` + while (input.slice(state.index + 1, state.index + 4) === '/**') { + let after = input[state.index + 4]; + if (after && after !== '/') { + break; } + state.consumed += '/**'; + state.index += 3; } - if (opts.unescape === true) { - value = advance() || ''; - } else { - value += advance() || ''; + if (prior.type === 'bos' && eos()) { + prev.type = 'globstar'; + prev.value += value; + prev.output = globstar(opts); + state.output = prev.output; + state.consumed += value; + continue; } - if (state.brackets === 0) { - push({ type: 'text', value }); + if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = '(?:' + prior.output; + + prev.type = 'globstar'; + prev.output = globstar(opts) + '|$)'; + prev.value += value; + + state.output += prior.output + prev.output; + state.consumed += value; continue; } - } - /** - * If we're inside a regex character class, continue - * until we reach the closing bracket. - */ + let next = peek(); + if (prior.type === 'slash' && prior.prev.type !== 'bos' && next === '/') { + let end = peek(2) !== void 0 ? '|$' : ''; - if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { - if (opts.posix !== false && value === ':') { - let inner = prev.value.slice(1); - if (inner.includes('[')) { - prev.posix = true; + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = '(?:' + prior.output; - if (inner.includes(':')) { - let idx = prev.value.lastIndexOf('['); - let pre = prev.value.slice(0, idx); - let rest = prev.value.slice(idx + 2); - let posix = POSIX_REGEX_SOURCE[rest]; - if (posix) { - prev.value = pre + posix; - state.backtrack = true; - advance(); + prev.type = 'globstar'; + prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; + prev.value += value; - if (!bos.output && tokens.indexOf(prev) === 1) { - bos.output = ONE_CHAR; - } - continue; - } - } - } + state.output += prior.output + prev.output; + state.consumed += value + advance(); + + push({ type: 'slash', value, output: '' }); + continue; } - if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { - value = '\\' + value; + if (prior.type === 'bos' && next === '/') { + prev.type = 'globstar'; + prev.value += value; + prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; + state.output = prev.output; + state.consumed += value + advance(); + push({ type: 'slash', value, output: '' }); + continue; } - if (value === ']' && (prev.value === '[' || prev.value === '[^')) { - value = '\\' + value; + // remove single star from output + state.output = state.output.slice(0, -prev.output.length); + + // reset previous token to globstar + prev.type = 'globstar'; + prev.output = globstar(opts); + prev.value += value; + + // reset output with globstar + state.output += prev.output; + state.consumed += value; + continue; + } + + let token = { type: 'star', value, output: star }; + + if (opts.bash === true) { + token.output = '.*?'; + if (prev.type === 'bos' || prev.type === 'slash') { + token.output = nodot + token.output; + } + push(token); + continue; + } + + if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { + token.output = value; + push(token); + continue; + } + + if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { + if (prev.type === 'dot') { + state.output += NO_DOT_SLASH; + prev.output += NO_DOT_SLASH; + + } else if (opts.dot === true) { + state.output += NO_DOTS_SLASH; + prev.output += NO_DOTS_SLASH; + + } else { + state.output += nodot; + prev.output += nodot; } - if (opts.posix === true && value === '!' && prev.value === '[') { - value = '^'; + if (peek() !== '*') { + state.output += ONE_CHAR; + prev.output += ONE_CHAR; + } + } + + push(token); + } + + while (state.brackets > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); + state.output = utils.escapeLast(state.output, '['); + decrement('brackets'); + } + + while (state.parens > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); + state.output = utils.escapeLast(state.output, '('); + decrement('parens'); + } + + while (state.braces > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); + state.output = utils.escapeLast(state.output, '{'); + decrement('braces'); + } + + if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { + push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); + } + + // rebuild the output if we had to backtrack at any point + if (state.backtrack === true) { + state.output = ''; + + for (let token of state.tokens) { + state.output += token.output != null ? token.output : token.value; + + if (token.suffix) { + state.output += token.suffix; } + } + } + + return state; +}; + +/** + * Fast paths for creating regular expressions for common glob patterns. + * This can significantly speed up processing and has very little downside + * impact when none of the fast paths match. + */ + +parse.fastpaths = (input, options) => { + let opts = { ...options }; + let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + input = REPLACEMENTS[input] || input; + let win32 = utils.isWindows(options); + + // create constants based on platform, for windows or posix + const { + DOT_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOTS_SLASH, + STAR, + START_ANCHOR + } = constants.globChars(win32); + + let capture = opts.capture ? '' : '?:'; + let star = opts.bash === true ? '.*?' : STAR; + let nodot = opts.dot ? NO_DOTS : NO_DOT; + let slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; + + if (opts.capture) { + star = `(${star})`; + } + + const globstar = (opts) => { + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + const create = str => { + switch (str) { + case '*': + return `${nodot}${ONE_CHAR}${star}`; + + case '.*': + return `${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*.*': + return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*/*': + return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + + case '**': + return nodot + globstar(opts); + + case '**/*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; - prev.value += value; - append({ value }); - continue; - } + case '**/*.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - /** - * If we're inside a quoted string, continue - * until we reach the closing double quote. - */ + case '**/.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; - if (state.quotes === 1 && value !== '"') { - value = utils.escapeRegex(value); - prev.value += value; - append({ value }); - continue; - } + default: { + let match = /^(.*?)\.(\w+)$/.exec(str); + if (!match) return; - /** - * Double quotes - */ + let source = create(match[1], options); + if (!source) return; - if (value === '"') { - state.quotes = state.quotes === 1 ? 0 : 1; - if (opts.keepQuotes === true) { - push({ type: 'text', value }); + return source + DOT_LITERAL + match[2]; } - continue; } + }; - /** - * Parentheses - */ + let output = create(input); + if (output && opts.strictSlashes !== true) { + output += `${SLASH_LITERAL}?`; + } - if (value === '(') { - push({ type: 'paren', value }); - increment('parens'); - continue; - } + return output; +}; - if (value === ')') { - if (state.parens === 0 && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '(')); - } +module.exports = parse; - let extglob = extglobs[extglobs.length - 1]; - if (extglob && state.parens === extglob.parens + 1) { - extglobClose(extglobs.pop()); - continue; - } - push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); - decrement('parens'); - continue; - } +/***/ }), +/* 619 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Brackets - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const merge2 = __webpack_require__(585); +function merge(streams) { + const mergedStream = merge2(streams); + streams.forEach((stream) => { + stream.once('error', (err) => mergedStream.emit('error', err)); + }); + return mergedStream; +} +exports.merge = merge; - if (value === '[') { - if (opts.nobracket === true || !input.slice(state.index + 1).includes(']')) { - if (opts.nobracket !== true && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('closing', ']')); - } - value = '\\' + value; - } else { - increment('brackets'); - } +/***/ }), +/* 620 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'bracket', value }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(621); +const provider_1 = __webpack_require__(648); +class ProviderAsync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = []; + return new Promise((resolve, reject) => { + const stream = this.api(root, task, options); + stream.once('error', reject); + stream.on('data', (entry) => entries.push(options.transform(entry))); + stream.once('end', () => resolve(entries)); + }); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderAsync; - if (value === ']') { - if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { - push({ type: 'text', value, output: '\\' + value }); - continue; - } - if (state.brackets === 0) { - if (opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '[')); - } +/***/ }), +/* 621 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'text', value, output: '\\' + value }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(382); +const fsStat = __webpack_require__(622); +const fsWalk = __webpack_require__(627); +const reader_1 = __webpack_require__(647); +class ReaderStream extends reader_1.default { + constructor() { + super(...arguments); + this._walkStream = fsWalk.walkStream; + this._stat = fsStat.stat; + } + dynamic(root, options) { + return this._walkStream(root, options); + } + static(patterns, options) { + const filepaths = patterns.map(this._getFullEntryPath, this); + const stream = new stream_1.PassThrough({ objectMode: true }); + stream._write = (index, _enc, done) => { + return this._getEntry(filepaths[index], patterns[index], options) + .then((entry) => { + if (entry !== null && options.entryFilter(entry)) { + stream.push(entry); + } + if (index === filepaths.length - 1) { + stream.end(); + } + done(); + }) + .catch(done); + }; + for (let i = 0; i < filepaths.length; i++) { + stream.write(i); + } + return stream; + } + _getEntry(filepath, pattern, options) { + return this._getStat(filepath) + .then((stats) => this._makeEntry(stats, pattern)) + .catch((error) => { + if (options.errorFilter(error)) { + return null; + } + throw error; + }); + } + _getStat(filepath) { + return new Promise((resolve, reject) => { + this._stat(filepath, this._fsStatSettings, (error, stats) => { + error ? reject(error) : resolve(stats); + }); + }); + } +} +exports.default = ReaderStream; - decrement('brackets'); - let prevValue = prev.value.slice(1); - if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { - value = '/' + value; - } +/***/ }), +/* 622 */ +/***/ (function(module, exports, __webpack_require__) { - prev.value += value; - append({ value }); +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async = __webpack_require__(623); +const sync = __webpack_require__(624); +const settings_1 = __webpack_require__(625); +exports.Settings = settings_1.default; +function stat(path, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return async.read(path, getSettings(), optionsOrSettingsOrCallback); + } + async.read(path, getSettings(optionsOrSettingsOrCallback), callback); +} +exports.stat = stat; +function statSync(path, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + return sync.read(path, settings); +} +exports.statSync = statSync; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} - // when literal brackets are explicitly disabled - // assume we should match with a regex character class - if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { - continue; - } - let escaped = utils.escapeRegex(prev.value); - state.output = state.output.slice(0, -prev.value.length); +/***/ }), +/* 623 */ +/***/ (function(module, exports, __webpack_require__) { - // when literal brackets are explicitly enabled - // assume we should escape the brackets to match literal characters - if (opts.literalBrackets === true) { - state.output += escaped; - prev.value = escaped; - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function read(path, settings, callback) { + settings.fs.lstat(path, (lstatError, lstat) => { + if (lstatError) { + return callFailureCallback(callback, lstatError); + } + if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { + return callSuccessCallback(callback, lstat); + } + settings.fs.stat(path, (statError, stat) => { + if (statError) { + if (settings.throwErrorOnBrokenSymbolicLink) { + return callFailureCallback(callback, statError); + } + return callSuccessCallback(callback, lstat); + } + if (settings.markSymbolicLink) { + stat.isSymbolicLink = () => true; + } + callSuccessCallback(callback, stat); + }); + }); +} +exports.read = read; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, result) { + callback(null, result); +} - // when the user specifies nothing, try to match both - prev.value = `(${capture}${escaped}|${prev.value})`; - state.output += prev.value; - continue; - } - /** - * Braces - */ +/***/ }), +/* 624 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === '{' && opts.nobrace !== true) { - push({ type: 'brace', value, output: '(' }); - increment('braces'); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function read(path, settings) { + const lstat = settings.fs.lstatSync(path); + if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { + return lstat; + } + try { + const stat = settings.fs.statSync(path); + if (settings.markSymbolicLink) { + stat.isSymbolicLink = () => true; + } + return stat; + } + catch (error) { + if (!settings.throwErrorOnBrokenSymbolicLink) { + return lstat; + } + throw error; + } +} +exports.read = read; - if (value === '}') { - if (opts.nobrace === true || state.braces === 0) { - push({ type: 'text', value, output: '\\' + value }); - continue; - } - let output = ')'; +/***/ }), +/* 625 */ +/***/ (function(module, exports, __webpack_require__) { - if (state.dots === true) { - let arr = tokens.slice(); - let range = []; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(626); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); + this.fs = fs.createFileSystemAdapter(this._options.fs); + this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; - for (let i = arr.length - 1; i >= 0; i--) { - tokens.pop(); - if (arr[i].type === 'brace') { - break; - } - if (arr[i].type !== 'dots') { - range.unshift(arr[i].value); - } - } - output = expandRange(range, opts); - state.backtrack = true; - } +/***/ }), +/* 626 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'brace', value, output }); - decrement('braces'); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(349); +exports.FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + stat: fs.stat, + lstatSync: fs.lstatSync, + statSync: fs.statSync +}; +function createFileSystemAdapter(fsMethods) { + if (!fsMethods) { + return exports.FILE_SYSTEM_ADAPTER; + } + return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); +} +exports.createFileSystemAdapter = createFileSystemAdapter; - /** - * Pipes - */ - if (value === '|') { - if (extglobs.length > 0) { - extglobs[extglobs.length - 1].conditions++; - } - push({ type: 'text', value }); - continue; - } +/***/ }), +/* 627 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Commas - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async_1 = __webpack_require__(628); +const stream_1 = __webpack_require__(643); +const sync_1 = __webpack_require__(644); +const settings_1 = __webpack_require__(646); +exports.Settings = settings_1.default; +function walk(dir, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return new async_1.default(dir, getSettings()).read(optionsOrSettingsOrCallback); + } + new async_1.default(dir, getSettings(optionsOrSettingsOrCallback)).read(callback); +} +exports.walk = walk; +function walkSync(dir, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + const provider = new sync_1.default(dir, settings); + return provider.read(); +} +exports.walkSync = walkSync; +function walkStream(dir, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + const provider = new stream_1.default(dir, settings); + return provider.read(); +} +exports.walkStream = walkStream; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} - if (value === ',') { - let output = value; - if (state.braces > 0 && stack[stack.length - 1] === 'braces') { - output = '|'; - } +/***/ }), +/* 628 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'comma', value, output }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async_1 = __webpack_require__(629); +class AsyncProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1.default(this._root, this._settings); + this._storage = new Set(); + } + read(callback) { + this._reader.onError((error) => { + callFailureCallback(callback, error); + }); + this._reader.onEntry((entry) => { + this._storage.add(entry); + }); + this._reader.onEnd(() => { + callSuccessCallback(callback, Array.from(this._storage)); + }); + this._reader.read(); + } +} +exports.default = AsyncProvider; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, entries) { + callback(null, entries); +} - /** - * Slashes - */ - if (value === '/') { - // if the beginning of the glob is "./", advance the start - // to the current index, and don't add the "./" characters - // to the state. This greatly simplifies lookbehinds when - // checking for BOS characters like "!" and "." (not "./") - if (prev.type === 'dot' && state.index === 1) { - state.start = state.index + 1; - state.consumed = ''; - state.output = ''; - tokens.pop(); - prev = bos; // reset "prev" to the first token - continue; - } +/***/ }), +/* 629 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const events_1 = __webpack_require__(373); +const fsScandir = __webpack_require__(630); +const fastq = __webpack_require__(639); +const common = __webpack_require__(641); +const reader_1 = __webpack_require__(642); +class AsyncReader extends reader_1.default { + constructor(_root, _settings) { + super(_root, _settings); + this._settings = _settings; + this._scandir = fsScandir.scandir; + this._emitter = new events_1.EventEmitter(); + this._queue = fastq(this._worker.bind(this), this._settings.concurrency); + this._isFatalError = false; + this._isDestroyed = false; + this._queue.drain = () => { + if (!this._isFatalError) { + this._emitter.emit('end'); + } + }; + } + read() { + this._isFatalError = false; + this._isDestroyed = false; + setImmediate(() => { + this._pushToQueue(this._root, this._settings.basePath); + }); + return this._emitter; + } + destroy() { + if (this._isDestroyed) { + throw new Error('The reader is already destroyed'); + } + this._isDestroyed = true; + this._queue.killAndDrain(); + } + onEntry(callback) { + this._emitter.on('entry', callback); + } + onError(callback) { + this._emitter.once('error', callback); + } + onEnd(callback) { + this._emitter.once('end', callback); + } + _pushToQueue(dir, base) { + const queueItem = { dir, base }; + this._queue.push(queueItem, (error) => { + if (error) { + this._handleError(error); + } + }); + } + _worker(item, done) { + this._scandir(item.dir, this._settings.fsScandirSettings, (error, entries) => { + if (error) { + return done(error, undefined); + } + for (const entry of entries) { + this._handleEntry(entry, item.base); + } + done(null, undefined); + }); + } + _handleError(error) { + if (!common.isFatalError(this._settings, error)) { + return; + } + this._isFatalError = true; + this._isDestroyed = true; + this._emitter.emit('error', error); + } + _handleEntry(entry, base) { + if (this._isDestroyed || this._isFatalError) { + return; + } + const fullpath = entry.path; + if (base !== undefined) { + entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + } + if (common.isAppliedFilter(this._settings.entryFilter, entry)) { + this._emitEntry(entry); + } + if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { + this._pushToQueue(fullpath, entry.path); + } + } + _emitEntry(entry) { + this._emitter.emit('entry', entry); + } +} +exports.default = AsyncReader; - push({ type: 'slash', value, output: SLASH_LITERAL }); - continue; - } - /** - * Dots - */ +/***/ }), +/* 630 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === '.') { - if (state.braces > 0 && prev.type === 'dot') { - if (prev.value === '.') prev.output = DOT_LITERAL; - prev.type = 'dots'; - prev.output += value; - prev.value += value; - state.dots = true; - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async = __webpack_require__(631); +const sync = __webpack_require__(636); +const settings_1 = __webpack_require__(637); +exports.Settings = settings_1.default; +function scandir(path, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return async.read(path, getSettings(), optionsOrSettingsOrCallback); + } + async.read(path, getSettings(optionsOrSettingsOrCallback), callback); +} +exports.scandir = scandir; +function scandirSync(path, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + return sync.read(path, settings); +} +exports.scandirSync = scandirSync; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} - push({ type: 'dot', value, output: DOT_LITERAL }); - continue; - } - /** - * Question marks - */ +/***/ }), +/* 631 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === '?') { - if (prev && prev.type === 'paren') { - let next = peek(); - let output = value; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(622); +const rpl = __webpack_require__(632); +const constants_1 = __webpack_require__(633); +const utils = __webpack_require__(634); +function read(dir, settings, callback) { + if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + return readdirWithFileTypes(dir, settings, callback); + } + return readdir(dir, settings, callback); +} +exports.read = read; +function readdirWithFileTypes(dir, settings, callback) { + settings.fs.readdir(dir, { withFileTypes: true }, (readdirError, dirents) => { + if (readdirError) { + return callFailureCallback(callback, readdirError); + } + const entries = dirents.map((dirent) => ({ + dirent, + name: dirent.name, + path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` + })); + if (!settings.followSymbolicLinks) { + return callSuccessCallback(callback, entries); + } + const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); + rpl(tasks, (rplError, rplEntries) => { + if (rplError) { + return callFailureCallback(callback, rplError); + } + callSuccessCallback(callback, rplEntries); + }); + }); +} +exports.readdirWithFileTypes = readdirWithFileTypes; +function makeRplTaskEntry(entry, settings) { + return (done) => { + if (!entry.dirent.isSymbolicLink()) { + return done(null, entry); + } + settings.fs.stat(entry.path, (statError, stats) => { + if (statError) { + if (settings.throwErrorOnBrokenSymbolicLink) { + return done(statError); + } + return done(null, entry); + } + entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); + return done(null, entry); + }); + }; +} +function readdir(dir, settings, callback) { + settings.fs.readdir(dir, (readdirError, names) => { + if (readdirError) { + return callFailureCallback(callback, readdirError); + } + const filepaths = names.map((name) => `${dir}${settings.pathSegmentSeparator}${name}`); + const tasks = filepaths.map((filepath) => { + return (done) => fsStat.stat(filepath, settings.fsStatSettings, done); + }); + rpl(tasks, (rplError, results) => { + if (rplError) { + return callFailureCallback(callback, rplError); + } + const entries = []; + for (let index = 0; index < names.length; index++) { + const name = names[index]; + const stats = results[index]; + const entry = { + name, + path: filepaths[index], + dirent: utils.fs.createDirentFromStats(name, stats) + }; + if (settings.stats) { + entry.stats = stats; + } + entries.push(entry); + } + callSuccessCallback(callback, entries); + }); + }); +} +exports.readdir = readdir; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, result) { + callback(null, result); +} - if (next === '<' && !utils.supportsLookbehinds()) { - throw new Error('Node.js v10 or higher is required for regex lookbehinds'); - } - if (prev.value === '(' && !/[!=<:]/.test(next) || (next === '<' && !/[!=]/.test(peek(2)))) { - output = '\\' + value; - } +/***/ }), +/* 632 */ +/***/ (function(module, exports) { - push({ type: 'text', value, output }); - continue; - } +module.exports = runParallel - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('qmark', value); - continue; - } +function runParallel (tasks, cb) { + var results, pending, keys + var isSync = true - if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { - push({ type: 'qmark', value, output: QMARK_NO_DOT }); - continue; - } + if (Array.isArray(tasks)) { + results = [] + pending = tasks.length + } else { + keys = Object.keys(tasks) + results = {} + pending = keys.length + } - push({ type: 'qmark', value, output: QMARK }); - continue; + function done (err) { + function end () { + if (cb) cb(err, results) + cb = null } + if (isSync) process.nextTick(end) + else end() + } - /** - * Exclamation - */ - - if (value === '!') { - if (opts.noextglob !== true && peek() === '(') { - if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { - extglobOpen('negate', value); - continue; - } - } - - if (opts.nonegate !== true && state.index === 0) { - negate(state); - continue; - } + function each (i, err, result) { + results[i] = result + if (--pending === 0 || err) { + done(err) } + } - /** - * Plus - */ - - if (value === '+') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('plus', value); - continue; - } + if (!pending) { + // empty + done(null) + } else if (keys) { + // object + keys.forEach(function (key) { + tasks[key](function (err, result) { each(key, err, result) }) + }) + } else { + // array + tasks.forEach(function (task, i) { + task(function (err, result) { each(i, err, result) }) + }) + } - if (prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) { - let output = prev.extglob === true ? '\\' + value : value; - push({ type: 'plus', value, output }); - continue; - } + isSync = false +} - // use regex behavior inside parens - if (state.parens > 0 && opts.regex !== false) { - push({ type: 'plus', value }); - continue; - } - push({ type: 'plus', value: PLUS_LITERAL }); - continue; - } +/***/ }), +/* 633 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Plain text - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); +const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); +const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); +/** + * IS `true` for Node.js 10.10 and greater. + */ +exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = MAJOR_VERSION > 10 || (MAJOR_VERSION === 10 && MINOR_VERSION >= 10); - if (value === '@') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - push({ type: 'at', value, output: '' }); - continue; - } - push({ type: 'text', value }); - continue; - } +/***/ }), +/* 634 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Plain text - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(635); +exports.fs = fs; - if (value !== '*') { - if (value === '$' || value === '^') { - value = '\\' + value; - } - let match = REGEX_NON_SPECIAL_CHAR.exec(input.slice(state.index + 1)); - if (match) { - value += match[0]; - state.index += match[0].length; - } +/***/ }), +/* 635 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'text', value }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +class DirentFromStats { + constructor(name, stats) { + this.name = name; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } +} +function createDirentFromStats(name, stats) { + return new DirentFromStats(name, stats); +} +exports.createDirentFromStats = createDirentFromStats; - /** - * Stars - */ - if (prev && (prev.type === 'globstar' || prev.star === true)) { - prev.type = 'star'; - prev.star = true; - prev.value += value; - prev.output = star; - state.backtrack = true; - state.consumed += value; - continue; - } +/***/ }), +/* 636 */ +/***/ (function(module, exports, __webpack_require__) { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('star', value); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(622); +const constants_1 = __webpack_require__(633); +const utils = __webpack_require__(634); +function read(dir, settings) { + if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + return readdirWithFileTypes(dir, settings); + } + return readdir(dir, settings); +} +exports.read = read; +function readdirWithFileTypes(dir, settings) { + const dirents = settings.fs.readdirSync(dir, { withFileTypes: true }); + return dirents.map((dirent) => { + const entry = { + dirent, + name: dirent.name, + path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` + }; + if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { + try { + const stats = settings.fs.statSync(entry.path); + entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); + } + catch (error) { + if (settings.throwErrorOnBrokenSymbolicLink) { + throw error; + } + } + } + return entry; + }); +} +exports.readdirWithFileTypes = readdirWithFileTypes; +function readdir(dir, settings) { + const names = settings.fs.readdirSync(dir); + return names.map((name) => { + const entryPath = `${dir}${settings.pathSegmentSeparator}${name}`; + const stats = fsStat.statSync(entryPath, settings.fsStatSettings); + const entry = { + name, + path: entryPath, + dirent: utils.fs.createDirentFromStats(name, stats) + }; + if (settings.stats) { + entry.stats = stats; + } + return entry; + }); +} +exports.readdir = readdir; - if (prev.type === 'star') { - if (opts.noglobstar === true) { - state.consumed += value; - continue; - } - let prior = prev.prev; - let before = prior.prev; - let isStart = prior.type === 'slash' || prior.type === 'bos'; - let afterStar = before && (before.type === 'star' || before.type === 'globstar'); +/***/ }), +/* 637 */ +/***/ (function(module, exports, __webpack_require__) { - if (opts.bash === true && (!isStart || (!eos() && peek() !== '/'))) { - push({ type: 'star', value, output: '' }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const fsStat = __webpack_require__(622); +const fs = __webpack_require__(638); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); + this.fs = fs.createFileSystemAdapter(this._options.fs); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); + this.stats = this._getValue(this._options.stats, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + this.fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this.followSymbolicLinks, + fs: this.fs, + throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink + }); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; - let isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); - let isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); - if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { - push({ type: 'star', value, output: '' }); - continue; - } - // strip consecutive `/**/` - while (input.slice(state.index + 1, state.index + 4) === '/**') { - let after = input[state.index + 4]; - if (after && after !== '/') { - break; - } - state.consumed += '/**'; - state.index += 3; - } +/***/ }), +/* 638 */ +/***/ (function(module, exports, __webpack_require__) { - if (prior.type === 'bos' && eos()) { - prev.type = 'globstar'; - prev.value += value; - prev.output = globstar(opts); - state.output = prev.output; - state.consumed += value; - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(349); +exports.FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + stat: fs.stat, + lstatSync: fs.lstatSync, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +function createFileSystemAdapter(fsMethods) { + if (!fsMethods) { + return exports.FILE_SYSTEM_ADAPTER; + } + return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); +} +exports.createFileSystemAdapter = createFileSystemAdapter; - if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = '(?:' + prior.output; - prev.type = 'globstar'; - prev.output = globstar(opts) + '|$)'; - prev.value += value; +/***/ }), +/* 639 */ +/***/ (function(module, exports, __webpack_require__) { - state.output += prior.output + prev.output; - state.consumed += value; - continue; - } +"use strict"; - let next = peek(); - if (prior.type === 'slash' && prior.prev.type !== 'bos' && next === '/') { - let end = peek(2) !== void 0 ? '|$' : ''; - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = '(?:' + prior.output; +var reusify = __webpack_require__(640) - prev.type = 'globstar'; - prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; - prev.value += value; +function fastqueue (context, worker, concurrency) { + if (typeof context === 'function') { + concurrency = worker + worker = context + context = null + } - state.output += prior.output + prev.output; - state.consumed += value + advance(); + var cache = reusify(Task) + var queueHead = null + var queueTail = null + var _running = 0 - push({ type: 'slash', value, output: '' }); - continue; - } + var self = { + push: push, + drain: noop, + saturated: noop, + pause: pause, + paused: false, + concurrency: concurrency, + running: running, + resume: resume, + idle: idle, + length: length, + unshift: unshift, + empty: noop, + kill: kill, + killAndDrain: killAndDrain + } - if (prior.type === 'bos' && next === '/') { - prev.type = 'globstar'; - prev.value += value; - prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state.output = prev.output; - state.consumed += value + advance(); - push({ type: 'slash', value, output: '' }); - continue; - } + return self - // remove single star from output - state.output = state.output.slice(0, -prev.output.length); + function running () { + return _running + } - // reset previous token to globstar - prev.type = 'globstar'; - prev.output = globstar(opts); - prev.value += value; + function pause () { + self.paused = true + } - // reset output with globstar - state.output += prev.output; - state.consumed += value; - continue; + function length () { + var current = queueHead + var counter = 0 + + while (current) { + current = current.next + counter++ } - let token = { type: 'star', value, output: star }; + return counter + } - if (opts.bash === true) { - token.output = '.*?'; - if (prev.type === 'bos' || prev.type === 'slash') { - token.output = nodot + token.output; - } - push(token); - continue; + function resume () { + if (!self.paused) return + self.paused = false + for (var i = 0; i < self.concurrency; i++) { + _running++ + release() } + } - if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { - token.output = value; - push(token); - continue; - } + function idle () { + return _running === 0 && self.length() === 0 + } - if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { - if (prev.type === 'dot') { - state.output += NO_DOT_SLASH; - prev.output += NO_DOT_SLASH; + function push (value, done) { + var current = cache.get() - } else if (opts.dot === true) { - state.output += NO_DOTS_SLASH; - prev.output += NO_DOTS_SLASH; + current.context = context + current.release = release + current.value = value + current.callback = done || noop + if (_running === self.concurrency || self.paused) { + if (queueTail) { + queueTail.next = current + queueTail = current } else { - state.output += nodot; - prev.output += nodot; + queueHead = current + queueTail = current + self.saturated() } + } else { + _running++ + worker.call(context, current.value, current.worked) + } + } - if (peek() !== '*') { - state.output += ONE_CHAR; - prev.output += ONE_CHAR; + function unshift (value, done) { + var current = cache.get() + + current.context = context + current.release = release + current.value = value + current.callback = done || noop + + if (_running === self.concurrency || self.paused) { + if (queueHead) { + current.next = queueHead + queueHead = current + } else { + queueHead = current + queueTail = current + self.saturated() } + } else { + _running++ + worker.call(context, current.value, current.worked) } - - push(token); } - while (state.brackets > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); - state.output = utils.escapeLast(state.output, '['); - decrement('brackets'); + function release (holder) { + if (holder) { + cache.release(holder) + } + var next = queueHead + if (next) { + if (!self.paused) { + if (queueTail === queueHead) { + queueTail = null + } + queueHead = next.next + next.next = null + worker.call(context, next.value, next.worked) + if (queueTail === null) { + self.empty() + } + } else { + _running-- + } + } else if (--_running === 0) { + self.drain() + } } - while (state.parens > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); - state.output = utils.escapeLast(state.output, '('); - decrement('parens'); + function kill () { + queueHead = null + queueTail = null + self.drain = noop } - while (state.braces > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); - state.output = utils.escapeLast(state.output, '{'); - decrement('braces'); + function killAndDrain () { + queueHead = null + queueTail = null + self.drain() + self.drain = noop } +} - if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { - push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); - } +function noop () {} - // rebuild the output if we had to backtrack at any point - if (state.backtrack === true) { - state.output = ''; +function Task () { + this.value = null + this.callback = noop + this.next = null + this.release = noop + this.context = null - for (let token of state.tokens) { - state.output += token.output != null ? token.output : token.value; + var self = this - if (token.suffix) { - state.output += token.suffix; - } - } + this.worked = function worked (err, result) { + var callback = self.callback + self.value = null + self.callback = noop + callback.call(self.context, err, result) + self.release(self) } +} - return state; -}; +module.exports = fastqueue -/** - * Fast paths for creating regular expressions for common glob patterns. - * This can significantly speed up processing and has very little downside - * impact when none of the fast paths match. - */ -parse.fastpaths = (input, options) => { - let opts = { ...options }; - let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - let len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } +/***/ }), +/* 640 */ +/***/ (function(module, exports, __webpack_require__) { - input = REPLACEMENTS[input] || input; - let win32 = utils.isWindows(options); +"use strict"; - // create constants based on platform, for windows or posix - const { - DOT_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOTS_SLASH, - STAR, - START_ANCHOR - } = constants.globChars(win32); - let capture = opts.capture ? '' : '?:'; - let star = opts.bash === true ? '.*?' : STAR; - let nodot = opts.dot ? NO_DOTS : NO_DOT; - let slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; +function reusify (Constructor) { + var head = new Constructor() + var tail = head - if (opts.capture) { - star = `(${star})`; - } + function get () { + var current = head - const globstar = (opts) => { - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; + if (current.next) { + head = current.next + } else { + head = new Constructor() + tail = head + } - const create = str => { - switch (str) { - case '*': - return `${nodot}${ONE_CHAR}${star}`; + current.next = null - case '.*': - return `${DOT_LITERAL}${ONE_CHAR}${star}`; + return current + } - case '*.*': - return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + function release (obj) { + tail.next = obj + tail = obj + } - case '*/*': - return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + return { + get: get, + release: release + } +} - case '**': - return nodot + globstar(opts); +module.exports = reusify - case '**/*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; - case '**/*.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; +/***/ }), +/* 641 */ +/***/ (function(module, exports, __webpack_require__) { - case '**/.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function isFatalError(settings, error) { + if (settings.errorFilter === null) { + return true; + } + return !settings.errorFilter(error); +} +exports.isFatalError = isFatalError; +function isAppliedFilter(filter, value) { + return filter === null || filter(value); +} +exports.isAppliedFilter = isAppliedFilter; +function replacePathSegmentSeparator(filepath, separator) { + return filepath.split(/[\\\/]/).join(separator); +} +exports.replacePathSegmentSeparator = replacePathSegmentSeparator; +function joinPathSegments(a, b, separator) { + if (a === '') { + return b; + } + return a + separator + b; +} +exports.joinPathSegments = joinPathSegments; - default: { - let match = /^(.*?)\.(\w+)$/.exec(str); - if (!match) return; - let source = create(match[1], options); - if (!source) return; +/***/ }), +/* 642 */ +/***/ (function(module, exports, __webpack_require__) { - return source + DOT_LITERAL + match[2]; - } - } - }; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const common = __webpack_require__(641); +class Reader { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); + } +} +exports.default = Reader; - let output = create(input); - if (output && opts.strictSlashes !== true) { - output += `${SLASH_LITERAL}?`; - } - return output; -}; +/***/ }), +/* 643 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = parse; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(382); +const async_1 = __webpack_require__(629); +class StreamProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1.default(this._root, this._settings); + this._stream = new stream_1.Readable({ + objectMode: true, + read: () => { }, + destroy: this._reader.destroy.bind(this._reader) + }); + } + read() { + this._reader.onError((error) => { + this._stream.emit('error', error); + }); + this._reader.onEntry((entry) => { + this._stream.push(entry); + }); + this._reader.onEnd(() => { + this._stream.push(null); + }); + this._reader.read(); + return this._stream; + } +} +exports.default = StreamProvider; /***/ }), -/* 624 */ +/* 644 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const merge2 = __webpack_require__(590); -function merge(streams) { - const mergedStream = merge2(streams); - streams.forEach((stream) => { - stream.once('error', (err) => mergedStream.emit('error', err)); - }); - return mergedStream; +const sync_1 = __webpack_require__(645); +class SyncProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new sync_1.default(this._root, this._settings); + } + read() { + return this._reader.read(); + } } -exports.merge = merge; +exports.default = SyncProvider; /***/ }), -/* 625 */ +/* 645 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(626); -const provider_1 = __webpack_require__(653); -class ProviderAsync extends provider_1.default { +const fsScandir = __webpack_require__(630); +const common = __webpack_require__(641); +const reader_1 = __webpack_require__(642); +class SyncReader extends reader_1.default { constructor() { super(...arguments); - this._reader = new stream_1.default(this._settings); + this._scandir = fsScandir.scandirSync; + this._storage = new Set(); + this._queue = new Set(); } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = []; - return new Promise((resolve, reject) => { - const stream = this.api(root, task, options); - stream.once('error', reject); - stream.on('data', (entry) => entries.push(options.transform(entry))); - stream.once('end', () => resolve(entries)); + read() { + this._pushToQueue(this._root, this._settings.basePath); + this._handleQueue(); + return Array.from(this._storage); + } + _pushToQueue(dir, base) { + this._queue.add({ dir, base }); + } + _handleQueue() { + for (const item of this._queue.values()) { + this._handleDirectory(item.dir, item.base); + } + } + _handleDirectory(dir, base) { + try { + const entries = this._scandir(dir, this._settings.fsScandirSettings); + for (const entry of entries) { + this._handleEntry(entry, base); + } + } + catch (error) { + this._handleError(error); + } + } + _handleError(error) { + if (!common.isFatalError(this._settings, error)) { + return; + } + throw error; + } + _handleEntry(entry, base) { + const fullpath = entry.path; + if (base !== undefined) { + entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + } + if (common.isAppliedFilter(this._settings.entryFilter, entry)) { + this._pushToStorage(entry); + } + if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { + this._pushToQueue(fullpath, entry.path); + } + } + _pushToStorage(entry) { + this._storage.add(entry); + } +} +exports.default = SyncReader; + + +/***/ }), +/* 646 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const fsScandir = __webpack_require__(630); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.basePath = this._getValue(this._options.basePath, undefined); + this.concurrency = this._getValue(this._options.concurrency, Infinity); + this.deepFilter = this._getValue(this._options.deepFilter, null); + this.entryFilter = this._getValue(this._options.entryFilter, null); + this.errorFilter = this._getValue(this._options.errorFilter, null); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); + this.fsScandirSettings = new fsScandir.Settings({ + followSymbolicLinks: this._options.followSymbolicLinks, + fs: this._options.fs, + pathSegmentSeparator: this._options.pathSegmentSeparator, + stats: this._options.stats, + throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink }); } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); + _getValue(option, value) { + return option === undefined ? value : option; } } -exports.default = ProviderAsync; +exports.default = Settings; /***/ }), -/* 626 */ +/* 647 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(27); -const fsStat = __webpack_require__(627); -const fsWalk = __webpack_require__(632); -const reader_1 = __webpack_require__(652); -class ReaderStream extends reader_1.default { - constructor() { - super(...arguments); - this._walkStream = fsWalk.walkStream; - this._stat = fsStat.stat; +const path = __webpack_require__(4); +const fsStat = __webpack_require__(622); +const utils = __webpack_require__(593); +class Reader { + constructor(_settings) { + this._settings = _settings; + this._fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this._settings.followSymbolicLinks, + fs: this._settings.fs, + throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks + }); } - dynamic(root, options) { - return this._walkStream(root, options); + _getFullEntryPath(filepath) { + return path.resolve(this._settings.cwd, filepath); } - static(patterns, options) { - const filepaths = patterns.map(this._getFullEntryPath, this); - const stream = new stream_1.PassThrough({ objectMode: true }); - stream._write = (index, _enc, done) => { - return this._getEntry(filepaths[index], patterns[index], options) - .then((entry) => { - if (entry !== null && options.entryFilter(entry)) { - stream.push(entry); - } - if (index === filepaths.length - 1) { - stream.end(); - } - done(); - }) - .catch(done); + _makeEntry(stats, pattern) { + const entry = { + name: pattern, + path: pattern, + dirent: utils.fs.createDirentFromStats(pattern, stats) }; - for (let i = 0; i < filepaths.length; i++) { - stream.write(i); + if (this._settings.stats) { + entry.stats = stats; } - return stream; - } - _getEntry(filepath, pattern, options) { - return this._getStat(filepath) - .then((stats) => this._makeEntry(stats, pattern)) - .catch((error) => { - if (options.errorFilter(error)) { - return null; - } - throw error; - }); + return entry; } - _getStat(filepath) { - return new Promise((resolve, reject) => { - this._stat(filepath, this._fsStatSettings, (error, stats) => { - error ? reject(error) : resolve(stats); - }); - }); + _isFatalError(error) { + return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; } } -exports.default = ReaderStream; +exports.default = Reader; /***/ }), -/* 627 */ +/* 648 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(628); -const sync = __webpack_require__(629); -const settings_1 = __webpack_require__(630); -exports.Settings = settings_1.default; -function stat(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return async.read(path, getSettings(), optionsOrSettingsOrCallback); +const path = __webpack_require__(4); +const deep_1 = __webpack_require__(649); +const entry_1 = __webpack_require__(650); +const error_1 = __webpack_require__(651); +const entry_2 = __webpack_require__(652); +class Provider { + constructor(_settings) { + this._settings = _settings; + this.errorFilter = new error_1.default(this._settings); + this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); + this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); + this.entryTransformer = new entry_2.default(this._settings); } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.stat = stat; -function statSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.statSync = statSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; + _getRootDirectory(task) { + return path.resolve(this._settings.cwd, task.base); + } + _getReaderOptions(task) { + const basePath = task.base === '.' ? '' : task.base; + return { + basePath, + pathSegmentSeparator: '/', + concurrency: this._settings.concurrency, + deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), + entryFilter: this.entryFilter.getFilter(task.positive, task.negative), + errorFilter: this.errorFilter.getFilter(), + followSymbolicLinks: this._settings.followSymbolicLinks, + fs: this._settings.fs, + stats: this._settings.stats, + throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, + transform: this.entryTransformer.getTransformer() + }; + } + _getMicromatchOptions() { + return { + dot: this._settings.dot, + matchBase: this._settings.baseNameMatch, + nobrace: !this._settings.braceExpansion, + nocase: !this._settings.caseSensitiveMatch, + noext: !this._settings.extglob, + noglobstar: !this._settings.globstar, + posix: true, + strictSlashes: false + }; } - return new settings_1.default(settingsOrOptions); } +exports.default = Provider; /***/ }), -/* 628 */ +/* 649 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -function read(path, settings, callback) { - settings.fs.lstat(path, (lstatError, lstat) => { - if (lstatError) { - return callFailureCallback(callback, lstatError); +const utils = __webpack_require__(593); +class DeepFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + } + getFilter(basePath, positive, negative) { + const maxPatternDepth = this._getMaxPatternDepth(positive); + const negativeRe = this._getNegativePatternsRe(negative); + return (entry) => this._filter(basePath, entry, negativeRe, maxPatternDepth); + } + _getMaxPatternDepth(patterns) { + const globstar = patterns.some(utils.pattern.hasGlobStar); + return globstar ? Infinity : utils.pattern.getMaxNaivePatternsDepth(patterns); + } + _getNegativePatternsRe(patterns) { + const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); + return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); + } + _filter(basePath, entry, negativeRe, maxPatternDepth) { + const depth = this._getEntryDepth(basePath, entry.path); + if (this._isSkippedByDeep(depth)) { + return false; } - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return callSuccessCallback(callback, lstat); + if (this._isSkippedByMaxPatternDepth(depth, maxPatternDepth)) { + return false; } - settings.fs.stat(path, (statError, stat) => { - if (statError) { - if (settings.throwErrorOnBrokenSymbolicLink) { - return callFailureCallback(callback, statError); - } - return callSuccessCallback(callback, lstat); - } - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - callSuccessCallback(callback, stat); - }); - }); -} -exports.read = read; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); + if (this._isSkippedSymbolicLink(entry)) { + return false; + } + if (this._isSkippedDotDirectory(entry)) { + return false; + } + return this._isSkippedByNegativePatterns(entry, negativeRe); + } + _getEntryDepth(basePath, entryPath) { + const basePathDepth = basePath.split('/').length; + const entryPathDepth = entryPath.split('/').length; + return entryPathDepth - (basePath === '' ? 0 : basePathDepth); + } + _isSkippedByDeep(entryDepth) { + return entryDepth >= this._settings.deep; + } + _isSkippedByMaxPatternDepth(entryDepth, maxPatternDepth) { + return !this._settings.baseNameMatch && maxPatternDepth !== Infinity && entryDepth > maxPatternDepth; + } + _isSkippedSymbolicLink(entry) { + return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); + } + _isSkippedDotDirectory(entry) { + return !this._settings.dot && entry.name.startsWith('.'); + } + _isSkippedByNegativePatterns(entry, negativeRe) { + return !utils.pattern.matchAny(entry.path, negativeRe); + } } +exports.default = DeepFilter; /***/ }), -/* 629 */ +/* 650 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -function read(path, settings) { - const lstat = settings.fs.lstatSync(path); - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return lstat; +const utils = __webpack_require__(593); +class EntryFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this.index = new Map(); } - try { - const stat = settings.fs.statSync(path); - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; + getFilter(positive, negative) { + const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); + const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); + return (entry) => this._filter(entry, positiveRe, negativeRe); + } + _filter(entry, positiveRe, negativeRe) { + if (this._settings.unique) { + if (this._isDuplicateEntry(entry)) { + return false; + } + this._createIndexRecord(entry); } - return stat; + if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { + return false; + } + if (this._isSkippedByAbsoluteNegativePatterns(entry, negativeRe)) { + return false; + } + const filepath = this._settings.baseNameMatch ? entry.name : entry.path; + return this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); } - catch (error) { - if (!settings.throwErrorOnBrokenSymbolicLink) { - return lstat; + _isDuplicateEntry(entry) { + return this.index.has(entry.path); + } + _createIndexRecord(entry) { + this.index.set(entry.path, undefined); + } + _onlyFileFilter(entry) { + return this._settings.onlyFiles && !entry.dirent.isFile(); + } + _onlyDirectoryFilter(entry) { + return this._settings.onlyDirectories && !entry.dirent.isDirectory(); + } + _isSkippedByAbsoluteNegativePatterns(entry, negativeRe) { + if (!this._settings.absolute) { + return false; } - throw error; + const fullpath = utils.path.makeAbsolute(this._settings.cwd, entry.path); + return this._isMatchToPatterns(fullpath, negativeRe); + } + _isMatchToPatterns(filepath, patternsRe) { + return utils.pattern.matchAny(filepath, patternsRe); } } -exports.read = read; +exports.default = EntryFilter; /***/ }), -/* 630 */ +/* 651 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(631); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); +const utils = __webpack_require__(593); +class ErrorFilter { + constructor(_settings) { + this._settings = _settings; } - _getValue(option, value) { - return option === undefined ? value : option; + getFilter() { + return (error) => this._isNonFatalError(error); + } + _isNonFatalError(error) { + return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; } } -exports.default = Settings; +exports.default = ErrorFilter; /***/ }), -/* 631 */ +/* 652 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync -}; -function createFileSystemAdapter(fsMethods) { - if (!fsMethods) { - return exports.FILE_SYSTEM_ADAPTER; +const utils = __webpack_require__(593); +class EntryTransformer { + constructor(_settings) { + this._settings = _settings; + } + getTransformer() { + return (entry) => this._transform(entry); + } + _transform(entry) { + let filepath = entry.path; + if (this._settings.absolute) { + filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); + filepath = utils.path.unixify(filepath); + } + if (this._settings.markDirectories && entry.dirent.isDirectory()) { + filepath += '/'; + } + if (!this._settings.objectMode) { + return filepath; + } + return Object.assign({}, entry, { path: filepath }); } - return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); } -exports.createFileSystemAdapter = createFileSystemAdapter; +exports.default = EntryTransformer; /***/ }), -/* 632 */ +/* 653 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(633); -const stream_1 = __webpack_require__(648); -const sync_1 = __webpack_require__(649); -const settings_1 = __webpack_require__(651); -exports.Settings = settings_1.default; -function walk(dir, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return new async_1.default(dir, getSettings()).read(optionsOrSettingsOrCallback); +const stream_1 = __webpack_require__(382); +const stream_2 = __webpack_require__(621); +const provider_1 = __webpack_require__(648); +class ProviderStream extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_2.default(this._settings); } - new async_1.default(dir, getSettings(optionsOrSettingsOrCallback)).read(callback); -} -exports.walk = walk; -function walkSync(dir, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new sync_1.default(dir, settings); - return provider.read(); -} -exports.walkSync = walkSync; -function walkStream(dir, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new stream_1.default(dir, settings); - return provider.read(); -} -exports.walkStream = walkStream; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const source = this.api(root, task, options); + const dest = new stream_1.Readable({ objectMode: true, read: () => { } }); + source + .once('error', (error) => dest.emit('error', error)) + .on('data', (entry) => dest.emit('data', options.transform(entry))) + .once('end', () => dest.emit('end')); + return dest; + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); } - return new settings_1.default(settingsOrOptions); } +exports.default = ProviderStream; /***/ }), -/* 633 */ +/* 654 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(634); -class AsyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._storage = new Set(); +const sync_1 = __webpack_require__(655); +const provider_1 = __webpack_require__(648); +class ProviderSync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new sync_1.default(this._settings); } - read(callback) { - this._reader.onError((error) => { - callFailureCallback(callback, error); - }); - this._reader.onEntry((entry) => { - this._storage.add(entry); - }); - this._reader.onEnd(() => { - callSuccessCallback(callback, Array.from(this._storage)); - }); - this._reader.read(); + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = this.api(root, task, options); + return entries.map(options.transform); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); } } -exports.default = AsyncProvider; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, entries) { - callback(null, entries); -} +exports.default = ProviderSync; /***/ }), -/* 634 */ +/* 655 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const events_1 = __webpack_require__(399); -const fsScandir = __webpack_require__(635); -const fastq = __webpack_require__(644); -const common = __webpack_require__(646); +const fsStat = __webpack_require__(622); +const fsWalk = __webpack_require__(627); const reader_1 = __webpack_require__(647); -class AsyncReader extends reader_1.default { - constructor(_root, _settings) { - super(_root, _settings); - this._settings = _settings; - this._scandir = fsScandir.scandir; - this._emitter = new events_1.EventEmitter(); - this._queue = fastq(this._worker.bind(this), this._settings.concurrency); - this._isFatalError = false; - this._isDestroyed = false; - this._queue.drain = () => { - if (!this._isFatalError) { - this._emitter.emit('end'); - } - }; - } - read() { - this._isFatalError = false; - this._isDestroyed = false; - setImmediate(() => { - this._pushToQueue(this._root, this._settings.basePath); - }); - return this._emitter; - } - destroy() { - if (this._isDestroyed) { - throw new Error('The reader is already destroyed'); - } - this._isDestroyed = true; - this._queue.killAndDrain(); - } - onEntry(callback) { - this._emitter.on('entry', callback); - } - onError(callback) { - this._emitter.once('error', callback); - } - onEnd(callback) { - this._emitter.once('end', callback); +class ReaderSync extends reader_1.default { + constructor() { + super(...arguments); + this._walkSync = fsWalk.walkSync; + this._statSync = fsStat.statSync; } - _pushToQueue(dir, base) { - const queueItem = { dir, base }; - this._queue.push(queueItem, (error) => { - if (error) { - this._handleError(error); - } - }); + dynamic(root, options) { + return this._walkSync(root, options); } - _worker(item, done) { - this._scandir(item.dir, this._settings.fsScandirSettings, (error, entries) => { - if (error) { - return done(error, undefined); - } - for (const entry of entries) { - this._handleEntry(entry, item.base); + static(patterns, options) { + const entries = []; + for (const pattern of patterns) { + const filepath = this._getFullEntryPath(pattern); + const entry = this._getEntry(filepath, pattern, options); + if (entry === null || !options.entryFilter(entry)) { + continue; } - done(null, undefined); - }); - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - this._isFatalError = true; - this._isDestroyed = true; - this._emitter.emit('error', error); - } - _handleEntry(entry, base) { - if (this._isDestroyed || this._isFatalError) { - return; - } - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + entries.push(entry); } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._emitEntry(entry); + return entries; + } + _getEntry(filepath, pattern, options) { + try { + const stats = this._getStat(filepath); + return this._makeEntry(stats, pattern); } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, entry.path); + catch (error) { + if (options.errorFilter(error)) { + return null; + } + throw error; } } - _emitEntry(entry) { - this._emitter.emit('entry', entry); + _getStat(filepath) { + return this._statSync(filepath, this._fsStatSettings); } } -exports.default = AsyncReader; +exports.default = ReaderSync; /***/ }), -/* 635 */ +/* 656 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(636); -const sync = __webpack_require__(641); -const settings_1 = __webpack_require__(642); -exports.Settings = settings_1.default; -function scandir(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return async.read(path, getSettings(), optionsOrSettingsOrCallback); +const fs = __webpack_require__(349); +const os = __webpack_require__(364); +const CPU_COUNT = os.cpus().length; +exports.DEFAULT_FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + lstatSync: fs.lstatSync, + stat: fs.stat, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +// tslint:enable no-redundant-jsdoc +class Settings { + constructor(_options = {}) { + this._options = _options; + this.absolute = this._getValue(this._options.absolute, false); + this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); + this.braceExpansion = this._getValue(this._options.braceExpansion, true); + this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); + this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); + this.cwd = this._getValue(this._options.cwd, process.cwd()); + this.deep = this._getValue(this._options.deep, Infinity); + this.dot = this._getValue(this._options.dot, false); + this.extglob = this._getValue(this._options.extglob, true); + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); + this.fs = this._getFileSystemMethods(this._options.fs); + this.globstar = this._getValue(this._options.globstar, true); + this.ignore = this._getValue(this._options.ignore, []); + this.markDirectories = this._getValue(this._options.markDirectories, false); + this.objectMode = this._getValue(this._options.objectMode, false); + this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); + this.onlyFiles = this._getValue(this._options.onlyFiles, true); + this.stats = this._getValue(this._options.stats, false); + this.suppressErrors = this._getValue(this._options.suppressErrors, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); + this.unique = this._getValue(this._options.unique, true); + if (this.onlyDirectories) { + this.onlyFiles = false; + } + if (this.stats) { + this.objectMode = true; + } } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.scandir = scandir; -function scandirSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.scandirSync = scandirSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; + _getValue(option, value) { + return option === undefined ? value : option; + } + _getFileSystemMethods(methods = {}) { + return Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER, methods); } - return new settings_1.default(settingsOrOptions); } +exports.default = Settings; /***/ }), -/* 636 */ +/* 657 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(627); -const rpl = __webpack_require__(637); -const constants_1 = __webpack_require__(638); -const utils = __webpack_require__(639); -function read(dir, settings, callback) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(dir, settings, callback); - } - return readdir(dir, settings, callback); -} -exports.read = read; -function readdirWithFileTypes(dir, settings, callback) { - settings.fs.readdir(dir, { withFileTypes: true }, (readdirError, dirents) => { - if (readdirError) { - return callFailureCallback(callback, readdirError); - } - const entries = dirents.map((dirent) => ({ - dirent, - name: dirent.name, - path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` - })); - if (!settings.followSymbolicLinks) { - return callSuccessCallback(callback, entries); - } - const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); - rpl(tasks, (rplError, rplEntries) => { - if (rplError) { - return callFailureCallback(callback, rplError); - } - callSuccessCallback(callback, rplEntries); - }); - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function makeRplTaskEntry(entry, settings) { - return (done) => { - if (!entry.dirent.isSymbolicLink()) { - return done(null, entry); - } - settings.fs.stat(entry.path, (statError, stats) => { - if (statError) { - if (settings.throwErrorOnBrokenSymbolicLink) { - return done(statError); - } - return done(null, entry); - } - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - return done(null, entry); - }); - }; -} -function readdir(dir, settings, callback) { - settings.fs.readdir(dir, (readdirError, names) => { - if (readdirError) { - return callFailureCallback(callback, readdirError); - } - const filepaths = names.map((name) => `${dir}${settings.pathSegmentSeparator}${name}`); - const tasks = filepaths.map((filepath) => { - return (done) => fsStat.stat(filepath, settings.fsStatSettings, done); - }); - rpl(tasks, (rplError, results) => { - if (rplError) { - return callFailureCallback(callback, rplError); - } - const entries = []; - for (let index = 0; index < names.length; index++) { - const name = names[index]; - const stats = results[index]; - const entry = { - name, - path: filepaths[index], - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - entries.push(entry); - } - callSuccessCallback(callback, entries); - }); - }); -} -exports.readdir = readdir; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); -} +const path = __webpack_require__(4); +const pathType = __webpack_require__(658); -/***/ }), -/* 637 */ -/***/ (function(module, exports) { +const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; -module.exports = runParallel +const getPath = (filepath, cwd) => { + const pth = filepath[0] === '!' ? filepath.slice(1) : filepath; + return path.isAbsolute(pth) ? pth : path.join(cwd, pth); +}; -function runParallel (tasks, cb) { - var results, pending, keys - var isSync = true +const addExtensions = (file, extensions) => { + if (path.extname(file)) { + return `**/${file}`; + } - if (Array.isArray(tasks)) { - results = [] - pending = tasks.length - } else { - keys = Object.keys(tasks) - results = {} - pending = keys.length - } + return `**/${file}.${getExtensions(extensions)}`; +}; - function done (err) { - function end () { - if (cb) cb(err, results) - cb = null - } - if (isSync) process.nextTick(end) - else end() - } +const getGlob = (directory, options) => { + if (options.files && !Array.isArray(options.files)) { + throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof options.files}\``); + } - function each (i, err, result) { - results[i] = result - if (--pending === 0 || err) { - done(err) - } - } + if (options.extensions && !Array.isArray(options.extensions)) { + throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof options.extensions}\``); + } - if (!pending) { - // empty - done(null) - } else if (keys) { - // object - keys.forEach(function (key) { - tasks[key](function (err, result) { each(key, err, result) }) - }) - } else { - // array - tasks.forEach(function (task, i) { - task(function (err, result) { each(i, err, result) }) - }) - } + if (options.files && options.extensions) { + return options.files.map(x => path.posix.join(directory, addExtensions(x, options.extensions))); + } - isSync = false -} + if (options.files) { + return options.files.map(x => path.posix.join(directory, `**/${x}`)); + } + if (options.extensions) { + return [path.posix.join(directory, `**/*.${getExtensions(options.extensions)}`)]; + } -/***/ }), -/* 638 */ -/***/ (function(module, exports, __webpack_require__) { + return [path.posix.join(directory, '**')]; +}; -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); -const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); -const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); -/** - * IS `true` for Node.js 10.10 and greater. - */ -exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = MAJOR_VERSION > 10 || (MAJOR_VERSION === 10 && MINOR_VERSION >= 10); +module.exports = async (input, options) => { + options = { + cwd: process.cwd(), + ...options + }; + if (typeof options.cwd !== 'string') { + throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); + } -/***/ }), -/* 639 */ -/***/ (function(module, exports, __webpack_require__) { + const globs = await Promise.all([].concat(input).map(async x => { + const isDirectory = await pathType.isDirectory(getPath(x, options.cwd)); + return isDirectory ? getGlob(x, options) : x; + })); -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(640); -exports.fs = fs; + return [].concat.apply([], globs); // eslint-disable-line prefer-spread +}; + +module.exports.sync = (input, options) => { + options = { + cwd: process.cwd(), + ...options + }; + + if (typeof options.cwd !== 'string') { + throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); + } + + const globs = [].concat(input).map(x => pathType.isDirectorySync(getPath(x, options.cwd)) ? getGlob(x, options) : x); + + return [].concat.apply([], globs); // eslint-disable-line prefer-spread +}; /***/ }), -/* 640 */ +/* 658 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; + +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(349); + +async function isType(fsStatType, statsMethodName, filePath) { + if (typeof filePath !== 'string') { + throw new TypeError(`Expected a string, got ${typeof filePath}`); + } + + try { + const stats = await promisify(fs[fsStatType])(filePath); + return stats[statsMethodName](); + } catch (error) { + if (error.code === 'ENOENT') { + return false; + } + + throw error; + } +} + +function isTypeSync(fsStatType, statsMethodName, filePath) { + if (typeof filePath !== 'string') { + throw new TypeError(`Expected a string, got ${typeof filePath}`); + } + + try { + return fs[fsStatType](filePath)[statsMethodName](); + } catch (error) { + if (error.code === 'ENOENT') { + return false; + } + + throw error; + } +} + +exports.isFile = isType.bind(null, 'stat', 'isFile'); +exports.isDirectory = isType.bind(null, 'stat', 'isDirectory'); +exports.isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink'); +exports.isFileSync = isTypeSync.bind(null, 'statSync', 'isFile'); +exports.isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory'); +exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 641 */ +/* 659 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(627); -const constants_1 = __webpack_require__(638); -const utils = __webpack_require__(639); -function read(dir, settings) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(dir, settings); - } - return readdir(dir, settings); -} -exports.read = read; -function readdirWithFileTypes(dir, settings) { - const dirents = settings.fs.readdirSync(dir, { withFileTypes: true }); - return dirents.map((dirent) => { - const entry = { - dirent, - name: dirent.name, - path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` - }; - if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { - try { - const stats = settings.fs.statSync(entry.path); - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - } - catch (error) { - if (settings.throwErrorOnBrokenSymbolicLink) { - throw error; - } - } - } - return entry; - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function readdir(dir, settings) { - const names = settings.fs.readdirSync(dir); - return names.map((name) => { - const entryPath = `${dir}${settings.pathSegmentSeparator}${name}`; - const stats = fsStat.statSync(entryPath, settings.fsStatSettings); - const entry = { - name, - path: entryPath, - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - return entry; - }); -} -exports.readdir = readdir; + +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const fastGlob = __webpack_require__(591); +const gitIgnore = __webpack_require__(660); +const slash = __webpack_require__(661); + +const DEFAULT_IGNORE = [ + '**/node_modules/**', + '**/flow-typed/**', + '**/coverage/**', + '**/.git' +]; + +const readFileP = promisify(fs.readFile); + +const mapGitIgnorePatternTo = base => ignore => { + if (ignore.startsWith('!')) { + return '!' + path.posix.join(base, ignore.slice(1)); + } + + return path.posix.join(base, ignore); +}; + +const parseGitIgnore = (content, options) => { + const base = slash(path.relative(options.cwd, path.dirname(options.fileName))); + + return content + .split(/\r?\n/) + .filter(Boolean) + .filter(line => !line.startsWith('#')) + .map(mapGitIgnorePatternTo(base)); +}; + +const reduceIgnore = files => { + return files.reduce((ignores, file) => { + ignores.add(parseGitIgnore(file.content, { + cwd: file.cwd, + fileName: file.filePath + })); + return ignores; + }, gitIgnore()); +}; + +const ensureAbsolutePathForCwd = (cwd, p) => { + if (path.isAbsolute(p)) { + if (p.startsWith(cwd)) { + return p; + } + + throw new Error(`Path ${p} is not in cwd ${cwd}`); + } + + return path.join(cwd, p); +}; + +const getIsIgnoredPredecate = (ignores, cwd) => { + return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p)))); +}; + +const getFile = async (file, cwd) => { + const filePath = path.join(cwd, file); + const content = await readFileP(filePath, 'utf8'); + + return { + cwd, + filePath, + content + }; +}; + +const getFileSync = (file, cwd) => { + const filePath = path.join(cwd, file); + const content = fs.readFileSync(filePath, 'utf8'); + + return { + cwd, + filePath, + content + }; +}; + +const normalizeOptions = ({ + ignore = [], + cwd = process.cwd() +} = {}) => { + return {ignore, cwd}; +}; + +module.exports = async options => { + options = normalizeOptions(options); + + const paths = await fastGlob('**/.gitignore', { + ignore: DEFAULT_IGNORE.concat(options.ignore), + cwd: options.cwd + }); + + const files = await Promise.all(paths.map(file => getFile(file, options.cwd))); + const ignores = reduceIgnore(files); + + return getIsIgnoredPredecate(ignores, options.cwd); +}; + +module.exports.sync = options => { + options = normalizeOptions(options); + + const paths = fastGlob.sync('**/.gitignore', { + ignore: DEFAULT_IGNORE.concat(options.ignore), + cwd: options.cwd + }); + + const files = paths.map(file => getFileSync(file, options.cwd)); + const ignores = reduceIgnore(files); + + return getIsIgnoredPredecate(ignores, options.cwd); +}; /***/ }), -/* 642 */ -/***/ (function(module, exports, __webpack_require__) { +/* 660 */ +/***/ (function(module, exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const fsStat = __webpack_require__(627); -const fs = __webpack_require__(643); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.stats = this._getValue(this._options.stats, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); - this.fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this.followSymbolicLinks, - fs: this.fs, - throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; +// A simple implementation of make-array +function makeArray (subject) { + return Array.isArray(subject) + ? subject + : [subject] +} +const REGEX_TEST_BLANK_LINE = /^\s+$/ +const REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/ +const REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/ +const REGEX_SPLITALL_CRLF = /\r?\n/g +// /foo, +// ./foo, +// ../foo, +// . +// .. +const REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/ -/***/ }), -/* 643 */ -/***/ (function(module, exports, __webpack_require__) { +const SLASH = '/' +const KEY_IGNORE = typeof Symbol !== 'undefined' + ? Symbol.for('node-ignore') + /* istanbul ignore next */ + : 'node-ignore' -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -function createFileSystemAdapter(fsMethods) { - if (!fsMethods) { - return exports.FILE_SYSTEM_ADAPTER; - } - return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); -} -exports.createFileSystemAdapter = createFileSystemAdapter; +const define = (object, key, value) => + Object.defineProperty(object, key, {value}) +const REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g -/***/ }), -/* 644 */ -/***/ (function(module, exports, __webpack_require__) { +// Sanitize the range of a regular expression +// The cases are complicated, see test cases for details +const sanitizeRange = range => range.replace( + REGEX_REGEXP_RANGE, + (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0) + ? match + // Invalid range (out of order) which is ok for gitignore rules but + // fatal for JavaScript regular expression, so eliminate it. + : '' +) -"use strict"; +// > If the pattern ends with a slash, +// > it is removed for the purpose of the following description, +// > but it would only find a match with a directory. +// > In other words, foo/ will match a directory foo and paths underneath it, +// > but will not match a regular file or a symbolic link foo +// > (this is consistent with the way how pathspec works in general in Git). +// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`' +// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call +// you could use option `mark: true` with `glob` +// '`foo/`' should not continue with the '`..`' +const DEFAULT_REPLACER_PREFIX = [ -var reusify = __webpack_require__(645) + // > Trailing spaces are ignored unless they are quoted with backslash ("\") + [ + // (a\ ) -> (a ) + // (a ) -> (a) + // (a \ ) -> (a ) + /\\?\s+$/, + match => match.indexOf('\\') === 0 + ? ' ' + : '' + ], -function fastqueue (context, worker, concurrency) { - if (typeof context === 'function') { - concurrency = worker - worker = context - context = null - } + // replace (\ ) with ' ' + [ + /\\\s/g, + () => ' ' + ], - var cache = reusify(Task) - var queueHead = null - var queueTail = null - var _running = 0 + // Escape metacharacters + // which is written down by users but means special for regular expressions. - var self = { - push: push, - drain: noop, - saturated: noop, - pause: pause, - paused: false, - concurrency: concurrency, - running: running, - resume: resume, - idle: idle, - length: length, - unshift: unshift, - empty: noop, - kill: kill, - killAndDrain: killAndDrain - } + // > There are 12 characters with special meanings: + // > - the backslash \, + // > - the caret ^, + // > - the dollar sign $, + // > - the period or dot ., + // > - the vertical bar or pipe symbol |, + // > - the question mark ?, + // > - the asterisk or star *, + // > - the plus sign +, + // > - the opening parenthesis (, + // > - the closing parenthesis ), + // > - and the opening square bracket [, + // > - the opening curly brace {, + // > These special characters are often called "metacharacters". + [ + /[\\^$.|*+(){]/g, + match => `\\${match}` + ], - return self + [ + // > [abc] matches any character inside the brackets + // > (in this case a, b, or c); + /\[([^\]/]*)($|\])/g, + (match, p1, p2) => p2 === ']' + ? `[${sanitizeRange(p1)}]` + : `\\${match}` + ], - function running () { - return _running - } + [ + // > a question mark (?) matches a single character + /(?!\\)\?/g, + () => '[^/]' + ], - function pause () { - self.paused = true - } + // leading slash + [ - function length () { - var current = queueHead - var counter = 0 + // > A leading slash matches the beginning of the pathname. + // > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". + // A leading slash matches the beginning of the pathname + /^\//, + () => '^' + ], - while (current) { - current = current.next - counter++ - } + // replace special metacharacter slash after the leading slash + [ + /\//g, + () => '\\/' + ], - return counter - } + [ + // > A leading "**" followed by a slash means match in all directories. + // > For example, "**/foo" matches file or directory "foo" anywhere, + // > the same as pattern "foo". + // > "**/foo/bar" matches file or directory "bar" anywhere that is directly + // > under directory "foo". + // Notice that the '*'s have been replaced as '\\*' + /^\^*\\\*\\\*\\\//, - function resume () { - if (!self.paused) return - self.paused = false - for (var i = 0; i < self.concurrency; i++) { - _running++ - release() + // '**/foo' <-> 'foo' + () => '^(?:.*\\/)?' + ] +] + +const DEFAULT_REPLACER_SUFFIX = [ + // starting + [ + // there will be no leading '/' + // (which has been replaced by section "leading slash") + // If starts with '**', adding a '^' to the regular expression also works + /^(?=[^^])/, + function startingReplacer () { + return !/\/(?!$)/.test(this) + // > If the pattern does not contain a slash /, + // > Git treats it as a shell glob pattern + // Actually, if there is only a trailing slash, + // git also treats it as a shell glob pattern + ? '(?:^|\\/)' + + // > Otherwise, Git treats the pattern as a shell glob suitable for + // > consumption by fnmatch(3) + : '^' } - } + ], - function idle () { - return _running === 0 && self.length() === 0 - } + // two globstars + [ + // Use lookahead assertions so that we could match more than one `'/**'` + /\\\/\\\*\\\*(?=\\\/|$)/g, - function push (value, done) { - var current = cache.get() + // Zero, one or several directories + // should not use '*', or it will be replaced by the next replacer - current.context = context - current.release = release - current.value = value - current.callback = done || noop + // Check if it is not the last `'/**'` + (_, index, str) => index + 6 < str.length - if (_running === self.concurrency || self.paused) { - if (queueTail) { - queueTail.next = current - queueTail = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } - } + // case: /**/ + // > A slash followed by two consecutive asterisks then a slash matches + // > zero or more directories. + // > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on. + // '/**/' + ? '(?:\\/[^\\/]+)*' - function unshift (value, done) { - var current = cache.get() + // case: /** + // > A trailing `"/**"` matches everything inside. - current.context = context - current.release = release - current.value = value - current.callback = done || noop + // #21: everything inside but it should not include the current folder + : '\\/.+' + ], - if (_running === self.concurrency || self.paused) { - if (queueHead) { - current.next = queueHead - queueHead = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } - } + // intermediate wildcards + [ + // Never replace escaped '*' + // ignore rule '\*' will match the path '*' - function release (holder) { - if (holder) { - cache.release(holder) - } - var next = queueHead - if (next) { - if (!self.paused) { - if (queueTail === queueHead) { - queueTail = null - } - queueHead = next.next - next.next = null - worker.call(context, next.value, next.worked) - if (queueTail === null) { - self.empty() - } - } else { - _running-- - } - } else if (--_running === 0) { - self.drain() - } - } + // 'abc.*/' -> go + // 'abc.*' -> skip this rule + /(^|[^\\]+)\\\*(?=.+)/g, - function kill () { - queueHead = null - queueTail = null - self.drain = noop - } + // '*.js' matches '.js' + // '*.js' doesn't match 'abc' + (_, p1) => `${p1}[^\\/]*` + ], - function killAndDrain () { - queueHead = null - queueTail = null - self.drain() - self.drain = noop - } -} + // trailing wildcard + [ + /(\^|\\\/)?\\\*$/, + (_, p1) => { + const prefix = p1 + // '\^': + // '/*' does not match '' + // '/*' does not match everything -function noop () {} + // '\\\/': + // 'abc/*' does not match 'abc/' + ? `${p1}[^/]+` -function Task () { - this.value = null - this.callback = noop - this.next = null - this.release = noop - this.context = null + // 'a*' matches 'a' + // 'a*' matches 'aa' + : '[^/]*' - var self = this + return `${prefix}(?=$|\\/$)` + } + ], - this.worked = function worked (err, result) { - var callback = self.callback - self.value = null - self.callback = noop - callback.call(self.context, err, result) - self.release(self) - } -} + [ + // unescape + /\\\\\\/g, + () => '\\' + ] +] -module.exports = fastqueue +const POSITIVE_REPLACERS = [ + ...DEFAULT_REPLACER_PREFIX, + // 'f' + // matches + // - /f(end) + // - /f/ + // - (start)f(end) + // - (start)f/ + // doesn't match + // - oof + // - foo + // pseudo: + // -> (^|/)f(/|$) -/***/ }), -/* 645 */ -/***/ (function(module, exports, __webpack_require__) { + // ending + [ + // 'js' will not match 'js.' + // 'ab' will not match 'abc' + /(?:[^*/])$/, -"use strict"; + // 'js*' will not match 'a.js' + // 'js/' will not match 'a.js' + // 'js' will match 'a.js' and 'a.js/' + match => `${match}(?=$|\\/)` + ], + ...DEFAULT_REPLACER_SUFFIX +] -function reusify (Constructor) { - var head = new Constructor() - var tail = head +const NEGATIVE_REPLACERS = [ + ...DEFAULT_REPLACER_PREFIX, - function get () { - var current = head + // #24, #38 + // The MISSING rule of [gitignore docs](https://git-scm.com/docs/gitignore) + // A negative pattern without a trailing wildcard should not + // re-include the things inside that directory. - if (current.next) { - head = current.next - } else { - head = new Constructor() - tail = head - } + // eg: + // ['node_modules/*', '!node_modules'] + // should ignore `node_modules/a.js` + [ + /(?:[^*])$/, + match => `${match}(?=$|\\/$)` + ], - current.next = null + ...DEFAULT_REPLACER_SUFFIX +] - return current - } +// A simple cache, because an ignore rule only has only one certain meaning +const regexCache = Object.create(null) - function release (obj) { - tail.next = obj - tail = obj +// @param {pattern} +const makeRegex = (pattern, negative, ignorecase) => { + const r = regexCache[pattern] + if (r) { + return r } - return { - get: get, - release: release + const replacers = negative + ? NEGATIVE_REPLACERS + : POSITIVE_REPLACERS + + const source = replacers.reduce( + (prev, current) => prev.replace(current[0], current[1].bind(pattern)), + pattern + ) + + return regexCache[pattern] = ignorecase + ? new RegExp(source, 'i') + : new RegExp(source) +} + +const isString = subject => typeof subject === 'string' + +// > A blank line matches no files, so it can serve as a separator for readability. +const checkPattern = pattern => pattern + && isString(pattern) + && !REGEX_TEST_BLANK_LINE.test(pattern) + + // > A line starting with # serves as a comment. + && pattern.indexOf('#') !== 0 + +const splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF) + +class IgnoreRule { + constructor ( + origin, + pattern, + negative, + regex + ) { + this.origin = origin + this.pattern = pattern + this.negative = negative + this.regex = regex } } -module.exports = reusify +const createRule = (pattern, ignorecase) => { + const origin = pattern + let negative = false + + // > An optional prefix "!" which negates the pattern; + if (pattern.indexOf('!') === 0) { + negative = true + pattern = pattern.substr(1) + } + + pattern = pattern + // > Put a backslash ("\") in front of the first "!" for patterns that + // > begin with a literal "!", for example, `"\!important!.txt"`. + .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!') + // > Put a backslash ("\") in front of the first hash for patterns that + // > begin with a hash. + .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#') + const regex = makeRegex(pattern, negative, ignorecase) -/***/ }), -/* 646 */ -/***/ (function(module, exports, __webpack_require__) { + return new IgnoreRule( + origin, + pattern, + negative, + regex + ) +} -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function isFatalError(settings, error) { - if (settings.errorFilter === null) { - return true; - } - return !settings.errorFilter(error); -} -exports.isFatalError = isFatalError; -function isAppliedFilter(filter, value) { - return filter === null || filter(value); -} -exports.isAppliedFilter = isAppliedFilter; -function replacePathSegmentSeparator(filepath, separator) { - return filepath.split(/[\\\/]/).join(separator); -} -exports.replacePathSegmentSeparator = replacePathSegmentSeparator; -function joinPathSegments(a, b, separator) { - if (a === '') { - return b; - } - return a + separator + b; -} -exports.joinPathSegments = joinPathSegments; +const throwError = (message, Ctor) => { + throw new Ctor(message) +} +const checkPath = (path, originalPath, doThrow) => { + if (!isString(path)) { + return doThrow( + `path must be a string, but got \`${originalPath}\``, + TypeError + ) + } -/***/ }), -/* 647 */ -/***/ (function(module, exports, __webpack_require__) { + // We don't know if we should ignore '', so throw + if (!path) { + return doThrow(`path must not be empty`, TypeError) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const common = __webpack_require__(646); -class Reader { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); - } -} -exports.default = Reader; + // Check if it is a relative path + if (checkPath.isNotRelative(path)) { + const r = '`path.relative()`d' + return doThrow( + `path should be a ${r} string, but got "${originalPath}"`, + RangeError + ) + } + return true +} -/***/ }), -/* 648 */ -/***/ (function(module, exports, __webpack_require__) { +const isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path) -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(27); -const async_1 = __webpack_require__(634); -class StreamProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._stream = new stream_1.Readable({ - objectMode: true, - read: () => { }, - destroy: this._reader.destroy.bind(this._reader) - }); - } - read() { - this._reader.onError((error) => { - this._stream.emit('error', error); - }); - this._reader.onEntry((entry) => { - this._stream.push(entry); - }); - this._reader.onEnd(() => { - this._stream.push(null); - }); - this._reader.read(); - return this._stream; - } -} -exports.default = StreamProvider; +checkPath.isNotRelative = isNotRelative +checkPath.convert = p => p +class Ignore { + constructor ({ + ignorecase = true + } = {}) { + this._rules = [] + this._ignorecase = ignorecase + define(this, KEY_IGNORE, true) + this._initCache() + } -/***/ }), -/* 649 */ -/***/ (function(module, exports, __webpack_require__) { + _initCache () { + this._ignoreCache = Object.create(null) + this._testCache = Object.create(null) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(650); -class SyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new sync_1.default(this._root, this._settings); - } - read() { - return this._reader.read(); - } -} -exports.default = SyncProvider; + _addPattern (pattern) { + // #32 + if (pattern && pattern[KEY_IGNORE]) { + this._rules = this._rules.concat(pattern._rules) + this._added = true + return + } + if (checkPattern(pattern)) { + const rule = createRule(pattern, this._ignorecase) + this._added = true + this._rules.push(rule) + } + } -/***/ }), -/* 650 */ -/***/ (function(module, exports, __webpack_require__) { + // @param {Array | string | Ignore} pattern + add (pattern) { + this._added = false -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsScandir = __webpack_require__(635); -const common = __webpack_require__(646); -const reader_1 = __webpack_require__(647); -class SyncReader extends reader_1.default { - constructor() { - super(...arguments); - this._scandir = fsScandir.scandirSync; - this._storage = new Set(); - this._queue = new Set(); - } - read() { - this._pushToQueue(this._root, this._settings.basePath); - this._handleQueue(); - return Array.from(this._storage); - } - _pushToQueue(dir, base) { - this._queue.add({ dir, base }); - } - _handleQueue() { - for (const item of this._queue.values()) { - this._handleDirectory(item.dir, item.base); - } - } - _handleDirectory(dir, base) { - try { - const entries = this._scandir(dir, this._settings.fsScandirSettings); - for (const entry of entries) { - this._handleEntry(entry, base); - } - } - catch (error) { - this._handleError(error); - } - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - throw error; - } - _handleEntry(entry, base) { - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._pushToStorage(entry); - } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, entry.path); - } - } - _pushToStorage(entry) { - this._storage.add(entry); - } -} -exports.default = SyncReader; + makeArray( + isString(pattern) + ? splitPattern(pattern) + : pattern + ).forEach(this._addPattern, this) + // Some rules have just added to the ignore, + // making the behavior changed. + if (this._added) { + this._initCache() + } -/***/ }), -/* 651 */ -/***/ (function(module, exports, __webpack_require__) { + return this + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const fsScandir = __webpack_require__(635); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.basePath = this._getValue(this._options.basePath, undefined); - this.concurrency = this._getValue(this._options.concurrency, Infinity); - this.deepFilter = this._getValue(this._options.deepFilter, null); - this.entryFilter = this._getValue(this._options.entryFilter, null); - this.errorFilter = this._getValue(this._options.errorFilter, null); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.fsScandirSettings = new fsScandir.Settings({ - followSymbolicLinks: this._options.followSymbolicLinks, - fs: this._options.fs, - pathSegmentSeparator: this._options.pathSegmentSeparator, - stats: this._options.stats, - throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; + // legacy + addPattern (pattern) { + return this.add(pattern) + } + // | ignored : unignored + // negative | 0:0 | 0:1 | 1:0 | 1:1 + // -------- | ------- | ------- | ------- | -------- + // 0 | TEST | TEST | SKIP | X + // 1 | TESTIF | SKIP | TEST | X -/***/ }), -/* 652 */ -/***/ (function(module, exports, __webpack_require__) { + // - SKIP: always skip + // - TEST: always test + // - TESTIF: only test if checkUnignored + // - X: that never happen -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const fsStat = __webpack_require__(627); -const utils = __webpack_require__(598); -class Reader { - constructor(_settings) { - this._settings = _settings; - this._fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this._settings.followSymbolicLinks, - fs: this._settings.fs, - throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks - }); - } - _getFullEntryPath(filepath) { - return path.resolve(this._settings.cwd, filepath); - } - _makeEntry(stats, pattern) { - const entry = { - name: pattern, - path: pattern, - dirent: utils.fs.createDirentFromStats(pattern, stats) - }; - if (this._settings.stats) { - entry.stats = stats; - } - return entry; - } - _isFatalError(error) { - return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; - } -} -exports.default = Reader; + // @param {boolean} whether should check if the path is unignored, + // setting `checkUnignored` to `false` could reduce additional + // path matching. + // @returns {TestResult} true if a file is ignored + _testOne (path, checkUnignored) { + let ignored = false + let unignored = false -/***/ }), -/* 653 */ -/***/ (function(module, exports, __webpack_require__) { + this._rules.forEach(rule => { + const {negative} = rule + if ( + unignored === negative && ignored !== unignored + || negative && !ignored && !unignored && !checkUnignored + ) { + return + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const deep_1 = __webpack_require__(654); -const entry_1 = __webpack_require__(655); -const error_1 = __webpack_require__(656); -const entry_2 = __webpack_require__(657); -class Provider { - constructor(_settings) { - this._settings = _settings; - this.errorFilter = new error_1.default(this._settings); - this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); - this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); - this.entryTransformer = new entry_2.default(this._settings); - } - _getRootDirectory(task) { - return path.resolve(this._settings.cwd, task.base); - } - _getReaderOptions(task) { - const basePath = task.base === '.' ? '' : task.base; - return { - basePath, - pathSegmentSeparator: '/', - concurrency: this._settings.concurrency, - deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), - entryFilter: this.entryFilter.getFilter(task.positive, task.negative), - errorFilter: this.errorFilter.getFilter(), - followSymbolicLinks: this._settings.followSymbolicLinks, - fs: this._settings.fs, - stats: this._settings.stats, - throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, - transform: this.entryTransformer.getTransformer() - }; - } - _getMicromatchOptions() { - return { - dot: this._settings.dot, - matchBase: this._settings.baseNameMatch, - nobrace: !this._settings.braceExpansion, - nocase: !this._settings.caseSensitiveMatch, - noext: !this._settings.extglob, - noglobstar: !this._settings.globstar, - posix: true, - strictSlashes: false - }; - } -} -exports.default = Provider; + const matched = rule.regex.test(path) + if (matched) { + ignored = !negative + unignored = negative + } + }) -/***/ }), -/* 654 */ -/***/ (function(module, exports, __webpack_require__) { + return { + ignored, + unignored + } + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); -class DeepFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - } - getFilter(basePath, positive, negative) { - const maxPatternDepth = this._getMaxPatternDepth(positive); - const negativeRe = this._getNegativePatternsRe(negative); - return (entry) => this._filter(basePath, entry, negativeRe, maxPatternDepth); - } - _getMaxPatternDepth(patterns) { - const globstar = patterns.some(utils.pattern.hasGlobStar); - return globstar ? Infinity : utils.pattern.getMaxNaivePatternsDepth(patterns); - } - _getNegativePatternsRe(patterns) { - const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); - return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); - } - _filter(basePath, entry, negativeRe, maxPatternDepth) { - const depth = this._getEntryDepth(basePath, entry.path); - if (this._isSkippedByDeep(depth)) { - return false; - } - if (this._isSkippedByMaxPatternDepth(depth, maxPatternDepth)) { - return false; - } - if (this._isSkippedSymbolicLink(entry)) { - return false; - } - if (this._isSkippedDotDirectory(entry)) { - return false; - } - return this._isSkippedByNegativePatterns(entry, negativeRe); - } - _getEntryDepth(basePath, entryPath) { - const basePathDepth = basePath.split('/').length; - const entryPathDepth = entryPath.split('/').length; - return entryPathDepth - (basePath === '' ? 0 : basePathDepth); - } - _isSkippedByDeep(entryDepth) { - return entryDepth >= this._settings.deep; - } - _isSkippedByMaxPatternDepth(entryDepth, maxPatternDepth) { - return !this._settings.baseNameMatch && maxPatternDepth !== Infinity && entryDepth > maxPatternDepth; - } - _isSkippedSymbolicLink(entry) { - return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); - } - _isSkippedDotDirectory(entry) { - return !this._settings.dot && entry.name.startsWith('.'); - } - _isSkippedByNegativePatterns(entry, negativeRe) { - return !utils.pattern.matchAny(entry.path, negativeRe); - } -} -exports.default = DeepFilter; + // @returns {TestResult} + _test (originalPath, cache, checkUnignored, slices) { + const path = originalPath + // Supports nullable path + && checkPath.convert(originalPath) + checkPath(path, originalPath, throwError) -/***/ }), -/* 655 */ -/***/ (function(module, exports, __webpack_require__) { + return this._t(path, cache, checkUnignored, slices) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); -class EntryFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this.index = new Map(); - } - getFilter(positive, negative) { - const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); - const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); - return (entry) => this._filter(entry, positiveRe, negativeRe); - } - _filter(entry, positiveRe, negativeRe) { - if (this._settings.unique) { - if (this._isDuplicateEntry(entry)) { - return false; - } - this._createIndexRecord(entry); - } - if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { - return false; - } - if (this._isSkippedByAbsoluteNegativePatterns(entry, negativeRe)) { - return false; - } - const filepath = this._settings.baseNameMatch ? entry.name : entry.path; - return this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); - } - _isDuplicateEntry(entry) { - return this.index.has(entry.path); - } - _createIndexRecord(entry) { - this.index.set(entry.path, undefined); - } - _onlyFileFilter(entry) { - return this._settings.onlyFiles && !entry.dirent.isFile(); - } - _onlyDirectoryFilter(entry) { - return this._settings.onlyDirectories && !entry.dirent.isDirectory(); - } - _isSkippedByAbsoluteNegativePatterns(entry, negativeRe) { - if (!this._settings.absolute) { - return false; - } - const fullpath = utils.path.makeAbsolute(this._settings.cwd, entry.path); - return this._isMatchToPatterns(fullpath, negativeRe); - } - _isMatchToPatterns(filepath, patternsRe) { - return utils.pattern.matchAny(filepath, patternsRe); - } -} -exports.default = EntryFilter; + _t (path, cache, checkUnignored, slices) { + if (path in cache) { + return cache[path] + } + if (!slices) { + // path/to/a.js + // ['path', 'to', 'a.js'] + slices = path.split(SLASH) + } -/***/ }), -/* 656 */ -/***/ (function(module, exports, __webpack_require__) { + slices.pop() -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); -class ErrorFilter { - constructor(_settings) { - this._settings = _settings; - } - getFilter() { - return (error) => this._isNonFatalError(error); - } - _isNonFatalError(error) { - return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; - } -} -exports.default = ErrorFilter; + // If the path has no parent directory, just test it + if (!slices.length) { + return cache[path] = this._testOne(path, checkUnignored) + } + const parent = this._t( + slices.join(SLASH) + SLASH, + cache, + checkUnignored, + slices + ) -/***/ }), -/* 657 */ -/***/ (function(module, exports, __webpack_require__) { + // If the path contains a parent directory, check the parent first + return cache[path] = parent.ignored + // > It is not possible to re-include a file if a parent directory of + // > that file is excluded. + ? parent + : this._testOne(path, checkUnignored) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); -class EntryTransformer { - constructor(_settings) { - this._settings = _settings; - } - getTransformer() { - return (entry) => this._transform(entry); - } - _transform(entry) { - let filepath = entry.path; - if (this._settings.absolute) { - filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); - filepath = utils.path.unixify(filepath); - } - if (this._settings.markDirectories && entry.dirent.isDirectory()) { - filepath += '/'; - } - if (!this._settings.objectMode) { - return filepath; - } - return Object.assign({}, entry, { path: filepath }); - } -} -exports.default = EntryTransformer; + ignores (path) { + return this._test(path, this._ignoreCache, false).ignored + } + createFilter () { + return path => !this.ignores(path) + } -/***/ }), -/* 658 */ -/***/ (function(module, exports, __webpack_require__) { + filter (paths) { + return makeArray(paths).filter(this.createFilter()) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(27); -const stream_2 = __webpack_require__(626); -const provider_1 = __webpack_require__(653); -class ProviderStream extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_2.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const source = this.api(root, task, options); - const dest = new stream_1.Readable({ objectMode: true, read: () => { } }); - source - .once('error', (error) => dest.emit('error', error)) - .on('data', (entry) => dest.emit('data', options.transform(entry))) - .once('end', () => dest.emit('end')); - return dest; - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderStream; + // @returns {TestResult} + test (path) { + return this._test(path, this._testCache, true) + } +} +const factory = options => new Ignore(options) -/***/ }), -/* 659 */ -/***/ (function(module, exports, __webpack_require__) { +const returnFalse = () => false -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(660); -const provider_1 = __webpack_require__(653); -class ProviderSync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new sync_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = this.api(root, task, options); - return entries.map(options.transform); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderSync; +const isPathValid = path => + checkPath(path && checkPath.convert(path), path, returnFalse) +factory.isPathValid = isPathValid -/***/ }), -/* 660 */ -/***/ (function(module, exports, __webpack_require__) { +// Fixes typescript +factory.default = factory -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(627); -const fsWalk = __webpack_require__(632); -const reader_1 = __webpack_require__(652); -class ReaderSync extends reader_1.default { - constructor() { - super(...arguments); - this._walkSync = fsWalk.walkSync; - this._statSync = fsStat.statSync; - } - dynamic(root, options) { - return this._walkSync(root, options); - } - static(patterns, options) { - const entries = []; - for (const pattern of patterns) { - const filepath = this._getFullEntryPath(pattern); - const entry = this._getEntry(filepath, pattern, options); - if (entry === null || !options.entryFilter(entry)) { - continue; - } - entries.push(entry); - } - return entries; - } - _getEntry(filepath, pattern, options) { - try { - const stats = this._getStat(filepath); - return this._makeEntry(stats, pattern); - } - catch (error) { - if (options.errorFilter(error)) { - return null; - } - throw error; - } - } - _getStat(filepath) { - return this._statSync(filepath, this._fsStatSettings); - } -} -exports.default = ReaderSync; +module.exports = factory + +// Windows +// -------------------------------------------------------------- +/* istanbul ignore if */ +if ( + // Detect `process` so that it can run in browsers. + typeof process !== 'undefined' + && ( + process.env && process.env.IGNORE_TEST_WIN32 + || process.platform === 'win32' + ) +) { + /* eslint no-control-regex: "off" */ + const makePosix = str => /^\\\\\?\\/.test(str) + || /["<>|\u0000-\u001F]+/u.test(str) + ? str + : str.replace(/\\/g, '/') + + checkPath.convert = makePosix + + // 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/' + // 'd:\\foo' + const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i + checkPath.isNotRelative = path => + REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path) + || isNotRelative(path) +} /***/ }), @@ -75639,59 +75887,17 @@ exports.default = ReaderSync; /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); -const os = __webpack_require__(11); -const CPU_COUNT = os.cpus().length; -exports.DEFAULT_FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - lstatSync: fs.lstatSync, - stat: fs.stat, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -// tslint:enable no-redundant-jsdoc -class Settings { - constructor(_options = {}) { - this._options = _options; - this.absolute = this._getValue(this._options.absolute, false); - this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); - this.braceExpansion = this._getValue(this._options.braceExpansion, true); - this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); - this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); - this.cwd = this._getValue(this._options.cwd, process.cwd()); - this.deep = this._getValue(this._options.deep, Infinity); - this.dot = this._getValue(this._options.dot, false); - this.extglob = this._getValue(this._options.extglob, true); - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); - this.fs = this._getFileSystemMethods(this._options.fs); - this.globstar = this._getValue(this._options.globstar, true); - this.ignore = this._getValue(this._options.ignore, []); - this.markDirectories = this._getValue(this._options.markDirectories, false); - this.objectMode = this._getValue(this._options.objectMode, false); - this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); - this.onlyFiles = this._getValue(this._options.onlyFiles, true); - this.stats = this._getValue(this._options.stats, false); - this.suppressErrors = this._getValue(this._options.suppressErrors, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); - this.unique = this._getValue(this._options.unique, true); - if (this.onlyDirectories) { - this.onlyFiles = false; - } - if (this.stats) { - this.objectMode = true; - } - } - _getValue(option, value) { - return option === undefined ? value : option; - } - _getFileSystemMethods(methods = {}) { - return Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER, methods); - } -} -exports.default = Settings; + +module.exports = path => { + const isExtendedLengthPath = /^\\\\\?\\/.test(path); + const hasNonAscii = /[^\u0000-\u0080]+/.test(path); // eslint-disable-line no-control-regex + + if (isExtendedLengthPath || hasNonAscii) { + return path; + } + + return path.replace(/\\/g, '/'); +}; /***/ }), @@ -75700,1739 +75906,1725 @@ exports.default = Settings; "use strict"; -const path = __webpack_require__(16); -const pathType = __webpack_require__(663); +const {Transform} = __webpack_require__(382); -const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; - -const getPath = (filepath, cwd) => { - const pth = filepath[0] === '!' ? filepath.slice(1) : filepath; - return path.isAbsolute(pth) ? pth : path.join(cwd, pth); -}; - -const addExtensions = (file, extensions) => { - if (path.extname(file)) { - return `**/${file}`; +class ObjectTransform extends Transform { + constructor() { + super({ + objectMode: true + }); } +} - return `**/${file}.${getExtensions(extensions)}`; -}; - -const getGlob = (directory, options) => { - if (options.files && !Array.isArray(options.files)) { - throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof options.files}\``); +class FilterStream extends ObjectTransform { + constructor(filter) { + super(); + this._filter = filter; } - if (options.extensions && !Array.isArray(options.extensions)) { - throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof options.extensions}\``); - } + _transform(data, encoding, callback) { + if (this._filter(data)) { + this.push(data); + } - if (options.files && options.extensions) { - return options.files.map(x => path.posix.join(directory, addExtensions(x, options.extensions))); + callback(); } +} - if (options.files) { - return options.files.map(x => path.posix.join(directory, `**/${x}`)); +class UniqueStream extends ObjectTransform { + constructor() { + super(); + this._pushed = new Set(); } - if (options.extensions) { - return [path.posix.join(directory, `**/*.${getExtensions(options.extensions)}`)]; + _transform(data, encoding, callback) { + if (!this._pushed.has(data)) { + this.push(data); + this._pushed.add(data); + } + + callback(); } +} - return [path.posix.join(directory, '**')]; +module.exports = { + FilterStream, + UniqueStream }; -module.exports = async (input, options) => { - options = { - cwd: process.cwd(), - ...options - }; - if (typeof options.cwd !== 'string') { - throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); - } +/***/ }), +/* 663 */ +/***/ (function(module, exports, __webpack_require__) { - const globs = await Promise.all([].concat(input).map(async x => { - const isDirectory = await pathType.isDirectory(getPath(x, options.cwd)); - return isDirectory ? getGlob(x, options) : x; - })); +"use strict"; - return [].concat.apply([], globs); // eslint-disable-line prefer-spread -}; +const path = __webpack_require__(4); -module.exports.sync = (input, options) => { - options = { - cwd: process.cwd(), - ...options - }; +module.exports = path_ => { + let cwd = process.cwd(); - if (typeof options.cwd !== 'string') { - throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); - } + path_ = path.resolve(path_); - const globs = [].concat(input).map(x => pathType.isDirectorySync(getPath(x, options.cwd)) ? getGlob(x, options) : x); + if (process.platform === 'win32') { + cwd = cwd.toLowerCase(); + path_ = path_.toLowerCase(); + } - return [].concat.apply([], globs); // eslint-disable-line prefer-spread + return path_ === cwd; }; /***/ }), -/* 663 */ +/* 664 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(23); +const path = __webpack_require__(4); -async function isType(fsStatType, statsMethodName, filePath) { - if (typeof filePath !== 'string') { - throw new TypeError(`Expected a string, got ${typeof filePath}`); - } +module.exports = (childPath, parentPath) => { + childPath = path.resolve(childPath); + parentPath = path.resolve(parentPath); - try { - const stats = await promisify(fs[fsStatType])(filePath); - return stats[statsMethodName](); - } catch (error) { - if (error.code === 'ENOENT') { - return false; - } + if (process.platform === 'win32') { + childPath = childPath.toLowerCase(); + parentPath = parentPath.toLowerCase(); + } - throw error; + if (childPath === parentPath) { + return false; } + + childPath += path.sep; + parentPath += path.sep; + + return childPath.startsWith(parentPath); +}; + + +/***/ }), +/* 665 */ +/***/ (function(module, exports, __webpack_require__) { + +const assert = __webpack_require__(371) +const path = __webpack_require__(4) +const fs = __webpack_require__(349) +let glob = undefined +try { + glob = __webpack_require__(586) +} catch (_err) { + // treat glob as optional. } -function isTypeSync(fsStatType, statsMethodName, filePath) { - if (typeof filePath !== 'string') { - throw new TypeError(`Expected a string, got ${typeof filePath}`); - } +const defaultGlobOpts = { + nosort: true, + silent: true +} - try { - return fs[fsStatType](filePath)[statsMethodName](); - } catch (error) { - if (error.code === 'ENOENT') { - return false; - } +// for EMFILE handling +let timeout = 0 - throw error; - } +const isWindows = (process.platform === "win32") + +const defaults = options => { + const methods = [ + 'unlink', + 'chmod', + 'stat', + 'lstat', + 'rmdir', + 'readdir' + ] + methods.forEach(m => { + options[m] = options[m] || fs[m] + m = m + 'Sync' + options[m] = options[m] || fs[m] + }) + + options.maxBusyTries = options.maxBusyTries || 3 + options.emfileWait = options.emfileWait || 1000 + if (options.glob === false) { + options.disableGlob = true + } + if (options.disableGlob !== true && glob === undefined) { + throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') + } + options.disableGlob = options.disableGlob || false + options.glob = options.glob || defaultGlobOpts } -exports.isFile = isType.bind(null, 'stat', 'isFile'); -exports.isDirectory = isType.bind(null, 'stat', 'isDirectory'); -exports.isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink'); -exports.isFileSync = isTypeSync.bind(null, 'statSync', 'isFile'); -exports.isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory'); -exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); +const rimraf = (p, options, cb) => { + if (typeof options === 'function') { + cb = options + options = {} + } + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert.equal(typeof cb, 'function', 'rimraf: callback function required') + assert(options, 'rimraf: invalid options argument provided') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + defaults(options) + + let busyTries = 0 + let errState = null + let n = 0 + + const next = (er) => { + errState = errState || er + if (--n === 0) + cb(errState) + } + + const afterGlob = (er, results) => { + if (er) + return cb(er) + + n = results.length + if (n === 0) + return cb() + + results.forEach(p => { + const CB = (er) => { + if (er) { + if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && + busyTries < options.maxBusyTries) { + busyTries ++ + // try again, with the same exact callback as this one. + return setTimeout(() => rimraf_(p, options, CB), busyTries * 100) + } + + // this one won't happen if graceful-fs is used. + if (er.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(() => rimraf_(p, options, CB), timeout ++) + } + + // already gone + if (er.code === "ENOENT") er = null + } + timeout = 0 + next(er) + } + rimraf_(p, options, CB) + }) + } -/***/ }), -/* 664 */ -/***/ (function(module, exports, __webpack_require__) { + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]) -"use strict"; + options.lstat(p, (er, stat) => { + if (!er) + return afterGlob(null, [p]) -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const fastGlob = __webpack_require__(596); -const gitIgnore = __webpack_require__(665); -const slash = __webpack_require__(666); + glob(p, options.glob, afterGlob) + }) -const DEFAULT_IGNORE = [ - '**/node_modules/**', - '**/flow-typed/**', - '**/coverage/**', - '**/.git' -]; +} -const readFileP = promisify(fs.readFile); +// Two possible strategies. +// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR +// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR +// +// Both result in an extra syscall when you guess wrong. However, there +// are likely far more normal files in the world than directories. This +// is based on the assumption that a the average number of files per +// directory is >= 1. +// +// If anyone ever complains about this, then I guess the strategy could +// be made configurable somehow. But until then, YAGNI. +const rimraf_ = (p, options, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') -const mapGitIgnorePatternTo = base => ignore => { - if (ignore.startsWith('!')) { - return '!' + path.posix.join(base, ignore.slice(1)); - } + // sunos lets the root user unlink directories, which is... weird. + // so we have to lstat here and make sure it's not a dir. + options.lstat(p, (er, st) => { + if (er && er.code === "ENOENT") + return cb(null) - return path.posix.join(base, ignore); -}; + // Windows can EPERM on stat. Life is suffering. + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb) -const parseGitIgnore = (content, options) => { - const base = slash(path.relative(options.cwd, path.dirname(options.fileName))); + if (st && st.isDirectory()) + return rmdir(p, options, er, cb) - return content - .split(/\r?\n/) - .filter(Boolean) - .filter(line => !line.startsWith('#')) - .map(mapGitIgnorePatternTo(base)); -}; + options.unlink(p, er => { + if (er) { + if (er.code === "ENOENT") + return cb(null) + if (er.code === "EPERM") + return (isWindows) + ? fixWinEPERM(p, options, er, cb) + : rmdir(p, options, er, cb) + if (er.code === "EISDIR") + return rmdir(p, options, er, cb) + } + return cb(er) + }) + }) +} -const reduceIgnore = files => { - return files.reduce((ignores, file) => { - ignores.add(parseGitIgnore(file.content, { - cwd: file.cwd, - fileName: file.filePath - })); - return ignores; - }, gitIgnore()); -}; +const fixWinEPERM = (p, options, er, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') + if (er) + assert(er instanceof Error) -const ensureAbsolutePathForCwd = (cwd, p) => { - if (path.isAbsolute(p)) { - if (p.startsWith(cwd)) { - return p; - } + options.chmod(p, 0o666, er2 => { + if (er2) + cb(er2.code === "ENOENT" ? null : er) + else + options.stat(p, (er3, stats) => { + if (er3) + cb(er3.code === "ENOENT" ? null : er) + else if (stats.isDirectory()) + rmdir(p, options, er, cb) + else + options.unlink(p, cb) + }) + }) +} - throw new Error(`Path ${p} is not in cwd ${cwd}`); - } +const fixWinEPERMSync = (p, options, er) => { + assert(p) + assert(options) + if (er) + assert(er instanceof Error) - return path.join(cwd, p); -}; + try { + options.chmodSync(p, 0o666) + } catch (er2) { + if (er2.code === "ENOENT") + return + else + throw er + } -const getIsIgnoredPredecate = (ignores, cwd) => { - return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p)))); -}; + let stats + try { + stats = options.statSync(p) + } catch (er3) { + if (er3.code === "ENOENT") + return + else + throw er + } -const getFile = async (file, cwd) => { - const filePath = path.join(cwd, file); - const content = await readFileP(filePath, 'utf8'); + if (stats.isDirectory()) + rmdirSync(p, options, er) + else + options.unlinkSync(p) +} - return { - cwd, - filePath, - content - }; -}; +const rmdir = (p, options, originalEr, cb) => { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + assert(typeof cb === 'function') -const getFileSync = (file, cwd) => { - const filePath = path.join(cwd, file); - const content = fs.readFileSync(filePath, 'utf8'); + // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) + // if we guessed wrong, and it's not a directory, then + // raise the original error. + options.rmdir(p, er => { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb) + else if (er && er.code === "ENOTDIR") + cb(originalEr) + else + cb(er) + }) +} - return { - cwd, - filePath, - content - }; -}; +const rmkids = (p, options, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') -const normalizeOptions = ({ - ignore = [], - cwd = process.cwd() -} = {}) => { - return {ignore, cwd}; -}; + options.readdir(p, (er, files) => { + if (er) + return cb(er) + let n = files.length + if (n === 0) + return options.rmdir(p, cb) + let errState + files.forEach(f => { + rimraf(path.join(p, f), options, er => { + if (errState) + return + if (er) + return cb(errState = er) + if (--n === 0) + options.rmdir(p, cb) + }) + }) + }) +} -module.exports = async options => { - options = normalizeOptions(options); +// this looks simpler, and is strictly *faster*, but will +// tie up the JavaScript thread and fail on excessively +// deep directory trees. +const rimrafSync = (p, options) => { + options = options || {} + defaults(options) - const paths = await fastGlob('**/.gitignore', { - ignore: DEFAULT_IGNORE.concat(options.ignore), - cwd: options.cwd - }); + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert(options, 'rimraf: missing options') + assert.equal(typeof options, 'object', 'rimraf: options should be object') - const files = await Promise.all(paths.map(file => getFile(file, options.cwd))); - const ignores = reduceIgnore(files); + let results - return getIsIgnoredPredecate(ignores, options.cwd); -}; + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p] + } else { + try { + options.lstatSync(p) + results = [p] + } catch (er) { + results = glob.sync(p, options.glob) + } + } -module.exports.sync = options => { - options = normalizeOptions(options); + if (!results.length) + return - const paths = fastGlob.sync('**/.gitignore', { - ignore: DEFAULT_IGNORE.concat(options.ignore), - cwd: options.cwd - }); + for (let i = 0; i < results.length; i++) { + const p = results[i] - const files = paths.map(file => getFileSync(file, options.cwd)); - const ignores = reduceIgnore(files); + let st + try { + st = options.lstatSync(p) + } catch (er) { + if (er.code === "ENOENT") + return - return getIsIgnoredPredecate(ignores, options.cwd); -}; + // Windows can EPERM on stat. Life is suffering. + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er) + } + try { + // sunos lets the root user unlink directories, which is... weird. + if (st && st.isDirectory()) + rmdirSync(p, options, null) + else + options.unlinkSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) + if (er.code !== "EISDIR") + throw er -/***/ }), -/* 665 */ -/***/ (function(module, exports) { + rmdirSync(p, options, er) + } + } +} -// A simple implementation of make-array -function makeArray (subject) { - return Array.isArray(subject) - ? subject - : [subject] +const rmdirSync = (p, options, originalEr) => { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + + try { + options.rmdirSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "ENOTDIR") + throw originalEr + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options) + } } -const REGEX_TEST_BLANK_LINE = /^\s+$/ -const REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/ -const REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/ -const REGEX_SPLITALL_CRLF = /\r?\n/g -// /foo, -// ./foo, -// ../foo, -// . -// .. -const REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/ +const rmkidsSync = (p, options) => { + assert(p) + assert(options) + options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options)) -const SLASH = '/' -const KEY_IGNORE = typeof Symbol !== 'undefined' - ? Symbol.for('node-ignore') - /* istanbul ignore next */ - : 'node-ignore' + // We only end up here once we got ENOTEMPTY at least once, and + // at this point, we are guaranteed to have removed all the kids. + // So, we know that it won't be ENOENT or ENOTDIR or anything else. + // try really hard to delete stuff on windows, because it has a + // PROFOUNDLY annoying habit of not closing handles promptly when + // files are deleted, resulting in spurious ENOTEMPTY errors. + const retries = isWindows ? 100 : 1 + let i = 0 + do { + let threw = true + try { + const ret = options.rmdirSync(p, options) + threw = false + return ret + } finally { + if (++i < retries && threw) + continue + } + } while (true) +} -const define = (object, key, value) => - Object.defineProperty(object, key, {value}) +module.exports = rimraf +rimraf.sync = rimrafSync -const REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g -// Sanitize the range of a regular expression -// The cases are complicated, see test cases for details -const sanitizeRange = range => range.replace( - REGEX_REGEXP_RANGE, - (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0) - ? match - // Invalid range (out of order) which is ok for gitignore rules but - // fatal for JavaScript regular expression, so eliminate it. - : '' -) +/***/ }), +/* 666 */ +/***/ (function(module, exports, __webpack_require__) { -// > If the pattern ends with a slash, -// > it is removed for the purpose of the following description, -// > but it would only find a match with a directory. -// > In other words, foo/ will match a directory foo and paths underneath it, -// > but will not match a regular file or a symbolic link foo -// > (this is consistent with the way how pathspec works in general in Git). -// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`' -// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call -// you could use option `mark: true` with `glob` +"use strict"; -// '`foo/`' should not continue with the '`..`' -const DEFAULT_REPLACER_PREFIX = [ +const AggregateError = __webpack_require__(667); - // > Trailing spaces are ignored unless they are quoted with backslash ("\") - [ - // (a\ ) -> (a ) - // (a ) -> (a) - // (a \ ) -> (a ) - /\\?\s+$/, - match => match.indexOf('\\') === 0 - ? ' ' - : '' - ], +module.exports = async ( + iterable, + mapper, + { + concurrency = Infinity, + stopOnError = true + } = {} +) => { + return new Promise((resolve, reject) => { + if (typeof mapper !== 'function') { + throw new TypeError('Mapper function is required'); + } - // replace (\ ) with ' ' - [ - /\\\s/g, - () => ' ' - ], + if (!(typeof concurrency === 'number' && concurrency >= 1)) { + throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); + } - // Escape metacharacters - // which is written down by users but means special for regular expressions. + const ret = []; + const errors = []; + const iterator = iterable[Symbol.iterator](); + let isRejected = false; + let isIterableDone = false; + let resolvingCount = 0; + let currentIndex = 0; - // > There are 12 characters with special meanings: - // > - the backslash \, - // > - the caret ^, - // > - the dollar sign $, - // > - the period or dot ., - // > - the vertical bar or pipe symbol |, - // > - the question mark ?, - // > - the asterisk or star *, - // > - the plus sign +, - // > - the opening parenthesis (, - // > - the closing parenthesis ), - // > - and the opening square bracket [, - // > - the opening curly brace {, - // > These special characters are often called "metacharacters". - [ - /[\\^$.|*+(){]/g, - match => `\\${match}` - ], + const next = () => { + if (isRejected) { + return; + } - [ - // > [abc] matches any character inside the brackets - // > (in this case a, b, or c); - /\[([^\]/]*)($|\])/g, - (match, p1, p2) => p2 === ']' - ? `[${sanitizeRange(p1)}]` - : `\\${match}` - ], + const nextItem = iterator.next(); + const i = currentIndex; + currentIndex++; - [ - // > a question mark (?) matches a single character - /(?!\\)\?/g, - () => '[^/]' - ], + if (nextItem.done) { + isIterableDone = true; - // leading slash - [ + if (resolvingCount === 0) { + if (!stopOnError && errors.length !== 0) { + reject(new AggregateError(errors)); + } else { + resolve(ret); + } + } - // > A leading slash matches the beginning of the pathname. - // > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". - // A leading slash matches the beginning of the pathname - /^\//, - () => '^' - ], + return; + } - // replace special metacharacter slash after the leading slash - [ - /\//g, - () => '\\/' - ], + resolvingCount++; - [ - // > A leading "**" followed by a slash means match in all directories. - // > For example, "**/foo" matches file or directory "foo" anywhere, - // > the same as pattern "foo". - // > "**/foo/bar" matches file or directory "bar" anywhere that is directly - // > under directory "foo". - // Notice that the '*'s have been replaced as '\\*' - /^\^*\\\*\\\*\\\//, + (async () => { + try { + const element = await nextItem.value; + ret[i] = await mapper(element, i); + resolvingCount--; + next(); + } catch (error) { + if (stopOnError) { + isRejected = true; + reject(error); + } else { + errors.push(error); + resolvingCount--; + next(); + } + } + })(); + }; - // '**/foo' <-> 'foo' - () => '^(?:.*\\/)?' - ] -] + for (let i = 0; i < concurrency; i++) { + next(); -const DEFAULT_REPLACER_SUFFIX = [ - // starting - [ - // there will be no leading '/' - // (which has been replaced by section "leading slash") - // If starts with '**', adding a '^' to the regular expression also works - /^(?=[^^])/, - function startingReplacer () { - return !/\/(?!$)/.test(this) - // > If the pattern does not contain a slash /, - // > Git treats it as a shell glob pattern - // Actually, if there is only a trailing slash, - // git also treats it as a shell glob pattern - ? '(?:^|\\/)' + if (isIterableDone) { + break; + } + } + }); +}; - // > Otherwise, Git treats the pattern as a shell glob suitable for - // > consumption by fnmatch(3) - : '^' - } - ], - // two globstars - [ - // Use lookahead assertions so that we could match more than one `'/**'` - /\\\/\\\*\\\*(?=\\\/|$)/g, +/***/ }), +/* 667 */ +/***/ (function(module, exports, __webpack_require__) { - // Zero, one or several directories - // should not use '*', or it will be replaced by the next replacer +"use strict"; - // Check if it is not the last `'/**'` - (_, index, str) => index + 6 < str.length +const indentString = __webpack_require__(668); +const cleanStack = __webpack_require__(669); - // case: /**/ - // > A slash followed by two consecutive asterisks then a slash matches - // > zero or more directories. - // > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on. - // '/**/' - ? '(?:\\/[^\\/]+)*' +const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); - // case: /** - // > A trailing `"/**"` matches everything inside. +class AggregateError extends Error { + constructor(errors) { + if (!Array.isArray(errors)) { + throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); + } - // #21: everything inside but it should not include the current folder - : '\\/.+' - ], + errors = [...errors].map(error => { + if (error instanceof Error) { + return error; + } - // intermediate wildcards - [ - // Never replace escaped '*' - // ignore rule '\*' will match the path '*' + if (error !== null && typeof error === 'object') { + // Handle plain error objects with message property and/or possibly other metadata + return Object.assign(new Error(error.message), error); + } - // 'abc.*/' -> go - // 'abc.*' -> skip this rule - /(^|[^\\]+)\\\*(?=.+)/g, + return new Error(error); + }); - // '*.js' matches '.js' - // '*.js' doesn't match 'abc' - (_, p1) => `${p1}[^\\/]*` - ], + let message = errors + .map(error => { + // The `stack` property is not standardized, so we can't assume it exists + return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); + }) + .join('\n'); + message = '\n' + indentString(message, 4); + super(message); - // trailing wildcard - [ - /(\^|\\\/)?\\\*$/, - (_, p1) => { - const prefix = p1 - // '\^': - // '/*' does not match '' - // '/*' does not match everything + this.name = 'AggregateError'; - // '\\\/': - // 'abc/*' does not match 'abc/' - ? `${p1}[^/]+` + Object.defineProperty(this, '_errors', {value: errors}); + } - // 'a*' matches 'a' - // 'a*' matches 'aa' - : '[^/]*' + * [Symbol.iterator]() { + for (const error of this._errors) { + yield error; + } + } +} - return `${prefix}(?=$|\\/$)` - } - ], +module.exports = AggregateError; - [ - // unescape - /\\\\\\/g, - () => '\\' - ] -] -const POSITIVE_REPLACERS = [ - ...DEFAULT_REPLACER_PREFIX, +/***/ }), +/* 668 */ +/***/ (function(module, exports, __webpack_require__) { - // 'f' - // matches - // - /f(end) - // - /f/ - // - (start)f(end) - // - (start)f/ - // doesn't match - // - oof - // - foo - // pseudo: - // -> (^|/)f(/|$) +"use strict"; - // ending - [ - // 'js' will not match 'js.' - // 'ab' will not match 'abc' - /(?:[^*/])$/, - // 'js*' will not match 'a.js' - // 'js/' will not match 'a.js' - // 'js' will match 'a.js' and 'a.js/' - match => `${match}(?=$|\\/)` - ], +module.exports = (string, count = 1, options) => { + options = { + indent: ' ', + includeEmptyLines: false, + ...options + }; - ...DEFAULT_REPLACER_SUFFIX -] + if (typeof string !== 'string') { + throw new TypeError( + `Expected \`input\` to be a \`string\`, got \`${typeof string}\`` + ); + } -const NEGATIVE_REPLACERS = [ - ...DEFAULT_REPLACER_PREFIX, + if (typeof count !== 'number') { + throw new TypeError( + `Expected \`count\` to be a \`number\`, got \`${typeof count}\`` + ); + } - // #24, #38 - // The MISSING rule of [gitignore docs](https://git-scm.com/docs/gitignore) - // A negative pattern without a trailing wildcard should not - // re-include the things inside that directory. + if (typeof options.indent !== 'string') { + throw new TypeError( + `Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\`` + ); + } - // eg: - // ['node_modules/*', '!node_modules'] - // should ignore `node_modules/a.js` - [ - /(?:[^*])$/, - match => `${match}(?=$|\\/$)` - ], + if (count === 0) { + return string; + } - ...DEFAULT_REPLACER_SUFFIX -] + const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; -// A simple cache, because an ignore rule only has only one certain meaning -const regexCache = Object.create(null) + return string.replace(regex, options.indent.repeat(count)); +}; -// @param {pattern} -const makeRegex = (pattern, negative, ignorecase) => { - const r = regexCache[pattern] - if (r) { - return r - } - const replacers = negative - ? NEGATIVE_REPLACERS - : POSITIVE_REPLACERS +/***/ }), +/* 669 */ +/***/ (function(module, exports, __webpack_require__) { - const source = replacers.reduce( - (prev, current) => prev.replace(current[0], current[1].bind(pattern)), - pattern - ) +"use strict"; - return regexCache[pattern] = ignorecase - ? new RegExp(source, 'i') - : new RegExp(source) -} +const os = __webpack_require__(364); -const isString = subject => typeof subject === 'string' +const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; +const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; +const homeDir = typeof os.homedir === 'undefined' ? '' : os.homedir(); -// > A blank line matches no files, so it can serve as a separator for readability. -const checkPattern = pattern => pattern - && isString(pattern) - && !REGEX_TEST_BLANK_LINE.test(pattern) +module.exports = (stack, options) => { + options = Object.assign({pretty: false}, options); - // > A line starting with # serves as a comment. - && pattern.indexOf('#') !== 0 + return stack.replace(/\\/g, '/') + .split('\n') + .filter(line => { + const pathMatches = line.match(extractPathRegex); + if (pathMatches === null || !pathMatches[1]) { + return true; + } -const splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF) + const match = pathMatches[1]; -class IgnoreRule { - constructor ( - origin, - pattern, - negative, - regex - ) { - this.origin = origin - this.pattern = pattern - this.negative = negative - this.regex = regex - } -} + // Electron + if ( + match.includes('.app/Contents/Resources/electron.asar') || + match.includes('.app/Contents/Resources/default_app.asar') + ) { + return false; + } -const createRule = (pattern, ignorecase) => { - const origin = pattern - let negative = false + return !pathRegex.test(match); + }) + .filter(line => line.trim() !== '') + .map(line => { + if (options.pretty) { + return line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~'))); + } - // > An optional prefix "!" which negates the pattern; - if (pattern.indexOf('!') === 0) { - negative = true - pattern = pattern.substr(1) - } + return line; + }) + .join('\n'); +}; - pattern = pattern - // > Put a backslash ("\") in front of the first "!" for patterns that - // > begin with a literal "!", for example, `"\!important!.txt"`. - .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!') - // > Put a backslash ("\") in front of the first hash for patterns that - // > begin with a hash. - .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#') - const regex = makeRegex(pattern, negative, ignorecase) +/***/ }), +/* 670 */ +/***/ (function(module, exports, __webpack_require__) { - return new IgnoreRule( - origin, - pattern, - negative, - regex - ) -} +"use strict"; -const throwError = (message, Ctor) => { - throw new Ctor(message) -} +const chalk = __webpack_require__(671); +const cliCursor = __webpack_require__(675); +const cliSpinners = __webpack_require__(679); +const logSymbols = __webpack_require__(681); -const checkPath = (path, originalPath, doThrow) => { - if (!isString(path)) { - return doThrow( - `path must be a string, but got \`${originalPath}\``, - TypeError - ) - } +class Ora { + constructor(options) { + if (typeof options === 'string') { + options = { + text: options + }; + } - // We don't know if we should ignore '', so throw - if (!path) { - return doThrow(`path must not be empty`, TypeError) - } + this.options = Object.assign({ + text: '', + color: 'cyan', + stream: process.stderr + }, options); - // Check if it is a relative path - if (checkPath.isNotRelative(path)) { - const r = '`path.relative()`d' - return doThrow( - `path should be a ${r} string, but got "${originalPath}"`, - RangeError - ) - } + const sp = this.options.spinner; + this.spinner = typeof sp === 'object' ? sp : (process.platform === 'win32' ? cliSpinners.line : (cliSpinners[sp] || cliSpinners.dots)); // eslint-disable-line no-nested-ternary - return true -} + if (this.spinner.frames === undefined) { + throw new Error('Spinner must define `frames`'); + } -const isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path) + this.text = this.options.text; + this.color = this.options.color; + this.interval = this.options.interval || this.spinner.interval || 100; + this.stream = this.options.stream; + this.id = null; + this.frameIndex = 0; + this.enabled = typeof this.options.enabled === 'boolean' ? this.options.enabled : ((this.stream && this.stream.isTTY) && !process.env.CI); + } + frame() { + const frames = this.spinner.frames; + let frame = frames[this.frameIndex]; -checkPath.isNotRelative = isNotRelative -checkPath.convert = p => p + if (this.color) { + frame = chalk[this.color](frame); + } -class Ignore { - constructor ({ - ignorecase = true - } = {}) { - this._rules = [] - this._ignorecase = ignorecase - define(this, KEY_IGNORE, true) - this._initCache() - } + this.frameIndex = ++this.frameIndex % frames.length; - _initCache () { - this._ignoreCache = Object.create(null) - this._testCache = Object.create(null) - } + return frame + ' ' + this.text; + } + clear() { + if (!this.enabled) { + return this; + } - _addPattern (pattern) { - // #32 - if (pattern && pattern[KEY_IGNORE]) { - this._rules = this._rules.concat(pattern._rules) - this._added = true - return - } + this.stream.clearLine(); + this.stream.cursorTo(0); - if (checkPattern(pattern)) { - const rule = createRule(pattern, this._ignorecase) - this._added = true - this._rules.push(rule) - } - } + return this; + } + render() { + this.clear(); + this.stream.write(this.frame()); - // @param {Array | string | Ignore} pattern - add (pattern) { - this._added = false + return this; + } + start(text) { + if (text) { + this.text = text; + } - makeArray( - isString(pattern) - ? splitPattern(pattern) - : pattern - ).forEach(this._addPattern, this) + if (!this.enabled || this.id) { + return this; + } - // Some rules have just added to the ignore, - // making the behavior changed. - if (this._added) { - this._initCache() - } + cliCursor.hide(this.stream); + this.render(); + this.id = setInterval(this.render.bind(this), this.interval); - return this - } + return this; + } + stop() { + if (!this.enabled) { + return this; + } - // legacy - addPattern (pattern) { - return this.add(pattern) - } + clearInterval(this.id); + this.id = null; + this.frameIndex = 0; + this.clear(); + cliCursor.show(this.stream); - // | ignored : unignored - // negative | 0:0 | 0:1 | 1:0 | 1:1 - // -------- | ------- | ------- | ------- | -------- - // 0 | TEST | TEST | SKIP | X - // 1 | TESTIF | SKIP | TEST | X + return this; + } + succeed(text) { + return this.stopAndPersist({symbol: logSymbols.success, text}); + } + fail(text) { + return this.stopAndPersist({symbol: logSymbols.error, text}); + } + warn(text) { + return this.stopAndPersist({symbol: logSymbols.warning, text}); + } + info(text) { + return this.stopAndPersist({symbol: logSymbols.info, text}); + } + stopAndPersist(options) { + if (!this.enabled) { + return this; + } - // - SKIP: always skip - // - TEST: always test - // - TESTIF: only test if checkUnignored - // - X: that never happen + // Legacy argument + // TODO: Deprecate sometime in the future + if (typeof options === 'string') { + options = { + symbol: options + }; + } - // @param {boolean} whether should check if the path is unignored, - // setting `checkUnignored` to `false` could reduce additional - // path matching. + options = options || {}; - // @returns {TestResult} true if a file is ignored - _testOne (path, checkUnignored) { - let ignored = false - let unignored = false + this.stop(); + this.stream.write(`${options.symbol || ' '} ${options.text || this.text}\n`); - this._rules.forEach(rule => { - const {negative} = rule - if ( - unignored === negative && ignored !== unignored - || negative && !ignored && !unignored && !checkUnignored - ) { - return - } + return this; + } +} - const matched = rule.regex.test(path) +module.exports = function (opts) { + return new Ora(opts); +}; - if (matched) { - ignored = !negative - unignored = negative - } - }) +module.exports.promise = (action, options) => { + if (typeof action.then !== 'function') { + throw new TypeError('Parameter `action` must be a Promise'); + } - return { - ignored, - unignored - } - } + const spinner = new Ora(options); + spinner.start(); - // @returns {TestResult} - _test (originalPath, cache, checkUnignored, slices) { - const path = originalPath - // Supports nullable path - && checkPath.convert(originalPath) + action.then( + () => { + spinner.succeed(); + }, + () => { + spinner.fail(); + } + ); - checkPath(path, originalPath, throwError) + return spinner; +}; - return this._t(path, cache, checkUnignored, slices) - } - _t (path, cache, checkUnignored, slices) { - if (path in cache) { - return cache[path] - } +/***/ }), +/* 671 */ +/***/ (function(module, exports, __webpack_require__) { - if (!slices) { - // path/to/a.js - // ['path', 'to', 'a.js'] - slices = path.split(SLASH) - } +"use strict"; - slices.pop() +const escapeStringRegexp = __webpack_require__(387); +const ansiStyles = __webpack_require__(672); +const stdoutColor = __webpack_require__(673).stdout; - // If the path has no parent directory, just test it - if (!slices.length) { - return cache[path] = this._testOne(path, checkUnignored) - } +const template = __webpack_require__(674); - const parent = this._t( - slices.join(SLASH) + SLASH, - cache, - checkUnignored, - slices - ) +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); - // If the path contains a parent directory, check the parent first - return cache[path] = parent.ignored - // > It is not possible to re-include a file if a parent directory of - // > that file is excluded. - ? parent - : this._testOne(path, checkUnignored) - } +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - ignores (path) { - return this._test(path, this._ignoreCache, false).ignored - } +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); - createFilter () { - return path => !this.ignores(path) - } +const styles = Object.create(null); - filter (paths) { - return makeArray(paths).filter(this.createFilter()) - } +function applyOptions(obj, options) { + options = options || {}; - // @returns {TestResult} - test (path) { - return this._test(path, this._testCache, true) - } + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; } -const factory = options => new Ignore(options) +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); -const returnFalse = () => false + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; -const isPathValid = path => - checkPath(path && checkPath.convert(path), path, returnFalse) + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); -factory.isPathValid = isPathValid + chalk.template.constructor = Chalk; -// Fixes typescript -factory.default = factory + return chalk.template; + } -module.exports = factory + applyOptions(this, options); +} -// Windows -// -------------------------------------------------------------- -/* istanbul ignore if */ -if ( - // Detect `process` so that it can run in browsers. - typeof process !== 'undefined' - && ( - process.env && process.env.IGNORE_TEST_WIN32 - || process.platform === 'win32' - ) -) { - /* eslint no-control-regex: "off" */ - const makePosix = str => /^\\\\\?\\/.test(str) - || /["<>|\u0000-\u001F]+/u.test(str) - ? str - : str.replace(/\\/g, '/') +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} - checkPath.convert = makePosix +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - // 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/' - // 'd:\\foo' - const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i - checkPath.isNotRelative = path => - REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path) - || isNotRelative(path) + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; } +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; -/***/ }), -/* 666 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } -module.exports = path => { - const isExtendedLengthPath = /^\\\\\?\\/.test(path); - const hasNonAscii = /[^\u0000-\u0080]+/.test(path); // eslint-disable-line no-control-regex + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} - if (isExtendedLengthPath || hasNonAscii) { - return path; +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; } - return path.replace(/\\/g, '/'); -}; - + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} -/***/ }), -/* 667 */ -/***/ (function(module, exports, __webpack_require__) { +const proto = Object.defineProperties(() => {}, styles); -"use strict"; +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; -const {Transform} = __webpack_require__(27); + builder._styles = _styles; + builder._empty = _empty; -class ObjectTransform extends Transform { - constructor() { - super({ - objectMode: true - }); - } -} + const self = this; -class FilterStream extends ObjectTransform { - constructor(filter) { - super(); - this._filter = filter; - } + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); - _transform(data, encoding, callback) { - if (this._filter(data)) { - this.push(data); + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; } + }); - callback(); - } + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + + return builder; } -class UniqueStream extends ObjectTransform { - constructor() { - super(); - this._pushed = new Set(); +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); + + if (argsLen === 0) { + return ''; } - _transform(data, encoding, callback) { - if (!this._pushed.has(data)) { - this.push(data); - this._pushed.add(data); + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; } + } - callback(); + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; } -} -module.exports = { - FilterStream, - UniqueStream -}; + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; -/***/ }), -/* 668 */ -/***/ (function(module, exports, __webpack_require__) { + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } -"use strict"; + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; -const path = __webpack_require__(16); + return str; +} -module.exports = path_ => { - let cwd = process.cwd(); +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } - path_ = path.resolve(path_); + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; - if (process.platform === 'win32') { - cwd = cwd.toLowerCase(); - path_ = path_.toLowerCase(); + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); } - return path_ === cwd; -}; + return template(chalk, parts.join('')); +} + +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript /***/ }), -/* 669 */ +/* 672 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(389); -const path = __webpack_require__(16); - -module.exports = (childPath, parentPath) => { - childPath = path.resolve(childPath); - parentPath = path.resolve(parentPath); - - if (process.platform === 'win32') { - childPath = childPath.toLowerCase(); - parentPath = parentPath.toLowerCase(); - } - - if (childPath === parentPath) { - return false; - } - - childPath += path.sep; - parentPath += path.sep; +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; - return childPath.startsWith(parentPath); +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; }; +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; -/***/ }), -/* 670 */ -/***/ (function(module, exports, __webpack_require__) { +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], -const assert = __webpack_require__(30) -const path = __webpack_require__(16) -const fs = __webpack_require__(23) -let glob = undefined -try { - glob = __webpack_require__(591) -} catch (_err) { - // treat glob as optional. -} + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], -const defaultGlobOpts = { - nosort: true, - silent: true -} + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; -// for EMFILE handling -let timeout = 0 + // Fix humans + styles.color.grey = styles.color.gray; -const isWindows = (process.platform === "win32") + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; -const defaults = options => { - const methods = [ - 'unlink', - 'chmod', - 'stat', - 'lstat', - 'rmdir', - 'readdir' - ] - methods.forEach(m => { - options[m] = options[m] || fs[m] - m = m + 'Sync' - options[m] = options[m] || fs[m] - }) + for (const styleName of Object.keys(group)) { + const style = group[styleName]; - options.maxBusyTries = options.maxBusyTries || 3 - options.emfileWait = options.emfileWait || 1000 - if (options.glob === false) { - options.disableGlob = true - } - if (options.disableGlob !== true && glob === undefined) { - throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') - } - options.disableGlob = options.disableGlob || false - options.glob = options.glob || defaultGlobOpts -} + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; -const rimraf = (p, options, cb) => { - if (typeof options === 'function') { - cb = options - options = {} - } + group[styleName] = styles[styleName]; - assert(p, 'rimraf: missing path') - assert.equal(typeof p, 'string', 'rimraf: path should be a string') - assert.equal(typeof cb, 'function', 'rimraf: callback function required') - assert(options, 'rimraf: invalid options argument provided') - assert.equal(typeof options, 'object', 'rimraf: options should be object') + codes.set(style[0], style[1]); + } - defaults(options) + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); - let busyTries = 0 - let errState = null - let n = 0 + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } - const next = (er) => { - errState = errState || er - if (--n === 0) - cb(errState) - } + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; - const afterGlob = (er, results) => { - if (er) - return cb(er) + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; - n = results.length - if (n === 0) - return cb() + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; - results.forEach(p => { - const CB = (er) => { - if (er) { - if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && - busyTries < options.maxBusyTries) { - busyTries ++ - // try again, with the same exact callback as this one. - return setTimeout(() => rimraf_(p, options, CB), busyTries * 100) - } + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; - // this one won't happen if graceful-fs is used. - if (er.code === "EMFILE" && timeout < options.emfileWait) { - return setTimeout(() => rimraf_(p, options, CB), timeout ++) - } + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } - // already gone - if (er.code === "ENOENT") er = null - } + const suite = colorConvert[key]; - timeout = 0 - next(er) - } - rimraf_(p, options, CB) - }) - } + if (key === 'ansi16') { + key = 'ansi'; + } - if (options.disableGlob || !glob.hasMagic(p)) - return afterGlob(null, [p]) + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } - options.lstat(p, (er, stat) => { - if (!er) - return afterGlob(null, [p]) + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } - glob(p, options.glob, afterGlob) - }) + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } + return styles; } -// Two possible strategies. -// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR -// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR -// -// Both result in an extra syscall when you guess wrong. However, there -// are likely far more normal files in the world than directories. This -// is based on the assumption that a the average number of files per -// directory is >= 1. -// -// If anyone ever complains about this, then I guess the strategy could -// be made configurable somehow. But until then, YAGNI. -const rimraf_ = (p, options, cb) => { - assert(p) - assert(options) - assert(typeof cb === 'function') +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); - // sunos lets the root user unlink directories, which is... weird. - // so we have to lstat here and make sure it's not a dir. - options.lstat(p, (er, st) => { - if (er && er.code === "ENOENT") - return cb(null) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) - // Windows can EPERM on stat. Life is suffering. - if (er && er.code === "EPERM" && isWindows) - fixWinEPERM(p, options, er, cb) +/***/ }), +/* 673 */ +/***/ (function(module, exports, __webpack_require__) { - if (st && st.isDirectory()) - return rmdir(p, options, er, cb) +"use strict"; - options.unlink(p, er => { - if (er) { - if (er.code === "ENOENT") - return cb(null) - if (er.code === "EPERM") - return (isWindows) - ? fixWinEPERM(p, options, er, cb) - : rmdir(p, options, er, cb) - if (er.code === "EISDIR") - return rmdir(p, options, er, cb) - } - return cb(er) - }) - }) -} +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); -const fixWinEPERM = (p, options, er, cb) => { - assert(p) - assert(options) - assert(typeof cb === 'function') - if (er) - assert(er instanceof Error) +const env = process.env; - options.chmod(p, 0o666, er2 => { - if (er2) - cb(er2.code === "ENOENT" ? null : er) - else - options.stat(p, (er3, stats) => { - if (er3) - cb(er3.code === "ENOENT" ? null : er) - else if (stats.isDirectory()) - rmdir(p, options, er, cb) - else - options.unlink(p, cb) - }) - }) +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; } -const fixWinEPERMSync = (p, options, er) => { - assert(p) - assert(options) - if (er) - assert(er instanceof Error) +function translateLevel(level) { + if (level === 0) { + return false; + } - try { - options.chmodSync(p, 0o666) - } catch (er2) { - if (er2.code === "ENOENT") - return - else - throw er - } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} - let stats - try { - stats = options.statSync(p) - } catch (er3) { - if (er3.code === "ENOENT") - return - else - throw er - } +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } - if (stats.isDirectory()) - rmdirSync(p, options, er) - else - options.unlinkSync(p) -} + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } -const rmdir = (p, options, originalEr, cb) => { - assert(p) - assert(options) - if (originalEr) - assert(originalEr instanceof Error) - assert(typeof cb === 'function') + if (hasFlag('color=256')) { + return 2; + } - // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) - // if we guessed wrong, and it's not a directory, then - // raise the original error. - options.rmdir(p, er => { - if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) - rmkids(p, options, cb) - else if (er && er.code === "ENOTDIR") - cb(originalEr) - else - cb(er) - }) -} + if (stream && !stream.isTTY && forceColor !== true) { + // VS code debugger doesn't have isTTY set + if (env.VSCODE_PID) { + return 1; + } + return 0; + } -const rmkids = (p, options, cb) => { - assert(p) - assert(options) - assert(typeof cb === 'function') + const min = forceColor ? 1 : 0; - options.readdir(p, (er, files) => { - if (er) - return cb(er) - let n = files.length - if (n === 0) - return options.rmdir(p, cb) - let errState - files.forEach(f => { - rimraf(path.join(p, f), options, er => { - if (errState) - return - if (er) - return cb(errState = er) - if (--n === 0) - options.rmdir(p, cb) - }) - }) - }) -} + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } -// this looks simpler, and is strictly *faster*, but will -// tie up the JavaScript thread and fail on excessively -// deep directory trees. -const rimrafSync = (p, options) => { - options = options || {} - defaults(options) + return 1; + } - assert(p, 'rimraf: missing path') - assert.equal(typeof p, 'string', 'rimraf: path should be a string') - assert(options, 'rimraf: missing options') - assert.equal(typeof options, 'object', 'rimraf: options should be object') + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } - let results + return min; + } - if (options.disableGlob || !glob.hasMagic(p)) { - results = [p] - } else { - try { - options.lstatSync(p) - results = [p] - } catch (er) { - results = glob.sync(p, options.glob) - } - } + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } - if (!results.length) - return + if (env.COLORTERM === 'truecolor') { + return 3; + } - for (let i = 0; i < results.length; i++) { - const p = results[i] + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - let st - try { - st = options.lstatSync(p) - } catch (er) { - if (er.code === "ENOENT") - return + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } - // Windows can EPERM on stat. Life is suffering. - if (er.code === "EPERM" && isWindows) - fixWinEPERMSync(p, options, er) - } + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } - try { - // sunos lets the root user unlink directories, which is... weird. - if (st && st.isDirectory()) - rmdirSync(p, options, null) - else - options.unlinkSync(p) - } catch (er) { - if (er.code === "ENOENT") - return - if (er.code === "EPERM") - return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) - if (er.code !== "EISDIR") - throw er + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } - rmdirSync(p, options, er) - } - } -} + if ('COLORTERM' in env) { + return 1; + } -const rmdirSync = (p, options, originalEr) => { - assert(p) - assert(options) - if (originalEr) - assert(originalEr instanceof Error) + if (env.TERM === 'dumb') { + return min; + } - try { - options.rmdirSync(p) - } catch (er) { - if (er.code === "ENOENT") - return - if (er.code === "ENOTDIR") - throw originalEr - if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") - rmkidsSync(p, options) - } + return min; } -const rmkidsSync = (p, options) => { - assert(p) - assert(options) - options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options)) - - // We only end up here once we got ENOTEMPTY at least once, and - // at this point, we are guaranteed to have removed all the kids. - // So, we know that it won't be ENOENT or ENOTDIR or anything else. - // try really hard to delete stuff on windows, because it has a - // PROFOUNDLY annoying habit of not closing handles promptly when - // files are deleted, resulting in spurious ENOTEMPTY errors. - const retries = isWindows ? 100 : 1 - let i = 0 - do { - let threw = true - try { - const ret = options.rmdirSync(p, options) - threw = false - return ret - } finally { - if (++i < retries && threw) - continue - } - } while (true) +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); } -module.exports = rimraf -rimraf.sync = rimrafSync +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; /***/ }), -/* 671 */ +/* 674 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const AggregateError = __webpack_require__(672); - -module.exports = async ( - iterable, - mapper, - { - concurrency = Infinity, - stopOnError = true - } = {} -) => { - return new Promise((resolve, reject) => { - if (typeof mapper !== 'function') { - throw new TypeError('Mapper function is required'); - } - - if (!(typeof concurrency === 'number' && concurrency >= 1)) { - throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); - } +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; - const ret = []; - const errors = []; - const iterator = iterable[Symbol.iterator](); - let isRejected = false; - let isIterableDone = false; - let resolvingCount = 0; - let currentIndex = 0; +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); - const next = () => { - if (isRejected) { - return; - } +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } - const nextItem = iterator.next(); - const i = currentIndex; - currentIndex++; + return ESCAPES.get(c) || c; +} - if (nextItem.done) { - isIterableDone = true; +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; - if (resolvingCount === 0) { - if (!stopOnError && errors.length !== 0) { - reject(new AggregateError(errors)); - } else { - resolve(ret); - } - } + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } - return; - } + return results; +} - resolvingCount++; +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; - (async () => { - try { - const element = await nextItem.value; - ret[i] = await mapper(element, i); - resolvingCount--; - next(); - } catch (error) { - if (stopOnError) { - isRejected = true; - reject(error); - } else { - errors.push(error); - resolvingCount--; - next(); - } - } - })(); - }; + const results = []; + let matches; - for (let i = 0; i < concurrency; i++) { - next(); + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; - if (isIterableDone) { - break; - } + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); } - }); -}; - - -/***/ }), -/* 672 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + } -const indentString = __webpack_require__(673); -const cleanStack = __webpack_require__(674); + return results; +} -const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); +function buildStyle(chalk, styles) { + const enabled = {}; -class AggregateError extends Error { - constructor(errors) { - if (!Array.isArray(errors)) { - throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); } + } - errors = [...errors].map(error => { - if (error instanceof Error) { - return error; + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); } - if (error !== null && typeof error === 'object') { - // Handle plain error objects with message property and/or possibly other metadata - return Object.assign(new Error(error.message), error); + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; } + } + } - return new Error(error); - }); - - let message = errors - .map(error => { - // The `stack` property is not standardized, so we can't assume it exists - return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); - }) - .join('\n'); - message = '\n' + indentString(message, 4); - super(message); + return current; +} - this.name = 'AggregateError'; +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; - Object.defineProperty(this, '_errors', {value: errors}); - } + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - * [Symbol.iterator]() { - for (const error of this._errors) { - yield error; + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); } + }); + + chunks.push(chunk.join('')); + + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); } -} -module.exports = AggregateError; + return chunks.join(''); +}; /***/ }), -/* 673 */ +/* 675 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const restoreCursor = __webpack_require__(676); -module.exports = (string, count = 1, options) => { - options = { - indent: ' ', - includeEmptyLines: false, - ...options - }; +let hidden = false; - if (typeof string !== 'string') { - throw new TypeError( - `Expected \`input\` to be a \`string\`, got \`${typeof string}\`` - ); - } +exports.show = stream => { + const s = stream || process.stderr; - if (typeof count !== 'number') { - throw new TypeError( - `Expected \`count\` to be a \`number\`, got \`${typeof count}\`` - ); + if (!s.isTTY) { + return; } - if (typeof options.indent !== 'string') { - throw new TypeError( - `Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\`` - ); - } + hidden = false; + s.write('\u001b[?25h'); +}; - if (count === 0) { - return string; +exports.hide = stream => { + const s = stream || process.stderr; + + if (!s.isTTY) { + return; } - const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; + restoreCursor(); + hidden = true; + s.write('\u001b[?25l'); +}; - return string.replace(regex, options.indent.repeat(count)); +exports.toggle = (force, stream) => { + if (force !== undefined) { + hidden = force; + } + + if (hidden) { + exports.show(stream); + } else { + exports.hide(stream); + } }; /***/ }), -/* 674 */ +/* 676 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); - -const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; -const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; -const homeDir = typeof os.homedir === 'undefined' ? '' : os.homedir(); - -module.exports = (stack, options) => { - options = Object.assign({pretty: false}, options); - - return stack.replace(/\\/g, '/') - .split('\n') - .filter(line => { - const pathMatches = line.match(extractPathRegex); - if (pathMatches === null || !pathMatches[1]) { - return true; - } - - const match = pathMatches[1]; - - // Electron - if ( - match.includes('.app/Contents/Resources/electron.asar') || - match.includes('.app/Contents/Resources/default_app.asar') - ) { - return false; - } - - return !pathRegex.test(match); - }) - .filter(line => line.trim() !== '') - .map(line => { - if (options.pretty) { - return line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~'))); - } +const onetime = __webpack_require__(677); +const signalExit = __webpack_require__(370); - return line; - }) - .join('\n'); -}; +module.exports = onetime(() => { + signalExit(() => { + process.stderr.write('\u001b[?25h'); + }, {alwaysLast: true}); +}); /***/ }), -/* 675 */ +/* 677 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const chalk = __webpack_require__(676); -const cliCursor = __webpack_require__(680); -const cliSpinners = __webpack_require__(684); -const logSymbols = __webpack_require__(565); +const mimicFn = __webpack_require__(678); -class Ora { - constructor(options) { - if (typeof options === 'string') { - options = { - text: options - }; - } +module.exports = (fn, opts) => { + // TODO: Remove this in v3 + if (opts === true) { + throw new TypeError('The second argument is now an options object'); + } - this.options = Object.assign({ - text: '', - color: 'cyan', - stream: process.stderr - }, options); + if (typeof fn !== 'function') { + throw new TypeError('Expected a function'); + } - const sp = this.options.spinner; - this.spinner = typeof sp === 'object' ? sp : (process.platform === 'win32' ? cliSpinners.line : (cliSpinners[sp] || cliSpinners.dots)); // eslint-disable-line no-nested-ternary + opts = opts || {}; - if (this.spinner.frames === undefined) { - throw new Error('Spinner must define `frames`'); - } + let ret; + let called = false; + const fnName = fn.displayName || fn.name || ''; - this.text = this.options.text; - this.color = this.options.color; - this.interval = this.options.interval || this.spinner.interval || 100; - this.stream = this.options.stream; - this.id = null; - this.frameIndex = 0; - this.enabled = typeof this.options.enabled === 'boolean' ? this.options.enabled : ((this.stream && this.stream.isTTY) && !process.env.CI); - } - frame() { - const frames = this.spinner.frames; - let frame = frames[this.frameIndex]; + const onetime = function () { + if (called) { + if (opts.throw === true) { + throw new Error(`Function \`${fnName}\` can only be called once`); + } - if (this.color) { - frame = chalk[this.color](frame); + return ret; } - this.frameIndex = ++this.frameIndex % frames.length; + called = true; + ret = fn.apply(this, arguments); + fn = null; - return frame + ' ' + this.text; - } - clear() { - if (!this.enabled) { - return this; - } + return ret; + }; - this.stream.clearLine(); - this.stream.cursorTo(0); + mimicFn(onetime, fn); - return this; - } - render() { - this.clear(); - this.stream.write(this.frame()); + return onetime; +}; - return this; - } - start(text) { - if (text) { - this.text = text; - } - if (!this.enabled || this.id) { - return this; - } +/***/ }), +/* 678 */ +/***/ (function(module, exports, __webpack_require__) { - cliCursor.hide(this.stream); - this.render(); - this.id = setInterval(this.render.bind(this), this.interval); +"use strict"; - return this; +module.exports = (to, from) => { + // TODO: use `Reflect.ownKeys()` when targeting Node.js 6 + for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) { + Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); } - stop() { - if (!this.enabled) { - return this; - } - clearInterval(this.id); - this.id = null; - this.frameIndex = 0; - this.clear(); - cliCursor.show(this.stream); + return to; +}; - return this; - } - succeed(text) { - return this.stopAndPersist({symbol: logSymbols.success, text}); - } - fail(text) { - return this.stopAndPersist({symbol: logSymbols.error, text}); - } - warn(text) { - return this.stopAndPersist({symbol: logSymbols.warning, text}); - } - info(text) { - return this.stopAndPersist({symbol: logSymbols.info, text}); - } - stopAndPersist(options) { - if (!this.enabled) { - return this; - } - // Legacy argument - // TODO: Deprecate sometime in the future - if (typeof options === 'string') { - options = { - symbol: options - }; - } +/***/ }), +/* 679 */ +/***/ (function(module, exports, __webpack_require__) { - options = options || {}; +"use strict"; - this.stop(); - this.stream.write(`${options.symbol || ' '} ${options.text || this.text}\n`); +module.exports = __webpack_require__(680); - return this; - } -} -module.exports = function (opts) { - return new Ora(opts); -}; +/***/ }), +/* 680 */ +/***/ (function(module) { -module.exports.promise = (action, options) => { - if (typeof action.then !== 'function') { - throw new TypeError('Parameter `action` must be a Promise'); - } +module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); - const spinner = new Ora(options); - spinner.start(); +/***/ }), +/* 681 */ +/***/ (function(module, exports, __webpack_require__) { - action.then( - () => { - spinner.succeed(); - }, - () => { - spinner.fail(); - } - ); +"use strict"; - return spinner; +const chalk = __webpack_require__(682); + +const isSupported = process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; + +const main = { + info: chalk.blue('ℹ'), + success: chalk.green('✔'), + warning: chalk.yellow('⚠'), + error: chalk.red('✖') +}; + +const fallbacks = { + info: chalk.blue('i'), + success: chalk.green('√'), + warning: chalk.yellow('‼'), + error: chalk.red('×') }; +module.exports = isSupported ? main : fallbacks; + /***/ }), -/* 676 */ +/* 682 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(3); -const ansiStyles = __webpack_require__(677); -const stdoutColor = __webpack_require__(678).stdout; +const escapeStringRegexp = __webpack_require__(387); +const ansiStyles = __webpack_require__(683); +const stdoutColor = __webpack_require__(684).stdout; -const template = __webpack_require__(679); +const template = __webpack_require__(685); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -77658,12 +77850,12 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 677 */ +/* 683 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(6); +const colorConvert = __webpack_require__(389); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -77828,16 +78020,16 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) /***/ }), -/* 678 */ +/* 684 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); const env = process.env; @@ -77973,7 +78165,7 @@ module.exports = { /***/ }), -/* 679 */ +/* 685 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78107,145 +78299,6 @@ module.exports = (chalk, tmp) => { }; -/***/ }), -/* 680 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const restoreCursor = __webpack_require__(681); - -let hidden = false; - -exports.show = stream => { - const s = stream || process.stderr; - - if (!s.isTTY) { - return; - } - - hidden = false; - s.write('\u001b[?25h'); -}; - -exports.hide = stream => { - const s = stream || process.stderr; - - if (!s.isTTY) { - return; - } - - restoreCursor(); - hidden = true; - s.write('\u001b[?25l'); -}; - -exports.toggle = (force, stream) => { - if (force !== undefined) { - hidden = force; - } - - if (hidden) { - exports.show(stream); - } else { - exports.hide(stream); - } -}; - - -/***/ }), -/* 681 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const onetime = __webpack_require__(682); -const signalExit = __webpack_require__(397); - -module.exports = onetime(() => { - signalExit(() => { - process.stderr.write('\u001b[?25h'); - }, {alwaysLast: true}); -}); - - -/***/ }), -/* 682 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const mimicFn = __webpack_require__(683); - -module.exports = (fn, opts) => { - // TODO: Remove this in v3 - if (opts === true) { - throw new TypeError('The second argument is now an options object'); - } - - if (typeof fn !== 'function') { - throw new TypeError('Expected a function'); - } - - opts = opts || {}; - - let ret; - let called = false; - const fnName = fn.displayName || fn.name || ''; - - const onetime = function () { - if (called) { - if (opts.throw === true) { - throw new Error(`Function \`${fnName}\` can only be called once`); - } - - return ret; - } - - called = true; - ret = fn.apply(this, arguments); - fn = null; - - return ret; - }; - - mimicFn(onetime, fn); - - return onetime; -}; - - -/***/ }), -/* 683 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = (to, from) => { - // TODO: use `Reflect.ownKeys()` when targeting Node.js 6 - for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) { - Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); - } - - return to; -}; - - -/***/ }), -/* 684 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = __webpack_require__(685); - - -/***/ }), -/* 685 */ -/***/ (function(module) { - -module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); - /***/ }), /* 686 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -78253,9 +78306,8 @@ module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\" "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunCommand", function() { return RunCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(516); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(500); /* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(501); /* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(502); /* @@ -78290,16 +78342,18 @@ const RunCommand = { const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph); if (extraArgs.length === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red.bold('\nNo script specified')); - process.exit(1); + throw new _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"]('No script specified'); } const scriptName = extraArgs[0]; const scriptArgs = extraArgs.slice(1); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`\nRunning script [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(scriptName)}] in batched topological order\n`)); - await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { - if (pkg.hasScript(scriptName)) { - await pkg.runScriptStreaming(scriptName, scriptArgs); + await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async project => { + if (project.hasScript(scriptName)) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`[${project.name}] running "${scriptName}" script`); + await project.runScriptStreaming(scriptName, { + args: scriptArgs + }); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${project.name}] complete`); } }); } @@ -78313,9 +78367,8 @@ const RunCommand = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WatchCommand", function() { return WatchCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(516); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(500); /* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(501); /* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(502); /* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(688); @@ -78378,12 +78431,11 @@ const WatchCommand = { } if (projectsToWatch.size === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`\nThere are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.\n`)); - return; + throw new _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"](`There are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.`); } const projectNames = Array.from(projectsToWatch.keys()); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`))); // Kibana should always be run the last, so we don't rely on automatic + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`); // Kibana should always be run the last, so we don't rely on automatic // topological batching and push it to the last one-entry batch manually. const shouldWatchKibanaProject = projectsToWatch.delete(kibanaProjectName); @@ -78394,8 +78446,10 @@ const WatchCommand = { } await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { - const completionHint = await Object(_utils_watch__WEBPACK_IMPORTED_MODULE_4__["waitUntilWatchIsReady"])(pkg.runScriptStreaming(watchScriptName).stdout); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`[${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(pkg.name)}] Initial build completed (${completionHint}).`)); + const completionHint = await Object(_utils_watch__WEBPACK_IMPORTED_MODULE_4__["waitUntilWatchIsReady"])(pkg.runScriptStreaming(watchScriptName, { + debug: false + }).stdout); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${pkg.name}] Initial build completed (${completionHint}).`); }); } @@ -78408,8 +78462,8 @@ const WatchCommand = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilWatchIsReady", function() { return waitUntilWatchIsReady; }); -/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(169); -/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(270); +/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(140); +/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(241); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -78482,17 +78536,11 @@ function waitUntilWatchIsReady(stream, opts = {}) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runCommand", function() { return runCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var indent_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(690); -/* harmony import */ var indent_string__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(indent_string__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var wrap_ansi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(691); -/* harmony import */ var wrap_ansi__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(wrap_ansi__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(516); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(34); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(502); -/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(698); -/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(699); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(516); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(500); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(502); +/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(690); +/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(691); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -78522,13 +78570,10 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope - - - async function runCommand(command, config) { try { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`Running [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(command.name)}] command from [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.yellow(config.rootPath)}]:\n`)); - const kbn = await _utils_kibana__WEBPACK_IMPORTED_MODULE_7__["Kibana"].loadFrom(config.rootPath); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`Running [${command.name}] command from [${config.rootPath}]`); + const kbn = await _utils_kibana__WEBPACK_IMPORTED_MODULE_4__["Kibana"].loadFrom(config.rootPath); const projects = kbn.getFilteredProjects({ skipKibanaPlugins: Boolean(config.options['skip-kibana-plugins']), ossOnly: Boolean(config.options.oss), @@ -78537,34 +78582,31 @@ async function runCommand(command, config) { }); if (projects.size === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`There are no projects found. Double check project name(s) in '-i/--include' and '-e/--exclude' filters.\n`)); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(`There are no projects found. Double check project name(s) in '-i/--include' and '-e/--exclude' filters.`); return process.exit(1); } - const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_5__["buildProjectGraph"])(projects); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`Found [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(projects.size.toString())}] projects:\n`)); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(Object(_utils_projects_tree__WEBPACK_IMPORTED_MODULE_6__["renderProjectsTree"])(config.rootPath, projects)); + const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_2__["buildProjectGraph"])(projects); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`Found ${projects.size.toString()} projects`); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(Object(_utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__["renderProjectsTree"])(config.rootPath, projects)); await command.run(projects, projectGraph, _objectSpread({}, config, { kbn })); - } catch (e) { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold.red(`\n[${command.name}] failed:\n`)); + } catch (error) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(`[${command.name}] failed:`); - if (e instanceof _utils_errors__WEBPACK_IMPORTED_MODULE_3__["CliError"]) { - const msg = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`CliError: ${e.message}\n`); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(wrap_ansi__WEBPACK_IMPORTED_MODULE_2___default()(msg, 80)); - const keys = Object.keys(e.meta); + if (error instanceof _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"]) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(error.message); + const metaOutput = Object.entries(error.meta).map(([key, value]) => `${key}: ${value}`).join('\n'); - if (keys.length > 0) { - const metaOutput = keys.map(key => { - const value = e.meta[key]; - return `${key}: ${value}`; - }); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write('Additional debugging info:\n'); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(indent_string__WEBPACK_IMPORTED_MODULE_1___default()(metaOutput.join('\n'), 3)); + if (metaOutput) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info('Additional debugging info:\n'); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].indent(2); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(metaOutput); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].indent(-2); } } else { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(e.stack); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(error); } process.exit(1); @@ -78581,400 +78623,14 @@ function toArray(value) { /***/ }), /* 690 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = (str, count, opts) => { - // Support older versions: use the third parameter as options.indent - // TODO: Remove the workaround in the next major version - const options = typeof opts === 'object' ? Object.assign({indent: ' '}, opts) : {indent: opts || ' '}; - count = count === undefined ? 1 : count; - - if (typeof str !== 'string') { - throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof str}\``); - } - - if (typeof count !== 'number') { - throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof count}\``); - } - - if (typeof options.indent !== 'string') { - throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\``); - } - - if (count === 0) { - return str; - } - - const regex = options.includeEmptyLines ? /^/mg : /^(?!\s*$)/mg; - return str.replace(regex, options.indent.repeat(count)); -} -; - - -/***/ }), -/* 691 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const stringWidth = __webpack_require__(692); -const stripAnsi = __webpack_require__(696); - -const ESCAPES = new Set([ - '\u001B', - '\u009B' -]); - -const END_CODE = 39; - -const ESCAPE_CODES = new Map([ - [0, 0], - [1, 22], - [2, 22], - [3, 23], - [4, 24], - [7, 27], - [8, 28], - [9, 29], - [30, 39], - [31, 39], - [32, 39], - [33, 39], - [34, 39], - [35, 39], - [36, 39], - [37, 39], - [90, 39], - [40, 49], - [41, 49], - [42, 49], - [43, 49], - [44, 49], - [45, 49], - [46, 49], - [47, 49] -]); - -const wrapAnsi = code => `${ESCAPES.values().next().value}[${code}m`; - -// Calculate the length of words split on ' ', ignoring -// the extra characters added by ansi escape codes -const wordLengths = str => str.split(' ').map(s => stringWidth(s)); - -// Wrap a long word across multiple rows -// Ansi escape codes do not count towards length -const wrapWord = (rows, word, cols) => { - const arr = Array.from(word); - - let insideEscape = false; - let visible = stringWidth(stripAnsi(rows[rows.length - 1])); - - for (const item of arr.entries()) { - const i = item[0]; - const char = item[1]; - const charLength = stringWidth(char); - - if (visible + charLength <= cols) { - rows[rows.length - 1] += char; - } else { - rows.push(char); - visible = 0; - } - - if (ESCAPES.has(char)) { - insideEscape = true; - } else if (insideEscape && char === 'm') { - insideEscape = false; - continue; - } - - if (insideEscape) { - continue; - } - - visible += charLength; - - if (visible === cols && i < arr.length - 1) { - rows.push(''); - visible = 0; - } - } - - // It's possible that the last row we copy over is only - // ansi escape characters, handle this edge-case - if (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) { - rows[rows.length - 2] += rows.pop(); - } -}; - -// The wrap-ansi module can be invoked -// in either 'hard' or 'soft' wrap mode -// -// 'hard' will never allow a string to take up more -// than cols characters -// -// 'soft' allows long words to expand past the column length -const exec = (str, cols, opts) => { - const options = opts || {}; - - if (str.trim() === '') { - return options.trim === false ? str : str.trim(); - } - - let pre = ''; - let ret = ''; - let escapeCode; - - const lengths = wordLengths(str); - const words = str.split(' '); - const rows = ['']; - - for (const item of Array.from(words).entries()) { - const i = item[0]; - const word = item[1]; - - rows[rows.length - 1] = options.trim === false ? rows[rows.length - 1] : rows[rows.length - 1].trim(); - let rowLength = stringWidth(rows[rows.length - 1]); - - if (rowLength || word === '') { - if (rowLength === cols && options.wordWrap === false) { - // If we start with a new word but the current row length equals the length of the columns, add a new row - rows.push(''); - rowLength = 0; - } - - rows[rows.length - 1] += ' '; - rowLength++; - } - - // In 'hard' wrap mode, the length of a line is - // never allowed to extend past 'cols' - if (lengths[i] > cols && options.hard) { - if (rowLength) { - rows.push(''); - } - wrapWord(rows, word, cols); - continue; - } - - if (rowLength + lengths[i] > cols && rowLength > 0) { - if (options.wordWrap === false && rowLength < cols) { - wrapWord(rows, word, cols); - continue; - } - - rows.push(''); - } - - if (rowLength + lengths[i] > cols && options.wordWrap === false) { - wrapWord(rows, word, cols); - continue; - } - - rows[rows.length - 1] += word; - } - - pre = rows.map(r => options.trim === false ? r : r.trim()).join('\n'); - - for (const item of Array.from(pre).entries()) { - const i = item[0]; - const char = item[1]; - - ret += char; - - if (ESCAPES.has(char)) { - const code = parseFloat(/\d[^m]*/.exec(pre.slice(i, i + 4))); - escapeCode = code === END_CODE ? null : code; - } - - const code = ESCAPE_CODES.get(Number(escapeCode)); - - if (escapeCode && code) { - if (pre[i + 1] === '\n') { - ret += wrapAnsi(code); - } else if (char === '\n') { - ret += wrapAnsi(escapeCode); - } - } - } - - return ret; -}; - -// For each newline, invoke the method separately -module.exports = (str, cols, opts) => { - return String(str) - .normalize() - .split('\n') - .map(line => exec(line, cols, opts)) - .join('\n'); -}; - - -/***/ }), -/* 692 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const stripAnsi = __webpack_require__(693); -const isFullwidthCodePoint = __webpack_require__(695); - -module.exports = str => { - if (typeof str !== 'string' || str.length === 0) { - return 0; - } - - str = stripAnsi(str); - - let width = 0; - - for (let i = 0; i < str.length; i++) { - const code = str.codePointAt(i); - - // Ignore control characters - if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { - continue; - } - - // Ignore combining characters - if (code >= 0x300 && code <= 0x36F) { - continue; - } - - // Surrogates - if (code > 0xFFFF) { - i++; - } - - width += isFullwidthCodePoint(code) ? 2 : 1; - } - - return width; -}; - - -/***/ }), -/* 693 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const ansiRegex = __webpack_require__(694); - -module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; - - -/***/ }), -/* 694 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = () => { - const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' - ].join('|'); - - return new RegExp(pattern, 'g'); -}; - - -/***/ }), -/* 695 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -/* eslint-disable yoda */ -module.exports = x => { - if (Number.isNaN(x)) { - return false; - } - - // code points are derived from: - // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt - if ( - x >= 0x1100 && ( - x <= 0x115f || // Hangul Jamo - x === 0x2329 || // LEFT-POINTING ANGLE BRACKET - x === 0x232a || // RIGHT-POINTING ANGLE BRACKET - // CJK Radicals Supplement .. Enclosed CJK Letters and Months - (0x2e80 <= x && x <= 0x3247 && x !== 0x303f) || - // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A - (0x3250 <= x && x <= 0x4dbf) || - // CJK Unified Ideographs .. Yi Radicals - (0x4e00 <= x && x <= 0xa4c6) || - // Hangul Jamo Extended-A - (0xa960 <= x && x <= 0xa97c) || - // Hangul Syllables - (0xac00 <= x && x <= 0xd7a3) || - // CJK Compatibility Ideographs - (0xf900 <= x && x <= 0xfaff) || - // Vertical Forms - (0xfe10 <= x && x <= 0xfe19) || - // CJK Compatibility Forms .. Small Form Variants - (0xfe30 <= x && x <= 0xfe6b) || - // Halfwidth and Fullwidth Forms - (0xff01 <= x && x <= 0xff60) || - (0xffe0 <= x && x <= 0xffe6) || - // Kana Supplement - (0x1b000 <= x && x <= 0x1b001) || - // Enclosed Ideographic Supplement - (0x1f200 <= x && x <= 0x1f251) || - // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane - (0x20000 <= x && x <= 0x3fffd) - ) - ) { - return true; - } - - return false; -}; - - -/***/ }), -/* 696 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const ansiRegex = __webpack_require__(697); - -module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; - - -/***/ }), -/* 697 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = () => { - const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' - ].join('|'); - - return new RegExp(pattern, 'g'); -}; - - -/***/ }), -/* 698 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderProjectsTree", function() { return renderProjectsTree; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(386); /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* * Licensed to Elasticsearch B.V. under one or more contributor @@ -79119,20 +78775,20 @@ function addProjectToTree(tree, pathParts, project) { } /***/ }), -/* 699 */ +/* 691 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kibana", function() { return Kibana; }); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(700); +/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(692); /* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(multimatch__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(704); +/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(696); /* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(is_path_inside__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(502); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(579); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(574); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -79273,15 +78929,15 @@ class Kibana { } /***/ }), -/* 700 */ +/* 692 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const minimatch = __webpack_require__(506); -const arrayUnion = __webpack_require__(701); -const arrayDiffer = __webpack_require__(702); -const arrify = __webpack_require__(703); +const arrayUnion = __webpack_require__(693); +const arrayDiffer = __webpack_require__(694); +const arrify = __webpack_require__(695); module.exports = (list, patterns, options = {}) => { list = arrify(list); @@ -79305,7 +78961,7 @@ module.exports = (list, patterns, options = {}) => { /***/ }), -/* 701 */ +/* 693 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79317,7 +78973,7 @@ module.exports = (...arguments_) => { /***/ }), -/* 702 */ +/* 694 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79332,7 +78988,7 @@ module.exports = arrayDiffer; /***/ }), -/* 703 */ +/* 695 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79362,12 +79018,12 @@ module.exports = arrify; /***/ }), -/* 704 */ +/* 696 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); +const path = __webpack_require__(4); module.exports = (childPath, parentPath) => { childPath = path.resolve(childPath); @@ -79390,15 +79046,15 @@ module.exports = (childPath, parentPath) => { /***/ }), -/* 705 */ +/* 697 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(706); +/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(698); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); -/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(941); +/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(933); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); /* @@ -79423,21 +79079,21 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/* 706 */ +/* 698 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return buildProductionProjects; }); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(707); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(699); /* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(587); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(582); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(579); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(574); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(491); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(500); /* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(518); /* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(502); /* @@ -79475,7 +79131,7 @@ async function buildProductionProjects({ const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["buildProjectGraph"])(projects); const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["topologicallyBatchProjects"])(projects, projectGraph); const projectNames = [...projects.values()].map(project => project.name); - _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].write(`Preparing production build for [${projectNames.join(', ')}]`); + _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].info(`Preparing production build for [${projectNames.join(', ')}]`); for (const batch of batchedProjects) { for (const project of batch) { @@ -79571,21 +79227,21 @@ async function copyToBuild(project, kibanaRoot, buildRoot) { } /***/ }), -/* 707 */ +/* 699 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const EventEmitter = __webpack_require__(399); -const path = __webpack_require__(16); -const os = __webpack_require__(11); -const pAll = __webpack_require__(708); -const arrify = __webpack_require__(710); -const globby = __webpack_require__(711); -const isGlob = __webpack_require__(605); -const cpFile = __webpack_require__(926); -const junk = __webpack_require__(938); -const CpyError = __webpack_require__(939); +const EventEmitter = __webpack_require__(373); +const path = __webpack_require__(4); +const os = __webpack_require__(364); +const pAll = __webpack_require__(700); +const arrify = __webpack_require__(702); +const globby = __webpack_require__(703); +const isGlob = __webpack_require__(600); +const cpFile = __webpack_require__(918); +const junk = __webpack_require__(930); +const CpyError = __webpack_require__(931); const defaultOptions = { ignoreJunk: true @@ -79704,12 +79360,12 @@ module.exports = (source, destination, { /***/ }), -/* 708 */ +/* 700 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pMap = __webpack_require__(709); +const pMap = __webpack_require__(701); module.exports = (iterable, options) => pMap(iterable, element => element(), options); // TODO: Remove this for the next major release @@ -79717,7 +79373,7 @@ module.exports.default = module.exports; /***/ }), -/* 709 */ +/* 701 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79796,7 +79452,7 @@ module.exports.default = pMap; /***/ }), -/* 710 */ +/* 702 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79826,17 +79482,17 @@ module.exports = arrify; /***/ }), -/* 711 */ +/* 703 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const arrayUnion = __webpack_require__(712); -const glob = __webpack_require__(714); -const fastGlob = __webpack_require__(719); -const dirGlob = __webpack_require__(919); -const gitignore = __webpack_require__(922); +const fs = __webpack_require__(349); +const arrayUnion = __webpack_require__(704); +const glob = __webpack_require__(706); +const fastGlob = __webpack_require__(711); +const dirGlob = __webpack_require__(911); +const gitignore = __webpack_require__(914); const DEFAULT_FILTER = () => false; @@ -79981,12 +79637,12 @@ module.exports.gitignore = gitignore; /***/ }), -/* 712 */ +/* 704 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var arrayUniq = __webpack_require__(713); +var arrayUniq = __webpack_require__(705); module.exports = function () { return arrayUniq([].concat.apply([], arguments)); @@ -79994,7 +79650,7 @@ module.exports = function () { /***/ }), -/* 713 */ +/* 705 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80063,7 +79719,7 @@ if ('Set' in global) { /***/ }), -/* 714 */ +/* 706 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -80108,27 +79764,27 @@ if ('Set' in global) { module.exports = glob -var fs = __webpack_require__(23) +var fs = __webpack_require__(349) var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(715) -var EE = __webpack_require__(399).EventEmitter -var path = __webpack_require__(16) -var assert = __webpack_require__(30) +var inherits = __webpack_require__(707) +var EE = __webpack_require__(373).EventEmitter +var path = __webpack_require__(4) +var assert = __webpack_require__(371) var isAbsolute = __webpack_require__(512) -var globSync = __webpack_require__(717) -var common = __webpack_require__(718) +var globSync = __webpack_require__(709) +var common = __webpack_require__(710) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp var inflight = __webpack_require__(515) -var util = __webpack_require__(29) +var util = __webpack_require__(397) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(404) +var once = __webpack_require__(378) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -80859,22 +80515,22 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 715 */ +/* 707 */ /***/ (function(module, exports, __webpack_require__) { try { - var util = __webpack_require__(29); + var util = __webpack_require__(397); /* istanbul ignore next */ if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(716); + module.exports = __webpack_require__(708); } /***/ }), -/* 716 */ +/* 708 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -80907,22 +80563,22 @@ if (typeof Object.create === 'function') { /***/ }), -/* 717 */ +/* 709 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(23) +var fs = __webpack_require__(349) var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(714).Glob -var util = __webpack_require__(29) -var path = __webpack_require__(16) -var assert = __webpack_require__(30) +var Glob = __webpack_require__(706).Glob +var util = __webpack_require__(397) +var path = __webpack_require__(4) +var assert = __webpack_require__(371) var isAbsolute = __webpack_require__(512) -var common = __webpack_require__(718) +var common = __webpack_require__(710) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -81399,7 +81055,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 718 */ +/* 710 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -81416,7 +81072,7 @@ function ownProp (obj, field) { return Object.prototype.hasOwnProperty.call(obj, field) } -var path = __webpack_require__(16) +var path = __webpack_require__(4) var minimatch = __webpack_require__(506) var isAbsolute = __webpack_require__(512) var Minimatch = minimatch.Minimatch @@ -81645,10 +81301,10 @@ function childrenIgnored (self, path) { /***/ }), -/* 719 */ +/* 711 */ /***/ (function(module, exports, __webpack_require__) { -const pkg = __webpack_require__(720); +const pkg = __webpack_require__(712); module.exports = pkg.async; module.exports.default = pkg.async; @@ -81661,19 +81317,19 @@ module.exports.generateTasks = pkg.generateTasks; /***/ }), -/* 720 */ +/* 712 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var optionsManager = __webpack_require__(721); -var taskManager = __webpack_require__(722); -var reader_async_1 = __webpack_require__(890); -var reader_stream_1 = __webpack_require__(914); -var reader_sync_1 = __webpack_require__(915); -var arrayUtils = __webpack_require__(917); -var streamUtils = __webpack_require__(918); +var optionsManager = __webpack_require__(713); +var taskManager = __webpack_require__(714); +var reader_async_1 = __webpack_require__(882); +var reader_stream_1 = __webpack_require__(906); +var reader_sync_1 = __webpack_require__(907); +var arrayUtils = __webpack_require__(909); +var streamUtils = __webpack_require__(910); /** * Synchronous API. */ @@ -81739,7 +81395,7 @@ function isString(source) { /***/ }), -/* 721 */ +/* 713 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81777,13 +81433,13 @@ exports.prepare = prepare; /***/ }), -/* 722 */ +/* 714 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var patternUtils = __webpack_require__(723); +var patternUtils = __webpack_require__(715); /** * Generate tasks based on parent directory of each pattern. */ @@ -81874,16 +81530,16 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 723 */ +/* 715 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(16); -var globParent = __webpack_require__(724); -var isGlob = __webpack_require__(727); -var micromatch = __webpack_require__(728); +var path = __webpack_require__(4); +var globParent = __webpack_require__(716); +var isGlob = __webpack_require__(719); +var micromatch = __webpack_require__(720); var GLOBSTAR = '**'; /** * Return true for static pattern. @@ -82029,16 +81685,16 @@ exports.matchAny = matchAny; /***/ }), -/* 724 */ +/* 716 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var path = __webpack_require__(16); -var isglob = __webpack_require__(725); -var pathDirname = __webpack_require__(726); -var isWin32 = __webpack_require__(11).platform() === 'win32'; +var path = __webpack_require__(4); +var isglob = __webpack_require__(717); +var pathDirname = __webpack_require__(718); +var isWin32 = __webpack_require__(364).platform() === 'win32'; module.exports = function globParent(str) { // flip windows path separators @@ -82060,7 +81716,7 @@ module.exports = function globParent(str) { /***/ }), -/* 725 */ +/* 717 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -82070,7 +81726,7 @@ module.exports = function globParent(str) { * Licensed under the MIT License. */ -var isExtglob = __webpack_require__(606); +var isExtglob = __webpack_require__(601); module.exports = function isGlob(str) { if (typeof str !== 'string' || str === '') { @@ -82091,14 +81747,14 @@ module.exports = function isGlob(str) { /***/ }), -/* 726 */ +/* 718 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var path = __webpack_require__(16); -var inspect = __webpack_require__(29).inspect; +var path = __webpack_require__(4); +var inspect = __webpack_require__(397).inspect; function assertPath(path) { if (typeof path !== 'string') { @@ -82241,7 +81897,7 @@ module.exports.win32 = win32; /***/ }), -/* 727 */ +/* 719 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -82251,7 +81907,7 @@ module.exports.win32 = win32; * Released under the MIT License. */ -var isExtglob = __webpack_require__(606); +var isExtglob = __webpack_require__(601); var chars = { '{': '}', '(': ')', '[': ']'}; module.exports = function isGlob(str, options) { @@ -82293,7 +81949,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 728 */ +/* 720 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82303,19 +81959,19 @@ module.exports = function isGlob(str, options) { * Module dependencies */ -var util = __webpack_require__(29); -var braces = __webpack_require__(729); -var toRegex = __webpack_require__(842); -var extend = __webpack_require__(850); +var util = __webpack_require__(397); +var braces = __webpack_require__(721); +var toRegex = __webpack_require__(834); +var extend = __webpack_require__(842); /** * Local dependencies */ -var compilers = __webpack_require__(853); -var parsers = __webpack_require__(886); -var cache = __webpack_require__(887); -var utils = __webpack_require__(888); +var compilers = __webpack_require__(845); +var parsers = __webpack_require__(878); +var cache = __webpack_require__(879); +var utils = __webpack_require__(880); var MAX_LENGTH = 1024 * 64; /** @@ -83177,7 +82833,7 @@ module.exports = micromatch; /***/ }), -/* 729 */ +/* 721 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83187,18 +82843,18 @@ module.exports = micromatch; * Module dependencies */ -var toRegex = __webpack_require__(730); -var unique = __webpack_require__(744); -var extend = __webpack_require__(739); +var toRegex = __webpack_require__(722); +var unique = __webpack_require__(736); +var extend = __webpack_require__(731); /** * Local dependencies */ -var compilers = __webpack_require__(745); -var parsers = __webpack_require__(762); -var Braces = __webpack_require__(772); -var utils = __webpack_require__(746); +var compilers = __webpack_require__(737); +var parsers = __webpack_require__(754); +var Braces = __webpack_require__(764); +var utils = __webpack_require__(738); var MAX_LENGTH = 1024 * 64; var cache = {}; @@ -83502,15 +83158,15 @@ module.exports = braces; /***/ }), -/* 730 */ +/* 722 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(731); -var extend = __webpack_require__(739); -var not = __webpack_require__(741); +var define = __webpack_require__(723); +var extend = __webpack_require__(731); +var not = __webpack_require__(733); var MAX_LENGTH = 1024 * 64; /** @@ -83657,7 +83313,7 @@ module.exports.makeRe = makeRe; /***/ }), -/* 731 */ +/* 723 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83670,7 +83326,7 @@ module.exports.makeRe = makeRe; -var isDescriptor = __webpack_require__(732); +var isDescriptor = __webpack_require__(724); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -83695,7 +83351,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 732 */ +/* 724 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83708,9 +83364,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(733); -var isAccessor = __webpack_require__(734); -var isData = __webpack_require__(737); +var typeOf = __webpack_require__(725); +var isAccessor = __webpack_require__(726); +var isData = __webpack_require__(729); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -83724,7 +83380,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 733 */ +/* 725 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -83877,7 +83533,7 @@ function isBuffer(val) { /***/ }), -/* 734 */ +/* 726 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83890,7 +83546,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(735); +var typeOf = __webpack_require__(727); // accessor descriptor properties var accessor = { @@ -83953,10 +83609,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 735 */ +/* 727 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -84075,7 +83731,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 736 */ +/* 728 */ /***/ (function(module, exports) { /*! @@ -84102,7 +83758,7 @@ function isSlowBuffer (obj) { /***/ }), -/* 737 */ +/* 729 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84115,7 +83771,7 @@ function isSlowBuffer (obj) { -var typeOf = __webpack_require__(738); +var typeOf = __webpack_require__(730); // data descriptor properties var data = { @@ -84164,10 +83820,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 738 */ +/* 730 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -84286,13 +83942,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 739 */ +/* 731 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(740); +var isObject = __webpack_require__(732); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -84326,7 +83982,7 @@ function hasOwn(obj, key) { /***/ }), -/* 740 */ +/* 732 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84346,13 +84002,13 @@ module.exports = function isExtendable(val) { /***/ }), -/* 741 */ +/* 733 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(742); +var extend = __webpack_require__(734); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -84419,13 +84075,13 @@ module.exports = toRegex; /***/ }), -/* 742 */ +/* 734 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(743); +var isObject = __webpack_require__(735); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -84459,7 +84115,7 @@ function hasOwn(obj, key) { /***/ }), -/* 743 */ +/* 735 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84479,7 +84135,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 744 */ +/* 736 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84529,13 +84185,13 @@ module.exports.immutable = function uniqueImmutable(arr) { /***/ }), -/* 745 */ +/* 737 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(746); +var utils = __webpack_require__(738); module.exports = function(braces, options) { braces.compiler @@ -84818,25 +84474,25 @@ function hasQueue(node) { /***/ }), -/* 746 */ +/* 738 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var splitString = __webpack_require__(747); +var splitString = __webpack_require__(739); var utils = module.exports; /** * Module dependencies */ -utils.extend = __webpack_require__(739); -utils.flatten = __webpack_require__(753); -utils.isObject = __webpack_require__(751); -utils.fillRange = __webpack_require__(754); -utils.repeat = __webpack_require__(761); -utils.unique = __webpack_require__(744); +utils.extend = __webpack_require__(731); +utils.flatten = __webpack_require__(745); +utils.isObject = __webpack_require__(743); +utils.fillRange = __webpack_require__(746); +utils.repeat = __webpack_require__(753); +utils.unique = __webpack_require__(736); utils.define = function(obj, key, val) { Object.defineProperty(obj, key, { @@ -85168,7 +84824,7 @@ utils.escapeRegex = function(str) { /***/ }), -/* 747 */ +/* 739 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85181,7 +84837,7 @@ utils.escapeRegex = function(str) { -var extend = __webpack_require__(748); +var extend = __webpack_require__(740); module.exports = function(str, options, fn) { if (typeof str !== 'string') { @@ -85346,14 +85002,14 @@ function keepEscaping(opts, str, idx) { /***/ }), -/* 748 */ +/* 740 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(749); -var assignSymbols = __webpack_require__(752); +var isExtendable = __webpack_require__(741); +var assignSymbols = __webpack_require__(744); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -85413,7 +85069,7 @@ function isEnum(obj, key) { /***/ }), -/* 749 */ +/* 741 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85426,7 +85082,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(750); +var isPlainObject = __webpack_require__(742); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -85434,7 +85090,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 750 */ +/* 742 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85447,7 +85103,7 @@ module.exports = function isExtendable(val) { -var isObject = __webpack_require__(751); +var isObject = __webpack_require__(743); function isObjectObject(o) { return isObject(o) === true @@ -85478,7 +85134,7 @@ module.exports = function isPlainObject(o) { /***/ }), -/* 751 */ +/* 743 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85497,7 +85153,7 @@ module.exports = function isObject(val) { /***/ }), -/* 752 */ +/* 744 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85544,7 +85200,7 @@ module.exports = function(receiver, objects) { /***/ }), -/* 753 */ +/* 745 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85573,7 +85229,7 @@ function flat(arr, res) { /***/ }), -/* 754 */ +/* 746 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85586,11 +85242,11 @@ function flat(arr, res) { -var util = __webpack_require__(29); -var isNumber = __webpack_require__(755); -var extend = __webpack_require__(757); -var repeat = __webpack_require__(759); -var toRegex = __webpack_require__(760); +var util = __webpack_require__(397); +var isNumber = __webpack_require__(747); +var extend = __webpack_require__(749); +var repeat = __webpack_require__(751); +var toRegex = __webpack_require__(752); /** * Return a range of numbers or letters. @@ -85788,7 +85444,7 @@ module.exports = fillRange; /***/ }), -/* 755 */ +/* 747 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85801,7 +85457,7 @@ module.exports = fillRange; -var typeOf = __webpack_require__(756); +var typeOf = __webpack_require__(748); module.exports = function isNumber(num) { var type = typeOf(num); @@ -85817,10 +85473,10 @@ module.exports = function isNumber(num) { /***/ }), -/* 756 */ +/* 748 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -85939,13 +85595,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 757 */ +/* 749 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(758); +var isObject = __webpack_require__(750); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -85979,7 +85635,7 @@ function hasOwn(obj, key) { /***/ }), -/* 758 */ +/* 750 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85999,7 +85655,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 759 */ +/* 751 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86076,7 +85732,7 @@ function repeat(str, num) { /***/ }), -/* 760 */ +/* 752 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86089,8 +85745,8 @@ function repeat(str, num) { -var repeat = __webpack_require__(759); -var isNumber = __webpack_require__(755); +var repeat = __webpack_require__(751); +var isNumber = __webpack_require__(747); var cache = {}; function toRegexRange(min, max, options) { @@ -86377,7 +86033,7 @@ module.exports = toRegexRange; /***/ }), -/* 761 */ +/* 753 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86402,14 +86058,14 @@ module.exports = function repeat(ele, num) { /***/ }), -/* 762 */ +/* 754 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Node = __webpack_require__(763); -var utils = __webpack_require__(746); +var Node = __webpack_require__(755); +var utils = __webpack_require__(738); /** * Braces parsers @@ -86769,15 +86425,15 @@ function concatNodes(pos, node, parent, options) { /***/ }), -/* 763 */ +/* 755 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(751); -var define = __webpack_require__(764); -var utils = __webpack_require__(771); +var isObject = __webpack_require__(743); +var define = __webpack_require__(756); +var utils = __webpack_require__(763); var ownNames; /** @@ -87268,7 +86924,7 @@ exports = module.exports = Node; /***/ }), -/* 764 */ +/* 756 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87281,7 +86937,7 @@ exports = module.exports = Node; -var isDescriptor = __webpack_require__(765); +var isDescriptor = __webpack_require__(757); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -87306,7 +86962,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 765 */ +/* 757 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87319,9 +86975,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(766); -var isAccessor = __webpack_require__(767); -var isData = __webpack_require__(769); +var typeOf = __webpack_require__(758); +var isAccessor = __webpack_require__(759); +var isData = __webpack_require__(761); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -87335,7 +86991,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 766 */ +/* 758 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -87470,7 +87126,7 @@ function isBuffer(val) { /***/ }), -/* 767 */ +/* 759 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87483,7 +87139,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(768); +var typeOf = __webpack_require__(760); // accessor descriptor properties var accessor = { @@ -87546,7 +87202,7 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 768 */ +/* 760 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -87681,7 +87337,7 @@ function isBuffer(val) { /***/ }), -/* 769 */ +/* 761 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87694,7 +87350,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(770); +var typeOf = __webpack_require__(762); module.exports = function isDataDescriptor(obj, prop) { // data descriptor properties @@ -87737,7 +87393,7 @@ module.exports = function isDataDescriptor(obj, prop) { /***/ }), -/* 770 */ +/* 762 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -87872,13 +87528,13 @@ function isBuffer(val) { /***/ }), -/* 771 */ +/* 763 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(756); +var typeOf = __webpack_require__(748); var utils = module.exports; /** @@ -88898,17 +88554,17 @@ function assert(val, message) { /***/ }), -/* 772 */ +/* 764 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(739); -var Snapdragon = __webpack_require__(773); -var compilers = __webpack_require__(745); -var parsers = __webpack_require__(762); -var utils = __webpack_require__(746); +var extend = __webpack_require__(731); +var Snapdragon = __webpack_require__(765); +var compilers = __webpack_require__(737); +var parsers = __webpack_require__(754); +var utils = __webpack_require__(738); /** * Customize Snapdragon parser and renderer @@ -89009,17 +88665,17 @@ module.exports = Braces; /***/ }), -/* 773 */ +/* 765 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Base = __webpack_require__(774); -var define = __webpack_require__(800); -var Compiler = __webpack_require__(810); -var Parser = __webpack_require__(839); -var utils = __webpack_require__(819); +var Base = __webpack_require__(766); +var define = __webpack_require__(792); +var Compiler = __webpack_require__(802); +var Parser = __webpack_require__(831); +var utils = __webpack_require__(811); var regexCache = {}; var cache = {}; @@ -89190,20 +88846,20 @@ module.exports.Parser = Parser; /***/ }), -/* 774 */ +/* 766 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var util = __webpack_require__(29); -var define = __webpack_require__(775); -var CacheBase = __webpack_require__(776); -var Emitter = __webpack_require__(777); -var isObject = __webpack_require__(751); -var merge = __webpack_require__(794); -var pascal = __webpack_require__(797); -var cu = __webpack_require__(798); +var util = __webpack_require__(397); +var define = __webpack_require__(767); +var CacheBase = __webpack_require__(768); +var Emitter = __webpack_require__(769); +var isObject = __webpack_require__(743); +var merge = __webpack_require__(786); +var pascal = __webpack_require__(789); +var cu = __webpack_require__(790); /** * Optionally define a custom `cache` namespace to use. @@ -89632,7 +89288,7 @@ module.exports.namespace = namespace; /***/ }), -/* 775 */ +/* 767 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89645,7 +89301,7 @@ module.exports.namespace = namespace; -var isDescriptor = __webpack_require__(765); +var isDescriptor = __webpack_require__(757); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -89670,21 +89326,21 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 776 */ +/* 768 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(751); -var Emitter = __webpack_require__(777); -var visit = __webpack_require__(778); -var toPath = __webpack_require__(781); -var union = __webpack_require__(782); -var del = __webpack_require__(786); -var get = __webpack_require__(784); -var has = __webpack_require__(791); -var set = __webpack_require__(785); +var isObject = __webpack_require__(743); +var Emitter = __webpack_require__(769); +var visit = __webpack_require__(770); +var toPath = __webpack_require__(773); +var union = __webpack_require__(774); +var del = __webpack_require__(778); +var get = __webpack_require__(776); +var has = __webpack_require__(783); +var set = __webpack_require__(777); /** * Create a `Cache` constructor that when instantiated will @@ -89938,7 +89594,7 @@ module.exports.namespace = namespace; /***/ }), -/* 777 */ +/* 769 */ /***/ (function(module, exports, __webpack_require__) { @@ -90107,7 +89763,7 @@ Emitter.prototype.hasListeners = function(event){ /***/ }), -/* 778 */ +/* 770 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90120,8 +89776,8 @@ Emitter.prototype.hasListeners = function(event){ -var visit = __webpack_require__(779); -var mapVisit = __webpack_require__(780); +var visit = __webpack_require__(771); +var mapVisit = __webpack_require__(772); module.exports = function(collection, method, val) { var result; @@ -90144,7 +89800,7 @@ module.exports = function(collection, method, val) { /***/ }), -/* 779 */ +/* 771 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90157,7 +89813,7 @@ module.exports = function(collection, method, val) { -var isObject = __webpack_require__(751); +var isObject = __webpack_require__(743); module.exports = function visit(thisArg, method, target, val) { if (!isObject(thisArg) && typeof thisArg !== 'function') { @@ -90184,14 +89840,14 @@ module.exports = function visit(thisArg, method, target, val) { /***/ }), -/* 780 */ +/* 772 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var util = __webpack_require__(29); -var visit = __webpack_require__(779); +var util = __webpack_require__(397); +var visit = __webpack_require__(771); /** * Map `visit` over an array of objects. @@ -90228,7 +89884,7 @@ function isObject(val) { /***/ }), -/* 781 */ +/* 773 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90241,7 +89897,7 @@ function isObject(val) { -var typeOf = __webpack_require__(756); +var typeOf = __webpack_require__(748); module.exports = function toPath(args) { if (typeOf(args) !== 'arguments') { @@ -90268,16 +89924,16 @@ function filter(arr) { /***/ }), -/* 782 */ +/* 774 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(743); -var union = __webpack_require__(783); -var get = __webpack_require__(784); -var set = __webpack_require__(785); +var isObject = __webpack_require__(735); +var union = __webpack_require__(775); +var get = __webpack_require__(776); +var set = __webpack_require__(777); module.exports = function unionValue(obj, prop, value) { if (!isObject(obj)) { @@ -90305,7 +89961,7 @@ function arrayify(val) { /***/ }), -/* 783 */ +/* 775 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90341,7 +89997,7 @@ module.exports = function union(init) { /***/ }), -/* 784 */ +/* 776 */ /***/ (function(module, exports) { /*! @@ -90397,7 +90053,7 @@ function toString(val) { /***/ }), -/* 785 */ +/* 777 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90410,10 +90066,10 @@ function toString(val) { -var split = __webpack_require__(747); -var extend = __webpack_require__(742); -var isPlainObject = __webpack_require__(750); -var isObject = __webpack_require__(743); +var split = __webpack_require__(739); +var extend = __webpack_require__(734); +var isPlainObject = __webpack_require__(742); +var isObject = __webpack_require__(735); module.exports = function(obj, prop, val) { if (!isObject(obj)) { @@ -90459,7 +90115,7 @@ function isValidKey(key) { /***/ }), -/* 786 */ +/* 778 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90472,8 +90128,8 @@ function isValidKey(key) { -var isObject = __webpack_require__(751); -var has = __webpack_require__(787); +var isObject = __webpack_require__(743); +var has = __webpack_require__(779); module.exports = function unset(obj, prop) { if (!isObject(obj)) { @@ -90498,7 +90154,7 @@ module.exports = function unset(obj, prop) { /***/ }), -/* 787 */ +/* 779 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90511,9 +90167,9 @@ module.exports = function unset(obj, prop) { -var isObject = __webpack_require__(788); -var hasValues = __webpack_require__(790); -var get = __webpack_require__(784); +var isObject = __webpack_require__(780); +var hasValues = __webpack_require__(782); +var get = __webpack_require__(776); module.exports = function(obj, prop, noZero) { if (isObject(obj)) { @@ -90524,7 +90180,7 @@ module.exports = function(obj, prop, noZero) { /***/ }), -/* 788 */ +/* 780 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90537,7 +90193,7 @@ module.exports = function(obj, prop, noZero) { -var isArray = __webpack_require__(789); +var isArray = __webpack_require__(781); module.exports = function isObject(val) { return val != null && typeof val === 'object' && isArray(val) === false; @@ -90545,7 +90201,7 @@ module.exports = function isObject(val) { /***/ }), -/* 789 */ +/* 781 */ /***/ (function(module, exports) { var toString = {}.toString; @@ -90556,7 +90212,7 @@ module.exports = Array.isArray || function (arr) { /***/ }), -/* 790 */ +/* 782 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90599,7 +90255,7 @@ module.exports = function hasValue(o, noZero) { /***/ }), -/* 791 */ +/* 783 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90612,9 +90268,9 @@ module.exports = function hasValue(o, noZero) { -var isObject = __webpack_require__(751); -var hasValues = __webpack_require__(792); -var get = __webpack_require__(784); +var isObject = __webpack_require__(743); +var hasValues = __webpack_require__(784); +var get = __webpack_require__(776); module.exports = function(val, prop) { return hasValues(isObject(val) && prop ? get(val, prop) : val); @@ -90622,7 +90278,7 @@ module.exports = function(val, prop) { /***/ }), -/* 792 */ +/* 784 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90635,8 +90291,8 @@ module.exports = function(val, prop) { -var typeOf = __webpack_require__(793); -var isNumber = __webpack_require__(755); +var typeOf = __webpack_require__(785); +var isNumber = __webpack_require__(747); module.exports = function hasValue(val) { // is-number checks for NaN and other edge cases @@ -90689,10 +90345,10 @@ module.exports = function hasValue(val) { /***/ }), -/* 793 */ +/* 785 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -90814,14 +90470,14 @@ module.exports = function kindOf(val) { /***/ }), -/* 794 */ +/* 786 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(795); -var forIn = __webpack_require__(796); +var isExtendable = __webpack_require__(787); +var forIn = __webpack_require__(788); function mixinDeep(target, objects) { var len = arguments.length, i = 0; @@ -90885,7 +90541,7 @@ module.exports = mixinDeep; /***/ }), -/* 795 */ +/* 787 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90898,7 +90554,7 @@ module.exports = mixinDeep; -var isPlainObject = __webpack_require__(750); +var isPlainObject = __webpack_require__(742); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -90906,7 +90562,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 796 */ +/* 788 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90929,7 +90585,7 @@ module.exports = function forIn(obj, fn, thisArg) { /***/ }), -/* 797 */ +/* 789 */ /***/ (function(module, exports) { /*! @@ -90956,14 +90612,14 @@ module.exports = pascalcase; /***/ }), -/* 798 */ +/* 790 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var util = __webpack_require__(29); -var utils = __webpack_require__(799); +var util = __webpack_require__(397); +var utils = __webpack_require__(791); /** * Expose class utils @@ -91328,7 +90984,7 @@ cu.bubble = function(Parent, events) { /***/ }), -/* 799 */ +/* 791 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91342,10 +90998,10 @@ var utils = {}; * Lazily required module dependencies */ -utils.union = __webpack_require__(783); -utils.define = __webpack_require__(800); -utils.isObj = __webpack_require__(751); -utils.staticExtend = __webpack_require__(807); +utils.union = __webpack_require__(775); +utils.define = __webpack_require__(792); +utils.isObj = __webpack_require__(743); +utils.staticExtend = __webpack_require__(799); /** @@ -91356,7 +91012,7 @@ module.exports = utils; /***/ }), -/* 800 */ +/* 792 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91369,7 +91025,7 @@ module.exports = utils; -var isDescriptor = __webpack_require__(801); +var isDescriptor = __webpack_require__(793); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -91394,7 +91050,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 801 */ +/* 793 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91407,9 +91063,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(802); -var isAccessor = __webpack_require__(803); -var isData = __webpack_require__(805); +var typeOf = __webpack_require__(794); +var isAccessor = __webpack_require__(795); +var isData = __webpack_require__(797); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -91423,7 +91079,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 802 */ +/* 794 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -91576,7 +91232,7 @@ function isBuffer(val) { /***/ }), -/* 803 */ +/* 795 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91589,7 +91245,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(804); +var typeOf = __webpack_require__(796); // accessor descriptor properties var accessor = { @@ -91652,10 +91308,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 804 */ +/* 796 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -91774,7 +91430,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 805 */ +/* 797 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91787,7 +91443,7 @@ module.exports = function kindOf(val) { -var typeOf = __webpack_require__(806); +var typeOf = __webpack_require__(798); // data descriptor properties var data = { @@ -91836,10 +91492,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 806 */ +/* 798 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -91958,7 +91614,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 807 */ +/* 799 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91971,9 +91627,9 @@ module.exports = function kindOf(val) { -var copy = __webpack_require__(808); -var define = __webpack_require__(800); -var util = __webpack_require__(29); +var copy = __webpack_require__(800); +var define = __webpack_require__(792); +var util = __webpack_require__(397); /** * Returns a function for extending the static properties, @@ -92055,15 +91711,15 @@ module.exports = extend; /***/ }), -/* 808 */ +/* 800 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(756); -var copyDescriptor = __webpack_require__(809); -var define = __webpack_require__(800); +var typeOf = __webpack_require__(748); +var copyDescriptor = __webpack_require__(801); +var define = __webpack_require__(792); /** * Copy static properties, prototype properties, and descriptors from one object to another. @@ -92236,7 +91892,7 @@ module.exports.has = has; /***/ }), -/* 809 */ +/* 801 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -92324,16 +91980,16 @@ function isObject(val) { /***/ }), -/* 810 */ +/* 802 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(811); -var define = __webpack_require__(800); -var debug = __webpack_require__(813)('snapdragon:compiler'); -var utils = __webpack_require__(819); +var use = __webpack_require__(803); +var define = __webpack_require__(792); +var debug = __webpack_require__(805)('snapdragon:compiler'); +var utils = __webpack_require__(811); /** * Create a new `Compiler` with the given `options`. @@ -92487,7 +92143,7 @@ Compiler.prototype = { // source map support if (opts.sourcemap) { - var sourcemaps = __webpack_require__(838); + var sourcemaps = __webpack_require__(830); sourcemaps(this); this.mapVisit(this.ast.nodes); this.applySourceMaps(); @@ -92508,7 +92164,7 @@ module.exports = Compiler; /***/ }), -/* 811 */ +/* 803 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -92521,7 +92177,7 @@ module.exports = Compiler; -var utils = __webpack_require__(812); +var utils = __webpack_require__(804); module.exports = function base(app, opts) { if (!utils.isObject(app) && typeof app !== 'function') { @@ -92636,7 +92292,7 @@ module.exports = function base(app, opts) { /***/ }), -/* 812 */ +/* 804 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -92650,8 +92306,8 @@ var utils = {}; * Lazily required module dependencies */ -utils.define = __webpack_require__(800); -utils.isObject = __webpack_require__(751); +utils.define = __webpack_require__(792); +utils.isObject = __webpack_require__(743); utils.isString = function(val) { @@ -92666,7 +92322,7 @@ module.exports = utils; /***/ }), -/* 813 */ +/* 805 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -92675,14 +92331,14 @@ module.exports = utils; */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(814); + module.exports = __webpack_require__(806); } else { - module.exports = __webpack_require__(817); + module.exports = __webpack_require__(809); } /***/ }), -/* 814 */ +/* 806 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -92691,7 +92347,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(815); +exports = module.exports = __webpack_require__(807); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -92873,7 +92529,7 @@ function localstorage() { /***/ }), -/* 815 */ +/* 807 */ /***/ (function(module, exports, __webpack_require__) { @@ -92889,7 +92545,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(816); +exports.humanize = __webpack_require__(808); /** * The currently active debug mode names, and names to skip. @@ -93081,7 +92737,7 @@ function coerce(val) { /***/ }), -/* 816 */ +/* 808 */ /***/ (function(module, exports) { /** @@ -93239,15 +92895,15 @@ function plural(ms, n, name) { /***/ }), -/* 817 */ +/* 809 */ /***/ (function(module, exports, __webpack_require__) { /** * Module dependencies. */ -var tty = __webpack_require__(484); -var util = __webpack_require__(29); +var tty = __webpack_require__(471); +var util = __webpack_require__(397); /** * This is the Node.js implementation of `debug()`. @@ -93255,7 +92911,7 @@ var util = __webpack_require__(29); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(815); +exports = module.exports = __webpack_require__(807); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -93427,14 +93083,14 @@ function createWritableStdioStream (fd) { break; case 'FILE': - var fs = __webpack_require__(23); + var fs = __webpack_require__(349); stream = new fs.SyncWriteStream(fd, { autoClose: false }); stream._type = 'fs'; break; case 'PIPE': case 'TCP': - var net = __webpack_require__(818); + var net = __webpack_require__(810); stream = new net.Socket({ fd: fd, readable: false, @@ -93493,13 +93149,13 @@ exports.enable(load()); /***/ }), -/* 818 */ +/* 810 */ /***/ (function(module, exports) { module.exports = require("net"); /***/ }), -/* 819 */ +/* 811 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -93509,9 +93165,9 @@ module.exports = require("net"); * Module dependencies */ -exports.extend = __webpack_require__(742); -exports.SourceMap = __webpack_require__(820); -exports.sourceMapResolve = __webpack_require__(831); +exports.extend = __webpack_require__(734); +exports.SourceMap = __webpack_require__(812); +exports.sourceMapResolve = __webpack_require__(823); /** * Convert backslash in the given string to forward slashes @@ -93554,7 +93210,7 @@ exports.last = function(arr, n) { /***/ }), -/* 820 */ +/* 812 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -93562,13 +93218,13 @@ exports.last = function(arr, n) { * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ -exports.SourceMapGenerator = __webpack_require__(821).SourceMapGenerator; -exports.SourceMapConsumer = __webpack_require__(827).SourceMapConsumer; -exports.SourceNode = __webpack_require__(830).SourceNode; +exports.SourceMapGenerator = __webpack_require__(813).SourceMapGenerator; +exports.SourceMapConsumer = __webpack_require__(819).SourceMapConsumer; +exports.SourceNode = __webpack_require__(822).SourceNode; /***/ }), -/* 821 */ +/* 813 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -93578,10 +93234,10 @@ exports.SourceNode = __webpack_require__(830).SourceNode; * http://opensource.org/licenses/BSD-3-Clause */ -var base64VLQ = __webpack_require__(822); -var util = __webpack_require__(824); -var ArraySet = __webpack_require__(825).ArraySet; -var MappingList = __webpack_require__(826).MappingList; +var base64VLQ = __webpack_require__(814); +var util = __webpack_require__(816); +var ArraySet = __webpack_require__(817).ArraySet; +var MappingList = __webpack_require__(818).MappingList; /** * An instance of the SourceMapGenerator represents a source map which is @@ -93990,7 +93646,7 @@ exports.SourceMapGenerator = SourceMapGenerator; /***/ }), -/* 822 */ +/* 814 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94030,7 +93686,7 @@ exports.SourceMapGenerator = SourceMapGenerator; * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var base64 = __webpack_require__(823); +var base64 = __webpack_require__(815); // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, @@ -94136,7 +93792,7 @@ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { /***/ }), -/* 823 */ +/* 815 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94209,7 +93865,7 @@ exports.decode = function (charCode) { /***/ }), -/* 824 */ +/* 816 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94632,7 +94288,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate /***/ }), -/* 825 */ +/* 817 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94642,7 +94298,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(824); +var util = __webpack_require__(816); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; @@ -94759,7 +94415,7 @@ exports.ArraySet = ArraySet; /***/ }), -/* 826 */ +/* 818 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94769,7 +94425,7 @@ exports.ArraySet = ArraySet; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(824); +var util = __webpack_require__(816); /** * Determine whether mappingB is after mappingA with respect to generated @@ -94844,7 +94500,7 @@ exports.MappingList = MappingList; /***/ }), -/* 827 */ +/* 819 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94854,11 +94510,11 @@ exports.MappingList = MappingList; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(824); -var binarySearch = __webpack_require__(828); -var ArraySet = __webpack_require__(825).ArraySet; -var base64VLQ = __webpack_require__(822); -var quickSort = __webpack_require__(829).quickSort; +var util = __webpack_require__(816); +var binarySearch = __webpack_require__(820); +var ArraySet = __webpack_require__(817).ArraySet; +var base64VLQ = __webpack_require__(814); +var quickSort = __webpack_require__(821).quickSort; function SourceMapConsumer(aSourceMap) { var sourceMap = aSourceMap; @@ -95932,7 +95588,7 @@ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; /***/ }), -/* 828 */ +/* 820 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -96049,7 +95705,7 @@ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { /***/ }), -/* 829 */ +/* 821 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -96169,7 +95825,7 @@ exports.quickSort = function (ary, comparator) { /***/ }), -/* 830 */ +/* 822 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -96179,8 +95835,8 @@ exports.quickSort = function (ary, comparator) { * http://opensource.org/licenses/BSD-3-Clause */ -var SourceMapGenerator = __webpack_require__(821).SourceMapGenerator; -var util = __webpack_require__(824); +var SourceMapGenerator = __webpack_require__(813).SourceMapGenerator; +var util = __webpack_require__(816); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). @@ -96588,17 +96244,17 @@ exports.SourceNode = SourceNode; /***/ }), -/* 831 */ +/* 823 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014, 2015, 2016, 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var sourceMappingURL = __webpack_require__(832) -var resolveUrl = __webpack_require__(833) -var decodeUriComponent = __webpack_require__(834) -var urix = __webpack_require__(836) -var atob = __webpack_require__(837) +var sourceMappingURL = __webpack_require__(824) +var resolveUrl = __webpack_require__(825) +var decodeUriComponent = __webpack_require__(826) +var urix = __webpack_require__(828) +var atob = __webpack_require__(829) @@ -96896,7 +96552,7 @@ module.exports = { /***/ }), -/* 832 */ +/* 824 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell @@ -96959,13 +96615,13 @@ void (function(root, factory) { /***/ }), -/* 833 */ +/* 825 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var url = __webpack_require__(452) +var url = __webpack_require__(439) function resolveUrl(/* ...urls */) { return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) { @@ -96977,13 +96633,13 @@ module.exports = resolveUrl /***/ }), -/* 834 */ +/* 826 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var decodeUriComponent = __webpack_require__(835) +var decodeUriComponent = __webpack_require__(827) function customDecodeUriComponent(string) { // `decodeUriComponent` turns `+` into ` `, but that's not wanted. @@ -96994,7 +96650,7 @@ module.exports = customDecodeUriComponent /***/ }), -/* 835 */ +/* 827 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97095,13 +96751,13 @@ module.exports = function (encodedURI) { /***/ }), -/* 836 */ +/* 828 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var path = __webpack_require__(16) +var path = __webpack_require__(4) "use strict" @@ -97118,7 +96774,7 @@ module.exports = urix /***/ }), -/* 837 */ +/* 829 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97132,16 +96788,16 @@ module.exports = atob.atob = atob; /***/ }), -/* 838 */ +/* 830 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var fs = __webpack_require__(23); -var path = __webpack_require__(16); -var define = __webpack_require__(800); -var utils = __webpack_require__(819); +var fs = __webpack_require__(349); +var path = __webpack_require__(4); +var define = __webpack_require__(792); +var utils = __webpack_require__(811); /** * Expose `mixin()`. @@ -97284,19 +96940,19 @@ exports.comment = function(node) { /***/ }), -/* 839 */ +/* 831 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(811); -var util = __webpack_require__(29); -var Cache = __webpack_require__(840); -var define = __webpack_require__(800); -var debug = __webpack_require__(813)('snapdragon:parser'); -var Position = __webpack_require__(841); -var utils = __webpack_require__(819); +var use = __webpack_require__(803); +var util = __webpack_require__(397); +var Cache = __webpack_require__(832); +var define = __webpack_require__(792); +var debug = __webpack_require__(805)('snapdragon:parser'); +var Position = __webpack_require__(833); +var utils = __webpack_require__(811); /** * Create a new `Parser` with the given `input` and `options`. @@ -97824,7 +97480,7 @@ module.exports = Parser; /***/ }), -/* 840 */ +/* 832 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97931,13 +97587,13 @@ MapCache.prototype.del = function mapDelete(key) { /***/ }), -/* 841 */ +/* 833 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(800); +var define = __webpack_require__(792); /** * Store position for a node @@ -97952,16 +97608,16 @@ module.exports = function Position(start, parser) { /***/ }), -/* 842 */ +/* 834 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var safe = __webpack_require__(843); -var define = __webpack_require__(849); -var extend = __webpack_require__(850); -var not = __webpack_require__(852); +var safe = __webpack_require__(835); +var define = __webpack_require__(841); +var extend = __webpack_require__(842); +var not = __webpack_require__(844); var MAX_LENGTH = 1024 * 64; /** @@ -98114,10 +97770,10 @@ module.exports.makeRe = makeRe; /***/ }), -/* 843 */ +/* 835 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(844); +var parse = __webpack_require__(836); var types = parse.types; module.exports = function (re, opts) { @@ -98163,13 +97819,13 @@ function isRegExp (x) { /***/ }), -/* 844 */ +/* 836 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(845); -var types = __webpack_require__(846); -var sets = __webpack_require__(847); -var positions = __webpack_require__(848); +var util = __webpack_require__(837); +var types = __webpack_require__(838); +var sets = __webpack_require__(839); +var positions = __webpack_require__(840); module.exports = function(regexpStr) { @@ -98451,11 +98107,11 @@ module.exports.types = types; /***/ }), -/* 845 */ +/* 837 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(846); -var sets = __webpack_require__(847); +var types = __webpack_require__(838); +var sets = __webpack_require__(839); // All of these are private and only used by randexp. @@ -98568,7 +98224,7 @@ exports.error = function(regexp, msg) { /***/ }), -/* 846 */ +/* 838 */ /***/ (function(module, exports) { module.exports = { @@ -98584,10 +98240,10 @@ module.exports = { /***/ }), -/* 847 */ +/* 839 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(846); +var types = __webpack_require__(838); var INTS = function() { return [{ type: types.RANGE , from: 48, to: 57 }]; @@ -98672,10 +98328,10 @@ exports.anyChar = function() { /***/ }), -/* 848 */ +/* 840 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(846); +var types = __webpack_require__(838); exports.wordBoundary = function() { return { type: types.POSITION, value: 'b' }; @@ -98695,7 +98351,7 @@ exports.end = function() { /***/ }), -/* 849 */ +/* 841 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98708,8 +98364,8 @@ exports.end = function() { -var isobject = __webpack_require__(751); -var isDescriptor = __webpack_require__(765); +var isobject = __webpack_require__(743); +var isDescriptor = __webpack_require__(757); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -98740,14 +98396,14 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 850 */ +/* 842 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(851); -var assignSymbols = __webpack_require__(752); +var isExtendable = __webpack_require__(843); +var assignSymbols = __webpack_require__(744); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -98807,7 +98463,7 @@ function isEnum(obj, key) { /***/ }), -/* 851 */ +/* 843 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98820,7 +98476,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(750); +var isPlainObject = __webpack_require__(742); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -98828,14 +98484,14 @@ module.exports = function isExtendable(val) { /***/ }), -/* 852 */ +/* 844 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(850); -var safe = __webpack_require__(843); +var extend = __webpack_require__(842); +var safe = __webpack_require__(835); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -98907,14 +98563,14 @@ module.exports = toRegex; /***/ }), -/* 853 */ +/* 845 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var nanomatch = __webpack_require__(854); -var extglob = __webpack_require__(870); +var nanomatch = __webpack_require__(846); +var extglob = __webpack_require__(862); module.exports = function(snapdragon) { var compilers = snapdragon.compiler.compilers; @@ -98991,7 +98647,7 @@ function escapeExtglobs(compiler) { /***/ }), -/* 854 */ +/* 846 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99001,18 +98657,18 @@ function escapeExtglobs(compiler) { * Module dependencies */ -var util = __webpack_require__(29); -var toRegex = __webpack_require__(855); -var extend = __webpack_require__(856); +var util = __webpack_require__(397); +var toRegex = __webpack_require__(847); +var extend = __webpack_require__(848); /** * Local dependencies */ -var compilers = __webpack_require__(858); -var parsers = __webpack_require__(859); -var cache = __webpack_require__(862); -var utils = __webpack_require__(864); +var compilers = __webpack_require__(850); +var parsers = __webpack_require__(851); +var cache = __webpack_require__(854); +var utils = __webpack_require__(856); var MAX_LENGTH = 1024 * 64; /** @@ -99836,15 +99492,15 @@ module.exports = nanomatch; /***/ }), -/* 855 */ +/* 847 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(800); -var extend = __webpack_require__(742); -var not = __webpack_require__(741); +var define = __webpack_require__(792); +var extend = __webpack_require__(734); +var not = __webpack_require__(733); var MAX_LENGTH = 1024 * 64; /** @@ -99991,14 +99647,14 @@ module.exports.makeRe = makeRe; /***/ }), -/* 856 */ +/* 848 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(857); -var assignSymbols = __webpack_require__(752); +var isExtendable = __webpack_require__(849); +var assignSymbols = __webpack_require__(744); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -100058,7 +99714,7 @@ function isEnum(obj, key) { /***/ }), -/* 857 */ +/* 849 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100071,7 +99727,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(750); +var isPlainObject = __webpack_require__(742); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -100079,7 +99735,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 858 */ +/* 850 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100425,15 +100081,15 @@ module.exports = function(nanomatch, options) { /***/ }), -/* 859 */ +/* 851 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regexNot = __webpack_require__(741); -var toRegex = __webpack_require__(855); -var isOdd = __webpack_require__(860); +var regexNot = __webpack_require__(733); +var toRegex = __webpack_require__(847); +var isOdd = __webpack_require__(852); /** * Characters to use in negation regex (we want to "not" match @@ -100819,7 +100475,7 @@ module.exports.not = NOT_REGEX; /***/ }), -/* 860 */ +/* 852 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100832,7 +100488,7 @@ module.exports.not = NOT_REGEX; -var isNumber = __webpack_require__(861); +var isNumber = __webpack_require__(853); module.exports = function isOdd(i) { if (!isNumber(i)) { @@ -100846,7 +100502,7 @@ module.exports = function isOdd(i) { /***/ }), -/* 861 */ +/* 853 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100874,14 +100530,14 @@ module.exports = function isNumber(num) { /***/ }), -/* 862 */ +/* 854 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(863))(); +module.exports = new (__webpack_require__(855))(); /***/ }), -/* 863 */ +/* 855 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100894,7 +100550,7 @@ module.exports = new (__webpack_require__(863))(); -var MapCache = __webpack_require__(840); +var MapCache = __webpack_require__(832); /** * Create a new `FragmentCache` with an optional object to use for `caches`. @@ -101016,27 +100672,27 @@ exports = module.exports = FragmentCache; /***/ }), -/* 864 */ +/* 856 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = module.exports; -var path = __webpack_require__(16); +var path = __webpack_require__(4); /** * Module dependencies */ -var isWindows = __webpack_require__(865)(); -var Snapdragon = __webpack_require__(773); -utils.define = __webpack_require__(866); -utils.diff = __webpack_require__(867); -utils.extend = __webpack_require__(856); -utils.pick = __webpack_require__(868); -utils.typeOf = __webpack_require__(869); -utils.unique = __webpack_require__(744); +var isWindows = __webpack_require__(857)(); +var Snapdragon = __webpack_require__(765); +utils.define = __webpack_require__(858); +utils.diff = __webpack_require__(859); +utils.extend = __webpack_require__(848); +utils.pick = __webpack_require__(860); +utils.typeOf = __webpack_require__(861); +utils.unique = __webpack_require__(736); /** * Returns true if the given value is effectively an empty string @@ -101402,7 +101058,7 @@ utils.unixify = function(options) { /***/ }), -/* 865 */ +/* 857 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -101430,7 +101086,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /***/ }), -/* 866 */ +/* 858 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101443,8 +101099,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ -var isobject = __webpack_require__(751); -var isDescriptor = __webpack_require__(765); +var isobject = __webpack_require__(743); +var isDescriptor = __webpack_require__(757); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -101475,7 +101131,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 867 */ +/* 859 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101529,7 +101185,7 @@ function diffArray(one, two) { /***/ }), -/* 868 */ +/* 860 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101542,7 +101198,7 @@ function diffArray(one, two) { -var isObject = __webpack_require__(751); +var isObject = __webpack_require__(743); module.exports = function pick(obj, keys) { if (!isObject(obj) && typeof obj !== 'function') { @@ -101571,7 +101227,7 @@ module.exports = function pick(obj, keys) { /***/ }), -/* 869 */ +/* 861 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -101706,7 +101362,7 @@ function isBuffer(val) { /***/ }), -/* 870 */ +/* 862 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101716,18 +101372,18 @@ function isBuffer(val) { * Module dependencies */ -var extend = __webpack_require__(742); -var unique = __webpack_require__(744); -var toRegex = __webpack_require__(855); +var extend = __webpack_require__(734); +var unique = __webpack_require__(736); +var toRegex = __webpack_require__(847); /** * Local dependencies */ -var compilers = __webpack_require__(871); -var parsers = __webpack_require__(882); -var Extglob = __webpack_require__(885); -var utils = __webpack_require__(884); +var compilers = __webpack_require__(863); +var parsers = __webpack_require__(874); +var Extglob = __webpack_require__(877); +var utils = __webpack_require__(876); var MAX_LENGTH = 1024 * 64; /** @@ -102044,13 +101700,13 @@ module.exports = extglob; /***/ }), -/* 871 */ +/* 863 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(872); +var brackets = __webpack_require__(864); /** * Extglob compilers @@ -102220,7 +101876,7 @@ module.exports = function(extglob) { /***/ }), -/* 872 */ +/* 864 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102230,17 +101886,17 @@ module.exports = function(extglob) { * Local dependencies */ -var compilers = __webpack_require__(873); -var parsers = __webpack_require__(875); +var compilers = __webpack_require__(865); +var parsers = __webpack_require__(867); /** * Module dependencies */ -var debug = __webpack_require__(877)('expand-brackets'); -var extend = __webpack_require__(742); -var Snapdragon = __webpack_require__(773); -var toRegex = __webpack_require__(855); +var debug = __webpack_require__(869)('expand-brackets'); +var extend = __webpack_require__(734); +var Snapdragon = __webpack_require__(765); +var toRegex = __webpack_require__(847); /** * Parses the given POSIX character class `pattern` and returns a @@ -102438,13 +102094,13 @@ module.exports = brackets; /***/ }), -/* 873 */ +/* 865 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var posix = __webpack_require__(874); +var posix = __webpack_require__(866); module.exports = function(brackets) { brackets.compiler @@ -102532,7 +102188,7 @@ module.exports = function(brackets) { /***/ }), -/* 874 */ +/* 866 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102561,14 +102217,14 @@ module.exports = { /***/ }), -/* 875 */ +/* 867 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(876); -var define = __webpack_require__(800); +var utils = __webpack_require__(868); +var define = __webpack_require__(792); /** * Text regex @@ -102787,14 +102443,14 @@ module.exports.TEXT_REGEX = TEXT_REGEX; /***/ }), -/* 876 */ +/* 868 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var toRegex = __webpack_require__(855); -var regexNot = __webpack_require__(741); +var toRegex = __webpack_require__(847); +var regexNot = __webpack_require__(733); var cached; /** @@ -102828,7 +102484,7 @@ exports.createRegex = function(pattern, include) { /***/ }), -/* 877 */ +/* 869 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -102837,14 +102493,14 @@ exports.createRegex = function(pattern, include) { */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(878); + module.exports = __webpack_require__(870); } else { - module.exports = __webpack_require__(881); + module.exports = __webpack_require__(873); } /***/ }), -/* 878 */ +/* 870 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -102853,7 +102509,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(879); +exports = module.exports = __webpack_require__(871); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -103035,7 +102691,7 @@ function localstorage() { /***/ }), -/* 879 */ +/* 871 */ /***/ (function(module, exports, __webpack_require__) { @@ -103051,7 +102707,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(880); +exports.humanize = __webpack_require__(872); /** * The currently active debug mode names, and names to skip. @@ -103243,7 +102899,7 @@ function coerce(val) { /***/ }), -/* 880 */ +/* 872 */ /***/ (function(module, exports) { /** @@ -103401,15 +103057,15 @@ function plural(ms, n, name) { /***/ }), -/* 881 */ +/* 873 */ /***/ (function(module, exports, __webpack_require__) { /** * Module dependencies. */ -var tty = __webpack_require__(484); -var util = __webpack_require__(29); +var tty = __webpack_require__(471); +var util = __webpack_require__(397); /** * This is the Node.js implementation of `debug()`. @@ -103417,7 +103073,7 @@ var util = __webpack_require__(29); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(879); +exports = module.exports = __webpack_require__(871); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -103589,14 +103245,14 @@ function createWritableStdioStream (fd) { break; case 'FILE': - var fs = __webpack_require__(23); + var fs = __webpack_require__(349); stream = new fs.SyncWriteStream(fd, { autoClose: false }); stream._type = 'fs'; break; case 'PIPE': case 'TCP': - var net = __webpack_require__(818); + var net = __webpack_require__(810); stream = new net.Socket({ fd: fd, readable: false, @@ -103655,15 +103311,15 @@ exports.enable(load()); /***/ }), -/* 882 */ +/* 874 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(872); -var define = __webpack_require__(883); -var utils = __webpack_require__(884); +var brackets = __webpack_require__(864); +var define = __webpack_require__(875); +var utils = __webpack_require__(876); /** * Characters to use in text regex (we want to "not" match @@ -103818,7 +103474,7 @@ module.exports = parsers; /***/ }), -/* 883 */ +/* 875 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103831,7 +103487,7 @@ module.exports = parsers; -var isDescriptor = __webpack_require__(765); +var isDescriptor = __webpack_require__(757); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -103856,14 +103512,14 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 884 */ +/* 876 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regex = __webpack_require__(741); -var Cache = __webpack_require__(863); +var regex = __webpack_require__(733); +var Cache = __webpack_require__(855); /** * Utils @@ -103932,7 +103588,7 @@ utils.createRegex = function(str) { /***/ }), -/* 885 */ +/* 877 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103942,16 +103598,16 @@ utils.createRegex = function(str) { * Module dependencies */ -var Snapdragon = __webpack_require__(773); -var define = __webpack_require__(883); -var extend = __webpack_require__(742); +var Snapdragon = __webpack_require__(765); +var define = __webpack_require__(875); +var extend = __webpack_require__(734); /** * Local dependencies */ -var compilers = __webpack_require__(871); -var parsers = __webpack_require__(882); +var compilers = __webpack_require__(863); +var parsers = __webpack_require__(874); /** * Customize Snapdragon parser and renderer @@ -104017,16 +103673,16 @@ module.exports = Extglob; /***/ }), -/* 886 */ +/* 878 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extglob = __webpack_require__(870); -var nanomatch = __webpack_require__(854); -var regexNot = __webpack_require__(741); -var toRegex = __webpack_require__(842); +var extglob = __webpack_require__(862); +var nanomatch = __webpack_require__(846); +var regexNot = __webpack_require__(733); +var toRegex = __webpack_require__(834); var not; /** @@ -104107,33 +103763,33 @@ function textRegex(pattern) { /***/ }), -/* 887 */ +/* 879 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(863))(); +module.exports = new (__webpack_require__(855))(); /***/ }), -/* 888 */ +/* 880 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = module.exports; -var path = __webpack_require__(16); +var path = __webpack_require__(4); /** * Module dependencies */ -var Snapdragon = __webpack_require__(773); -utils.define = __webpack_require__(849); -utils.diff = __webpack_require__(867); -utils.extend = __webpack_require__(850); -utils.pick = __webpack_require__(868); -utils.typeOf = __webpack_require__(889); -utils.unique = __webpack_require__(744); +var Snapdragon = __webpack_require__(765); +utils.define = __webpack_require__(841); +utils.diff = __webpack_require__(859); +utils.extend = __webpack_require__(842); +utils.pick = __webpack_require__(860); +utils.typeOf = __webpack_require__(881); +utils.unique = __webpack_require__(736); /** * Returns true if the platform is windows, or `path.sep` is `\\`. @@ -104430,7 +104086,7 @@ utils.unixify = function(options) { /***/ }), -/* 889 */ +/* 881 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -104565,7 +104221,7 @@ function isBuffer(val) { /***/ }), -/* 890 */ +/* 882 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104584,9 +104240,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(891); -var reader_1 = __webpack_require__(904); -var fs_stream_1 = __webpack_require__(908); +var readdir = __webpack_require__(883); +var reader_1 = __webpack_require__(896); +var fs_stream_1 = __webpack_require__(900); var ReaderAsync = /** @class */ (function (_super) { __extends(ReaderAsync, _super); function ReaderAsync() { @@ -104647,15 +104303,15 @@ exports.default = ReaderAsync; /***/ }), -/* 891 */ +/* 883 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const readdirSync = __webpack_require__(892); -const readdirAsync = __webpack_require__(900); -const readdirStream = __webpack_require__(903); +const readdirSync = __webpack_require__(884); +const readdirAsync = __webpack_require__(892); +const readdirStream = __webpack_require__(895); module.exports = exports = readdirAsyncPath; exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath; @@ -104739,7 +104395,7 @@ function readdirStreamStat (dir, options) { /***/ }), -/* 892 */ +/* 884 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104747,11 +104403,11 @@ function readdirStreamStat (dir, options) { module.exports = readdirSync; -const DirectoryReader = __webpack_require__(893); +const DirectoryReader = __webpack_require__(885); let syncFacade = { - fs: __webpack_require__(898), - forEach: __webpack_require__(899), + fs: __webpack_require__(890), + forEach: __webpack_require__(891), sync: true }; @@ -104780,18 +104436,18 @@ function readdirSync (dir, options, internalOptions) { /***/ }), -/* 893 */ +/* 885 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const Readable = __webpack_require__(27).Readable; -const EventEmitter = __webpack_require__(399).EventEmitter; -const path = __webpack_require__(16); -const normalizeOptions = __webpack_require__(894); -const stat = __webpack_require__(896); -const call = __webpack_require__(897); +const Readable = __webpack_require__(382).Readable; +const EventEmitter = __webpack_require__(373).EventEmitter; +const path = __webpack_require__(4); +const normalizeOptions = __webpack_require__(886); +const stat = __webpack_require__(888); +const call = __webpack_require__(889); /** * Asynchronously reads the contents of a directory and streams the results @@ -105167,14 +104823,14 @@ module.exports = DirectoryReader; /***/ }), -/* 894 */ +/* 886 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const globToRegExp = __webpack_require__(895); +const path = __webpack_require__(4); +const globToRegExp = __webpack_require__(887); module.exports = normalizeOptions; @@ -105351,7 +105007,7 @@ function normalizeOptions (options, internalOptions) { /***/ }), -/* 895 */ +/* 887 */ /***/ (function(module, exports) { module.exports = function (glob, opts) { @@ -105488,13 +105144,13 @@ module.exports = function (glob, opts) { /***/ }), -/* 896 */ +/* 888 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const call = __webpack_require__(897); +const call = __webpack_require__(889); module.exports = stat; @@ -105569,7 +105225,7 @@ function symlinkStat (fs, path, lstats, callback) { /***/ }), -/* 897 */ +/* 889 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105630,14 +105286,14 @@ function callOnce (fn) { /***/ }), -/* 898 */ +/* 890 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const call = __webpack_require__(897); +const fs = __webpack_require__(349); +const call = __webpack_require__(889); /** * A facade around {@link fs.readdirSync} that allows it to be called @@ -105701,7 +105357,7 @@ exports.lstat = function (path, callback) { /***/ }), -/* 899 */ +/* 891 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105730,7 +105386,7 @@ function syncForEach (array, iterator, done) { /***/ }), -/* 900 */ +/* 892 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105738,12 +105394,12 @@ function syncForEach (array, iterator, done) { module.exports = readdirAsync; -const maybe = __webpack_require__(901); -const DirectoryReader = __webpack_require__(893); +const maybe = __webpack_require__(893); +const DirectoryReader = __webpack_require__(885); let asyncFacade = { - fs: __webpack_require__(23), - forEach: __webpack_require__(902), + fs: __webpack_require__(349), + forEach: __webpack_require__(894), async: true }; @@ -105785,7 +105441,7 @@ function readdirAsync (dir, options, callback, internalOptions) { /***/ }), -/* 901 */ +/* 893 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105812,7 +105468,7 @@ module.exports = function maybe (cb, promise) { /***/ }), -/* 902 */ +/* 894 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105848,7 +105504,7 @@ function asyncForEach (array, iterator, done) { /***/ }), -/* 903 */ +/* 895 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105856,11 +105512,11 @@ function asyncForEach (array, iterator, done) { module.exports = readdirStream; -const DirectoryReader = __webpack_require__(893); +const DirectoryReader = __webpack_require__(885); let streamFacade = { - fs: __webpack_require__(23), - forEach: __webpack_require__(902), + fs: __webpack_require__(349), + forEach: __webpack_require__(894), async: true }; @@ -105880,16 +105536,16 @@ function readdirStream (dir, options, internalOptions) { /***/ }), -/* 904 */ +/* 896 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(16); -var deep_1 = __webpack_require__(905); -var entry_1 = __webpack_require__(907); -var pathUtil = __webpack_require__(906); +var path = __webpack_require__(4); +var deep_1 = __webpack_require__(897); +var entry_1 = __webpack_require__(899); +var pathUtil = __webpack_require__(898); var Reader = /** @class */ (function () { function Reader(options) { this.options = options; @@ -105955,14 +105611,14 @@ exports.default = Reader; /***/ }), -/* 905 */ +/* 897 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(906); -var patternUtils = __webpack_require__(723); +var pathUtils = __webpack_require__(898); +var patternUtils = __webpack_require__(715); var DeepFilter = /** @class */ (function () { function DeepFilter(options, micromatchOptions) { this.options = options; @@ -106045,13 +105701,13 @@ exports.default = DeepFilter; /***/ }), -/* 906 */ +/* 898 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(16); +var path = __webpack_require__(4); /** * Returns «true» if the last partial of the path starting with a period. */ @@ -106076,14 +105732,14 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 907 */ +/* 899 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(906); -var patternUtils = __webpack_require__(723); +var pathUtils = __webpack_require__(898); +var patternUtils = __webpack_require__(715); var EntryFilter = /** @class */ (function () { function EntryFilter(options, micromatchOptions) { this.options = options; @@ -106168,7 +105824,7 @@ exports.default = EntryFilter; /***/ }), -/* 908 */ +/* 900 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106187,9 +105843,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var stream = __webpack_require__(27); -var fsStat = __webpack_require__(909); -var fs_1 = __webpack_require__(913); +var stream = __webpack_require__(382); +var fsStat = __webpack_require__(901); +var fs_1 = __webpack_require__(905); var FileSystemStream = /** @class */ (function (_super) { __extends(FileSystemStream, _super); function FileSystemStream() { @@ -106239,14 +105895,14 @@ exports.default = FileSystemStream; /***/ }), -/* 909 */ +/* 901 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const optionsManager = __webpack_require__(910); -const statProvider = __webpack_require__(912); +const optionsManager = __webpack_require__(902); +const statProvider = __webpack_require__(904); /** * Asynchronous API. */ @@ -106277,13 +105933,13 @@ exports.statSync = statSync; /***/ }), -/* 910 */ +/* 902 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsAdapter = __webpack_require__(911); +const fsAdapter = __webpack_require__(903); function prepare(opts) { const options = Object.assign({ fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined), @@ -106296,13 +105952,13 @@ exports.prepare = prepare; /***/ }), -/* 911 */ +/* 903 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); +const fs = __webpack_require__(349); exports.FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, stat: fs.stat, @@ -106319,7 +105975,7 @@ exports.getFileSystemAdapter = getFileSystemAdapter; /***/ }), -/* 912 */ +/* 904 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106371,13 +106027,13 @@ exports.isFollowedSymlink = isFollowedSymlink; /***/ }), -/* 913 */ +/* 905 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(16); +var path = __webpack_require__(4); var FileSystem = /** @class */ (function () { function FileSystem(options) { this.options = options; @@ -106402,7 +106058,7 @@ exports.default = FileSystem; /***/ }), -/* 914 */ +/* 906 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106421,10 +106077,10 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var stream = __webpack_require__(27); -var readdir = __webpack_require__(891); -var reader_1 = __webpack_require__(904); -var fs_stream_1 = __webpack_require__(908); +var stream = __webpack_require__(382); +var readdir = __webpack_require__(883); +var reader_1 = __webpack_require__(896); +var fs_stream_1 = __webpack_require__(900); var TransformStream = /** @class */ (function (_super) { __extends(TransformStream, _super); function TransformStream(reader) { @@ -106492,7 +106148,7 @@ exports.default = ReaderStream; /***/ }), -/* 915 */ +/* 907 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106511,9 +106167,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(891); -var reader_1 = __webpack_require__(904); -var fs_sync_1 = __webpack_require__(916); +var readdir = __webpack_require__(883); +var reader_1 = __webpack_require__(896); +var fs_sync_1 = __webpack_require__(908); var ReaderSync = /** @class */ (function (_super) { __extends(ReaderSync, _super); function ReaderSync() { @@ -106573,7 +106229,7 @@ exports.default = ReaderSync; /***/ }), -/* 916 */ +/* 908 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106592,8 +106248,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var fsStat = __webpack_require__(909); -var fs_1 = __webpack_require__(913); +var fsStat = __webpack_require__(901); +var fs_1 = __webpack_require__(905); var FileSystemSync = /** @class */ (function (_super) { __extends(FileSystemSync, _super); function FileSystemSync() { @@ -106639,7 +106295,7 @@ exports.default = FileSystemSync; /***/ }), -/* 917 */ +/* 909 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106655,13 +106311,13 @@ exports.flatten = flatten; /***/ }), -/* 918 */ +/* 910 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var merge2 = __webpack_require__(590); +var merge2 = __webpack_require__(585); /** * Merge multiple streams and propagate their errors into one stream in parallel. */ @@ -106676,13 +106332,13 @@ exports.merge = merge; /***/ }), -/* 919 */ +/* 911 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const pathType = __webpack_require__(920); +const path = __webpack_require__(4); +const pathType = __webpack_require__(912); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -106748,13 +106404,13 @@ module.exports.sync = (input, opts) => { /***/ }), -/* 920 */ +/* 912 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const pify = __webpack_require__(921); +const fs = __webpack_require__(349); +const pify = __webpack_require__(913); function type(fn, fn2, fp) { if (typeof fp !== 'string') { @@ -106797,7 +106453,7 @@ exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 921 */ +/* 913 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106888,17 +106544,17 @@ module.exports = (obj, opts) => { /***/ }), -/* 922 */ +/* 914 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const fastGlob = __webpack_require__(719); -const gitIgnore = __webpack_require__(923); -const pify = __webpack_require__(924); -const slash = __webpack_require__(925); +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const fastGlob = __webpack_require__(711); +const gitIgnore = __webpack_require__(915); +const pify = __webpack_require__(916); +const slash = __webpack_require__(917); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -106996,7 +106652,7 @@ module.exports.sync = options => { /***/ }), -/* 923 */ +/* 915 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -107465,7 +107121,7 @@ module.exports = options => new IgnoreBase(options) /***/ }), -/* 924 */ +/* 916 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107540,7 +107196,7 @@ module.exports = (input, options) => { /***/ }), -/* 925 */ +/* 917 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107558,17 +107214,17 @@ module.exports = input => { /***/ }), -/* 926 */ +/* 918 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const {constants: fsConstants} = __webpack_require__(23); -const pEvent = __webpack_require__(927); -const CpFileError = __webpack_require__(930); -const fs = __webpack_require__(934); -const ProgressEmitter = __webpack_require__(937); +const path = __webpack_require__(4); +const {constants: fsConstants} = __webpack_require__(349); +const pEvent = __webpack_require__(919); +const CpFileError = __webpack_require__(922); +const fs = __webpack_require__(926); +const ProgressEmitter = __webpack_require__(929); const cpFileAsync = async (source, destination, options, progressEmitter) => { let readError; @@ -107682,12 +107338,12 @@ module.exports.sync = (source, destination, options) => { /***/ }), -/* 927 */ +/* 919 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pTimeout = __webpack_require__(928); +const pTimeout = __webpack_require__(920); const symbolAsyncIterator = Symbol.asyncIterator || '@@asyncIterator'; @@ -107978,12 +107634,12 @@ module.exports.iterator = (emitter, event, options) => { /***/ }), -/* 928 */ +/* 920 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pFinally = __webpack_require__(929); +const pFinally = __webpack_require__(921); class TimeoutError extends Error { constructor(message) { @@ -108029,7 +107685,7 @@ module.exports.TimeoutError = TimeoutError; /***/ }), -/* 929 */ +/* 921 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -108051,12 +107707,12 @@ module.exports = (promise, onFinally) => { /***/ }), -/* 930 */ +/* 922 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(931); +const NestedError = __webpack_require__(923); class CpFileError extends NestedError { constructor(message, nested) { @@ -108070,10 +107726,10 @@ module.exports = CpFileError; /***/ }), -/* 931 */ +/* 923 */ /***/ (function(module, exports, __webpack_require__) { -var inherits = __webpack_require__(932); +var inherits = __webpack_require__(924); var NestedError = function (message, nested) { this.nested = nested; @@ -108124,20 +107780,20 @@ module.exports = NestedError; /***/ }), -/* 932 */ +/* 924 */ /***/ (function(module, exports, __webpack_require__) { try { - var util = __webpack_require__(29); + var util = __webpack_require__(397); if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { - module.exports = __webpack_require__(933); + module.exports = __webpack_require__(925); } /***/ }), -/* 933 */ +/* 925 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -108166,16 +107822,16 @@ if (typeof Object.create === 'function') { /***/ }), -/* 934 */ +/* 926 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(22); -const makeDir = __webpack_require__(935); -const pEvent = __webpack_require__(927); -const CpFileError = __webpack_require__(930); +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(493); +const makeDir = __webpack_require__(927); +const pEvent = __webpack_require__(919); +const CpFileError = __webpack_require__(922); const stat = promisify(fs.stat); const lstat = promisify(fs.lstat); @@ -108272,15 +107928,15 @@ exports.copyFileSync = (source, destination, flags) => { /***/ }), -/* 935 */ +/* 927 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const {promisify} = __webpack_require__(29); -const semver = __webpack_require__(936); +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const {promisify} = __webpack_require__(397); +const semver = __webpack_require__(928); const defaults = { mode: 0o777 & (~process.umask()), @@ -108429,7 +108085,7 @@ module.exports.sync = (input, options) => { /***/ }), -/* 936 */ +/* 928 */ /***/ (function(module, exports) { exports = module.exports = SemVer @@ -110031,12 +109687,12 @@ function coerce (version, options) { /***/ }), -/* 937 */ +/* 929 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const EventEmitter = __webpack_require__(399); +const EventEmitter = __webpack_require__(373); const written = new WeakMap(); @@ -110072,7 +109728,7 @@ module.exports = ProgressEmitter; /***/ }), -/* 938 */ +/* 930 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -110118,12 +109774,12 @@ exports.default = module.exports; /***/ }), -/* 939 */ +/* 931 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(940); +const NestedError = __webpack_require__(932); class CpyError extends NestedError { constructor(message, nested) { @@ -110137,10 +109793,10 @@ module.exports = CpyError; /***/ }), -/* 940 */ +/* 932 */ /***/ (function(module, exports, __webpack_require__) { -var inherits = __webpack_require__(29).inherits; +var inherits = __webpack_require__(397).inherits; var NestedError = function (message, nested) { this.nested = nested; @@ -110193,7 +109849,7 @@ module.exports = NestedError; /***/ }), -/* 941 */ +/* 933 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; diff --git a/packages/kbn-pm/package.json b/packages/kbn-pm/package.json index 5938d15573d63..301d9653cda2b 100644 --- a/packages/kbn-pm/package.json +++ b/packages/kbn-pm/package.json @@ -22,7 +22,6 @@ "@types/glob": "^5.0.35", "@types/globby": "^6.1.0", "@types/has-ansi": "^3.0.0", - "@types/indent-string": "^3.0.0", "@types/lodash.clonedeepwith": "^4.5.3", "@types/log-symbols": "^2.0.0", "@types/ncp": "^2.0.1", @@ -32,7 +31,6 @@ "@types/strip-ansi": "^3.0.0", "@types/strong-log-transformer": "^1.0.0", "@types/tempy": "^0.2.0", - "@types/wrap-ansi": "^2.0.15", "@types/write-pkg": "^3.1.0", "@kbn/dev-utils": "1.0.0", "@yarnpkg/lockfile": "^1.1.0", @@ -47,7 +45,6 @@ "glob": "^7.1.2", "globby": "^8.0.1", "has-ansi": "^3.0.0", - "indent-string": "^3.2.0", "is-path-inside": "^3.0.2", "lodash.clonedeepwith": "^4.5.0", "log-symbols": "^2.2.0", @@ -66,7 +63,6 @@ "unlazy-loader": "^0.1.3", "webpack": "^4.41.5", "webpack-cli": "^3.3.10", - "wrap-ansi": "^3.0.1", "write-pkg": "^4.0.0" }, "dependencies": { diff --git a/packages/kbn-pm/src/cli.ts b/packages/kbn-pm/src/cli.ts index 94f348e1835ed..b72e9ae8690aa 100644 --- a/packages/kbn-pm/src/cli.ts +++ b/packages/kbn-pm/src/cli.ts @@ -17,46 +17,58 @@ * under the License. */ -import chalk from 'chalk'; import dedent from 'dedent'; import getopts from 'getopts'; import { resolve } from 'path'; +import { pickLevelFromFlags } from '@kbn/dev-utils'; import { commands } from './commands'; import { runCommand } from './run'; import { log } from './utils/log'; function help() { - const availableCommands = Object.keys(commands) - .map((commandName) => commands[commandName]) - .map((command) => `${command.name} - ${command.description}`); - - log.write(dedent` - usage: kbn [] - - By default commands are run for Kibana itself, all packages in the 'packages/' - folder and for all plugins in './plugins' and '../kibana-extra'. - - Available commands: - - ${availableCommands.join('\n ')} - - Global options: - - -e, --exclude Exclude specified project. Can be specified multiple times to exclude multiple projects, e.g. '-e kibana -e @kbn/pm'. - -i, --include Include only specified projects. If left unspecified, it defaults to including all projects. - --oss Do not include the x-pack when running command. - --skip-kibana-plugins Filter all plugins in ./plugins and ../kibana-extra when running command. - --no-cache Disable the bootstrap cache - `); + log.info( + dedent` + usage: kbn [] + + By default commands are run for Kibana itself, all packages in the 'packages/' + folder and for all plugins in './plugins' and '../kibana-extra'. + + Available commands: + + ${Object.values(commands) + .map((command) => `${command.name} - ${command.description}`) + .join('\n ')} + + Global options: + + -e, --exclude Exclude specified project. Can be specified multiple times to exclude multiple projects, e.g. '-e kibana -e @kbn/pm'. + -i, --include Include only specified projects. If left unspecified, it defaults to including all projects. + --oss Do not include the x-pack when running command. + --skip-kibana-plugins Filter all plugins in ./plugins and ../kibana-extra when running command. + --no-cache Disable the bootstrap cache + --verbose Set log level to verbose + --debug Set log level to debug + --quiet Set log level to error + --silent Disable log output + ` + '\n' + ); } export async function run(argv: string[]) { + log.setLogLevel( + pickLevelFromFlags( + getopts(argv, { + boolean: ['verbose', 'debug', 'quiet', 'silent'], + }) + ) + ); + // We can simplify this setup (and remove this extra handling) once Yarn // starts forwarding the `--` directly to this script, see // https://github.com/yarnpkg/yarn/blob/b2d3e1a8fe45ef376b716d597cc79b38702a9320/src/cli/index.js#L174-L182 if (argv.includes('--')) { - log.write(chalk.red(`Using "--" is not allowed, as it doesn't work with 'yarn kbn'.`)); + log.error(`Using "--" is not allowed, as it doesn't work with 'yarn kbn'.`); process.exit(1); } @@ -90,7 +102,7 @@ export async function run(argv: string[]) { const command = commands[commandName]; if (command === undefined) { - log.write(chalk.red(`[${commandName}] is not a valid command, see 'kbn --help'`)); + log.error(`[${commandName}] is not a valid command, see 'kbn --help'`); process.exit(1); } diff --git a/packages/kbn-pm/src/commands/__snapshots__/bootstrap.test.ts.snap b/packages/kbn-pm/src/commands/__snapshots__/bootstrap.test.ts.snap index c0505710f5670..be146d710c87a 100644 --- a/packages/kbn-pm/src/commands/__snapshots__/bootstrap.test.ts.snap +++ b/packages/kbn-pm/src/commands/__snapshots__/bootstrap.test.ts.snap @@ -90,29 +90,32 @@ Array [ exports[`calls "kbn:bootstrap" scripts and links executables after installing deps: script 1`] = ` Array [ Array [ - "kbn:bootstrap", - Array [], - Project { - "allDependencies": Object {}, - "devDependencies": Object {}, - "isWorkspaceProject": false, - "isWorkspaceRoot": false, - "json": Object { - "name": "bar", + Object { + "args": Array [], + "debug": undefined, + "pkg": Project { + "allDependencies": Object {}, + "devDependencies": Object {}, + "isWorkspaceProject": false, + "isWorkspaceRoot": false, + "json": Object { + "name": "bar", + "scripts": Object { + "kbn:bootstrap": "node ./bar.js", + }, + "version": "1.0.0", + }, + "nodeModulesLocation": "/packages/kbn-pm/src/commands/packages/bar/node_modules", + "packageJsonLocation": "/packages/kbn-pm/src/commands/packages/bar/package.json", + "path": "/packages/kbn-pm/src/commands/packages/bar", + "productionDependencies": Object {}, "scripts": Object { "kbn:bootstrap": "node ./bar.js", }, + "targetLocation": "/packages/kbn-pm/src/commands/packages/bar/target", "version": "1.0.0", }, - "nodeModulesLocation": "/packages/kbn-pm/src/commands/packages/bar/node_modules", - "packageJsonLocation": "/packages/kbn-pm/src/commands/packages/bar/package.json", - "path": "/packages/kbn-pm/src/commands/packages/bar", - "productionDependencies": Object {}, - "scripts": Object { - "kbn:bootstrap": "node ./bar.js", - }, - "targetLocation": "/packages/kbn-pm/src/commands/packages/bar/target", - "version": "1.0.0", + "script": "kbn:bootstrap", }, ], ] @@ -127,36 +130,6 @@ Array [ ] `; -exports[`does not run installer if no deps in package: logs 1`] = ` -Array [ - Array [ - " -Running installs in topological order:", - ], - Array [ - " - -Installing dependencies in [kibana]: -", - ], - Array [ - " -Installs completed, linking package executables: -", - ], - Array [ - " -Linking executables completed, running \`kbn:bootstrap\` scripts -", - ], - Array [ - " -Bootstrapping completed! -", - ], -] -`; - exports[`handles "frozen-lockfile": install in dir 1`] = ` Array [ Array [ @@ -184,45 +157,3 @@ Array [ ], ] `; - -exports[`handles dependencies of dependencies: logs 1`] = ` -Array [ - Array [ - " -Running installs in topological order:", - ], - Array [ - " - -Installing dependencies in [kibana]: -", - ], - Array [ - " - -Installing dependencies in [bar]: -", - ], - Array [ - " - -Installing dependencies in [foo]: -", - ], - Array [ - " -Installs completed, linking package executables: -", - ], - Array [ - " -Linking executables completed, running \`kbn:bootstrap\` scripts -", - ], - Array [ - " -Bootstrapping completed! -", - ], -] -`; diff --git a/packages/kbn-pm/src/commands/bootstrap.test.ts b/packages/kbn-pm/src/commands/bootstrap.test.ts index 072f34611f8fc..d6a30f0ef33d6 100644 --- a/packages/kbn-pm/src/commands/bootstrap.test.ts +++ b/packages/kbn-pm/src/commands/bootstrap.test.ts @@ -22,6 +22,8 @@ jest.mock('../utils/link_project_executables'); import { resolve } from 'path'; +import { ToolingLogCollectingWriter } from '@kbn/dev-utils'; + import { absolutePathSnapshotSerializer, stripAnsiSnapshotSerializer } from '../test_helpers'; import { linkProjectExecutables } from '../utils/link_project_executables'; import { IPackageJson } from '../utils/package_json'; @@ -30,12 +32,20 @@ import { buildProjectGraph } from '../utils/projects'; import { installInDir, runScriptInPackageStreaming, yarnWorkspacesInfo } from '../utils/scripts'; import { BootstrapCommand } from './bootstrap'; import { Kibana } from '../utils/kibana'; +import { log } from '../utils/log'; const mockInstallInDir = installInDir as jest.Mock; const mockRunScriptInPackageStreaming = runScriptInPackageStreaming as jest.Mock; const mockLinkProjectExecutables = linkProjectExecutables as jest.Mock; const mockYarnWorkspacesInfo = yarnWorkspacesInfo as jest.Mock; +const logWriter = new ToolingLogCollectingWriter('debug'); +log.setLogLevel('silent'); +log.setWriters([logWriter]); +beforeEach(() => { + logWriter.messages.length = 0; +}); + const createProject = (packageJson: IPackageJson, path = '.') => { const project = new Project( { @@ -55,10 +65,6 @@ const createProject = (packageJson: IPackageJson, path = '.') => { expect.addSnapshotSerializer(absolutePathSnapshotSerializer); expect.addSnapshotSerializer(stripAnsiSnapshotSerializer); -const noop = () => { - // noop -}; - beforeEach(() => { mockYarnWorkspacesInfo.mockResolvedValue({}); }); @@ -111,8 +117,6 @@ test('handles dependencies of dependencies', async () => { const kbn = new Kibana(projects); const projectGraph = buildProjectGraph(projects); - const logMock = jest.spyOn(console, 'log').mockImplementation(noop); - await BootstrapCommand.run(projects, projectGraph, { extraArgs: [], options: {}, @@ -121,7 +125,19 @@ test('handles dependencies of dependencies', async () => { }); expect(mockInstallInDir.mock.calls).toMatchSnapshot('install in dir'); - expect(logMock.mock.calls).toMatchSnapshot('logs'); + expect(logWriter.messages).toMatchInlineSnapshot(` + Array [ + " info [kibana] running yarn", + "", + "", + " info [bar] running yarn", + "", + "", + " info [foo] running yarn", + "", + "", + ] + `); }); test('does not run installer if no deps in package', async () => { @@ -148,8 +164,6 @@ test('does not run installer if no deps in package', async () => { const kbn = new Kibana(projects); const projectGraph = buildProjectGraph(projects); - const logMock = jest.spyOn(console, 'log').mockImplementation(noop); - await BootstrapCommand.run(projects, projectGraph, { extraArgs: [], options: {}, @@ -158,7 +172,13 @@ test('does not run installer if no deps in package', async () => { }); expect(mockInstallInDir.mock.calls).toMatchSnapshot('install in dir'); - expect(logMock.mock.calls).toMatchSnapshot('logs'); + expect(logWriter.messages).toMatchInlineSnapshot(` + Array [ + " info [kibana] running yarn", + "", + "", + ] + `); }); test('handles "frozen-lockfile"', async () => { @@ -175,8 +195,6 @@ test('handles "frozen-lockfile"', async () => { const kbn = new Kibana(projects); const projectGraph = buildProjectGraph(projects); - jest.spyOn(console, 'log').mockImplementation(noop); - await BootstrapCommand.run(projects, projectGraph, { extraArgs: [], options: { @@ -215,8 +233,6 @@ test('calls "kbn:bootstrap" scripts and links executables after installing deps' const kbn = new Kibana(projects); const projectGraph = buildProjectGraph(projects); - jest.spyOn(console, 'log').mockImplementation(noop); - await BootstrapCommand.run(projects, projectGraph, { extraArgs: [], options: {}, diff --git a/packages/kbn-pm/src/commands/bootstrap.ts b/packages/kbn-pm/src/commands/bootstrap.ts index 6146aeab21db4..80ccc5daecc56 100644 --- a/packages/kbn-pm/src/commands/bootstrap.ts +++ b/packages/kbn-pm/src/commands/bootstrap.ts @@ -17,12 +17,11 @@ * under the License. */ -import chalk from 'chalk'; - import { linkProjectExecutables } from '../utils/link_project_executables'; import { log } from '../utils/log'; import { parallelizeBatches } from '../utils/parallelize'; import { topologicallyBatchProjects } from '../utils/projects'; +import { Project } from '../utils/project'; import { ICommand } from './'; import { getAllChecksums } from '../utils/project_checksums'; import { BootstrapCacheFile } from '../utils/bootstrap_cache_file'; @@ -42,12 +41,10 @@ export const BootstrapCommand: ICommand = { ...(options['prefer-offline'] === true ? ['--prefer-offline'] : []), ]; - log.write(chalk.bold('\nRunning installs in topological order:')); - for (const batch of batchedProjectsByWorkspace) { for (const project of batch) { if (project.isWorkspaceProject) { - log.write(`Skipping workspace project: ${project.name}`); + log.verbose(`Skipping workspace project: ${project.name}`); continue; } @@ -57,7 +54,6 @@ export const BootstrapCommand: ICommand = { } } - log.write(chalk.bold('\nInstalls completed, linking package executables:\n')); await linkProjectExecutables(projects, projectGraph); /** @@ -66,22 +62,38 @@ export const BootstrapCommand: ICommand = { * transpiled before they can be used. Ideally we shouldn't do this unless we * have to, as it will slow down the bootstrapping process. */ - log.write(chalk.bold('\nLinking executables completed, running `kbn:bootstrap` scripts\n')); - const checksums = options.cache ? await getAllChecksums(kbn, log) : false; - await parallelizeBatches(batchedProjects, async (project) => { + const checksums = await getAllChecksums(kbn, log); + const caches = new Map(); + let cachedProjectCount = 0; + + for (const project of projects.values()) { if (project.hasScript('kbn:bootstrap')) { - const cacheFile = new BootstrapCacheFile(kbn, project, checksums); - if (cacheFile.isValid()) { - log.success(`[${project.name}] cache up to date`); - } else { - cacheFile.delete(); - await project.runScriptStreaming('kbn:bootstrap'); - cacheFile.write(); + const file = new BootstrapCacheFile(kbn, project, checksums); + const valid = options.cache && file.isValid(); + + if (valid) { + log.debug(`[${project.name}] cache up to date`); } + + caches.set(project, { file, valid }); + cachedProjectCount += 1; } - }); + } + + if (cachedProjectCount > 0) { + log.success(`${cachedProjectCount} bootsrap builds are cached`); + } - log.write(chalk.green.bold('\nBootstrapping completed!\n')); + await parallelizeBatches(batchedProjects, async (project) => { + const cache = caches.get(project); + if (cache && !cache.valid) { + log.info(`[${project.name}] running [kbn:bootstrap] script`); + cache.file.delete(); + await project.runScriptStreaming('kbn:bootstrap'); + cache.file.write(); + log.success(`[${project.name}] bootstrap complete`); + } + }); }, }; diff --git a/packages/kbn-pm/src/commands/clean.ts b/packages/kbn-pm/src/commands/clean.ts index b3d433e22bd79..26d6897992501 100644 --- a/packages/kbn-pm/src/commands/clean.ts +++ b/packages/kbn-pm/src/commands/clean.ts @@ -17,7 +17,6 @@ * under the License. */ -import chalk from 'chalk'; import del from 'del'; import ora from 'ora'; import { join, relative } from 'path'; @@ -57,10 +56,8 @@ export const CleanCommand: ICommand = { } if (toDelete.length === 0) { - log.write(chalk.bold.green('\n\nNothing to delete')); + log.success('Nothing to delete'); } else { - log.write(chalk.bold.red('\n\nDeleting:\n')); - /** * In order to avoid patterns like `/build` in packages from accidentally * impacting files outside the package we use `process.chdir()` to change @@ -75,7 +72,11 @@ export const CleanCommand: ICommand = { for (const { pattern, cwd } of toDelete) { process.chdir(cwd); const promise = del(pattern); - ora.promise(promise, relative(originalCwd, join(cwd, String(pattern)))); + + if (log.wouldLogLevel('info')) { + ora.promise(promise, relative(originalCwd, join(cwd, String(pattern)))); + } + await promise; } } finally { diff --git a/packages/kbn-pm/src/commands/run.ts b/packages/kbn-pm/src/commands/run.ts index 989bfef19c380..1c6760ed6f3ee 100644 --- a/packages/kbn-pm/src/commands/run.ts +++ b/packages/kbn-pm/src/commands/run.ts @@ -17,8 +17,7 @@ * under the License. */ -import chalk from 'chalk'; - +import { CliError } from '../utils/errors'; import { log } from '../utils/log'; import { parallelizeBatches } from '../utils/parallelize'; import { topologicallyBatchProjects } from '../utils/projects'; @@ -32,20 +31,19 @@ export const RunCommand: ICommand = { const batchedProjects = topologicallyBatchProjects(projects, projectGraph); if (extraArgs.length === 0) { - log.write(chalk.red.bold('\nNo script specified')); - process.exit(1); + throw new CliError('No script specified'); } const scriptName = extraArgs[0]; const scriptArgs = extraArgs.slice(1); - log.write( - chalk.bold(`\nRunning script [${chalk.green(scriptName)}] in batched topological order\n`) - ); - - await parallelizeBatches(batchedProjects, async (pkg) => { - if (pkg.hasScript(scriptName)) { - await pkg.runScriptStreaming(scriptName, scriptArgs); + await parallelizeBatches(batchedProjects, async (project) => { + if (project.hasScript(scriptName)) { + log.info(`[${project.name}] running "${scriptName}" script`); + await project.runScriptStreaming(scriptName, { + args: scriptArgs, + }); + log.success(`[${project.name}] complete`); } }); }, diff --git a/packages/kbn-pm/src/commands/watch.ts b/packages/kbn-pm/src/commands/watch.ts index 2e18b02a1c860..6775f728c1494 100644 --- a/packages/kbn-pm/src/commands/watch.ts +++ b/packages/kbn-pm/src/commands/watch.ts @@ -17,7 +17,7 @@ * under the License. */ -import chalk from 'chalk'; +import { CliError } from '../utils/errors'; import { log } from '../utils/log'; import { parallelizeBatches } from '../utils/parallelize'; import { ProjectMap, topologicallyBatchProjects } from '../utils/projects'; @@ -58,20 +58,13 @@ export const WatchCommand: ICommand = { } if (projectsToWatch.size === 0) { - log.write( - chalk.red( - `\nThere are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.\n` - ) + throw new CliError( + `There are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.` ); - return; } const projectNames = Array.from(projectsToWatch.keys()); - log.write( - chalk.bold( - chalk.green(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`) - ) - ); + log.info(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`); // Kibana should always be run the last, so we don't rely on automatic // topological batching and push it to the last one-entry batch manually. @@ -85,12 +78,12 @@ export const WatchCommand: ICommand = { await parallelizeBatches(batchedProjects, async (pkg) => { const completionHint = await waitUntilWatchIsReady( - pkg.runScriptStreaming(watchScriptName).stdout + pkg.runScriptStreaming(watchScriptName, { + debug: false, + }).stdout ); - log.write( - chalk.bold(`[${chalk.green(pkg.name)}] Initial build completed (${completionHint}).`) - ); + log.success(`[${pkg.name}] Initial build completed (${completionHint}).`); }); }, }; diff --git a/packages/kbn-pm/src/production/build_production_projects.ts b/packages/kbn-pm/src/production/build_production_projects.ts index 689bf51cd7bdf..f5c59fd582c59 100644 --- a/packages/kbn-pm/src/production/build_production_projects.ts +++ b/packages/kbn-pm/src/production/build_production_projects.ts @@ -47,7 +47,7 @@ export async function buildProductionProjects({ const batchedProjects = topologicallyBatchProjects(projects, projectGraph); const projectNames = [...projects.values()].map((project) => project.name); - log.write(`Preparing production build for [${projectNames.join(', ')}]`); + log.info(`Preparing production build for [${projectNames.join(', ')}]`); for (const batch of batchedProjects) { for (const project of batch) { diff --git a/packages/kbn-pm/src/run.test.ts b/packages/kbn-pm/src/run.test.ts index ff0dc2666afea..b2479af3809c4 100644 --- a/packages/kbn-pm/src/run.test.ts +++ b/packages/kbn-pm/src/run.test.ts @@ -18,9 +18,13 @@ */ import { resolve } from 'path'; + import { ICommand, ICommandConfig } from './commands'; import { runCommand } from './run'; import { Project } from './utils/project'; +import { log } from './utils/log'; + +log.setLogLevel('silent'); const rootPath = resolve(`${__dirname}/utils/__fixtures__/kibana`); @@ -51,11 +55,6 @@ beforeEach(() => { options: {}, rootPath, }; - - // Reduce the noise that comes from the run command. - jest.spyOn(console, 'log').mockImplementation(() => { - // noop - }); }); test('passes all found projects to the command if no filter is specified', async () => { diff --git a/packages/kbn-pm/src/run.ts b/packages/kbn-pm/src/run.ts index c3879c701d785..04286590bd821 100644 --- a/packages/kbn-pm/src/run.ts +++ b/packages/kbn-pm/src/run.ts @@ -17,10 +17,6 @@ * under the License. */ -import chalk from 'chalk'; -import indentString from 'indent-string'; -import wrapAnsi from 'wrap-ansi'; - import { ICommand, ICommandConfig } from './commands'; import { CliError } from './utils/errors'; import { log } from './utils/log'; @@ -30,11 +26,7 @@ import { Kibana } from './utils/kibana'; export async function runCommand(command: ICommand, config: Omit) { try { - log.write( - chalk.bold( - `Running [${chalk.green(command.name)}] command from [${chalk.yellow(config.rootPath)}]:\n` - ) - ); + log.debug(`Running [${command.name}] command from [${config.rootPath}]`); const kbn = await Kibana.loadFrom(config.rootPath); const projects = kbn.getFilteredProjects({ @@ -45,42 +37,39 @@ export async function runCommand(command: ICommand, config: Omit 0) { - const metaOutput = keys.map((key) => { - const value = e.meta[key]; - return `${key}: ${value}`; - }); + const metaOutput = Object.entries(error.meta) + .map(([key, value]) => `${key}: ${value}`) + .join('\n'); - log.write('Additional debugging info:\n'); - log.write(indentString(metaOutput.join('\n'), 3)); + if (metaOutput) { + log.info('Additional debugging info:\n'); + log.indent(2); + log.info(metaOutput); + log.indent(-2); } } else { - log.write(e.stack); + log.error(error); } process.exit(1); diff --git a/packages/kbn-pm/src/utils/__snapshots__/link_project_executables.test.ts.snap b/packages/kbn-pm/src/utils/__snapshots__/link_project_executables.test.ts.snap index 62091205b01a4..5bda7b544e201 100644 --- a/packages/kbn-pm/src/utils/__snapshots__/link_project_executables.test.ts.snap +++ b/packages/kbn-pm/src/utils/__snapshots__/link_project_executables.test.ts.snap @@ -68,14 +68,3 @@ Object { "unlink": Array [], } `; - -exports[`bin script points to a file creates a symlink in the project node_modules/.bin directory: logs 1`] = ` -Array [ - Array [ - "[foo] bar -> ../bar/bin/bar.js", - ], - Array [ - "[baz] bar -> ../bar/bin/bar.js", - ], -] -`; diff --git a/packages/kbn-pm/src/utils/child_process.ts b/packages/kbn-pm/src/utils/child_process.ts index 784446924a8dc..bafe2bf57adc2 100644 --- a/packages/kbn-pm/src/utils/child_process.ts +++ b/packages/kbn-pm/src/utils/child_process.ts @@ -17,19 +17,20 @@ * under the License. */ +import { Writable } from 'stream'; + import chalk from 'chalk'; import execa from 'execa'; -import logSymbols from 'log-symbols'; import logTransformer from 'strong-log-transformer'; -function generateColors() { - const colorWheel = [chalk.cyan, chalk.magenta, chalk.blue, chalk.yellow, chalk.green]; - - const count = colorWheel.length; - let children = 0; +import { log } from './log'; - return () => colorWheel[children++ % count]; -} +const colorWheel = [chalk.cyan, chalk.magenta, chalk.blue, chalk.yellow, chalk.green]; +const getColor = () => { + const color = colorWheel.shift()!; + colorWheel.push(color); + return color; +}; export function spawn(command: string, args: string[], opts: execa.Options) { return execa(command, args, { @@ -39,13 +40,26 @@ export function spawn(command: string, args: string[], opts: execa.Options) { }); } -const nextColor = generateColors(); +function streamToLog(debug: boolean = true) { + return new Writable({ + objectMode: true, + write(line, _, cb) { + if (line.endsWith('\n')) { + log[debug ? 'debug' : 'write'](line.slice(0, -1)); + } else { + log[debug ? 'debug' : 'write'](line); + } + + cb(); + }, + }); +} export function spawnStreaming( command: string, args: string[], opts: execa.Options, - { prefix }: { prefix: string } + { prefix, debug }: { prefix: string; debug?: boolean } ) { const spawned = execa(command, args, { stdio: ['ignore', 'pipe', 'pipe'], @@ -53,15 +67,12 @@ export function spawnStreaming( ...opts, }); - const color = nextColor(); - const prefixedStdout = logTransformer({ tag: `${color.bold(prefix)}:` }); - const prefixedStderr = logTransformer({ - mergeMultiline: true, - tag: `${logSymbols.error} ${color.bold(prefix)}:`, - }); + const color = getColor(); + const prefixedStdout = logTransformer({ tag: color.bold(prefix) }); + const prefixedStderr = logTransformer({ mergeMultiline: true, tag: color.bold(prefix) }); - spawned.stdout.pipe(prefixedStdout).pipe(process.stdout); - spawned.stderr.pipe(prefixedStderr).pipe(process.stderr); + spawned.stdout.pipe(prefixedStdout).pipe(streamToLog(debug)); + spawned.stderr.pipe(prefixedStderr).pipe(streamToLog(debug)); return spawned; } diff --git a/packages/kbn-pm/src/utils/link_project_executables.test.ts b/packages/kbn-pm/src/utils/link_project_executables.test.ts index a19e1fd66f334..887c474a12eca 100644 --- a/packages/kbn-pm/src/utils/link_project_executables.test.ts +++ b/packages/kbn-pm/src/utils/link_project_executables.test.ts @@ -23,10 +23,19 @@ jest.mock('./fs'); import { resolve } from 'path'; +import { ToolingLogCollectingWriter } from '@kbn/dev-utils'; + import { absolutePathSnapshotSerializer, stripAnsiSnapshotSerializer } from '../test_helpers'; import { linkProjectExecutables } from './link_project_executables'; import { Project } from './project'; import { buildProjectGraph } from './projects'; +import { log } from './log'; + +const logWriter = new ToolingLogCollectingWriter(); +log.setWriters([logWriter]); +beforeEach(() => { + logWriter.messages.length = 0; +}); const projectsByName = new Map([ [ @@ -101,12 +110,15 @@ describe('bin script points to a file', () => { const fs = require('./fs'); fs.isFile.mockReturnValue(true); - const logMock = jest.spyOn(console, 'log').mockImplementation(() => { - // noop - }); await linkProjectExecutables(projectsByName, projectGraph); expect(getFsMockCalls()).toMatchSnapshot('fs module calls'); - expect(logMock.mock.calls).toMatchSnapshot('logs'); + expect(logWriter.messages).toMatchInlineSnapshot(` + Array [ + " debg Linking package executables", + " debg [foo] bar -> ../bar/bin/bar.js", + " debg [baz] bar -> ../bar/bin/bar.js", + ] + `); }); }); diff --git a/packages/kbn-pm/src/utils/link_project_executables.ts b/packages/kbn-pm/src/utils/link_project_executables.ts index b403dfb2ecf2e..f7362788b417d 100644 --- a/packages/kbn-pm/src/utils/link_project_executables.ts +++ b/packages/kbn-pm/src/utils/link_project_executables.ts @@ -19,8 +19,6 @@ import { dirname, relative, resolve, sep } from 'path'; -import chalk from 'chalk'; - import { chmod, createSymlink, isFile, mkdirp } from './fs'; import { log } from './log'; import { ProjectGraph, ProjectMap } from './projects'; @@ -37,6 +35,7 @@ export async function linkProjectExecutables( projectsByName: ProjectMap, projectGraph: ProjectGraph ) { + log.debug(`Linking package executables`); for (const [projectName, projectDeps] of projectGraph) { const project = projectsByName.get(projectName)!; const binsDir = resolve(project.nodeModulesLocation, '.bin'); @@ -57,7 +56,7 @@ export async function linkProjectExecutables( // Get relative project path with normalized path separators. const projectRelativePath = relative(project.path, srcPath).split(sep).join('/'); - log.write(chalk`{dim [${project.name}]} ${name} -> {dim ${projectRelativePath}}`); + log.debug(`[${project.name}] ${name} -> ${projectRelativePath}`); await mkdirp(dirname(dest)); await createSymlink(srcPath, dest, 'exec'); diff --git a/packages/kbn-pm/src/utils/log.ts b/packages/kbn-pm/src/utils/log.ts index 9e5630be5bd19..786ff8b19ef4e 100644 --- a/packages/kbn-pm/src/utils/log.ts +++ b/packages/kbn-pm/src/utils/log.ts @@ -17,27 +17,36 @@ * under the License. */ -import { ToolingLog, ToolingLogCollectingWriter } from '@kbn/dev-utils'; +import { + ToolingLog, + ToolingLogTextWriter, + LogLevel, + parseLogLevel, + ParsedLogLevel, +} from '@kbn/dev-utils'; class Log extends ToolingLog { - testWriter?: ToolingLogCollectingWriter; + private logLevel!: ParsedLogLevel; constructor() { - super({ - level: 'info', - writeTo: process.stdout, - }); + super(); + this.setLogLevel('info'); } - /** - * Log something to the console. Ideally we would use a real logger in - * kbn-pm, but that's a pretty big change for now. - * @param ...args - */ - write(...args: any[]) { - // eslint-disable-next-line no-console - console.log(...args); + setLogLevel(level: LogLevel) { + this.logLevel = parseLogLevel(level); + this.setWriters([ + new ToolingLogTextWriter({ + level: this.logLevel.name, + writeTo: process.stdout, + }), + ]); + } + + wouldLogLevel(level: LogLevel) { + return this.logLevel.flags[level]; } } export const log = new Log(); +export { LogLevel, Log }; diff --git a/packages/kbn-pm/src/utils/project.ts b/packages/kbn-pm/src/utils/project.ts index 91a3a5365b60e..8f45df52c7a2f 100644 --- a/packages/kbn-pm/src/utils/project.ts +++ b/packages/kbn-pm/src/utils/project.ts @@ -17,7 +17,6 @@ * under the License. */ -import chalk from 'chalk'; import fs from 'fs'; import Path from 'path'; import { inspect } from 'util'; @@ -190,16 +189,20 @@ export class Project { } public async runScript(scriptName: string, args: string[] = []) { - log.write( - chalk.bold( - `\n\nRunning script [${chalk.green(scriptName)}] in [${chalk.green(this.name)}]:\n` - ) - ); + log.info(`Running script [${scriptName}] in [${this.name}]:`); return runScriptInPackage(scriptName, args, this); } - public runScriptStreaming(scriptName: string, args: string[] = []) { - return runScriptInPackageStreaming(scriptName, args, this); + public runScriptStreaming( + scriptName: string, + options: { args?: string[]; debug?: boolean } = {} + ) { + return runScriptInPackageStreaming({ + script: scriptName, + args: options.args || [], + pkg: this, + debug: options.debug, + }); } public hasDependencies() { @@ -207,8 +210,12 @@ export class Project { } public async installDependencies({ extraArgs }: { extraArgs: string[] }) { - log.write(chalk.bold(`\n\nInstalling dependencies in [${chalk.green(this.name)}]:\n`)); + log.info(`[${this.name}] running yarn`); + + log.write(''); await installInDir(this.path, extraArgs); + log.write(''); + await this.removeExtraneousNodeModules(); } @@ -239,7 +246,7 @@ export class Project { const isDevDependency = devDependencies && devDependencies.hasOwnProperty(name); if (!isDependency && !isDevDependency && fs.existsSync(nodeModulesPath)) { - log.write(`No dependency on ${name}, removing link in node_modules`); + log.debug(`No dependency on ${name}, removing link in node_modules`); fs.unlinkSync(nodeModulesPath); } }); diff --git a/packages/kbn-pm/src/utils/project_checksums.ts b/packages/kbn-pm/src/utils/project_checksums.ts index 46dde1b32c158..839c44f4f18c4 100644 --- a/packages/kbn-pm/src/utils/project_checksums.ts +++ b/packages/kbn-pm/src/utils/project_checksums.ts @@ -23,12 +23,12 @@ import Crypto from 'crypto'; import { promisify } from 'util'; import execa from 'execa'; -import { ToolingLog } from '@kbn/dev-utils'; import { readYarnLock, YarnLock } from './yarn_lock'; import { ProjectMap } from '../utils/projects'; import { Project } from '../utils/project'; import { Kibana } from '../utils/kibana'; +import { Log } from '../utils/log'; export type ChecksumMap = Map; /** map of [repo relative path to changed file, type of change] */ @@ -38,7 +38,7 @@ const statAsync = promisify(Fs.stat); const projectBySpecificitySorter = (a: Project, b: Project) => b.path.length - a.path.length; /** Get the changed files for a set of projects */ -async function getChangesForProjects(projects: ProjectMap, kbn: Kibana, log: ToolingLog) { +async function getChangesForProjects(projects: ProjectMap, kbn: Kibana, log: Log) { log.verbose('getting changed files'); const { stdout } = await execa( @@ -150,7 +150,7 @@ async function getLatestSha(project: Project, kbn: Kibana) { * in the yarn.lock file, does not include other projects in the workspace * or their dependencies */ -function resolveDepsForProject(project: Project, yarnLock: YarnLock, kbn: Kibana, log: ToolingLog) { +function resolveDepsForProject(project: Project, yarnLock: YarnLock, kbn: Kibana, log: Log) { /** map of [name@range, name@resolved] */ const resolved = new Map(); @@ -198,7 +198,7 @@ async function getChecksum( changes: Changes | undefined, yarnLock: YarnLock, kbn: Kibana, - log: ToolingLog + log: Log ) { const sha = await getLatestSha(project, kbn); if (sha) { @@ -256,7 +256,7 @@ async function getChecksum( * - un-committed changes * - resolved dependencies from yarn.lock referenced by project package.json */ -export async function getAllChecksums(kbn: Kibana, log: ToolingLog) { +export async function getAllChecksums(kbn: Kibana, log: Log) { const projects = kbn.getAllProjects(); const changesByProject = await getChangesForProjects(projects, kbn, log); const yarnLock = await readYarnLock(kbn); diff --git a/packages/kbn-pm/src/utils/scripts.ts b/packages/kbn-pm/src/utils/scripts.ts index 009efa1285c0c..728ac4287b1ce 100644 --- a/packages/kbn-pm/src/utils/scripts.ts +++ b/packages/kbn-pm/src/utils/scripts.ts @@ -56,13 +56,24 @@ export async function runScriptInPackage(script: string, args: string[], pkg: Pr /** * Run script in the given directory */ -export function runScriptInPackageStreaming(script: string, args: string[], pkg: Project) { +export function runScriptInPackageStreaming({ + script, + args, + pkg, + debug, +}: { + script: string; + args: string[]; + pkg: Project; + debug?: boolean; +}) { const execOpts = { cwd: pkg.path, }; return spawnStreaming('yarn', ['run', script, ...args], execOpts, { prefix: pkg.name, + debug, }); } diff --git a/renovate.json5 b/renovate.json5 index 674c4e0df7904..b4f1441a50d60 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -418,14 +418,6 @@ '@types/history', ], }, - { - groupSlug: 'indent-string', - groupName: 'indent-string related packages', - packageNames: [ - 'indent-string', - '@types/indent-string', - ], - }, { groupSlug: 'inquirer', groupName: 'inquirer related packages', @@ -1067,14 +1059,6 @@ '@types/chokidar', ], }, - { - groupSlug: 'wrap-ansi', - groupName: 'wrap-ansi related packages', - packageNames: [ - 'wrap-ansi', - '@types/wrap-ansi', - ], - }, { groupSlug: 'write-pkg', groupName: 'write-pkg related packages', diff --git a/yarn.lock b/yarn.lock index df478e79d2bf6..9f0d4c297fd25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4186,11 +4186,6 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== -"@types/indent-string@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/indent-string/-/indent-string-3.0.0.tgz#9ebb391ceda548926f5819ad16405349641b999f" - integrity sha1-nrs5HO2lSJJvWBmtFkBTSWQbmZ8= - "@types/inert@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/inert/-/inert-5.1.2.tgz#2bb8bef3b2462f904c960654c9edfa39285a85c6" @@ -5177,11 +5172,6 @@ "@types/webpack-sources" "*" source-map "^0.6.0" -"@types/wrap-ansi@^2.0.15": - version "2.0.15" - resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-2.0.15.tgz#87affc11a46864cb6853b642e89363633d544aa7" - integrity sha512-kPagHsyqrq5Qg4dSbxFmcX8ea0JYs43PfBcuKK53LT4XTZxbvGnmnY6U6a5QgySb5lEGYiqpg0/HESvTYrlzyQ== - "@types/write-pkg@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/write-pkg/-/write-pkg-3.1.0.tgz#f58767f4fb9a6a3ad8e95d3e9cd1f2d026ceab26" From d1ed2079453d267b2fc5c3c3f2c5fa36811fb222 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 8 Jun 2020 17:56:06 -0500 Subject: [PATCH 25/91] APM TypeScript improvements (#68572) * Add `compilerOptions.noErrorTrunctation` to the tsconfig template * Remove unused parameters Not adding `noUnusedParamaters` to the tsconfig since we get too many hits from dependencies when running `tsc`. These do show up in the editor as warnings, though. --- .../app/ErrorGroupOverview/List/index.tsx | 2 +- .../SettingsPage/SettingsPage.tsx | 2 +- .../ErrorRateAlertTrigger/index.stories.tsx | 2 +- .../shared/StickyProperties/index.tsx | 1 - .../index.stories.tsx | 57 +++++++++---------- .../TransactionCharts/ChoroplethMap/index.tsx | 2 +- .../context/LoadingIndicatorContext.tsx | 2 +- .../public/context/UrlParamsContext/index.tsx | 2 +- x-pack/plugins/apm/public/services/rest/ml.ts | 4 +- .../scripts/optimize-tsconfig/tsconfig.json | 8 +-- .../generate-sample-documents.ts | 2 +- .../apm/server/lib/apm_telemetry/index.ts | 2 +- .../get_service_map_from_trace_ids.ts | 2 +- .../server/lib/services/annotations/index.ts | 2 +- .../settings/apm_indices/save_apm_indices.ts | 2 +- x-pack/plugins/apm/server/routes/errors.ts | 2 +- .../apm/server/routes/service_nodes.ts | 2 +- x-pack/plugins/apm/server/routes/services.ts | 2 +- .../routes/settings/agent_configuration.ts | 4 +- .../apm/server/routes/settings/apm_indices.ts | 4 +- .../apm/server/routes/settings/custom_link.ts | 4 +- 21 files changed, 53 insertions(+), 57 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx index ed683b8ecd11d..1096c0c77db30 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx @@ -103,7 +103,7 @@ const ErrorGroupList: React.FC = (props) => { }), field: 'type', sortable: false, - render: (type: string, item: ErrorGroupListAPIResponse[0]) => { + render: (type: string) => { return ( (obj: T): T { return Object.fromEntries( - Object.entries(obj).filter(([k, v]) => v != null && v !== '') + Object.entries(obj).filter(([_, v]) => v != null && v !== '') ); } diff --git a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx index ddfca94e567d9..8f7ed54f91bd0 100644 --- a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx @@ -8,7 +8,7 @@ import { storiesOf } from '@storybook/react'; import React from 'react'; import { ErrorRateAlertTrigger } from '.'; -storiesOf('app/ErrorRateAlertTrigger', module).add('example', (props) => { +storiesOf('app/ErrorRateAlertTrigger', module).add('example', () => { const params = { threshold: 2, window: '5m', diff --git a/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx b/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx index 74c75e4585c3e..8bfea721c854d 100644 --- a/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx @@ -69,7 +69,6 @@ function getPropertyLabel({ fieldName, label }: Partial) { function getPropertyValue({ val, - fieldName, truncated = false, }: Partial) { if (truncated) { diff --git a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx index 7b22218bf23df..e2429d1225442 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx @@ -14,37 +14,34 @@ import { import { MockUrlParamsContextProvider } from '../../../context/UrlParamsContext/MockUrlParamsContextProvider'; import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; -storiesOf('app/TransactionDurationAlertTrigger', module).add( - 'example', - (context) => { - const params = { - threshold: 1500, - aggregationType: 'avg' as const, - window: '5m', - }; +storiesOf('app/TransactionDurationAlertTrigger', module).add('example', () => { + const params = { + threshold: 1500, + aggregationType: 'avg' as const, + window: '5m', + }; - const contextMock = (merge(cloneDeep(mockApmPluginContextValue), { - core: { - http: { - get: () => { - return Promise.resolve({ transactionTypes: ['request'] }); - }, + const contextMock = (merge(cloneDeep(mockApmPluginContextValue), { + core: { + http: { + get: () => { + return Promise.resolve({ transactionTypes: ['request'] }); }, }, - }) as unknown) as ApmPluginContextValue; + }, + }) as unknown) as ApmPluginContextValue; - return ( -
- - - undefined} - setAlertProperty={() => undefined} - /> - - -
- ); - } -); + return ( +
+ + + undefined} + setAlertProperty={() => undefined} + /> + + +
+ ); +}); diff --git a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx index 937c18807f80f..ebd6061831f4e 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx @@ -137,7 +137,7 @@ export const ChoroplethMap: React.FC = (props) => { }, [map, items, tooltipState]); const updateTooltipStateOnMousemoveRef = useRef( - (event: mapboxgl.MapMouseEvent & mapboxgl.EventData) => {} + (_event: mapboxgl.MapMouseEvent & mapboxgl.EventData) => {} ); // initialization side effect, only runs once diff --git a/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx b/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx index 32e52f8e396b5..a26653d3d5294 100644 --- a/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx +++ b/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx @@ -10,7 +10,7 @@ import { useDelayedVisibility } from '../components/shared/useDelayedVisibility' export const LoadingIndicatorContext = React.createContext({ statuses: {}, - dispatchStatus: (action: Action) => {}, + dispatchStatus: (_action: Action) => {}, }); interface State { diff --git a/x-pack/plugins/apm/public/context/UrlParamsContext/index.tsx b/x-pack/plugins/apm/public/context/UrlParamsContext/index.tsx index bc8cabb6f6641..6083a216bbf95 100644 --- a/x-pack/plugins/apm/public/context/UrlParamsContext/index.tsx +++ b/x-pack/plugins/apm/public/context/UrlParamsContext/index.tsx @@ -40,7 +40,7 @@ function useUiFilters(params: IUrlParams): UIFilters { return useDeepObjectIdentity({ kuery, environment, ...localUiFilters }); } -const defaultRefresh = (time: TimeRange) => {}; +const defaultRefresh = (_time: TimeRange) => {}; const UrlParamsContext = createContext({ urlParams: {} as IUrlParams, diff --git a/x-pack/plugins/apm/public/services/rest/ml.ts b/x-pack/plugins/apm/public/services/rest/ml.ts index 7d1f386fa896c..99c162bde02da 100644 --- a/x-pack/plugins/apm/public/services/rest/ml.ts +++ b/x-pack/plugins/apm/public/services/rest/ml.ts @@ -36,7 +36,7 @@ interface StartedMLJobApiResponse { jobs: MlResponseItem[]; } -async function getTransactionIndices(http: HttpSetup) { +async function getTransactionIndices() { const indices = await callApmApi({ method: 'GET', pathname: `/api/apm/settings/apm-indices`, @@ -53,7 +53,7 @@ export async function startMLJob({ transactionType: string; http: HttpSetup; }) { - const transactionIndices = await getTransactionIndices(http); + const transactionIndices = await getTransactionIndices(); const groups = [ 'apm', encodeForMlApi(serviceName), diff --git a/x-pack/plugins/apm/scripts/optimize-tsconfig/tsconfig.json b/x-pack/plugins/apm/scripts/optimize-tsconfig/tsconfig.json index 34b67c834554d..5a810fa90259a 100644 --- a/x-pack/plugins/apm/scripts/optimize-tsconfig/tsconfig.json +++ b/x-pack/plugins/apm/scripts/optimize-tsconfig/tsconfig.json @@ -4,8 +4,8 @@ "./plugins/observability/**/*", "./typings/**/*" ], - "exclude": [ - "**/__fixtures__/**/*", - "./plugins/apm/e2e/cypress/**/*" - ] + "exclude": ["**/__fixtures__/**/*", "./plugins/apm/e2e/cypress/**/*"], + "compilerOptions": { + "noErrorTruncation": true + } } diff --git a/x-pack/plugins/apm/scripts/upload-telemetry-data/generate-sample-documents.ts b/x-pack/plugins/apm/scripts/upload-telemetry-data/generate-sample-documents.ts index e9f1e99f1fc39..50de0d5b234d4 100644 --- a/x-pack/plugins/apm/scripts/upload-telemetry-data/generate-sample-documents.ts +++ b/x-pack/plugins/apm/scripts/upload-telemetry-data/generate-sample-documents.ts @@ -78,7 +78,7 @@ export async function generateSampleDocuments( const dateOfScriptExecution = new Date(); return flatten( - range(0, opts.instances).map((instanceNo) => { + range(0, opts.instances).map(() => { const instanceId = uuid.v4(); const defaults = { cluster_uuid: instanceId, diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts index df82d44fb5041..632e653a2f6e9 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts @@ -120,7 +120,7 @@ export async function createApmTelemetry({ usageCollector.registerCollector(collector); - core.getStartServices().then(([coreStart, pluginsStart]) => { + core.getStartServices().then(([_coreStart, pluginsStart]) => { const { taskManager: taskManagerStart } = pluginsStart as { taskManager: TaskManagerStartContract; }; diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts index e34479e92a06c..01cbc1aa9b989 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts @@ -270,7 +270,7 @@ export async function getServiceMapFromTraceIds({ return conns; }, [] as Connection[]); }, [] as Connection[]), - (value, index, array) => { + (value, _index, array) => { return find(array, value); } ); diff --git a/x-pack/plugins/apm/server/lib/services/annotations/index.ts b/x-pack/plugins/apm/server/lib/services/annotations/index.ts index 4d3efc478a4fd..9365213a87f6e 100644 --- a/x-pack/plugins/apm/server/lib/services/annotations/index.ts +++ b/x-pack/plugins/apm/server/lib/services/annotations/index.ts @@ -41,7 +41,7 @@ export async function getServiceAnnotations({ : []; if (storedAnnotations.length) { - derivedAnnotationsPromise.catch((error) => { + derivedAnnotationsPromise.catch(() => { // handle error silently to prevent Kibana from crashing }); return { annotations: storedAnnotations }; diff --git a/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.ts b/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.ts index 9601bdd51824d..d4ef6e2f91051 100644 --- a/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.ts +++ b/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.ts @@ -28,6 +28,6 @@ export async function saveApmIndices( function removeEmpty(apmIndices: Partial) { return Object.entries(apmIndices) .map(([key, value]) => [key, value?.trim()]) - .filter(([key, value]) => !!value) + .filter(([_, value]) => !!value) .reduce((obj, [key, value]) => ({ ...obj, [key as string]: value }), {}); } diff --git a/x-pack/plugins/apm/server/routes/errors.ts b/x-pack/plugins/apm/server/routes/errors.ts index 7e45f412d4bdb..1615550027d3c 100644 --- a/x-pack/plugins/apm/server/routes/errors.ts +++ b/x-pack/plugins/apm/server/routes/errors.ts @@ -12,7 +12,7 @@ import { getErrorGroups } from '../lib/errors/get_error_groups'; import { setupRequest } from '../lib/helpers/setup_request'; import { uiFiltersRt, rangeRt } from './default_api_types'; -export const errorsRoute = createRoute((core) => ({ +export const errorsRoute = createRoute(() => ({ path: '/api/apm/services/{serviceName}/errors', params: { path: t.type({ diff --git a/x-pack/plugins/apm/server/routes/service_nodes.ts b/x-pack/plugins/apm/server/routes/service_nodes.ts index a6e9175fcb651..8721407671825 100644 --- a/x-pack/plugins/apm/server/routes/service_nodes.ts +++ b/x-pack/plugins/apm/server/routes/service_nodes.ts @@ -9,7 +9,7 @@ import { setupRequest } from '../lib/helpers/setup_request'; import { getServiceNodes } from '../lib/service_nodes'; import { rangeRt, uiFiltersRt } from './default_api_types'; -export const serviceNodesRoute = createRoute((core) => ({ +export const serviceNodesRoute = createRoute(() => ({ path: '/api/apm/services/{serviceName}/serviceNodes', params: { path: t.type({ diff --git a/x-pack/plugins/apm/server/routes/services.ts b/x-pack/plugins/apm/server/routes/services.ts index 996bfbd9184d1..8672c6c108c4c 100644 --- a/x-pack/plugins/apm/server/routes/services.ts +++ b/x-pack/plugins/apm/server/routes/services.ts @@ -17,7 +17,7 @@ import { uiFiltersRt, rangeRt } from './default_api_types'; import { getServiceAnnotations } from '../lib/services/annotations'; import { dateAsStringRt } from '../../common/runtime_types/date_as_string_rt'; -export const servicesRoute = createRoute((core) => ({ +export const servicesRoute = createRoute(() => ({ path: '/api/apm/services', params: { query: t.intersection([uiFiltersRt, rangeRt]), diff --git a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts index 6fd864a337165..f5c9cc2adf238 100644 --- a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts +++ b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts @@ -24,7 +24,7 @@ import { import { jsonRt } from '../../../common/runtime_types/json_rt'; // get list of configurations -export const agentConfigurationRoute = createRoute((core) => ({ +export const agentConfigurationRoute = createRoute(() => ({ path: '/api/apm/settings/agent-configuration', handler: async ({ context, request }) => { const setup = await setupRequest(context, request); @@ -137,7 +137,7 @@ export const createOrUpdateAgentConfigurationRoute = createRoute(() => ({ })); // Lookup single configuration (used by APM Server) -export const agentConfigurationSearchRoute = createRoute((core) => ({ +export const agentConfigurationSearchRoute = createRoute(() => ({ method: 'POST', path: '/api/apm/settings/agent-configuration/search', params: { diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices.ts index 2d5722744f93e..e52ce760e026a 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices.ts +++ b/x-pack/plugins/apm/server/routes/settings/apm_indices.ts @@ -34,7 +34,7 @@ export const apmIndicesRoute = createRoute(() => ({ })); // save ui indices -export const saveApmIndicesRoute = createRoute((core) => ({ +export const saveApmIndicesRoute = createRoute(() => ({ method: 'POST', path: '/api/apm/settings/apm-indices/save', options: { @@ -50,7 +50,7 @@ export const saveApmIndicesRoute = createRoute((core) => ({ 'apm_oss.metricsIndices': t.string, }), }, - handler: async ({ context, request }) => { + handler: async ({ context }) => { const { body } = context.params; const savedObjectsClient = context.core.savedObjects.client; return await saveApmIndices(savedObjectsClient, body); diff --git a/x-pack/plugins/apm/server/routes/settings/custom_link.ts b/x-pack/plugins/apm/server/routes/settings/custom_link.ts index f32840fe08b9c..83c23a75e999d 100644 --- a/x-pack/plugins/apm/server/routes/settings/custom_link.ts +++ b/x-pack/plugins/apm/server/routes/settings/custom_link.ts @@ -17,7 +17,7 @@ import { getTransaction } from '../../lib/settings/custom_link/get_transaction'; import { listCustomLinks } from '../../lib/settings/custom_link/list_custom_links'; import { createRoute } from '../create_route'; -export const customLinkTransactionRoute = createRoute((core) => ({ +export const customLinkTransactionRoute = createRoute(() => ({ path: '/api/apm/settings/custom_links/transaction', params: { query: filterOptionsRt, @@ -31,7 +31,7 @@ export const customLinkTransactionRoute = createRoute((core) => ({ }, })); -export const listCustomLinksRoute = createRoute((core) => ({ +export const listCustomLinksRoute = createRoute(() => ({ path: '/api/apm/settings/custom_links', params: { query: filterOptionsRt, From 299a6026fd9d20a4a5b20e6443d79ea1f962a3fe Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 8 Jun 2020 17:16:30 -0700 Subject: [PATCH 26/91] [Ingest Manager] Copy fixes (#68325) * #68153 Change Elastic integrations to Integrations * Fix copy casing * #68152 Update create data source CTA copy * #68166 Remove icon next to top-level navigation when user is on new Kibana navigation style * Fix i18n Co-authored-by: Elastic Machine --- .../ingest_manager/components/settings_flyout.tsx | 4 ++-- .../applications/ingest_manager/layouts/default.tsx | 11 +++++++---- .../sections/agent_config/components/actions_menu.tsx | 2 +- .../components/datasources/datasources_table.tsx | 2 +- .../components/datasources/no_datasources.tsx | 2 +- .../epm/screens/detail/confirm_package_uninstall.tsx | 2 +- .../sections/epm/screens/detail/header.tsx | 5 ++++- .../sections/epm/screens/detail/settings_panel.tsx | 2 +- .../sections/epm/screens/home/header.tsx | 4 ++-- x-pack/plugins/translations/translations/ja-JP.json | 1 - x-pack/plugins/translations/translations/zh-CN.json | 1 - 11 files changed, 20 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx index 47d723dd9a1ac..c79077e68afb0 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx @@ -167,7 +167,7 @@ export const SettingFlyout: React.FunctionComponent = ({ onClose }) => { 'xpack.ingestManager.settings.integrationUpgradeEnabledFieldLabel', { defaultMessage: - 'Automatically update Integrations to the latest version to receive the latest assets. Agent configurations may need to be updated in order to use new features.', + 'Automatically update integrations to the latest version to receive the latest assets. Agent configurations may need to be updated in order to use new features.', } ), }, @@ -190,7 +190,7 @@ export const SettingFlyout: React.FunctionComponent = ({ onClose }) => {

diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx index 978c74f72d7aa..5e0cba7383e9c 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx @@ -9,7 +9,7 @@ import { EuiTabs, EuiTab, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiButtonEmpty } f import { FormattedMessage } from '@kbn/i18n/react'; import { Section } from '../sections'; import { AlphaMessaging, SettingFlyout } from '../components'; -import { useLink, useConfig } from '../hooks'; +import { useLink, useConfig, useCore } from '../hooks'; interface Props { showSettings?: boolean; @@ -42,6 +42,7 @@ export const DefaultLayout: React.FunctionComponent = ({ }) => { const { getHref } = useLink(); const { epm, fleet } = useConfig(); + const { uiSettings } = useCore(); const [isSettingsFlyoutOpen, setIsSettingsFlyoutOpen] = React.useState(false); return ( @@ -57,9 +58,11 @@ export const DefaultLayout: React.FunctionComponent = ({
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/home/header.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/home/header.tsx index a40fe98f93ddc..c378e5a47a9b9 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/home/header.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/home/header.tsx @@ -20,7 +20,7 @@ export const HeroCopy = memo(() => {

@@ -46,7 +46,7 @@ export const HeroImage = memo(() => { const Illustration = styled(EuiImage).attrs((props) => ({ alt: i18n.translate('xpack.ingestManager.epm.illustrationAltText', { - defaultMessage: 'Illustration of an Elastic integration', + defaultMessage: 'Illustration of an integration', }), url: IS_DARK_THEME ? toAssets('illustration_integrations_darkmode.svg') diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ba0e0ca532d90..5be46ce4bcd2d 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8362,7 +8362,6 @@ "xpack.ingestManager.enrollmentTokensList.newKeyButton": "新しい登録トークン", "xpack.ingestManager.enrollmentTokensList.pageDescription": "これは、エージェントを登録するために使用できる登録トークンのリストです。", "xpack.ingestManager.enrollmentTokensList.secretTitle": "シークレット", - "xpack.ingestManager.epm.addDatasourceButtonText": "データソースを作成", "xpack.ingestManager.epm.browseAllButtonText": "すべての統合を参照", "xpack.ingestManager.epm.illustrationAltText": "Elastic統合の例", "xpack.ingestManager.epm.pageSubtitle": "一般的なアプリやサービスの統合を参照する", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 6aaf592a87e78..dff26907b48ed 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8366,7 +8366,6 @@ "xpack.ingestManager.enrollmentTokensList.newKeyButton": "新建注册令牌", "xpack.ingestManager.enrollmentTokensList.pageDescription": "这是可用于注册代理的注册令牌列表。", "xpack.ingestManager.enrollmentTokensList.secretTitle": "密钥", - "xpack.ingestManager.epm.addDatasourceButtonText": "创建数据源", "xpack.ingestManager.epm.browseAllButtonText": "浏览所有集成", "xpack.ingestManager.epm.illustrationAltText": "Elastic 集成的图示", "xpack.ingestManager.epm.pageSubtitle": "浏览集成以了解热门应用和服务。", From e49888f2ec5c86207a85d35c08e6a1ba0bb3555c Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jun 2020 01:31:33 +0100 Subject: [PATCH 27/91] chore(NA): skip apis Endpoint plugin test metadata api POST /api/endpoint/metadata when index is not empty (#68586) --- x-pack/test/api_integration/apis/endpoint/metadata.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/endpoint/metadata.ts b/x-pack/test/api_integration/apis/endpoint/metadata.ts index 5c4bb52b8d9e2..e48db70fd0124 100644 --- a/x-pack/test/api_integration/apis/endpoint/metadata.ts +++ b/x-pack/test/api_integration/apis/endpoint/metadata.ts @@ -14,7 +14,8 @@ const numberOfHostsInFixture = 3; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - describe('test metadata api', () => { + // SKIPPED as it is failing on ES PROMOTION: https://github.com/elastic/kibana/issues/68584 + describe.skip('test metadata api', () => { describe('POST /api/endpoint/metadata when index is empty', () => { it('metadata api should return empty result when index is empty', async () => { await esArchiver.unload('endpoint/metadata/api_feature'); From d99cf75814c4d11e5720a2837693642b2dfeb5df Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Mon, 8 Jun 2020 19:54:09 -0600 Subject: [PATCH 28/91] [SIEM][Detection Engine] Converts from joi to use io-ts and moves the types to common (#68127) ## Summary * https://github.com/elastic/siem-team/issues/646 * Converts the detection rules and REST to use io-ts * Removes their joi counterparts * Updates all tests to use it * Fixes a bug with the risk_score that was being sent in as a string from the UI instead of a number * Fixes a bug within the exactCheck validating where it can now accept null value types for optional body messages. * Fixes a bug in the FindRoute where it did not send down fields from REST * Changes the lists plugin to utilize the io-ts types from siem rather than having them duplicated. * Makes some stronger validations * Adds a lot of codecs **Things to look out for:** * Generic testing to ensure I didn't break something that was not part of the tests. * Fix for the risk_score from string to number is in: ``` x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx ``` * Fix for the exact check (unit tests are written and added) ``` x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx ``` * Within all the types I added are there any misspelled things or copy-pasta mistakes with strings: x-pack/plugins/security_solution/common/detection_engine/schemas/types * Fix for `find_rules_route.ts:58` ``` x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts ``` **Follow on things that this PR doesn't do we need to:** * Add linter rule to forbid NodeJS code within common section * The `[object Object]` formatter issues seen in the code such as: ``` // TODO: Fix/Change the formatErrors to be better able to handle objects 'Invalid value "[object Object]" supplied to "note"', ``` * Formatter issues such as: `'Invalid value "" supplied to ""'` * Remove the hapi server object from lists plugin ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios --- .../lists/common/schemas/common/schemas.ts | 2 +- .../create_exception_list_item_schema.ts | 3 +- .../request/create_exception_list_schema.ts | 2 +- .../request/import_list_item_schema.ts | 2 + .../lists/common/schemas/types/index.ts | 3 - .../plugins/lists/common/siem_common_deps.ts | 3 + .../schemas/common/schemas.ts | 182 +- .../add_prepackaged_rules_schema.mock.ts | 47 + .../request/add_prepackaged_rules_schema.ts | 134 ++ ..._prepackaged_rules_type_dependents.test.ts | 71 + .../add_prepackaged_rules_type_dependents.ts | 107 + .../add_prepackged_rules_schema.test.ts | 1389 +++++++++++++ .../request/create_rules_bulk_schema.test.ts | 281 +++ .../request/create_rules_bulk_schema.ts | 14 + .../request/create_rules_schema.mock.ts | 43 + .../request/create_rules_schema.test.ts | 1445 +++++++++++++ .../schemas/request/create_rules_schema.ts | 134 ++ .../create_rules_type_dependents.test.ts | 68 + .../request/create_rules_type_dependents.ts | 105 + .../request/export_rules_schema.test.ts | 159 ++ .../schemas/request/export_rules_schema.ts | 33 + .../request/find_rule_statuses_schema.ts | 17 + .../request/find_rule_type_dependents.test.ts | 45 + .../schemas/request/find_rules_schema.test.ts | 198 ++ .../schemas/request/find_rules_schema.ts | 30 + .../request/find_rules_type_dependents.ts | 23 + .../request/import_rules_schema.mock.ts | 44 + .../request/import_rules_schema.test.ts | 1579 ++++++++++++++ .../schemas/request/import_rules_schema.ts | 180 ++ .../import_rules_type_dependents.test.ts | 68 + .../request/import_rules_type_dependents.ts | 105 + .../patch_rule_type_dependents.test.ts | 81 + .../request/patch_rules_bulk_schema.test.ts | 101 + .../request/patch_rules_bulk_schema.ts | 14 + .../request/patch_rules_schema.mock.ts | 21 + .../request/patch_rules_schema.test.ts | 1153 +++++++++++ .../schemas/request/patch_rules_schema.ts | 90 + .../request/patch_rules_type_dependents.ts | 77 + .../request/query_rules_bulk_schema.test.ts | 103 + .../request/query_rules_bulk_schema.ts | 14 + .../request/query_rules_schema.test.ts | 23 + .../schemas/request}/query_rules_schema.ts | 17 +- .../query_rules_type_dependents.test.ts | 25 + .../request/query_rules_type_dependents.ts | 21 + .../query_signals_index_schema.test.ts | 94 + .../request/query_signals_index_schema.ts | 21 + .../request/set_signal_status_schema.test.ts | 82 + .../request/set_signal_status_schema.ts | 24 + .../set_signal_status_type_dependents.test.ts | 46 + .../set_signal_status_type_dependents.ts | 21 + .../request/update_rules_bulk_schema.test.ts | 277 +++ .../request/update_rules_bulk_schema.ts | 14 + .../request/update_rules_schema.mock.ts | 42 + .../request/update_rules_schema.test.ts | 1387 +++++++++++++ .../schemas/request/update_rules_schema.ts | 140 ++ .../update_rules_type_dependents.test.ts | 88 + .../request/update_rules_type_dependents.ts | 116 ++ .../types/deafult_boolean_true.test.ts | 48 + .../schemas/types/deafult_from_string.test.ts | 39 + .../types/default_actions_array.test.ts | 54 + .../schemas/types/default_actions_array.ts | 22 + .../types/default_boolean_false.test.ts | 48 + .../schemas/types/default_boolean_false.ts | 22 + .../schemas/types/default_boolean_true.ts | 21 + .../types/default_empty_string.test.ts | 39 + .../schemas/types/default_empty_string.ts | 21 + .../types/default_export_file_name.test.ts | 39 + .../schemas/types/default_export_file_name.ts | 22 + .../schemas/types/default_from_string.ts | 22 + .../types/default_interval_string.test.ts | 39 + .../schemas/types/default_interval_string.ts | 21 + .../types/default_language_string.test.ts | 40 + .../schemas/types/default_language_string.ts | 23 + .../types/default_max_signals_number.test.ts | 58 + .../types/default_max_signals_number.ts | 32 + .../schemas/types/default_page.test.ts | 75 + .../schemas/types/default_page.ts | 32 + .../schemas/types/default_per_page.test.ts | 75 + .../schemas/types/default_per_page.ts | 32 + .../types/default_string_array.test.ts | 48 + .../schemas/types/default_string_array.ts | 8 +- .../default_string_boolean_false.test.ts | 93 + .../types/default_string_boolean_false.ts | 32 + .../types/default_threat_array.test.ts | 62 + .../schemas/types/default_threat_array.ts | 22 + .../types/default_throttle_null.test.ts | 40 + .../schemas/types/default_throttle_null.ts | 23 + .../schemas/types/default_to_string.test.ts | 39 + .../schemas/types/default_to_string.ts | 21 + .../schemas/types/default_uuid.test.ts | 41 + .../schemas/types/default_uuid.ts | 6 +- .../types/default_version_number.test.ts | 57 + .../schemas/types/default_version_number.ts | 22 + .../schemas/types/iso_date_string.ts | 6 +- .../schemas/types/lists_default_array.ts | 5 +- .../schemas/types/non_empty_string.test.ts | 48 + .../schemas/types/non_empty_string.ts | 6 +- .../schemas/types/only_false_allowed.test.ts | 48 + .../schemas/types/only_false_allowed.ts | 33 + .../schemas/types/positive_integer.ts | 6 +- .../positive_integer_greater_than_zero.ts | 10 +- .../types/references_default_array.test.ts | 12 +- .../schemas/types/references_default_array.ts | 10 +- .../schemas/types/risk_score.ts | 6 +- .../detection_engine/schemas/types/uuid.ts | 6 +- .../common/exact_check.test.ts | 22 + .../security_solution/common/exact_check.ts | 11 +- .../rules/step_about_rule/index.test.tsx | 152 +- .../rules/step_about_rule/schema.tsx | 1 + .../routes/__mocks__/request_responses.ts | 62 +- .../rules/add_prepackaged_rules_route.test.ts | 16 +- .../rules/add_prepackaged_rules_route.ts | 2 +- .../rules/create_rules_bulk_route.test.ts | 2 +- .../routes/rules/create_rules_bulk_route.ts | 67 +- .../routes/rules/create_rules_route.test.ts | 2 +- .../routes/rules/create_rules_route.ts | 53 +- .../rules/delete_rules_bulk_route.test.ts | 30 +- .../routes/rules/delete_rules_bulk_route.ts | 27 +- .../routes/rules/delete_rules_route.test.ts | 11 +- .../routes/rules/delete_rules_route.ts | 18 +- .../routes/rules/export_rules_route.ts | 19 +- .../routes/rules/find_rules_route.test.ts | 2 +- .../routes/rules/find_rules_route.ts | 19 +- .../rules/find_rules_status_route.test.ts | 2 +- .../routes/rules/find_rules_status_route.ts | 23 +- .../get_prepackaged_rules_status_route.ts | 1 + .../routes/rules/import_rules_route.test.ts | 6 +- .../routes/rules/import_rules_route.ts | 64 +- .../rules/patch_rules_bulk_route.test.ts | 17 +- .../routes/rules/patch_rules_bulk_route.ts | 25 +- .../routes/rules/patch_rules_route.test.ts | 12 +- .../routes/rules/patch_rules_route.ts | 33 +- .../routes/rules/read_rules_route.ts | 21 +- .../rules/update_rules_bulk_route.test.ts | 16 +- .../routes/rules/update_rules_bulk_route.ts | 49 +- .../routes/rules/update_rules_route.test.ts | 17 +- .../routes/rules/update_rules_route.ts | 48 +- .../routes/rules/utils.test.ts | 10 +- .../detection_engine/routes/rules/utils.ts | 38 +- .../add_prepackaged_rules_schema.test.ts | 1658 --------------- .../schemas/add_prepackaged_rules_schema.ts | 115 - .../schemas/create_rules_bulk_schema.test.ts | 260 --- .../schemas/create_rules_bulk_schema.ts | 11 - .../schemas/create_rules_schema.test.ts | 1623 --------------- .../routes/schemas/create_rules_schema.ts | 102 - .../schemas/export_rules_schema.test.ts | 113 - .../routes/schemas/export_rules_schema.ts | 22 - .../routes/schemas/find_rules_schema.test.ts | 147 -- .../routes/schemas/find_rules_schema.ts | 24 - .../schemas/find_rules_statuses_schema.ts | 11 - .../schemas/import_rules_schema.test.ts | 1841 ----------------- .../routes/schemas/import_rules_schema.ts | 131 -- .../schemas/patch_rules_bulk_schema.test.ts | 100 - .../routes/schemas/patch_rules_bulk_schema.ts | 11 - .../routes/schemas/patch_rules_schema.test.ts | 1362 ------------ .../routes/schemas/patch_rules_schema.ts | 82 - .../schemas/query_rules_bulk_schema.test.ts | 97 - .../routes/schemas/query_rules_bulk_schema.ts | 10 - .../routes/schemas/query_rules_schema.test.ts | 42 - .../query_signals_index_schema.test.ts | 75 - .../schemas/query_signals_index_schema.ts | 15 - .../routes/schemas/schemas.ts | 125 -- .../schemas/set_signal_status_schema.test.ts | 75 - .../schemas/set_signal_status_schema.ts | 17 - .../schemas/update_rules_bulk_schema.test.ts | 91 - .../schemas/update_rules_bulk_schema.ts | 11 - .../schemas/update_rules_schema.test.ts | 1645 --------------- .../routes/schemas/update_rules_schema.ts | 111 - .../routes/signals/open_close_signals.test.ts | 17 +- .../signals/open_close_signals_route.ts | 18 +- .../signals/query_signals_route.test.ts | 9 +- .../routes/signals/query_signals_route.ts | 29 +- .../rules/create_rules.mock.ts | 78 + .../rules/create_rules.test.ts | 30 +- .../detection_engine/rules/create_rules.ts | 8 +- .../create_rules_stream_from_ndjson.test.ts | 31 +- .../rules/create_rules_stream_from_ndjson.ts | 34 +- .../rules/delete_rules.test.ts | 16 +- .../detection_engine/rules/delete_rules.ts | 4 +- .../lib/detection_engine/rules/find_rules.ts | 4 +- .../rules/get_existing_prepackaged_rules.ts | 2 + .../rules/get_export_by_object_ids.ts | 2 +- .../rules/get_prepackaged_rules.test.ts | 14 +- .../rules/get_prepackaged_rules.ts | 43 +- .../rules/get_rules_to_install.test.ts | 17 +- .../rules/get_rules_to_install.ts | 6 +- .../rules/get_rules_to_update.test.ts | 17 +- .../rules/get_rules_to_update.ts | 6 +- .../rules/install_prepacked_rules.ts | 17 +- .../rules/patch_rules.mock.ts | 183 ++ .../rules/patch_rules.test.ts | 143 +- .../lib/detection_engine/rules/patch_rules.ts | 17 +- .../detection_engine/rules/read_rules.test.ts | 27 +- .../lib/detection_engine/rules/read_rules.ts | 8 +- .../lib/detection_engine/rules/types.ts | 272 ++- .../rules/update_prepacked_rules.test.ts | 19 +- .../rules/update_prepacked_rules.ts | 24 +- .../rules/update_rules.mock.ts | 81 + .../rules/update_rules.test.ts | 97 +- .../detection_engine/rules/update_rules.ts | 11 +- .../create_ndjson_prepackaged_rules.sh | 17 + .../signals/__mocks__/es_results.ts | 2 +- .../signals/build_exceptions_query.ts | 2 +- .../detection_engine/signals/build_rule.ts | 2 +- .../signals/filter_events_with_list.ts | 2 +- .../detection_engine/signals/get_filter.ts | 4 +- .../signals/search_after_bulk_create.ts | 2 +- .../signals/signal_params_schema.ts | 2 +- .../signals/signal_rule_alert_type.ts | 2 +- .../lib/detection_engine/signals/types.ts | 14 - .../lib/detection_engine/tags/read_tags.ts | 2 + .../server/lib/detection_engine/types.ts | 22 +- .../create_stream_from_ndjson.test.ts | 6 +- .../read_stream/create_stream_from_ndjson.ts | 36 +- .../basic/tests/delete_rules.ts | 4 +- .../basic/tests/delete_rules_bulk.ts | 32 +- .../basic/tests/import_rules.ts | 10 - .../basic/tests/patch_rules.ts | 4 +- .../basic/tests/patch_rules_bulk.ts | 16 +- .../basic/tests/read_rules.ts | 4 +- .../basic/tests/update_rules.ts | 4 +- .../basic/tests/update_rules_bulk.ts | 16 +- .../security_and_spaces/tests/delete_rules.ts | 4 +- .../tests/delete_rules_bulk.ts | 32 +- .../security_and_spaces/tests/import_rules.ts | 10 - .../security_and_spaces/tests/patch_rules.ts | 4 +- .../tests/patch_rules_bulk.ts | 16 +- .../security_and_spaces/tests/read_rules.ts | 4 +- .../security_and_spaces/tests/update_rules.ts | 4 +- .../tests/update_rules_bulk.ts | 16 +- 230 files changed, 13701 insertions(+), 10845 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_statuses_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rule_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.test.ts rename x-pack/plugins/security_solution/{server/lib/detection_engine/routes/schemas => common/detection_engine/schemas/request}/query_rules_schema.ts (54%) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_boolean_true.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_from_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_true.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_from_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.test.ts rename x-pack/plugins/{lists/common => security_solution/common/detection_engine}/schemas/types/default_string_array.ts (75%) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.test.ts rename x-pack/plugins/{lists/common => security_solution/common/detection_engine}/schemas/types/default_uuid.ts (84%) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.test.ts rename x-pack/plugins/{lists/common => security_solution/common/detection_engine}/schemas/types/non_empty_string.ts (81%) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_statuses_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/schemas.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.mock.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.mock.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts create mode 100755 x-pack/plugins/security_solution/server/lib/detection_engine/scripts/create_ndjson_prepackaged_rules.sh diff --git a/x-pack/plugins/lists/common/schemas/common/schemas.ts b/x-pack/plugins/lists/common/schemas/common/schemas.ts index 14ae030c63df3..7f086647bbc75 100644 --- a/x-pack/plugins/lists/common/schemas/common/schemas.ts +++ b/x-pack/plugins/lists/common/schemas/common/schemas.ts @@ -8,8 +8,8 @@ import * as t from 'io-ts'; -import { DefaultStringArray, NonEmptyString } from '../types'; import { DefaultNamespace } from '../types/default_namespace'; +import { DefaultStringArray, NonEmptyString } from '../../siem_common_deps'; export const name = t.string; export type Name = t.TypeOf; diff --git a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts index c10d441d93aa5..4322ff4c2801b 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts @@ -24,8 +24,9 @@ import { tags, } from '../common/schemas'; import { Identity, RequiredKeepUndefined } from '../../types'; -import { DefaultEntryArray, DefaultUuid } from '../types'; +import { DefaultEntryArray } from '../types'; import { EntriesArray } from '../types/entries'; +import { DefaultUuid } from '../../siem_common_deps'; export const createExceptionListItemSchema = t.intersection([ t.exact( diff --git a/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts index 3da8bfca126ae..a0aaa91c81427 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts @@ -22,7 +22,7 @@ import { tags, } from '../common/schemas'; import { Identity, RequiredKeepUndefined } from '../../types'; -import { DefaultUuid } from '../types/default_uuid'; +import { DefaultUuid } from '../../siem_common_deps'; export const createExceptionListSchema = t.intersection([ t.exact( diff --git a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts index 94299c93b29d8..0a5e861d84483 100644 --- a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts @@ -6,6 +6,7 @@ /* eslint-disable @typescript-eslint/camelcase */ +// TODO: You cannot import a stream from common into the front end code! CHANGE THIS import { Readable } from 'stream'; import * as t from 'io-ts'; @@ -20,6 +21,7 @@ export const importListItemSchema = t.exact( export type ImportListItemSchema = t.TypeOf; +// TODO: You cannot import a stream from common into the front end code! CHANGE THIS export interface HapiReadableStream extends Readable { hapi: { filename: string; diff --git a/x-pack/plugins/lists/common/schemas/types/index.ts b/x-pack/plugins/lists/common/schemas/types/index.ts index 674d7c40c2970..2f38ff86d4fb2 100644 --- a/x-pack/plugins/lists/common/schemas/types/index.ts +++ b/x-pack/plugins/lists/common/schemas/types/index.ts @@ -4,7 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ export * from './default_entries_array'; -export * from './default_string_array'; -export * from './default_uuid'; export * from './entries'; -export * from './non_empty_string'; diff --git a/x-pack/plugins/lists/common/siem_common_deps.ts b/x-pack/plugins/lists/common/siem_common_deps.ts index 9de40e3f72932..3759305987f79 100644 --- a/x-pack/plugins/lists/common/siem_common_deps.ts +++ b/x-pack/plugins/lists/common/siem_common_deps.ts @@ -4,5 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +export { NonEmptyString } from '../../security_solution/common/detection_engine/schemas/types/non_empty_string'; +export { DefaultUuid } from '../../security_solution/common/detection_engine/schemas/types/default_uuid'; +export { DefaultStringArray } from '../../security_solution/common/detection_engine/schemas/types/default_string_array'; export { exactCheck } from '../../security_solution/common/exact_check'; export { getPaths, foldLeftRight } from '../../security_solution/common/test_utils'; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts index 9eb2d9abccbd3..7db8e57421d02 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts @@ -14,16 +14,35 @@ import { PositiveIntegerGreaterThanZero } from '../types/positive_integer_greate import { PositiveInteger } from '../types/positive_integer'; export const description = t.string; +export type Description = t.TypeOf; + +export const descriptionOrUndefined = t.union([description, t.undefined]); +export type DescriptionOrUndefined = t.TypeOf; + export const enabled = t.boolean; -export const exclude_export_details = t.boolean; +export type Enabled = t.TypeOf; + +export const enabledOrUndefined = t.union([enabled, t.undefined]); +export type EnabledOrUndefined = t.TypeOf; + export const false_positives = t.array(t.string); +export type FalsePositives = t.TypeOf; + +export const falsePositivesOrUndefined = t.union([false_positives, t.undefined]); +export type FalsePositivesOrUndefined = t.TypeOf; + export const file_name = t.string; +export type FileName = t.TypeOf; + +export const exclude_export_details = t.boolean; +export type ExcludeExportDetails = t.TypeOf; /** * TODO: Right now the filters is an "unknown", when it could more than likely * become the actual ESFilter as a type. */ export const filters = t.array(t.unknown); // Filters are not easily type-able yet +export type Filters = t.TypeOf; // Filters are not easily type-able yet /** * Params is an "object", since it is a type of AlertActionParams which is action templates. @@ -43,30 +62,98 @@ export const action = t.exact( ); export const actions = t.array(action); +export type Actions = t.TypeOf; // TODO: Create a regular expression type or custom date math part type here export const from = t.string; +export type From = t.TypeOf; + +export const fromOrUndefined = t.union([from, t.undefined]); +export type FromOrUndefined = t.TypeOf; export const immutable = t.boolean; +export type Immutable = t.TypeOf; // Note: Never make this a strict uuid, we allow the rule_id to be any string at the moment // in case we encounter 3rd party rule systems which might be using auto incrementing numbers // or other different things. export const rule_id = t.string; +export type RuleId = t.TypeOf; + +export const ruleIdOrUndefined = t.union([rule_id, t.undefined]); +export type RuleIdOrUndefined = t.TypeOf; export const id = UUID; +export const idOrUndefined = t.union([id, t.undefined]); +export type IdOrUndefined = t.TypeOf; + export const index = t.array(t.string); +export type Index = t.TypeOf; + +export const indexOrUndefined = t.union([index, t.undefined]); +export type IndexOrUndefined = t.TypeOf; + export const interval = t.string; +export type Interval = t.TypeOf; + +export const intervalOrUndefined = t.union([interval, t.undefined]); +export type IntervalOrUndefined = t.TypeOf; + export const query = t.string; +export type Query = t.TypeOf; + +export const queryOrUndefined = t.union([query, t.undefined]); +export type QueryOrUndefined = t.TypeOf; + export const language = t.keyof({ kuery: null, lucene: null }); +export type Language = t.TypeOf; + +export const languageOrUndefined = t.union([language, t.undefined]); +export type LanguageOrUndefined = t.TypeOf; + export const objects = t.array(t.type({ rule_id })); + export const output_index = t.string; +export type OutputIndex = t.TypeOf; + +export const outputIndexOrUndefined = t.union([output_index, t.undefined]); +export type OutputIndexOrUndefined = t.TypeOf; + export const saved_id = t.string; +export type SavedId = t.TypeOf; + +export const savedIdOrUndefined = t.union([saved_id, t.undefined]); +export type SavedIdOrUndefined = t.TypeOf; + export const timeline_id = t.string; +export type TimelineId = t.TypeOf; + +export const timelineIdOrUndefined = t.union([timeline_id, t.undefined]); +export type TimelineIdOrUndefined = t.TypeOf; + export const timeline_title = t.string; +export type TimelineTitle = t.TypeOf; + +export const timelineTitleOrUndefined = t.union([timeline_title, t.undefined]); +export type TimelineTitleOrUndefined = t.TypeOf; + export const throttle = t.string; +export type Throttle = t.TypeOf; + +export const throttleOrNull = t.union([throttle, t.null]); +export type ThrottleOrNull = t.TypeOf; + export const anomaly_threshold = PositiveInteger; +export type AnomalyThreshold = t.TypeOf; + +export const anomalyThresholdOrUndefined = t.union([anomaly_threshold, t.undefined]); +export type AnomalyThresholdOrUndefined = t.TypeOf; + export const machine_learning_job_id = t.string; +export type MachineLearningJobId = t.TypeOf; + +export const machineLearningJobIdOrUndefined = t.union([machine_learning_job_id, t.undefined]); +export type MachineLearningJobIdOrUndefined = t.TypeOf; /** * Note that this is a plain unknown object because we allow the UI @@ -76,30 +163,103 @@ export const machine_learning_job_id = t.string; * so we have tighter control over 3rd party data structures. */ export const meta = t.object; +export type Meta = t.TypeOf; +export const metaOrUndefined = t.union([meta, t.undefined]); +export type MetaOrUndefined = t.TypeOf; + export const max_signals = PositiveIntegerGreaterThanZero; +export type MaxSignals = t.TypeOf; + +export const maxSignalsOrUndefined = t.union([max_signals, t.undefined]); +export type MaxSignalsOrUndefined = t.TypeOf; + export const name = t.string; +export type Name = t.TypeOf; + +export const nameOrUndefined = t.union([name, t.undefined]); +export type NameOrUndefined = t.TypeOf; + export const risk_score = RiskScore; +export type RiskScore = t.TypeOf; + +export const riskScoreOrUndefined = t.union([risk_score, t.undefined]); +export type RiskScoreOrUndefined = t.TypeOf; + export const severity = t.keyof({ low: null, medium: null, high: null, critical: null }); +export type Severity = t.TypeOf; + +export const severityOrUndefined = t.union([severity, t.undefined]); +export type SeverityOrUndefined = t.TypeOf; + export const status = t.keyof({ open: null, closed: null }); + export const job_status = t.keyof({ succeeded: null, failed: null, 'going to run': null }); // TODO: Create a regular expression type or custom date math part type here export const to = t.string; +export type To = t.TypeOf; + +export const toOrUndefined = t.union([to, t.undefined]); +export type ToOrUndefined = t.TypeOf; export const type = t.keyof({ machine_learning: null, query: null, saved_query: null }); +export type Type = t.TypeOf; + +export const typeOrUndefined = t.union([type, t.undefined]); +export type TypeOrUndefined = t.TypeOf; + export const queryFilter = t.string; +export type QueryFilter = t.TypeOf; + +export const queryFilterOrUndefined = t.union([queryFilter, t.undefined]); +export type QueryFilterOrUndefined = t.TypeOf; + export const references = t.array(t.string); +export type References = t.TypeOf; + +export const referencesOrUndefined = t.union([references, t.undefined]); +export type ReferencesOrUndefined = t.TypeOf; + export const per_page = PositiveInteger; +export type PerPage = t.TypeOf; + +export const perPageOrUndefined = t.union([per_page, t.undefined]); +export type PerPageOrUndefined = t.TypeOf; + export const page = PositiveIntegerGreaterThanZero; +export type Page = t.TypeOf; + +export const pageOrUndefined = t.union([page, t.undefined]); +export type PageOrUndefined = t.TypeOf; + export const signal_ids = t.array(t.string); // TODO: Can this be more strict or is this is the set of all Elastic Queries? export const signal_status_query = t.object; export const sort_field = t.string; +export type SortField = t.TypeOf; + +export const sortFieldOrUndefined = t.union([sort_field, t.undefined]); +export type SortFieldOrUndefined = t.TypeOf; + export const sort_order = t.keyof({ asc: null, desc: null }); +export type sortOrder = t.TypeOf; + +export const sortOrderOrUndefined = t.union([sort_order, t.undefined]); +export type SortOrderOrUndefined = t.TypeOf; + export const tags = t.array(t.string); +export type Tags = t.TypeOf; + +export const tagsOrUndefined = t.union([tags, t.undefined]); +export type TagsOrUndefined = t.TypeOf; + export const fields = t.array(t.string); +export type Fields = t.TypeOf; +export const fieldsOrUndefined = t.union([fields, t.undefined]); +export type FieldsOrUndefined = t.TypeOf; + export const threat_framework = t.string; export const threat_tactic_id = t.string; export const threat_tactic_name = t.string; @@ -129,11 +289,23 @@ export const threat = t.array( }) ) ); + +export type Threat = t.TypeOf; + +export const threatOrUndefined = t.union([threat, t.undefined]); +export type ThreatOrUndefined = t.TypeOf; + export const created_at = IsoDateString; export const updated_at = IsoDateString; export const updated_by = t.string; export const created_by = t.string; + export const version = PositiveIntegerGreaterThanZero; +export type Version = t.TypeOf; + +export const versionOrUndefined = t.union([version, t.undefined]); +export type VersionOrUndefined = t.TypeOf; + export const last_success_at = IsoDateString; export const last_success_message = t.string; export const last_failure_at = IsoDateString; @@ -150,7 +322,12 @@ export const success_count = PositiveInteger; export const rules_custom_installed = PositiveInteger; export const rules_not_installed = PositiveInteger; export const rules_not_updated = PositiveInteger; + export const note = t.string; +export type Note = t.TypeOf; + +export const noteOrUndefined = t.union([note, t.undefined]); +export type NoteOrUndefined = t.TypeOf; // NOTE: Experimental list support not being shipped currently and behind a feature flag // TODO: Remove this comment once we lists have passed testing and is ready for the release @@ -185,3 +362,6 @@ export const list_and = t.intersection([ and: t.array(list), }), ]); + +export const listAndOrUndefined = t.union([t.array(list_and), t.undefined]); +export type ListAndOrUndefined = t.TypeOf; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock.ts new file mode 100644 index 0000000000000..52a210f3a01aa --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + AddPrepackagedRulesSchema, + AddPrepackagedRulesSchemaDecoded, +} from './add_prepackaged_rules_schema'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +export const getAddPrepackagedRulesSchemaMock = (): AddPrepackagedRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', + version: 1, +}); + +export const getAddPrepackagedRulesSchemaDecodedMock = (): AddPrepackagedRulesSchemaDecoded => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + references: [], + actions: [], + enabled: false, + false_positives: [], + from: 'now-6m', + interval: '5m', + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + to: 'now', + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + rule_id: 'rule-1', +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.ts new file mode 100644 index 0000000000000..3e7e7e5409c9c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.ts @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + MaxSignals, + name, + severity, + Tags, + To, + type, + Threat, + ThrottleOrNull, + note, + References, + Actions, + Enabled, + FalsePositives, + From, + Interval, + language, + query, + rule_id, + version, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultStringArray } from '../types/default_string_array'; +import { DefaultActionsArray } from '../types/default_actions_array'; +import { DefaultBooleanFalse } from '../types/default_boolean_false'; +import { DefaultFromString } from '../types/default_from_string'; +import { DefaultIntervalString } from '../types/default_interval_string'; +import { DefaultMaxSignalsNumber } from '../types/default_max_signals_number'; +import { DefaultToString } from '../types/default_to_string'; +import { DefaultThreatArray } from '../types/default_threat_array'; +import { DefaultThrottleNull } from '../types/default_throttle_null'; +import { ListsDefaultArray, ListsDefaultArraySchema } from '../types/lists_default_array'; + +/** + * Big differences between this schema and the createRulesSchema + * - rule_id is required here + * - output_index is not allowed (and instead the space index must be used) + * - immutable is forbidden but defaults to true instead of to false and it can only ever be true (This is forced directly in the route and not here) + * - enabled defaults to false instead of true + * - version is a required field that must exist + * - index is a required field that must exist if type !== machine_learning (Checked within the runtime type dependent system) + */ +export const addPrepackagedRulesSchema = t.intersection([ + t.exact( + t.type({ + description, + risk_score, + name, + severity, + type, + rule_id, + version, + }) + ), + t.exact( + t.partial({ + actions: DefaultActionsArray, // defaults to empty actions array if not set during decode + anomaly_threshold, // defaults to undefined if not set during decode + enabled: DefaultBooleanFalse, // defaults to false if not set during decode + false_positives: DefaultStringArray, // defaults to empty string array if not set during decode + filters, // defaults to undefined if not set during decode + from: DefaultFromString, // defaults to "now-6m" if not set during decode + index, // defaults to undefined if not set during decode + interval: DefaultIntervalString, // defaults to "5m" if not set during decode + query, // defaults to undefined if not set during decode + language, // defaults to undefined if not set during decode + saved_id, // defaults to "undefined" if not set during decode + timeline_id, // defaults to "undefined" if not set during decode + timeline_title, // defaults to "undefined" if not set during decode + meta, // defaults to "undefined" if not set during decode + machine_learning_job_id, // defaults to "undefined" if not set during decode + max_signals: DefaultMaxSignalsNumber, // defaults to DEFAULT_MAX_SIGNALS (100) if not set during decode + tags: DefaultStringArray, // defaults to empty string array if not set during decode + to: DefaultToString, // defaults to "now" if not set during decode + threat: DefaultThreatArray, // defaults to empty array if not set during decode + throttle: DefaultThrottleNull, // defaults to "null" if not set during decode + references: DefaultStringArray, // defaults to empty array of strings if not set during decode + note, // defaults to "undefined" if not set during decode + exceptions_list: ListsDefaultArray, // defaults to empty array if not set during decode + }) + ), +]); + +export type AddPrepackagedRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type AddPrepackagedRulesSchemaDecoded = Omit< + AddPrepackagedRulesSchema, + | 'references' + | 'actions' + | 'enabled' + | 'false_positives' + | 'from' + | 'interval' + | 'max_signals' + | 'tags' + | 'to' + | 'threat' + | 'throttle' + | 'exceptions_list' +> & { + references: References; + actions: Actions; + enabled: Enabled; + false_positives: FalsePositives; + from: From; + interval: Interval; + max_signals: MaxSignals; + tags: Tags; + to: To; + threat: Threat; + throttle: ThrottleOrNull; + exceptions_list: ListsDefaultArraySchema; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..793d4b04ed0e5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.test.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AddPrepackagedRulesSchema } from './add_prepackaged_rules_schema'; +import { addPrepackagedRuleValidateTypeDependents } from './add_prepackaged_rules_type_dependents'; +import { getAddPrepackagedRulesSchemaMock } from './add_prepackaged_rules_schema.mock'; + +describe('create_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and will not validate without out', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + type: 'saved_query', + }; + delete schema.saved_id; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "type" is "saved_query", "saved_id" is required']); + }); + + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.ts new file mode 100644 index 0000000000000..2788c331154d2 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.ts @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AddPrepackagedRulesSchema } from './add_prepackaged_rules_schema'; + +export const validateAnomalyThreshold = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.anomaly_threshold == null) { + return ['when "type" is "machine_learning" anomaly_threshold is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateQuery = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateSavedId = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'saved_query') { + if (rule.saved_id == null) { + return ['when "type" is "saved_query", "saved_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateMachineLearningJobId = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.machine_learning_job_id == null) { + return ['when "type" is "machine_learning", "machine_learning_job_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const addPrepackagedRuleValidateTypeDependents = ( + schema: AddPrepackagedRulesSchema +): string[] => { + return [ + ...validateAnomalyThreshold(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateSavedId(schema), + ...validateMachineLearningJobId(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts new file mode 100644 index 0000000000000..5d170f5a78645 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts @@ -0,0 +1,1389 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + addPrepackagedRulesSchema, + AddPrepackagedRulesSchemaDecoded, + AddPrepackagedRulesSchema, +} from './add_prepackaged_rules_schema'; + +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; +import { + getAddPrepackagedRulesSchemaMock, + getAddPrepackagedRulesSchemaDecodedMock, +} from './add_prepackaged_rules_schema.mock'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('add prepackaged rules schema', () => { + test('empty objects do not validate', () => { + const payload: Partial = {}; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "rule_id"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('made up values do not validate', () => { + const payload: AddPrepackagedRulesSchema & { madeUp: string } = { + ...getAddPrepackagedRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + interval: '5m', + index: ['index-1'], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, query, index, interval, version] does validate', () => { + const payload: AddPrepackagedRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + risk_score: 50, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, version] does validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + risk_score: 50, + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does not validate', () => { + const payload: Partial & { output_index: string } = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index, version] does not validate because output_index is not allowed', () => { + const payload: Partial & { output_index: string } = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "output_index"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, version] does validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + version: 1, + actions: [], + enabled: false, + exceptions_list: [], + false_positives: [], + max_signals: 100, + references: [], + tags: [], + threat: [], + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can send in an empty array to threat', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + threat: [], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + threat: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { + const payload: AddPrepackagedRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as valid', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + references: ['index-1'], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + references: ['index-1'], + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults references to an array if it is not sent in', () => { + const { references, ...noReferences } = getAddPrepackagedRulesSchemaMock(); + const decoded = addPrepackagedRulesSchema.decode(noReferences); + const checked = exactCheck(noReferences, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + references: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('immutable cannot be set in a pre-packaged rule', () => { + const payload: AddPrepackagedRulesSchema & { immutable: boolean } = { + ...getAddPrepackagedRulesSchemaMock(), + immutable: true, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('defaults enabled to false', () => { + const payload: AddPrepackagedRulesSchema = getAddPrepackagedRulesSchemaMock(); + delete payload.enabled; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(((message.schema as unknown) as AddPrepackagedRulesSchemaDecoded).enabled).toEqual( + false + ); + }); + + test('rule_id is required', () => { + const payload: AddPrepackagedRulesSchema = getAddPrepackagedRulesSchemaMock(); + delete payload.rule_id; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "rule_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + ...getAddPrepackagedRulesSchemaMock(), + references: [5], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + ...getAddPrepackagedRulesSchemaMock(), + index: [5], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('defaults interval to 5 min', () => { + const { interval, ...noInterval } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noInterval, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + interval: expectedInterval, + ...expectedNoInterval + } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoInterval, + interval: '5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults max signals to 100', () => { + const { max_signals, ...noMaxSignals } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noMaxSignals, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + max_signals: expectedMaxSignals, + ...expectedNoMaxSignals + } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoMaxSignals, + max_signals: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_query type can have filters with it', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + filters: [], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getAddPrepackagedRulesSchemaMock(), + filters: 'some string', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some string" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('language validates with kuery', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + language: 'kuery', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + language: 'lucene', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getAddPrepackagedRulesSchemaMock(), + language: 'something-made-up', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + max_signals: -1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + max_signals: 0, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + max_signals: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can optionally send in an array of tags', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + tags: ['tag_1', 'tag_2'], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + tags: ['tag_1', 'tag_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of tags that are numbers', () => { + const payload: Omit & { tags: number[] } = { + ...getAddPrepackagedRulesSchemaMock(), + tags: [0, 1, 2], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "0" supplied to ""', + 'Invalid value "1" supplied to ""', + 'Invalid value "2" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "framework"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getAddPrepackagedRulesSchemaMock(), + threat: [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "tactic"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getAddPrepackagedRulesSchemaMock(), + threat: [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "technique"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getAddPrepackagedRulesSchemaMock(), + threat: [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + }, + ], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can optionally send in an array of false positives', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + false_positives: ['false_1', 'false_2'], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + false_positives: ['false_1', 'false_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of false positives that are numbers', () => { + const payload: Omit & { + false_positives: number[]; + } = { + ...getAddPrepackagedRulesSchemaMock(), + false_positives: [5, 4], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "5" supplied to ""', + 'Invalid value "4" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + test('You cannot set the risk_score to 101', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + risk_score: 101, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "101" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to -1', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + risk_score: -1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to "risk_score"']); + expect(message.schema).toEqual({}); + }); + + test('You can set the risk_score to 0', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + risk_score: 0, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + risk_score: 0, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set the risk_score to 100', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + risk_score: 100, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + risk_score: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set meta to any object you want', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getAddPrepackagedRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can omit the query string when filters are present', () => { + const { query, ...noQuery } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noQuery, + filters: [], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { query: expectedQuery, ...expectedNoQuery } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoQuery, + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...noFrom } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noFrom, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { from: expectedFrom, ...expectedNoFrom } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoFrom, + from: 'now-6m', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...noTo } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noTo, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { to: expectedTo, ...expectedNoTo } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoTo, + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + ...getAddPrepackagedRulesSchemaMock(), + severity: 'junk', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...noActions } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noActions, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + actions: expectedActions, + ...expectedNoActions + } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoActions, + actions: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "undefined" supplied to "id"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "action_type_id"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', params: {} }], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...noThrottle } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noThrottle, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + throttle: expectedThrottle, + ...expectedNoThrottle + } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoThrottle, + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + describe('note', () => { + test('You can set note to a string', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + note: '# documentation markdown here', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + note: '# documentation markdown here', + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set note to an empty string', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + note: '', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + note: '', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create note as an object', () => { + const payload: Omit & { note: {} } = { + ...getAddPrepackagedRulesSchemaMock(), + note: { + somethingHere: 'something else', + }, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + // TODO: Fix/Change the formatErrors to be better able to handle objects + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { + const payload: AddPrepackagedRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts new file mode 100644 index 0000000000000..e79dde41752a3 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts @@ -0,0 +1,281 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + createRulesBulkSchema, + CreateRulesBulkSchema, + CreateRulesBulkSchemaDecoded, +} from './create_rules_bulk_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight } from '../../../test_utils'; +import { + getCreateRulesSchemaMock, + getCreateRulesSchemaDecodedMock, +} from './create_rules_schema.mock'; +import { formatErrors } from '../../../format_errors'; +import { CreateRulesSchema } from './create_rules_schema'; + +// only the basics of testing are here. +// see: create_rules_schema.test.ts for the bulk of the validation tests +// this just wraps createRulesSchema in an array +describe('create_rules_bulk_schema', () => { + test('can take an empty array and validate it', () => { + const payload: CreateRulesBulkSchema = []; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(output.errors).toEqual([]); + expect(output.schema).toEqual([]); + }); + + test('made up values do not validate for a single element', () => { + const payload: Array<{ madeUp: string }> = [{ madeUp: 'hi' }]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(output.schema).toEqual({}); + }); + + test('single array element does validate', () => { + const payload: CreateRulesBulkSchema = [getCreateRulesSchemaMock()]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([getCreateRulesSchemaDecodedMock()]); + }); + + test('two array elements do validate', () => { + const payload: CreateRulesBulkSchema = [getCreateRulesSchemaMock(), getCreateRulesSchemaMock()]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([ + getCreateRulesSchemaDecodedMock(), + getCreateRulesSchemaDecodedMock(), + ]); + }); + + test('single array element with a missing value (risk_score) will not validate', () => { + const singleItem = getCreateRulesSchemaMock(); + delete singleItem.risk_score; + const payload: CreateRulesBulkSchema = [singleItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is valid but the second is invalid (risk_score) will not validate', () => { + const singleItem = getCreateRulesSchemaMock(); + const secondItem = getCreateRulesSchemaMock(); + delete secondItem.risk_score; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is invalid (risk_score) but the second is valid will not validate', () => { + const singleItem = getCreateRulesSchemaMock(); + const secondItem = getCreateRulesSchemaMock(); + delete singleItem.risk_score; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where both are invalid (risk_score) will not validate', () => { + const singleItem = getCreateRulesSchemaMock(); + const secondItem = getCreateRulesSchemaMock(); + delete singleItem.risk_score; + delete secondItem.risk_score; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is invalid (extra key and value) but the second is valid will not validate', () => { + const singleItem: CreateRulesSchema & { madeUpValue: string } = { + ...getCreateRulesSchemaMock(), + madeUpValue: 'something', + }; + const secondItem = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the second is invalid (extra key and value) but the first is valid will not validate', () => { + const singleItem: CreateRulesSchema = getCreateRulesSchemaMock(); + const secondItem: CreateRulesSchema & { madeUpValue: string } = { + ...getCreateRulesSchemaMock(), + madeUpValue: 'something', + }; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('two array elements where both are invalid (extra key and value) will not validate', () => { + const singleItem: CreateRulesSchema & { madeUpValue: string } = { + ...getCreateRulesSchemaMock(), + madeUpValue: 'something', + }; + const secondItem: CreateRulesSchema & { madeUpValue: string } = { + ...getCreateRulesSchemaMock(), + madeUpValue: 'something', + }; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue,madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...withoutFrom } = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [withoutFrom]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as CreateRulesBulkSchemaDecoded)[0].from).toEqual('now-6m'); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...withoutTo } = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [withoutTo]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as CreateRulesBulkSchemaDecoded)[0].to).toEqual('now'); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const badSeverity = { ...getCreateRulesSchemaMock(), severity: 'madeup' }; + const payload = [badSeverity]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['Invalid value "madeup" supplied to "severity"']); + expect(output.schema).toEqual({}); + }); + + test('You can set "note" to a string', () => { + const payload: CreateRulesBulkSchema = [ + { ...getCreateRulesSchemaMock(), note: '# test markdown' }, + ]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([ + { ...getCreateRulesSchemaDecodedMock(), note: '# test markdown' }, + ]); + }); + + test('You can set "note" to an empty string', () => { + const payload: CreateRulesBulkSchema = [{ ...getCreateRulesSchemaMock(), note: '' }]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([{ ...getCreateRulesSchemaDecodedMock(), note: '' }]); + }); + + test('You can set "note" to anything other than string', () => { + const payload = [ + { + ...getCreateRulesSchemaMock(), + note: { + something: 'some object', + }, + }, + ]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + // TODO: We should change the formatter used to better print objects + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(output.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...withoutActions } = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [withoutActions]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as CreateRulesBulkSchemaDecoded)[0].actions).toEqual([]); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...withoutThrottle } = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [withoutThrottle]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as CreateRulesBulkSchemaDecoded)[0].throttle).toEqual(null); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.ts new file mode 100644 index 0000000000000..c6233cc63fa9f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +import { createRulesSchema, CreateRulesSchemaDecoded } from './create_rules_schema'; + +export const createRulesBulkSchema = t.array(createRulesSchema); +export type CreateRulesBulkSchema = t.TypeOf; + +export type CreateRulesBulkSchemaDecoded = CreateRulesSchemaDecoded[]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts new file mode 100644 index 0000000000000..a9ab6f8959e24 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CreateRulesSchema, CreateRulesSchemaDecoded } from './create_rules_schema'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +export const getCreateRulesSchemaMock = (): CreateRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', +}); + +export const getCreateRulesSchemaDecodedMock = (): CreateRulesSchemaDecoded => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + from: 'now-6m', + interval: '5m', + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + to: 'now', + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + rule_id: 'rule-1', +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts new file mode 100644 index 0000000000000..d672d38028902 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts @@ -0,0 +1,1445 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + createRulesSchema, + CreateRulesSchema, + CreateRulesSchemaDecoded, +} from './create_rules_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; +import { + getCreateRulesSchemaMock, + getCreateRulesSchemaDecodedMock, +} from './create_rules_schema.mock'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('create rules schema', () => { + test('empty objects do not validate', () => { + const payload: Partial = {}; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('made up values do not validate', () => { + const payload: CreateRulesSchema & { madeUp: string } = { + ...getCreateRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + interval: '5m', + index: ['index-1'], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('You can send in an empty array to threat', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + threat: [], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + threat: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as valid', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + references: ['index-1'], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + references: ['index-1'], + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults references to an array if it is not sent in', () => { + const { references, ...noReferences } = getCreateRulesSchemaMock(); + const decoded = createRulesSchema.decode(noReferences); + const checked = exactCheck(noReferences, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + references: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + ...getCreateRulesSchemaMock(), + references: [5], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + ...getCreateRulesSchemaMock(), + index: [5], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('saved_query type can have filters with it', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + filters: [], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getCreateRulesSchemaMock(), + filters: 'some string', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some string" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('language validates with kuery', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + language: 'kuery', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + language: 'lucene', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getCreateRulesSchemaMock(), + language: 'something-made-up', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + max_signals: -1, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + max_signals: 0, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + max_signals: 1, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can optionally send in an array of tags', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + tags: ['tag_1', 'tag_2'], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + tags: ['tag_1', 'tag_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of tags that are numbers', () => { + const payload: Omit & { tags: number[] } = { + ...getCreateRulesSchemaMock(), + tags: [0, 1, 2], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "0" supplied to ""', + 'Invalid value "1" supplied to ""', + 'Invalid value "2" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "framework"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getCreateRulesSchemaMock(), + threat: [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "tactic"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getCreateRulesSchemaMock(), + threat: [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "technique"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getCreateRulesSchemaMock(), + threat: [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can optionally send in an array of false positives', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + false_positives: ['false_1', 'false_2'], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + false_positives: ['false_1', 'false_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of false positives that are numbers', () => { + const payload: Omit & { false_positives: number[] } = { + ...getCreateRulesSchemaMock(), + false_positives: [5, 4], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "5" supplied to ""', + 'Invalid value "4" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the immutable to a number when trying to create a rule', () => { + const payload: Omit & { immutable: number } = { + ...getCreateRulesSchemaMock(), + immutable: 5, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to 101', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + risk_score: 101, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "101" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to -1', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + risk_score: -1, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to "risk_score"']); + expect(message.schema).toEqual({}); + }); + + test('You can set the risk_score to 0', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + risk_score: 0, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + risk_score: 0, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set the risk_score to 100', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + risk_score: 100, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + risk_score: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set meta to any object you want', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getCreateRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can omit the query string when filters are present', () => { + const { query, ...noQuery } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noQuery, + filters: [], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { query: expectedQuery, ...expectedNoQuery } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoQuery, + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + ...getCreateRulesSchemaMock(), + severity: 'junk', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "undefined" supplied to "id"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "action_type_id"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', params: {} }], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + describe('note', () => { + test('You can set note to a string', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + note: '# documentation markdown here', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + note: '# documentation markdown here', + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set note to an empty string', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + note: '', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + note: '', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create note as an object', () => { + const payload: Omit & { note: {} } = { + ...getCreateRulesSchemaMock(), + note: { + somethingHere: 'something else', + }, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + // TODO: Fix/Change the formatErrors to be better able to handle objects + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + }); + + test('defaults interval to 5 min', () => { + const { interval, ...noInterval } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noInterval, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { interval: expectedInterval, ...expectedNoInterval } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoInterval, + interval: '5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults max signals to 100', () => { + const { max_signals, ...noMaxSignals } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noMaxSignals, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + max_signals: expectedMaxSignals, + ...expectedNoMaxSignals + } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoMaxSignals, + max_signals: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...noFrom } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noFrom, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { from: expectedFrom, ...expectedNoFrom } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoFrom, + from: 'now-6m', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...noTo } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noTo, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { to: expectedTo, ...expectedNoTo } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoTo, + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...noActions } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noActions, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { actions: expectedActions, ...expectedNoActions } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoActions, + actions: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...noThrottle } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noThrottle, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { throttle: expectedThrottle, ...expectedNoThrottle } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoThrottle, + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + test('machine_learning type does validate', () => { + const payload: CreateRulesSchema = { + type: 'machine_learning', + anomaly_threshold: 50, + machine_learning_job_id: 'linux_anomalous_network_activity_ecs', + false_positives: [], + references: [], + risk_score: 50, + threat: [], + name: 'ss', + description: 'ss', + severity: 'low', + tags: [], + interval: '5m', + from: 'now-360s', + to: 'now', + meta: { from: '1m' }, + actions: [], + enabled: true, + throttle: 'no_actions', + rule_id: 'rule-1', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + type: 'machine_learning', + anomaly_threshold: 50, + machine_learning_job_id: 'linux_anomalous_network_activity_ecs', + false_positives: [], + references: [], + risk_score: 50, + threat: [], + name: 'ss', + description: 'ss', + severity: 'low', + tags: [], + interval: '5m', + from: 'now-360s', + to: 'now', + meta: { from: '1m' }, + actions: [], + enabled: true, + throttle: 'no_actions', + exceptions_list: [], + max_signals: DEFAULT_MAX_SIGNALS, + version: 1, + rule_id: 'rule-1', + }; + expect(message.schema).toEqual(expected); + }); + + test('it generates a uuid v4 whenever you omit the rule_id', () => { + const { rule_id, ...noRuleId } = getCreateRulesSchemaMock(); + const decoded = createRulesSchema.decode(noRuleId); + const checked = exactCheck(noRuleId, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as CreateRulesSchemaDecoded).rule_id).toMatch( + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i + ); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts new file mode 100644 index 0000000000000..4e60201b8030e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + RuleId, + index, + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + MaxSignals, + name, + severity, + Tags, + To, + type, + Threat, + ThrottleOrNull, + note, + Version, + References, + Actions, + Enabled, + FalsePositives, + From, + Interval, + language, + query, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultStringArray } from '../types/default_string_array'; +import { DefaultActionsArray } from '../types/default_actions_array'; +import { DefaultBooleanTrue } from '../types/default_boolean_true'; +import { DefaultFromString } from '../types/default_from_string'; +import { DefaultIntervalString } from '../types/default_interval_string'; +import { DefaultMaxSignalsNumber } from '../types/default_max_signals_number'; +import { DefaultToString } from '../types/default_to_string'; +import { DefaultThreatArray } from '../types/default_threat_array'; +import { DefaultThrottleNull } from '../types/default_throttle_null'; +import { DefaultVersionNumber } from '../types/default_version_number'; +import { ListsDefaultArray, ListsDefaultArraySchema } from '../types/lists_default_array'; +import { DefaultUuid } from '../types/default_uuid'; + +export const createRulesSchema = t.intersection([ + t.exact( + t.type({ + description, + risk_score, + name, + severity, + type, + }) + ), + t.exact( + t.partial({ + actions: DefaultActionsArray, // defaults to empty actions array if not set during decode + anomaly_threshold, // defaults to undefined if not set during decode + enabled: DefaultBooleanTrue, // defaults to true if not set during decode + false_positives: DefaultStringArray, // defaults to empty string array if not set during decode + filters, // defaults to undefined if not set during decode + from: DefaultFromString, // defaults to "now-6m" if not set during decode + rule_id: DefaultUuid, + index, // defaults to undefined if not set during decode + interval: DefaultIntervalString, // defaults to "5m" if not set during decode + query, // defaults to undefined if not set during decode + language, // defaults to undefined if not set during decode + // TODO: output_index: This should be removed eventually + output_index, // defaults to "undefined" if not set during decode + saved_id, // defaults to "undefined" if not set during decode + timeline_id, // defaults to "undefined" if not set during decode + timeline_title, // defaults to "undefined" if not set during decode + meta, // defaults to "undefined" if not set during decode + machine_learning_job_id, // defaults to "undefined" if not set during decode + max_signals: DefaultMaxSignalsNumber, // defaults to DEFAULT_MAX_SIGNALS (100) if not set during decode + tags: DefaultStringArray, // defaults to empty string array if not set during decode + to: DefaultToString, // defaults to "now" if not set during decode + threat: DefaultThreatArray, // defaults to empty array if not set during decode + throttle: DefaultThrottleNull, // defaults to "null" if not set during decode + references: DefaultStringArray, // defaults to empty array of strings if not set during decode + note, // defaults to "undefined" if not set during decode + version: DefaultVersionNumber, // defaults to 1 if not set during decode + exceptions_list: ListsDefaultArray, // defaults to empty array if not set during decode + }) + ), +]); + +export type CreateRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type CreateRulesSchemaDecoded = Omit< + CreateRulesSchema, + | 'references' + | 'actions' + | 'enabled' + | 'false_positives' + | 'from' + | 'interval' + | 'max_signals' + | 'tags' + | 'to' + | 'threat' + | 'throttle' + | 'version' + | 'exceptions_list' + | 'rule_id' +> & { + references: References; + actions: Actions; + enabled: Enabled; + false_positives: FalsePositives; + from: From; + interval: Interval; + max_signals: MaxSignals; + tags: Tags; + to: To; + threat: Threat; + throttle: ThrottleOrNull; + version: Version; + exceptions_list: ListsDefaultArraySchema; + rule_id: RuleId; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..ebf0b2e591ca9 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.test.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getCreateRulesSchemaMock } from './create_rules_schema.mock'; +import { CreateRulesSchema } from './create_rules_schema'; +import { createRuleValidateTypeDependents } from './create_rules_type_dependents'; + +describe('create_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and will not validate without out', () => { + const schema: CreateRulesSchema = { ...getCreateRulesSchemaMock(), type: 'saved_query' }; + delete schema.saved_id; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "type" is "saved_query", "saved_id" is required']); + }); + + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.ts new file mode 100644 index 0000000000000..aad2a2c4a9206 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.ts @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CreateRulesSchema } from './create_rules_schema'; + +export const validateAnomalyThreshold = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.anomaly_threshold == null) { + return ['when "type" is "machine_learning" anomaly_threshold is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateQuery = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateSavedId = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'saved_query') { + if (rule.saved_id == null) { + return ['when "type" is "saved_query", "saved_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateMachineLearningJobId = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.machine_learning_job_id == null) { + return ['when "type" is "machine_learning", "machine_learning_job_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: CreateRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: CreateRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const createRuleValidateTypeDependents = (schema: CreateRulesSchema): string[] => { + return [ + ...validateAnomalyThreshold(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateSavedId(schema), + ...validateMachineLearningJobId(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.test.ts new file mode 100644 index 0000000000000..3e9799a5ad2f9 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.test.ts @@ -0,0 +1,159 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + exportRulesQuerySchema, + exportRulesSchema, + ExportRulesSchema, + ExportRulesQuerySchema, + ExportRulesQuerySchemaDecoded, +} from './export_rules_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('create rules schema', () => { + describe('exportRulesSchema', () => { + test('null value or absent values validate', () => { + const payload: Partial = null; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('empty object does not validate', () => { + const payload = {}; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + // TODO: Change formatter to display a better value than [object Object] + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "objects"', + 'Invalid value "[object Object]" supplied to ""', + ]); + expect(message.schema).toEqual(payload); + }); + + test('empty object array does validate', () => { + const payload: ExportRulesSchema = { objects: [] }; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('array with rule_id validates', () => { + const payload: ExportRulesSchema = { objects: [{ rule_id: 'test-1' }] }; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('array with id does not validate as we do not allow that on purpose since we export rule_id', () => { + const payload: Omit & { objects: [{ id: string }] } = { + objects: [{ id: '4a7ff83d-3055-4bb2-ba68-587b9c6c15a4' }], + }; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + // TODO: Change formatter to display a better value than [object Object] + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "objects,rule_id"', + 'Invalid value "[object Object]" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + }); + + describe('exportRulesQuerySchema', () => { + test('default value for file_name is export.ndjson and default for exclude_export_details is false', () => { + const payload: Partial = {}; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ExportRulesQuerySchemaDecoded = { + file_name: 'export.ndjson', + exclude_export_details: false, + }; + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(expected); + }); + + test('file_name validates', () => { + const payload: ExportRulesQuerySchema = { + file_name: 'test.ndjson', + }; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ExportRulesQuerySchemaDecoded = { + file_name: 'test.ndjson', + exclude_export_details: false, + }; + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(expected); + }); + + test('file_name does not validate with a number', () => { + const payload: Omit & { file_name: number } = { + file_name: 10, + }; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "10" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('exclude_export_details validates with a boolean true', () => { + const payload: ExportRulesQuerySchema = { + exclude_export_details: true, + }; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ExportRulesQuerySchemaDecoded = { + exclude_export_details: true, + file_name: 'export.ndjson', + }; + expect(message.schema).toEqual(expected); + }); + + test('exclude_export_details does not validate with a string', () => { + const payload: Omit & { + exclude_export_details: string; + } = { + exclude_export_details: 'invalid string', + }; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "invalid string" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts new file mode 100644 index 0000000000000..75fa2da92b787 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { rule_id, FileName, ExcludeExportDetails } from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultExportFileName } from '../types/default_export_file_name'; +import { DefaultStringBooleanFalse } from '../types/default_string_boolean_false'; + +const objects = t.array(t.exact(t.type({ rule_id }))); +export const exportRulesSchema = t.union([t.exact(t.type({ objects })), t.null]); +export type ExportRulesSchema = t.TypeOf; +export type ExportRulesSchemaDecoded = ExportRulesSchema; + +export const exportRulesQuerySchema = t.exact( + t.partial({ file_name: DefaultExportFileName, exclude_export_details: DefaultStringBooleanFalse }) +); + +export type ExportRulesQuerySchema = t.TypeOf; + +export type ExportRulesQuerySchemaDecoded = Omit< + ExportRulesQuerySchema, + 'file_name' | 'exclude_export_details' +> & { + file_name: FileName; + exclude_export_details: ExcludeExportDetails; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_statuses_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_statuses_schema.ts new file mode 100644 index 0000000000000..1969d9d798d23 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_statuses_schema.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +export const findRulesStatusesSchema = t.exact( + t.type({ + ids: t.array(t.string), + }) +); + +export type FindRulesStatusesSchema = t.TypeOf; + +export type FindRulesStatusesSchemaDecoded = FindRulesStatusesSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_type_dependents.test.ts new file mode 100644 index 0000000000000..e86e67e47e460 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_type_dependents.test.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FindRulesSchema } from './find_rules_schema'; +import { findRuleValidateTypeDependents } from './find_rules_type_dependents'; + +describe('find_rules_type_dependents', () => { + test('You can have an empty sort_field and empty sort_order', () => { + const schema: FindRulesSchema = {}; + const errors = findRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You can have both a sort_field and and a sort_order', () => { + const schema: FindRulesSchema = { + sort_field: 'some field', + sort_order: 'asc', + }; + const errors = findRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot have sort_field without sort_order', () => { + const schema: FindRulesSchema = { + sort_field: 'some field', + }; + const errors = findRuleValidateTypeDependents(schema); + expect(errors).toEqual([ + 'when "sort_order" and "sort_field" must exist together or not at all', + ]); + }); + + test('You cannot have sort_order without sort_field', () => { + const schema: FindRulesSchema = { + sort_order: 'asc', + }; + const errors = findRuleValidateTypeDependents(schema); + expect(errors).toEqual([ + 'when "sort_order" and "sort_field" must exist together or not at all', + ]); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.test.ts new file mode 100644 index 0000000000000..46e6ee82055a5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.test.ts @@ -0,0 +1,198 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; +import { FindRulesSchema, findRulesSchema } from './find_rules_schema'; + +describe('find_rules_schema', () => { + test('empty objects do validate', () => { + const payload: FindRulesSchema = {}; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual({ + page: 1, + per_page: 20, + }); + }); + + test('all values validate', () => { + const payload: FindRulesSchema = { + per_page: 5, + page: 1, + sort_field: 'some field', + fields: ['field 1', 'field 2'], + filter: 'some filter', + sort_order: 'asc', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('made up parameters do not validate', () => { + const payload: Partial & { madeUp: string } = { madeUp: 'invalid value' }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('per_page validates', () => { + const payload: FindRulesSchema = { + per_page: 5, + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).per_page).toEqual(payload.per_page); + }); + + test('page validates', () => { + const payload: FindRulesSchema = { + page: 5, + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).page).toEqual(payload.page); + }); + + test('sort_field validates', () => { + const payload: FindRulesSchema = { + sort_field: 'value', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).sort_field).toEqual('value'); + }); + + test('fields validates with a string', () => { + const payload: FindRulesSchema = { + fields: ['some value'], + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).fields).toEqual(payload.fields); + }); + + test('fields validates with multiple strings', () => { + const payload: FindRulesSchema = { + fields: ['some value 1', 'some value 2'], + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).fields).toEqual(payload.fields); + }); + + test('fields does not validate with a number', () => { + const payload: Omit & { fields: number } = { + fields: 5, + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "fields"']); + expect(message.schema).toEqual({}); + }); + + test('per_page has a default of 20', () => { + const payload: FindRulesSchema = {}; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).per_page).toEqual(20); + }); + + test('page has a default of 1', () => { + const payload: FindRulesSchema = {}; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).page).toEqual(1); + }); + + test('filter works with a string', () => { + const payload: FindRulesSchema = { + filter: 'some value 1', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).filter).toEqual(payload.filter); + }); + + test('filter does not work with a number', () => { + const payload: Omit & { filter: number } = { + filter: 5, + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "filter"']); + expect(message.schema).toEqual({}); + }); + + test('sort_order validates with desc and sort_field', () => { + const payload: FindRulesSchema = { + sort_order: 'desc', + sort_field: 'some field', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).sort_order).toEqual(payload.sort_order); + expect((message.schema as FindRulesSchema).sort_field).toEqual(payload.sort_field); + }); + + test('sort_order does not validate with a string other than asc and desc', () => { + const payload: Omit & { sort_order: string } = { + sort_order: 'some other string', + sort_field: 'some field', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some other string" supplied to "sort_order"', + ]); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts new file mode 100644 index 0000000000000..87076803c9582 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { queryFilter, fields, sort_field, sort_order, PerPage, Page } from '../common/schemas'; +import { DefaultPerPage } from '../types/default_per_page'; +import { DefaultPage } from '../types/default_page'; +/* eslint-enable @typescript-eslint/camelcase */ + +export const findRulesSchema = t.exact( + t.partial({ + fields, + filter: queryFilter, + per_page: DefaultPerPage, // defaults to "20" if not sent in during decode + page: DefaultPage, // defaults to "1" if not sent in during decode + sort_field, + sort_order, + }) +); + +export type FindRulesSchema = t.TypeOf; +export type FindRulesSchemaDecoded = Omit & { + per_page: PerPage; + page: Page; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_type_dependents.ts new file mode 100644 index 0000000000000..6916f102e4f57 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_type_dependents.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FindRulesSchema } from './find_rules_schema'; + +export const validateSortOrder = (find: FindRulesSchema): string[] => { + if (find.sort_order != null || find.sort_field != null) { + if (find.sort_order == null || find.sort_field == null) { + return ['when "sort_order" and "sort_field" must exist together or not at all']; + } else { + return []; + } + } else { + return []; + } +}; + +export const findRuleValidateTypeDependents = (schema: FindRulesSchema): string[] => { + return [...validateSortOrder(schema)]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts new file mode 100644 index 0000000000000..92fab202c9ddc --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ImportRulesSchema, ImportRulesSchemaDecoded } from './import_rules_schema'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +export const getImportRulesSchemaMock = (): ImportRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', +}); + +export const getImportRulesSchemaDecodedMock = (): ImportRulesSchemaDecoded => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + from: 'now-6m', + interval: '5m', + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + to: 'now', + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + rule_id: 'rule-1', + immutable: false, +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts new file mode 100644 index 0000000000000..be2c3e046fe91 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts @@ -0,0 +1,1579 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; +import { + ImportRulesSchema, + importRulesSchema, + ImportRulesSchemaDecoded, + importRulesQuerySchema, + ImportRulesQuerySchema, + importRulesPayloadSchema, + ImportRulesPayloadSchema, +} from './import_rules_schema'; +import { + getImportRulesSchemaMock, + getImportRulesSchemaDecodedMock, +} from './import_rules_schema.mock'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('import rules schema', () => { + test('empty objects do not validate', () => { + const payload: Partial = {}; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "rule_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('made up values do not validate', () => { + const payload: ImportRulesSchema & { madeUp: string } = { + ...getImportRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + interval: '5m', + index: ['index-1'], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can send in an empty array to threat', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + threat: [], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + threat: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + immutable: false, + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as valid', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + references: ['index-1'], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + references: ['index-1'], + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults references to an array if it is not sent in', () => { + const { references, ...noReferences } = getImportRulesSchemaMock(); + const decoded = importRulesSchema.decode(noReferences); + const checked = exactCheck(noReferences, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + references: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + ...getImportRulesSchemaMock(), + references: [5], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + ...getImportRulesSchemaMock(), + index: [5], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('defaults interval to 5 min', () => { + const { interval, ...noInterval } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noInterval, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { interval: expectedInterval, ...expectedNoInterval } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoInterval, + interval: '5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults max signals to 100', () => { + const { max_signals, ...noMaxSignals } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noMaxSignals, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + max_signals: expectedMaxSignals, + ...expectedNoMaxSignals + } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoMaxSignals, + max_signals: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_query type can have filters with it', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + filters: [], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getImportRulesSchemaMock(), + filters: 'some string', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some string" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('language validates with kuery', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + language: 'kuery', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + language: 'lucene', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getImportRulesSchemaMock(), + language: 'something-made-up', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + max_signals: -1, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + max_signals: 0, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + max_signals: 1, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can optionally send in an array of tags', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + tags: ['tag_1', 'tag_2'], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + tags: ['tag_1', 'tag_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of tags that are numbers', () => { + const payload: Omit & { tags: number[] } = { + ...getImportRulesSchemaMock(), + tags: [0, 1, 2], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "0" supplied to ""', + 'Invalid value "1" supplied to ""', + 'Invalid value "2" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "framework"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getImportRulesSchemaMock(), + threat: [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "tactic"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getImportRulesSchemaMock(), + threat: [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "technique"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getImportRulesSchemaMock(), + threat: [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can optionally send in an array of false positives', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + false_positives: ['false_1', 'false_2'], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + false_positives: ['false_1', 'false_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of false positives that are numbers', () => { + const payload: Omit & { false_positives: number[] } = { + ...getImportRulesSchemaMock(), + false_positives: [5, 4], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "5" supplied to ""', + 'Invalid value "4" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the immutable to a number when trying to create a rule', () => { + const payload: Omit & { immutable: number } = { + ...getImportRulesSchemaMock(), + immutable: 5, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('You can optionally set the immutable to be false', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + immutable: false, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(getImportRulesSchemaDecodedMock()); + }); + + test('You cannot set the immutable to be true', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + immutable: true, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "true" supplied to "immutable"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the immutable to be a number', () => { + const payload: Omit & { immutable: number } = { + ...getImportRulesSchemaMock(), + immutable: 5, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to 101', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + risk_score: 101, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "101" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to -1', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + risk_score: -1, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to "risk_score"']); + expect(message.schema).toEqual({}); + }); + + test('You can set the risk_score to 0', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + risk_score: 0, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + risk_score: 0, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set the risk_score to 100', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + risk_score: 100, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + risk_score: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set meta to any object you want', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getImportRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can omit the query string when filters are present', () => { + const { query, ...noQuery } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noQuery, + filters: [], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { query: expectedQuery, ...expectedNoQuery } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoQuery, + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('rule_id is required and you cannot get by with just id', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + }; + delete payload.rule_id; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "rule_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it validates with created_at, updated_at, created_by, updated_by values', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + created_at: '2020-01-09T06:15:24.749Z', + updated_at: '2020-01-09T06:15:24.749Z', + created_by: 'Braden Hassanabad', + updated_by: 'Evan Hassanabad', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + created_at: '2020-01-09T06:15:24.749Z', + updated_at: '2020-01-09T06:15:24.749Z', + created_by: 'Braden Hassanabad', + updated_by: 'Evan Hassanabad', + }; + expect(message.schema).toEqual(expected); + }); + + test('it does not validate with epoch strings for created_at', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + created_at: '1578550728650', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "1578550728650" supplied to "created_at"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it does not validate with epoch strings for updated_at', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + updated_at: '1578550728650', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "1578550728650" supplied to "updated_at"', + ]); + expect(message.schema).toEqual({}); + }); + + describe('importRulesQuerySchema', () => { + test('overwrite gets a default value of false', () => { + const payload: ImportRulesQuerySchema = {}; + + const decoded = importRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual({ + overwrite: false, + }); + }); + + test('overwrite validates with a boolean true', () => { + const payload: ImportRulesQuerySchema = { overwrite: true }; + + const decoded = importRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual({ + overwrite: true, + }); + }); + + test('overwrite does not validate with a weird string', () => { + const payload: Omit & { overwrite: string } = { + overwrite: 'invalid-string', + }; + + const decoded = importRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "invalid-string" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + }); + + describe('importRulesPayloadSchema', () => { + test('does not validate with an empty object', () => { + const payload = {}; + + const decoded = importRulesPayloadSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "file"', + ]); + expect(message.schema).toEqual({}); + }); + + test('does not validate with a made string', () => { + const payload: Omit & { madeUpKey: string } = { + madeUpKey: 'madeupstring', + }; + + const decoded = importRulesPayloadSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "file"', + ]); + expect(message.schema).toEqual({}); + }); + + test('does validate with a file object', () => { + const payload: ImportRulesPayloadSchema = { file: {} }; + + const decoded = importRulesPayloadSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...noFrom } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noFrom, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { from: expectedFrom, ...expectedNoFrom } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoFrom, + from: 'now-6m', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...noTo } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noTo, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { to: expectedTo, ...expectedNoTo } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoTo, + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + ...getImportRulesSchemaMock(), + severity: 'junk', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...noActions } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noActions, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { actions: expectedActions, ...expectedNoActions } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoActions, + actions: [], + }; + expect(message.schema).toEqual(expected); + }); + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "undefined" supplied to "id"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "action_type_id"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', params: {} }], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...noThrottle } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noThrottle, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { throttle: expectedThrottle, ...expectedNoThrottle } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoThrottle, + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + describe('note', () => { + test('You can set note to a string', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + note: '# documentation markdown here', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + note: '# documentation markdown here', + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set note to an empty string', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + note: '', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + note: '', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create note as an object', () => { + const payload: Omit & { note: {} } = { + ...getImportRulesSchemaMock(), + note: { + somethingHere: 'something else', + }, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + // TODO: Fix/Change the formatErrors to be better able to handle objects + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + references: [], + actions: [], + enabled: true, + false_positives: [], + immutable: false, + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts new file mode 100644 index 0000000000000..a2110263e8e51 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts @@ -0,0 +1,180 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + RuleId, + index, + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + MaxSignals, + name, + severity, + Tags, + To, + type, + Threat, + ThrottleOrNull, + note, + Version, + References, + Actions, + Enabled, + FalsePositives, + From, + Interval, + language, + query, + rule_id, + id, + created_at, + updated_at, + created_by, + updated_by, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultStringArray } from '../types/default_string_array'; +import { DefaultActionsArray } from '../types/default_actions_array'; +import { DefaultBooleanTrue } from '../types/default_boolean_true'; +import { DefaultFromString } from '../types/default_from_string'; +import { DefaultIntervalString } from '../types/default_interval_string'; +import { DefaultMaxSignalsNumber } from '../types/default_max_signals_number'; +import { DefaultToString } from '../types/default_to_string'; +import { DefaultThreatArray } from '../types/default_threat_array'; +import { DefaultThrottleNull } from '../types/default_throttle_null'; +import { DefaultVersionNumber } from '../types/default_version_number'; +import { ListsDefaultArray, ListsDefaultArraySchema } from '../types/lists_default_array'; +import { OnlyFalseAllowed } from '../types/only_false_allowed'; +import { DefaultStringBooleanFalse } from '../types/default_string_boolean_false'; + +/** + * Differences from this and the createRulesSchema are + * - rule_id is required + * - id is optional (but ignored in the import code - rule_id is exclusively used for imports) + * - immutable is optional but if it is any value other than false it will be rejected + * - created_at is optional (but ignored in the import code) + * - updated_at is optional (but ignored in the import code) + * - created_by is optional (but ignored in the import code) + * - updated_by is optional (but ignored in the import code) + */ +export const importRulesSchema = t.intersection([ + t.exact( + t.type({ + description, + risk_score, + name, + severity, + type, + rule_id, + }) + ), + t.exact( + t.partial({ + id, // defaults to undefined if not set during decode + actions: DefaultActionsArray, // defaults to empty actions array if not set during decode + anomaly_threshold, // defaults to undefined if not set during decode + enabled: DefaultBooleanTrue, // defaults to true if not set during decode + false_positives: DefaultStringArray, // defaults to empty string array if not set during decode + filters, // defaults to undefined if not set during decode + from: DefaultFromString, // defaults to "now-6m" if not set during decode + index, // defaults to undefined if not set during decode + immutable: OnlyFalseAllowed, // defaults to "false" if not set during decode + interval: DefaultIntervalString, // defaults to "5m" if not set during decode + query, // defaults to undefined if not set during decode + language, // defaults to undefined if not set during decode + // TODO: output_index: This should be removed eventually + output_index, // defaults to "undefined" if not set during decode + saved_id, // defaults to "undefined" if not set during decode + timeline_id, // defaults to "undefined" if not set during decode + timeline_title, // defaults to "undefined" if not set during decode + meta, // defaults to "undefined" if not set during decode + machine_learning_job_id, // defaults to "undefined" if not set during decode + max_signals: DefaultMaxSignalsNumber, // defaults to DEFAULT_MAX_SIGNALS (100) if not set during decode + tags: DefaultStringArray, // defaults to empty string array if not set during decode + to: DefaultToString, // defaults to "now" if not set during decode + threat: DefaultThreatArray, // defaults to empty array if not set during decode + throttle: DefaultThrottleNull, // defaults to "null" if not set during decode + references: DefaultStringArray, // defaults to empty array of strings if not set during decode + note, // defaults to "undefined" if not set during decode + version: DefaultVersionNumber, // defaults to 1 if not set during decode + exceptions_list: ListsDefaultArray, // defaults to empty array if not set during decode + created_at, // defaults "undefined" if not set during decode + updated_at, // defaults "undefined" if not set during decode + created_by, // defaults "undefined" if not set during decode + updated_by, // defaults "undefined" if not set during decode + }) + ), +]); + +export type ImportRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type ImportRulesSchemaDecoded = Omit< + ImportRulesSchema, + | 'references' + | 'actions' + | 'enabled' + | 'false_positives' + | 'from' + | 'interval' + | 'max_signals' + | 'tags' + | 'to' + | 'threat' + | 'throttle' + | 'version' + | 'exceptions_list' + | 'rule_id' + | 'immutable' +> & { + references: References; + actions: Actions; + enabled: Enabled; + false_positives: FalsePositives; + from: From; + interval: Interval; + max_signals: MaxSignals; + tags: Tags; + to: To; + threat: Threat; + throttle: ThrottleOrNull; + version: Version; + exceptions_list: ListsDefaultArraySchema; + rule_id: RuleId; + immutable: false; +}; + +export const importRulesQuerySchema = t.exact( + t.partial({ + overwrite: DefaultStringBooleanFalse, + }) +); + +export type ImportRulesQuerySchema = t.TypeOf; +export type ImportRulesQuerySchemaDecoded = Omit & { + overwrite: boolean; +}; + +export const importRulesPayloadSchema = t.exact( + t.type({ + file: t.object, + }) +); + +export type ImportRulesPayloadSchema = t.TypeOf; + +export type ImportRulesPayloadSchemaDecoded = ImportRulesPayloadSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..f9b989c81e533 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.test.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getImportRulesSchemaMock } from './import_rules_schema.mock'; +import { ImportRulesSchema } from './import_rules_schema'; +import { importRuleValidateTypeDependents } from './import_rules_type_dependents'; + +describe('import_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and will not validate without out', () => { + const schema: ImportRulesSchema = { ...getImportRulesSchemaMock(), type: 'saved_query' }; + delete schema.saved_id; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "type" is "saved_query", "saved_id" is required']); + }); + + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.ts new file mode 100644 index 0000000000000..59191a4fe3121 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.ts @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ImportRulesSchema } from './import_rules_schema'; + +export const validateAnomalyThreshold = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.anomaly_threshold == null) { + return ['when "type" is "machine_learning" anomaly_threshold is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateQuery = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateSavedId = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'saved_query') { + if (rule.saved_id == null) { + return ['when "type" is "saved_query", "saved_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateMachineLearningJobId = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.machine_learning_job_id == null) { + return ['when "type" is "machine_learning", "machine_learning_job_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: ImportRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: ImportRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const importRuleValidateTypeDependents = (schema: ImportRulesSchema): string[] => { + return [ + ...validateAnomalyThreshold(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateSavedId(schema), + ...validateMachineLearningJobId(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rule_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rule_type_dependents.test.ts new file mode 100644 index 0000000000000..a388e69332072 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rule_type_dependents.test.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getPatchRulesSchemaMock } from './patch_rules_schema.mock'; +import { PatchRulesSchema } from './patch_rules_schema'; +import { patchRuleValidateTypeDependents } from './patch_rules_type_dependents'; + +describe('patch_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); + + test('You cannot have both an id and a rule_id', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + id: 'some-id', + rule_id: 'some-rule-id', + }; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['both "id" and "rule_id" cannot exist, choose one or the other']); + }); + + test('You must set either an id or a rule_id', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + }; + delete schema.id; + delete schema.rule_id; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['either "id" or "rule_id" must be set']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.test.ts new file mode 100644 index 0000000000000..7b86c02e5c475 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.test.ts @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { patchRulesBulkSchema, PatchRulesBulkSchema } from './patch_rules_bulk_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight } from '../../../test_utils'; +import { formatErrors } from '../../../format_errors'; +import { PatchRulesSchema } from './patch_rules_schema'; + +// only the basics of testing are here. +// see: patch_rules_schema.test.ts for the bulk of the validation tests +// this just wraps patchRulesSchema in an array +describe('patch_rules_bulk_schema', () => { + test('can take an empty array and validate it', () => { + const payload: PatchRulesBulkSchema = []; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(output.errors).toEqual([]); + expect(output.schema).toEqual([]); + }); + + test('made up values do not validate for a single element', () => { + const payload: Array<{ madeUp: string }> = [{ madeUp: 'hi' }]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUp"']); + expect(output.schema).toEqual({}); + }); + + test('single array of [id] does validate', () => { + const payload: PatchRulesBulkSchema = [{ id: '4125761e-51da-4de9-a0c8-42824f532ddb' }]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('two arrays of [id] validate', () => { + const payload: PatchRulesBulkSchema = [ + { id: '4125761e-51da-4de9-a0c8-42824f532ddb' }, + { id: '192f403d-b285-4251-9e8b-785fcfcf22e8' }, + ]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('can set "note" to be a string', () => { + const payload: PatchRulesBulkSchema = [ + { id: '4125761e-51da-4de9-a0c8-42824f532ddb' }, + { note: 'hi' }, + ]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('can set "note" to be an empty string', () => { + const payload: PatchRulesBulkSchema = [ + { id: '4125761e-51da-4de9-a0c8-42824f532ddb' }, + { note: '' }, + ]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('cannot set "note" to be anything other than a string', () => { + const payload: Array & { note?: object }> = [ + { id: '4125761e-51da-4de9-a0c8-42824f532ddb' }, + { note: { someprop: 'some value here' } }, + ]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + // TODO: Fix the formatter to give something better than [object Object] + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(output.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.ts new file mode 100644 index 0000000000000..272e36751e37b --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +import { patchRulesSchema, PatchRulesSchemaDecoded } from './patch_rules_schema'; + +export const patchRulesBulkSchema = t.array(patchRulesSchema); +export type PatchRulesBulkSchema = t.TypeOf; + +export type PatchRulesBulkSchemaDecoded = PatchRulesSchemaDecoded[]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.mock.ts new file mode 100644 index 0000000000000..7b4f632cdebf0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.mock.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PatchRulesSchema, PatchRulesSchemaDecoded } from './patch_rules_schema'; + +export const getPatchRulesSchemaMock = (): PatchRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', +}); + +export const getPatchRulesSchemaDecodedMock = (): PatchRulesSchemaDecoded => + getPatchRulesSchemaMock(); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts new file mode 100644 index 0000000000000..921e07a29609c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts @@ -0,0 +1,1153 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { patchRulesSchema, PatchRulesSchema, PatchRulesSchemaDecoded } from './patch_rules_schema'; +import { getPatchRulesSchemaMock, getPatchRulesSchemaDecodedMock } from './patch_rules_schema.mock'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('patch_rules_schema', () => { + test('made up values do not validate', () => { + const payload: PatchRulesSchema & { madeUp: string } = { + ...getPatchRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[id] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, risk_score] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + risk_score: 10, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + risk_score: 10, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, name] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, name] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, name, severity] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, name, severity] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, name, severity, type] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, name, severity, type] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, name, severity, type, interval] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, index, name, severity, interval, type, query, language] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, index, name, severity, type, filters] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + filters: [], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, type, filters] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + filters: [], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as a valid value to patch with', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: ['index-1'], + query: 'some query', + language: 'kuery', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: ['index-1'], + query: 'some query', + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('does not default references to an array', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).references).toEqual(undefined); + }); + + test('does not default interval', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).interval).toEqual(undefined); + }); + + test('does not default max_signals', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).max_signals).toEqual(undefined); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + references: [5], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "references"']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + index: [5], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('saved_id is not required when type is saved_query and will validate without it', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + type: 'saved_query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + type: 'saved_query', + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_id validates with type:saved_query', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + type: 'saved_query', + saved_id: 'some id', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + type: 'saved_query', + saved_id: 'some id', + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_query type can have filters with it', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + saved_id: 'some id', + filters: [], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + saved_id: 'some id', + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with kuery', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + language: 'kuery', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + query: 'some query', + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + language: 'lucene', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + query: 'some query', + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getPatchRulesSchemaMock(), + query: 'some query', + language: 'something-made-up', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + max_signals: -1, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "-1" supplied to "max_signals"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + max_signals: 0, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to "max_signals"']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + max_signals: 1, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + query: 'some query', + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('meta can be patched', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + meta: { whateverYouWant: 'anything_at_all' }, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + meta: { whateverYouWant: 'anything_at_all' }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot patch meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getPatchRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getPatchRulesSchemaMock(), + filters: 'should not work', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('threat is not defaulted to empty array on patch', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).threat).toEqual(undefined); + }); + + test('threat is not defaulted to undefined on patch with empty array', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat: [], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).threat).toEqual([]); + }); + + test('threat is valid when updated with all sub-objects', () => { + const threat: PatchRulesSchema['threat'] = [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ]; + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('threat is invalid when updated with missing property framework', () => { + const threat: Omit = [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ]; + const payload: Omit = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "threat,framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('threat is invalid when updated with missing tactic sub-object', () => { + const threat: Omit = [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ]; + + const payload: Omit = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "threat,tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('threat is invalid when updated with missing technique', () => { + const threat: Omit = [ + { + framework: 'fake', + tactic: { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + }, + ]; + + const payload: Omit = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "threat,technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_id: 'some-id', + timeline_title: 'some-title', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + timeline_id: 'some-id', + timeline_title: 'some-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + severity: 'junk', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + describe('note', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, note] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + note: '# some documentation markdown', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + note: '# some documentation markdown', + }; + expect(message.schema).toEqual(expected); + }); + + test('note can be patched', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + note: '# new documentation markdown', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + note: '# new documentation markdown', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot patch note as an object', () => { + const payload: Omit & { note: object } = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + note: { + someProperty: 'something else here', + }, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + // TODO: Change the formatter to output something more readable than [object Object] + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + }); + + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getPatchRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "actions,group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getPatchRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "actions,id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getPatchRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "actions,params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getPatchRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "actions,action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts new file mode 100644 index 0000000000000..605e0272bbb4c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + index, + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + rule_id, + name, + severity, + type, + note, + version, + actions, + false_positives, + interval, + max_signals, + from, + enabled, + tags, + threat, + throttle, + references, + to, + language, + listAndOrUndefined, + query, + id, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +/** + * All of the patch elements should default to undefined if not set + */ +export const patchRulesSchema = t.exact( + t.partial({ + description, + risk_score, + name, + severity, + type, + id, + actions, + anomaly_threshold, + enabled, + false_positives, + filters, + from, + rule_id, + index, + interval, + query, + language, + // TODO: output_index: This should be removed eventually + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + max_signals, + tags, + to, + threat, + throttle, + references, + note, + version, + exceptions_list: listAndOrUndefined, + }) +); + +export type PatchRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type PatchRulesSchemaDecoded = PatchRulesSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_type_dependents.ts new file mode 100644 index 0000000000000..554cdb822762f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_type_dependents.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PatchRulesSchema } from './patch_rules_schema'; + +export const validateQuery = (rule: PatchRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: PatchRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: PatchRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: PatchRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateId = (rule: PatchRulesSchema): string[] => { + if (rule.id != null && rule.rule_id != null) { + return ['both "id" and "rule_id" cannot exist, choose one or the other']; + } else if (rule.id == null && rule.rule_id == null) { + return ['either "id" or "rule_id" must be set']; + } else { + return []; + } +}; + +export const patchRuleValidateTypeDependents = (schema: PatchRulesSchema): string[] => { + return [ + ...validateId(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.test.ts new file mode 100644 index 0000000000000..4728f7dd84cbd --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.test.ts @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { queryRulesBulkSchema, QueryRulesBulkSchema } from './query_rules_bulk_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight } from '../../../test_utils'; +import { formatErrors } from '../../../format_errors'; + +// only the basics of testing are here. +// see: query_rules_schema.test.ts for the bulk of the validation tests +// this just wraps queryRulesSchema in an array +describe('query_rules_bulk_schema', () => { + test('can take an empty array and validate it', () => { + const payload: QueryRulesBulkSchema = []; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([]); + }); + + test('non uuid being supplied to id does not validate', () => { + const payload: QueryRulesBulkSchema = [ + { + id: '1', + }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['Invalid value "1" supplied to "id"']); + expect(output.schema).toEqual({}); + }); + + test('both rule_id and id being supplied do validate', () => { + const payload: QueryRulesBulkSchema = [ + { + rule_id: '1', + id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f', + }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('only id validates with two elements', () => { + const payload: QueryRulesBulkSchema = [ + { id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }, + { id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('only rule_id validates', () => { + const payload: QueryRulesBulkSchema = [{ rule_id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('only rule_id validates with two elements', () => { + const payload: QueryRulesBulkSchema = [ + { rule_id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }, + { rule_id: '2' }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('both id and rule_id validates with two separate elements', () => { + const payload: QueryRulesBulkSchema = [ + { id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }, + { rule_id: '2' }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.ts new file mode 100644 index 0000000000000..a5611bdc2f12f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +import { queryRulesSchema, QueryRulesSchemaDecoded } from './query_rules_schema'; + +export const queryRulesBulkSchema = t.array(queryRulesSchema); +export type QueryRulesBulkSchema = t.TypeOf; + +export type QueryRulesBulkSchemaDecoded = QueryRulesSchemaDecoded[]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.test.ts new file mode 100644 index 0000000000000..c9cb6f310961a --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.test.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { queryRulesSchema, QueryRulesSchema } from './query_rules_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('query_rules_schema', () => { + test('empty objects do validate', () => { + const payload: Partial = {}; + + const decoded = queryRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts similarity index 54% rename from x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts index 86a731699d1ea..cb8f21128b052 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts @@ -4,13 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import Joi from 'joi'; +import * as t from 'io-ts'; /* eslint-disable @typescript-eslint/camelcase */ -import { rule_id, id } from './schemas'; +import { rule_id, id } from '../common/schemas'; /* eslint-enable @typescript-eslint/camelcase */ -export const queryRulesSchema = Joi.object({ - rule_id, - id, -}).xor('id', 'rule_id'); +export const queryRulesSchema = t.exact( + t.partial({ + rule_id, + id, + }) +); + +export type QueryRulesSchema = t.TypeOf; +export type QueryRulesSchemaDecoded = QueryRulesSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..ad7f368d4eede --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.test.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { QueryRulesSchema } from './query_rules_schema'; +import { queryRuleValidateTypeDependents } from './query_rules_type_dependents'; + +describe('query_rules_type_dependents', () => { + test('You cannot have both an id and a rule_id', () => { + const schema: QueryRulesSchema = { + id: 'some-id', + rule_id: 'some-rule-id', + }; + const errors = queryRuleValidateTypeDependents(schema); + expect(errors).toEqual(['both "id" and "rule_id" cannot exist, choose one or the other']); + }); + + test('You must set either an id or a rule_id', () => { + const schema: QueryRulesSchema = {}; + const errors = queryRuleValidateTypeDependents(schema); + expect(errors).toEqual(['either "id" or "rule_id" must be set']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.ts new file mode 100644 index 0000000000000..f3e602dff0f06 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { QueryRulesSchema } from './query_rules_schema'; + +export const validateId = (rule: QueryRulesSchema): string[] => { + if (rule.id != null && rule.rule_id != null) { + return ['both "id" and "rule_id" cannot exist, choose one or the other']; + } else if (rule.id == null && rule.rule_id == null) { + return ['either "id" or "rule_id" must be set']; + } else { + return []; + } +}; + +export const queryRuleValidateTypeDependents = (schema: QueryRulesSchema): string[] => { + return [...validateId(schema)]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts new file mode 100644 index 0000000000000..23e5fa7e721b0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { QuerySignalsSchema, querySignalsSchema } from './query_signals_index_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('query, aggs, size, _source and track_total_hits on signals index', () => { + test('query, aggs, size, _source and track_total_hits simultaneously', () => { + const payload: QuerySignalsSchema = { + query: {}, + aggs: {}, + size: 1, + track_total_hits: true, + _source: ['field'], + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('query, only', () => { + const payload: QuerySignalsSchema = { + query: {}, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('aggs only', () => { + const payload: QuerySignalsSchema = { + aggs: {}, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('size only', () => { + const payload: QuerySignalsSchema = { + size: 1, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('track_total_hits only', () => { + const payload: QuerySignalsSchema = { + track_total_hits: true, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('_source only', () => { + const payload: QuerySignalsSchema = { + _source: ['field'], + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts new file mode 100644 index 0000000000000..3a050c9208f77 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { PositiveIntegerGreaterThanZero } from '../types/positive_integer_greater_than_zero'; + +export const querySignalsSchema = t.exact( + t.partial({ + query: t.object, + aggs: t.object, + size: PositiveIntegerGreaterThanZero, + track_total_hits: t.boolean, + _source: t.array(t.string), + }) +); + +export type QuerySignalsSchema = t.TypeOf; +export type QuerySignalsSchemaDecoded = QuerySignalsSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.test.ts new file mode 100644 index 0000000000000..dc889892ba83e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.test.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { setSignalsStatusSchema, SetSignalsStatusSchema } from './set_signal_status_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('set signal status schema', () => { + test('signal_ids and status is valid', () => { + const payload: SetSignalsStatusSchema = { + signal_ids: ['somefakeid'], + status: 'open', + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('query and status is valid', () => { + const payload: SetSignalsStatusSchema = { + query: {}, + status: 'open', + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('signal_ids and missing status is invalid', () => { + const payload: Omit = { + signal_ids: ['somefakeid'], + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "status"', + ]); + expect(message.schema).toEqual({}); + }); + + test('query and missing status is invalid', () => { + const payload: Omit = { + query: {}, + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "status"', + ]); + expect(message.schema).toEqual({}); + }); + + test('signal_ids is present but status has wrong value', () => { + const payload: Omit & { status: 'fakeVal' } = { + query: {}, + status: 'fakeVal', + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "fakeVal" supplied to "status"', + ]); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts new file mode 100644 index 0000000000000..0e922aeaf8cdf --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { signal_ids, signal_status_query, status } from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +export const setSignalsStatusSchema = t.intersection([ + t.type({ + status, + }), + t.partial({ + signal_ids, + query: signal_status_query, + }), +]); + +export type SetSignalsStatusSchema = t.TypeOf; +export type SetSignalsStatusSchemaDecoded = SetSignalsStatusSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.test.ts new file mode 100644 index 0000000000000..b79af2fef5c97 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.test.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { setSignalStatusValidateTypeDependents } from './set_signal_status_type_dependents'; +import { SetSignalsStatusSchema } from './set_signal_status_schema'; + +describe('update_rules_type_dependents', () => { + test('You can have just a "signals_id"', () => { + const schema: SetSignalsStatusSchema = { + status: 'open', + signal_ids: ['some-id'], + }; + const errors = setSignalStatusValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You can have just a "query"', () => { + const schema: SetSignalsStatusSchema = { + status: 'open', + query: {}, + }; + const errors = setSignalStatusValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot have both a "signals_id" and a "query"', () => { + const schema: SetSignalsStatusSchema = { + status: 'open', + query: {}, + signal_ids: ['some-id'], + }; + const errors = setSignalStatusValidateTypeDependents(schema); + expect(errors).toEqual(['both "signal_ids" and "query" cannot exist, choose one or the other']); + }); + + test('You must set either an "signals_id" and a "query"', () => { + const schema: SetSignalsStatusSchema = { + status: 'open', + }; + const errors = setSignalStatusValidateTypeDependents(schema); + expect(errors).toEqual(['either "signal_ids" or "query" must be set']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.ts new file mode 100644 index 0000000000000..c495860fa72bf --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SetSignalsStatusSchema } from './set_signal_status_schema'; + +export const validateId = (signalStatus: SetSignalsStatusSchema): string[] => { + if (signalStatus.signal_ids != null && signalStatus.query != null) { + return ['both "signal_ids" and "query" cannot exist, choose one or the other']; + } else if (signalStatus.signal_ids == null && signalStatus.query == null) { + return ['either "signal_ids" or "query" must be set']; + } else { + return []; + } +}; + +export const setSignalStatusValidateTypeDependents = (schema: SetSignalsStatusSchema): string[] => { + return [...validateId(schema)]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts new file mode 100644 index 0000000000000..edc652ce3b3f4 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts @@ -0,0 +1,277 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { updateRulesBulkSchema, UpdateRulesBulkSchema } from './update_rules_bulk_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight } from '../../../test_utils'; +import { formatErrors } from '../../../format_errors'; +import { + getUpdateRulesSchemaMock, + getUpdateRulesSchemaDecodedMock, +} from './update_rules_schema.mock'; +import { UpdateRulesSchema } from './update_rules_schema'; + +// only the basics of testing are here. +// see: update_rules_schema.test.ts for the bulk of the validation tests +// this just wraps updateRulesSchema in an array +describe('update_rules_bulk_schema', () => { + test('can take an empty array and validate it', () => { + const payload: UpdateRulesBulkSchema = []; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(output.errors).toEqual([]); + expect(output.schema).toEqual([]); + }); + + test('made up values do not validate for a single element', () => { + const payload: Array<{ madeUp: string }> = [{ madeUp: 'hi' }]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(output.schema).toEqual({}); + }); + + test('single array element does validate', () => { + const payload: UpdateRulesBulkSchema = [getUpdateRulesSchemaMock()]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([getUpdateRulesSchemaDecodedMock()]); + }); + + test('two array elements do validate', () => { + const payload: UpdateRulesBulkSchema = [getUpdateRulesSchemaMock(), getUpdateRulesSchemaMock()]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([ + getUpdateRulesSchemaDecodedMock(), + getUpdateRulesSchemaDecodedMock(), + ]); + }); + + test('single array element with a missing value (risk_score) will not validate', () => { + const singleItem = getUpdateRulesSchemaMock(); + delete singleItem.risk_score; + const payload: UpdateRulesBulkSchema = [singleItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is valid but the second is invalid (risk_score) will not validate', () => { + const singleItem = getUpdateRulesSchemaMock(); + const secondItem = getUpdateRulesSchemaMock(); + delete secondItem.risk_score; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is invalid (risk_score) but the second is valid will not validate', () => { + const singleItem = getUpdateRulesSchemaMock(); + const secondItem = getUpdateRulesSchemaMock(); + delete singleItem.risk_score; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where both are invalid (risk_score) will not validate', () => { + const singleItem = getUpdateRulesSchemaMock(); + const secondItem = getUpdateRulesSchemaMock(); + delete singleItem.risk_score; + delete secondItem.risk_score; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is invalid (extra key and value) but the second is valid will not validate', () => { + const singleItem: UpdateRulesSchema & { madeUpValue: string } = { + ...getUpdateRulesSchemaMock(), + madeUpValue: 'something', + }; + const secondItem = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the second is invalid (extra key and value) but the first is valid will not validate', () => { + const singleItem: UpdateRulesSchema = getUpdateRulesSchemaMock(); + const secondItem: UpdateRulesSchema & { madeUpValue: string } = { + ...getUpdateRulesSchemaMock(), + madeUpValue: 'something', + }; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('two array elements where both are invalid (extra key and value) will not validate', () => { + const singleItem: UpdateRulesSchema & { madeUpValue: string } = { + ...getUpdateRulesSchemaMock(), + madeUpValue: 'something', + }; + const secondItem: UpdateRulesSchema & { madeUpValue: string } = { + ...getUpdateRulesSchemaMock(), + madeUpValue: 'something', + }; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue,madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...withoutFrom } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [withoutFrom]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as UpdateRulesBulkSchema)[0].from).toEqual('now-6m'); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...withoutTo } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [withoutTo]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as UpdateRulesBulkSchema)[0].to).toEqual('now'); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const badSeverity = { ...getUpdateRulesSchemaMock(), severity: 'madeup' }; + const payload = [badSeverity]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['Invalid value "madeup" supplied to "severity"']); + expect(output.schema).toEqual({}); + }); + + test('You can set "note" to a string', () => { + const payload: UpdateRulesBulkSchema = [ + { ...getUpdateRulesSchemaMock(), note: '# test markdown' }, + ]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([ + { ...getUpdateRulesSchemaDecodedMock(), note: '# test markdown' }, + ]); + }); + + test('You can set "note" to an empty string', () => { + const payload: UpdateRulesBulkSchema = [{ ...getUpdateRulesSchemaMock(), note: '' }]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([{ ...getUpdateRulesSchemaDecodedMock(), note: '' }]); + }); + + test('You can set "note" to anything other than string', () => { + const payload = [ + { + ...getUpdateRulesSchemaMock(), + note: { + something: 'some object', + }, + }, + ]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + // TODO: We should change the formatter used to better print objects + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(output.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...withoutActions } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [withoutActions]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as UpdateRulesBulkSchema)[0].actions).toEqual([]); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...withoutThrottle } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [withoutThrottle]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as UpdateRulesBulkSchema)[0].throttle).toEqual(null); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.ts new file mode 100644 index 0000000000000..429103c7df13e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +import { updateRulesSchema, UpdateRulesSchemaDecoded } from './update_rules_schema'; + +export const updateRulesBulkSchema = t.array(updateRulesSchema); +export type UpdateRulesBulkSchema = t.TypeOf; + +export type UpdateRulesBulkSchemaDecoded = UpdateRulesSchemaDecoded[]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.mock.ts new file mode 100644 index 0000000000000..b8a99115ba7d5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.mock.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UpdateRulesSchema, UpdateRulesSchemaDecoded } from './update_rules_schema'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +export const getUpdateRulesSchemaMock = (): UpdateRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', +}); + +export const getUpdateRulesSchemaDecodedMock = (): UpdateRulesSchemaDecoded => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + from: 'now-6m', + interval: '5m', + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + to: 'now', + threat: [], + throttle: null, + exceptions_list: [], + rule_id: 'rule-1', +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts new file mode 100644 index 0000000000000..e60522e1964f4 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts @@ -0,0 +1,1387 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + updateRulesSchema, + UpdateRulesSchema, + UpdateRulesSchemaDecoded, +} from './update_rules_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { + getUpdateRulesSchemaMock, + getUpdateRulesSchemaDecodedMock, +} from './update_rules_schema.mock'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('update rules schema', () => { + test('empty objects do not validate', () => { + const payload: Partial = {}; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('made up values do not validate', () => { + const payload: UpdateRulesSchema & { madeUp: string } = { + ...getUpdateRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + interval: '5m', + index: ['index-1'], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('You can send in an empty array to threat', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + threat: [], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + threat: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as valid', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + references: ['index-1'], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + references: ['index-1'], + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults references to an array if it is not sent in', () => { + const { references, ...noReferences } = getUpdateRulesSchemaMock(); + const decoded = updateRulesSchema.decode(noReferences); + const checked = exactCheck(noReferences, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + references: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + ...getUpdateRulesSchemaMock(), + references: [5], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + ...getUpdateRulesSchemaMock(), + index: [5], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('defaults interval to 5 min', () => { + const { interval, ...noInterval } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noInterval, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { interval: expectedInterval, ...expectedNoInterval } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoInterval, + interval: '5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults max signals to 100', () => { + const { max_signals, ...noMaxSignals } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noMaxSignals, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + max_signals: expectedMaxSignals, + ...expectedNoMaxSignals + } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoMaxSignals, + max_signals: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_query type can have filters with it', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + filters: [], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getUpdateRulesSchemaMock(), + filters: 'some string', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some string" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('language validates with kuery', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + language: 'kuery', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + language: 'lucene', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getUpdateRulesSchemaMock(), + language: 'something-made-up', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + max_signals: -1, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + max_signals: 0, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + max_signals: 1, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can optionally send in an array of tags', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + tags: ['tag_1', 'tag_2'], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + tags: ['tag_1', 'tag_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of tags that are numbers', () => { + const payload: Omit & { tags: number[] } = { + ...getUpdateRulesSchemaMock(), + tags: [0, 1, 2], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "0" supplied to ""', + 'Invalid value "1" supplied to ""', + 'Invalid value "2" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "framework"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getUpdateRulesSchemaMock(), + threat: [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "tactic"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getUpdateRulesSchemaMock(), + threat: [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "technique"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getUpdateRulesSchemaMock(), + threat: [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can optionally send in an array of false positives', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + false_positives: ['false_1', 'false_2'], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + false_positives: ['false_1', 'false_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of false positives that are numbers', () => { + const payload: Omit & { false_positives: number[] } = { + ...getUpdateRulesSchemaMock(), + false_positives: [5, 4], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "5" supplied to ""', + 'Invalid value "4" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the immutable to a number when trying to update a rule', () => { + const payload: Omit & { immutable: number } = { + ...getUpdateRulesSchemaMock(), + immutable: 5, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to 101', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + risk_score: 101, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "101" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to -1', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + risk_score: -1, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to "risk_score"']); + expect(message.schema).toEqual({}); + }); + + test('You can set the risk_score to 0', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + risk_score: 0, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + risk_score: 0, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set the risk_score to 100', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + risk_score: 100, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + risk_score: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set meta to any object you want', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot update meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getUpdateRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can omit the query string when filters are present', () => { + const { query, ...noQuery } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noQuery, + filters: [], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { query: expectedQuery, ...expectedNoQuery } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoQuery, + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...noFrom } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noFrom, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { from: expectedFrom, ...expectedNoFrom } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoFrom, + from: 'now-6m', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...noTo } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noTo, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { to: expectedTo, ...expectedNoTo } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoTo, + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + ...getUpdateRulesSchemaMock(), + severity: 'junk', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...noActions } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noActions, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { actions: expectedActions, ...expectedNoActions } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoActions, + actions: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "undefined" supplied to "id"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "action_type_id"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', params: {} }], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...noThrottle } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noThrottle, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { throttle: expectedThrottle, ...expectedNoThrottle } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoThrottle, + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + describe('note', () => { + test('You can set note to a string', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + note: '# documentation markdown here', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + note: '# documentation markdown here', + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set note to an empty string', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + note: '', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + note: '', + }; + expect(message.schema).toEqual(expected); + }); + + // Note: If you're looking to remove `note`, omit `note` entirely + test('You cannot set note to null', () => { + const payload: Omit & { note: null } = { + ...getUpdateRulesSchemaMock(), + note: null, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "null" supplied to "note"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot set note as an object', () => { + const payload: Omit & { note: {} } = { + ...getUpdateRulesSchemaMock(), + note: { + somethingHere: 'something else', + }, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + // TODO: Fix/Change the formatErrors to be better able to handle objects + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts new file mode 100644 index 0000000000000..504233f95986f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + RuleId, + index, + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + rule_id, + MaxSignals, + name, + severity, + Tags, + To, + type, + Threat, + ThrottleOrNull, + note, + version, + References, + Actions, + Enabled, + FalsePositives, + From, + Interval, + language, + query, + id, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultStringArray } from '../types/default_string_array'; +import { DefaultActionsArray } from '../types/default_actions_array'; +import { DefaultBooleanTrue } from '../types/default_boolean_true'; +import { DefaultFromString } from '../types/default_from_string'; +import { DefaultIntervalString } from '../types/default_interval_string'; +import { DefaultMaxSignalsNumber } from '../types/default_max_signals_number'; +import { DefaultToString } from '../types/default_to_string'; +import { DefaultThreatArray } from '../types/default_threat_array'; +import { DefaultThrottleNull } from '../types/default_throttle_null'; +import { ListsDefaultArray, ListsDefaultArraySchema } from '../types/lists_default_array'; + +/** + * This almost identical to the create_rules_schema except for a few details. + * - The version will not be defaulted to a 1. If it is not given then its default will become the previous version auto-incremented + * This does break idempotency slightly as calls repeatedly without it will increment the number. If the version number is passed in + * this will update the rule's version number. + * - id is on here because you can pass in an id to update using it instead of rule_id. + */ +export const updateRulesSchema = t.intersection([ + t.exact( + t.type({ + description, + risk_score, + name, + severity, + type, + }) + ), + t.exact( + t.partial({ + id, // defaults to "undefined" if not set during decode + actions: DefaultActionsArray, // defaults to empty actions array if not set during decode + anomaly_threshold, // defaults to undefined if not set during decode + enabled: DefaultBooleanTrue, // defaults to true if not set during decode + false_positives: DefaultStringArray, // defaults to empty string array if not set during decode + filters, // defaults to undefined if not set during decode + from: DefaultFromString, // defaults to "now-6m" if not set during decode + rule_id, // defaults to "undefined" if not set during decode + index, // defaults to undefined if not set during decode + interval: DefaultIntervalString, // defaults to "5m" if not set during decode + query, // defaults to undefined if not set during decode + language, // defaults to undefined if not set during decode + // TODO: output_index: This should be removed eventually + output_index, // defaults to "undefined" if not set during decode + saved_id, // defaults to "undefined" if not set during decode + timeline_id, // defaults to "undefined" if not set during decode + timeline_title, // defaults to "undefined" if not set during decode + meta, // defaults to "undefined" if not set during decode + machine_learning_job_id, // defaults to "undefined" if not set during decode + max_signals: DefaultMaxSignalsNumber, // defaults to DEFAULT_MAX_SIGNALS (100) if not set during decode + tags: DefaultStringArray, // defaults to empty string array if not set during decode + to: DefaultToString, // defaults to "now" if not set during decode + threat: DefaultThreatArray, // defaults to empty array if not set during decode + throttle: DefaultThrottleNull, // defaults to "null" if not set during decode + references: DefaultStringArray, // defaults to empty array of strings if not set during decode + note, // defaults to "undefined" if not set during decode + version, // defaults to "undefined" if not set during decode + exceptions_list: ListsDefaultArray, // defaults to empty array if not set during decode + }) + ), +]); + +export type UpdateRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type UpdateRulesSchemaDecoded = Omit< + UpdateRulesSchema, + | 'references' + | 'actions' + | 'enabled' + | 'false_positives' + | 'from' + | 'interval' + | 'max_signals' + | 'tags' + | 'to' + | 'threat' + | 'throttle' + | 'exceptions_list' + | 'rule_id' +> & { + references: References; + actions: Actions; + enabled: Enabled; + false_positives: FalsePositives; + from: From; + interval: Interval; + max_signals: MaxSignals; + tags: Tags; + to: To; + threat: Threat; + throttle: ThrottleOrNull; + exceptions_list: ListsDefaultArraySchema; + rule_id: RuleId; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..a63c8243cb5f1 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.test.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getUpdateRulesSchemaMock } from './update_rules_schema.mock'; +import { UpdateRulesSchema } from './update_rules_schema'; +import { updateRuleValidateTypeDependents } from './update_rules_type_dependents'; + +describe('update_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and will not validate without out', () => { + const schema: UpdateRulesSchema = { ...getUpdateRulesSchemaMock(), type: 'saved_query' }; + delete schema.saved_id; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "type" is "saved_query", "saved_id" is required']); + }); + + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); + + test('You cannot have both an id and a rule_id', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + id: 'some-id', + rule_id: 'some-rule-id', + }; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['both "id" and "rule_id" cannot exist, choose one or the other']); + }); + + test('You must set either an id or a rule_id', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + }; + delete schema.id; + delete schema.rule_id; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['either "id" or "rule_id" must be set']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.ts new file mode 100644 index 0000000000000..9204f727b2660 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.ts @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UpdateRulesSchema } from './update_rules_schema'; + +export const validateAnomalyThreshold = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.anomaly_threshold == null) { + return ['when "type" is "machine_learning" anomaly_threshold is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateQuery = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateSavedId = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'saved_query') { + if (rule.saved_id == null) { + return ['when "type" is "saved_query", "saved_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateMachineLearningJobId = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.machine_learning_job_id == null) { + return ['when "type" is "machine_learning", "machine_learning_job_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: UpdateRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: UpdateRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateId = (rule: UpdateRulesSchema): string[] => { + if (rule.id != null && rule.rule_id != null) { + return ['both "id" and "rule_id" cannot exist, choose one or the other']; + } else if (rule.id == null && rule.rule_id == null) { + return ['either "id" or "rule_id" must be set']; + } else { + return []; + } +}; + +export const updateRuleValidateTypeDependents = (schema: UpdateRulesSchema): string[] => { + return [ + ...validateId(schema), + ...validateAnomalyThreshold(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateSavedId(schema), + ...validateMachineLearningJobId(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_boolean_true.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_boolean_true.test.ts new file mode 100644 index 0000000000000..a2deaf626624f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_boolean_true.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultBooleanTrue } from './default_boolean_true'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_boolean_true', () => { + test('it should validate a boolean false', () => { + const payload = false; + const decoded = DefaultBooleanTrue.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a boolean true', () => { + const payload = true; + const decoded = DefaultBooleanTrue.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultBooleanTrue.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default true', () => { + const payload = null; + const decoded = DefaultBooleanTrue.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(true); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_from_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_from_string.test.ts new file mode 100644 index 0000000000000..d68d447ca4454 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_from_string.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultFromString } from './default_from_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_from_string', () => { + test('it should validate a from string', () => { + const payload = 'now-20m'; + const decoded = DefaultFromString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultFromString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "now-6m"', () => { + const payload = null; + const decoded = DefaultFromString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('now-6m'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.test.ts new file mode 100644 index 0000000000000..645eade71916f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.test.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultActionsArray } from './default_actions_array'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { Actions } from '../common/schemas'; + +describe('default_actions_array', () => { + test('it should validate an empty array', () => { + const payload: string[] = []; + const decoded = DefaultActionsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate an array of actions', () => { + const payload: Actions = [ + { id: '123', group: 'group', action_type_id: 'action_type_id', params: {} }, + ]; + const decoded = DefaultActionsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate an array with a number', () => { + const payload = [ + { id: '123', group: 'group', action_type_id: 'action_type_id', params: {} }, + 5, + ]; + const decoded = DefaultActionsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default array entry', () => { + const payload = null; + const decoded = DefaultActionsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual([]); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.ts new file mode 100644 index 0000000000000..ce3eb7fa7da83 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { actions, Actions } from '../common/schemas'; + +/** + * Types the DefaultStringArray as: + * - If null or undefined, then a default action array will be set + */ +export const DefaultActionsArray = new t.Type( + 'DefaultActionsArray', + actions.is, + (input): Either => (input == null ? t.success([]) : actions.decode(input)), + t.identity +); + +export type DefaultActionsArrayC = typeof DefaultActionsArray; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.test.ts new file mode 100644 index 0000000000000..1697928b17e0c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultBooleanFalse } from './default_boolean_false'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_boolean_false', () => { + test('it should validate a boolean false', () => { + const payload = false; + const decoded = DefaultBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a boolean true', () => { + const payload = true; + const decoded = DefaultBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default false', () => { + const payload = null; + const decoded = DefaultBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.ts new file mode 100644 index 0000000000000..624b9802f680c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultBooleanFalse as: + * - If null or undefined, then a default false will be set + */ +export const DefaultBooleanFalse = new t.Type( + 'DefaultBooleanFalse', + t.boolean.is, + (input): Either => + input == null ? t.success(false) : t.boolean.decode(input), + t.identity +); + +export type DefaultBooleanFalseC = typeof DefaultBooleanFalse; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_true.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_true.ts new file mode 100644 index 0000000000000..58c912a0a8650 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_true.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultBooleanTrue as: + * - If null or undefined, then a default true will be set + */ +export const DefaultBooleanTrue = new t.Type( + 'DefaultBooleanTrue', + t.boolean.is, + (input): Either => (input == null ? t.success(true) : t.boolean.decode(input)), + t.identity +); + +export type DefaultBooleanTrueC = typeof DefaultBooleanTrue; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.test.ts new file mode 100644 index 0000000000000..386d4c55905cd --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultEmptyString } from './default_empty_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_empty_string', () => { + test('it should validate a regular string', () => { + const payload = 'some string'; + const decoded = DefaultEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of ""', () => { + const payload = null; + const decoded = DefaultEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(''); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.ts new file mode 100644 index 0000000000000..6216d0c1111b0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultEmptyString as: + * - If null or undefined, then a default of an empty string "" will be used + */ +export const DefaultEmptyString = new t.Type( + 'DefaultEmptyString', + t.string.is, + (input): Either => (input == null ? t.success('') : t.string.decode(input)), + t.identity +); + +export type DefaultEmptyStringC = typeof DefaultEmptyString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.test.ts new file mode 100644 index 0000000000000..328cd738d7de0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultExportFileName } from './default_export_file_name'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_export_file_name', () => { + test('it should validate a regular string', () => { + const payload = 'some string'; + const decoded = DefaultExportFileName.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultExportFileName.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "export.ndjson"', () => { + const payload = null; + const decoded = DefaultExportFileName.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('export.ndjson'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.ts new file mode 100644 index 0000000000000..41dfdee1e0da0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultExportFileName as: + * - If null or undefined, then a default of "export.ndjson" will be used + */ +export const DefaultExportFileName = new t.Type( + 'DefaultExportFileName', + t.string.is, + (input): Either => + input == null ? t.success('export.ndjson') : t.string.decode(input), + t.identity +); + +export type DefaultExportFileNameC = typeof DefaultExportFileName; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_from_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_from_string.ts new file mode 100644 index 0000000000000..4217532de954e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_from_string.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultFromString as: + * - If null or undefined, then a default of the string "now-6m" will be used + */ +export const DefaultFromString = new t.Type( + 'DefaultFromString', + t.string.is, + (input): Either => + input == null ? t.success('now-6m') : t.string.decode(input), + t.identity +); + +export type DefaultFromStringC = typeof DefaultFromString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.test.ts new file mode 100644 index 0000000000000..9720178a4ae9b --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultIntervalString } from './default_interval_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_interval_string', () => { + test('it should validate a interval string', () => { + const payload = '20m'; + const decoded = DefaultIntervalString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultIntervalString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "5m"', () => { + const payload = null; + const decoded = DefaultIntervalString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('5m'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.ts new file mode 100644 index 0000000000000..579e7591fdb03 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultIntervalString as: + * - If null or undefined, then a default of the string "5m" will be used + */ +export const DefaultIntervalString = new t.Type( + 'DefaultIntervalString', + t.string.is, + (input): Either => (input == null ? t.success('5m') : t.string.decode(input)), + t.identity +); + +export type DefaultIntervalStringC = typeof DefaultIntervalString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.test.ts new file mode 100644 index 0000000000000..e3da8dbd280ab --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.test.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultLanguageString } from './default_language_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { Language } from '../common/schemas'; + +describe('default_language_string', () => { + test('it should validate a string', () => { + const payload: Language = 'lucene'; + const decoded = DefaultLanguageString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultLanguageString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "kuery"', () => { + const payload = null; + const decoded = DefaultLanguageString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('kuery'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.ts new file mode 100644 index 0000000000000..248e15d56dfd7 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { language } from '../common/schemas'; + +/** + * Types the DefaultLanguageString as: + * - If null or undefined, then a default of the string "kuery" will be used + */ +export const DefaultLanguageString = new t.Type( + 'DefaultLanguageString', + t.string.is, + (input): Either => + input == null ? t.success('kuery') : language.decode(input), + t.identity +); + +export type DefaultLanguageStringC = typeof DefaultLanguageString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.test.ts new file mode 100644 index 0000000000000..a6f137c3f2113 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.test.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultMaxSignalsNumber } from './default_max_signals_number'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('default_from_string', () => { + test('it should validate a max signal number', () => { + const payload = 5; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a string', () => { + const payload = '5'; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a zero', () => { + const payload = 0; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a negative number', () => { + const payload = -1; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of DEFAULT_MAX_SIGNALS', () => { + const payload = null; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(DEFAULT_MAX_SIGNALS); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts new file mode 100644 index 0000000000000..6f0c32c5466f3 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +// eslint-disable-next-line @typescript-eslint/camelcase +import { max_signals } from '../common/schemas'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +/** + * Types the default max signal: + * - Natural Number (positive integer and not a float), + * - greater than 1 + * - If undefined then it will use DEFAULT_MAX_SIGNALS (100) as the default + */ +export const DefaultMaxSignalsNumber: DefaultMaxSignalsNumberC = new t.Type< + number, + number, + unknown +>( + 'DefaultMaxSignals', + t.number.is, + (input): Either => { + return input == null ? t.success(DEFAULT_MAX_SIGNALS) : max_signals.decode(input); + }, + t.identity +); + +export type DefaultMaxSignalsNumberC = t.Type; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.test.ts new file mode 100644 index 0000000000000..1d1d43667c710 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.test.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultPage } from './default_page'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_page', () => { + test('it should validate a regular number greater than zero', () => { + const payload = 5; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a string of a number', () => { + const payload = '5'; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(5); + }); + + test('it should not validate a junk string', () => { + const payload = 'invalid-string'; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "NaN" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate an empty string', () => { + const payload = ''; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "NaN" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a zero', () => { + const payload = 0; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a negative number', () => { + const payload = -1; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of 20', () => { + const payload = null; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(1); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.ts new file mode 100644 index 0000000000000..95e3b42f3e138 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { PositiveIntegerGreaterThanZero } from './positive_integer_greater_than_zero'; + +/** + * Types the DefaultPerPage as: + * - If a string this will convert the string to a number + * - If null or undefined, then a default of 1 will be used + * - If the number is 0 or less this will not validate as it has to be a positive number greater than zero + */ +export const DefaultPage = new t.Type( + 'DefaultPerPage', + t.number.is, + (input): Either => { + if (input == null) { + return t.success(1); + } else if (typeof input === 'string') { + return PositiveIntegerGreaterThanZero.decode(parseInt(input, 10)); + } else { + return PositiveIntegerGreaterThanZero.decode(input); + } + }, + t.identity +); + +export type DefaultPageC = typeof DefaultPage; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.test.ts new file mode 100644 index 0000000000000..3ecbae6ed43f5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.test.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultPerPage } from './default_per_page'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_per_page', () => { + test('it should validate a regular number greater than zero', () => { + const payload = 5; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a string of a number', () => { + const payload = '5'; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(5); + }); + + test('it should not validate a junk string', () => { + const payload = 'invalid-string'; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "NaN" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate an empty string', () => { + const payload = ''; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "NaN" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a zero', () => { + const payload = 0; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a negative number', () => { + const payload = -1; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of 20', () => { + const payload = null; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(20); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.ts new file mode 100644 index 0000000000000..f96f280f6af11 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { PositiveIntegerGreaterThanZero } from './positive_integer_greater_than_zero'; + +/** + * Types the DefaultPerPage as: + * - If a string this will convert the string to a number + * - If null or undefined, then a default of 20 will be used + * - If the number is 0 or less this will not validate as it has to be a positive number greater than zero + */ +export const DefaultPerPage = new t.Type( + 'DefaultPerPage', + t.number.is, + (input): Either => { + if (input == null) { + return t.success(20); + } else if (typeof input === 'string') { + return PositiveIntegerGreaterThanZero.decode(parseInt(input, 10)); + } else { + return PositiveIntegerGreaterThanZero.decode(input); + } + }, + t.identity +); + +export type DefaultPerPageC = typeof DefaultPerPage; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.test.ts new file mode 100644 index 0000000000000..83142c8d65777 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultStringArray } from './default_string_array'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_string_array', () => { + test('it should validate an empty array', () => { + const payload: string[] = []; + const decoded = DefaultStringArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate an array of strings', () => { + const payload = ['value 1', 'value 2']; + const decoded = DefaultStringArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate an array with a number', () => { + const payload = ['value 1', 5]; + const decoded = DefaultStringArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default array entry', () => { + const payload = null; + const decoded = DefaultStringArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual([]); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/types/default_string_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.ts similarity index 75% rename from x-pack/plugins/lists/common/schemas/types/default_string_array.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.ts index c6ebffa379903..1f043cfd1b8e5 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_string_array.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.ts @@ -7,16 +7,16 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type DefaultStringArrayC = t.Type; - /** * Types the DefaultStringArray as: * - If null or undefined, then a default array will be set */ -export const DefaultStringArray: DefaultStringArrayC = new t.Type( - 'DefaultArray', +export const DefaultStringArray = new t.Type( + 'DefaultStringArray', t.array(t.string).is, (input): Either => input == null ? t.success([]) : t.array(t.string).decode(input), t.identity ); + +export type DefaultStringArrayC = typeof DefaultStringArray; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.test.ts new file mode 100644 index 0000000000000..1941a642e8baf --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.test.ts @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { DefaultStringBooleanFalse } from './default_string_boolean_false'; + +describe('default_string_boolean_false', () => { + test('it should validate a boolean false', () => { + const payload = false; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a boolean true', () => { + const payload = true; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default false', () => { + const payload = null; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(false); + }); + + test('it should return a default false when given a string of "false"', () => { + const payload = 'false'; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(false); + }); + + test('it should return a default true when given a string of "true"', () => { + const payload = 'true'; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(true); + }); + + test('it should return a default true when given a string of "TruE"', () => { + const payload = 'TruE'; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(true); + }); + + test('it should not work with a strong of junk "junk"', () => { + const payload = 'junk'; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not work with an empty string', () => { + const payload = ''; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "" supplied to ""']); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.ts new file mode 100644 index 0000000000000..48a40d4b9ceec --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultStringBooleanFalse as: + * - If a string this will convert the string to a boolean + * - If null or undefined, then a default false will be set + */ +export const DefaultStringBooleanFalse = new t.Type( + 'DefaultStringBooleanFalse', + t.boolean.is, + (input): Either => { + if (input == null) { + return t.success(false); + } else if (typeof input === 'string' && input.toLowerCase() === 'true') { + return t.success(true); + } else if (typeof input === 'string' && input.toLowerCase() === 'false') { + return t.success(false); + } else { + return t.boolean.decode(input); + } + }, + t.identity +); + +export type DefaultStringBooleanFalseC = typeof DefaultStringBooleanFalse; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.test.ts new file mode 100644 index 0000000000000..9819da0b8d463 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.test.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultThreatArray } from './default_threat_array'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { Threat } from '../common/schemas'; + +describe('default_threat_null', () => { + test('it should validate an empty array', () => { + const payload: Threat = []; + const decoded = DefaultThreatArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate an array of threats', () => { + const payload: Threat = [ + { + framework: 'MITRE ATTACK', + technique: [{ reference: 'https://test.com', name: 'Audio Capture', id: 'T1123' }], + tactic: { reference: 'https://test.com', name: 'Collection', id: 'TA000999' }, + }, + ]; + const decoded = DefaultThreatArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate an array with a number', () => { + const payload = [ + { + framework: 'MITRE ATTACK', + technique: [{ reference: 'https://test.com', name: 'Audio Capture', id: 'T1123' }], + tactic: { reference: 'https://test.com', name: 'Collection', id: 'TA000999' }, + }, + 5, + ]; + const decoded = DefaultThreatArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default empty array if not provided a value', () => { + const payload = null; + const decoded = DefaultThreatArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual([]); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.ts new file mode 100644 index 0000000000000..da0611e24bc7e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { Threat, threat } from '../common/schemas'; + +/** + * Types the DefaultThreatArray as: + * - If null or undefined, then an empty array will be set + */ +export const DefaultThreatArray = new t.Type( + 'DefaultThreatArray', + threat.is, + (input): Either => (input == null ? t.success([]) : threat.decode(input)), + t.identity +); + +export type DefaultThreatArrayC = typeof DefaultThreatArray; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.test.ts new file mode 100644 index 0000000000000..304fd65647c3c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.test.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultThrottleNull } from './default_throttle_null'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { Throttle } from '../common/schemas'; + +describe('default_throttle_null', () => { + test('it should validate a throttle string', () => { + const payload: Throttle = 'some string'; + const decoded = DefaultThrottleNull.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate an array with a number', () => { + const payload = 5; + const decoded = DefaultThrottleNull.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default "null" if not provided a value', () => { + const payload = undefined; + const decoded = DefaultThrottleNull.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(null); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.ts new file mode 100644 index 0000000000000..fd31594323f4d --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { ThrottleOrNull, throttle } from '../common/schemas'; + +/** + * Types the DefaultThrottleNull as: + * - If null or undefined, then a null will be set + */ +export const DefaultThrottleNull = new t.Type( + 'DefaultThreatNull', + throttle.is, + (input): Either => + input == null ? t.success(null) : throttle.decode(input), + t.identity +); + +export type DefaultThrottleNullC = typeof DefaultThrottleNull; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.test.ts new file mode 100644 index 0000000000000..3e22d57cedf99 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultToString } from './default_to_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_to_string', () => { + test('it should validate a to string', () => { + const payload = 'now-5m'; + const decoded = DefaultToString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultToString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "now"', () => { + const payload = null; + const decoded = DefaultToString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('now'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.ts new file mode 100644 index 0000000000000..163bcf8c4e5b2 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultToString as: + * - If null or undefined, then a default of the string "now" will be used + */ +export const DefaultToString = new t.Type( + 'DefaultFromString', + t.string.is, + (input): Either => (input == null ? t.success('now') : t.string.decode(input)), + t.identity +); + +export type DefaultToStringC = typeof DefaultToString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.test.ts new file mode 100644 index 0000000000000..7dab8869d5d87 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.test.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultUuid } from './default_uuid'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_uuid', () => { + test('it should validate a regular string', () => { + const payload = '1'; + const decoded = DefaultUuid.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultUuid.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of a uuid', () => { + const payload = null; + const decoded = DefaultUuid.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toMatch( + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i + ); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/types/default_uuid.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.ts similarity index 84% rename from x-pack/plugins/lists/common/schemas/types/default_uuid.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.ts index 4fb4133d7353f..b0c328a93ff03 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_uuid.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.ts @@ -10,17 +10,17 @@ import uuid from 'uuid'; import { NonEmptyString } from './non_empty_string'; -export type DefaultUuidC = t.Type; - /** * Types the DefaultUuid as: * - If null or undefined, then a default string uuid.v4() will be * created otherwise it will be checked just against an empty string */ -export const DefaultUuid: DefaultUuidC = new t.Type( +export const DefaultUuid = new t.Type( 'DefaultUuid', t.string.is, (input): Either => input == null ? t.success(uuid.v4()) : NonEmptyString.decode(input), t.identity ); + +export type DefaultUuidC = typeof DefaultUuid; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.test.ts new file mode 100644 index 0000000000000..65697d8830b66 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.test.ts @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultVersionNumber } from './default_version_number'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_version_number', () => { + test('it should validate a version number', () => { + const payload = 5; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a 0', () => { + const payload = 0; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a -1', () => { + const payload = -1; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a string', () => { + const payload = '5'; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of 1', () => { + const payload = null; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(1); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.ts new file mode 100644 index 0000000000000..4a310329660df --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { version, Version } from '../common/schemas'; + +/** + * Types the DefaultVersionNumber as: + * - If null or undefined, then a default of the number 1 will be used + */ +export const DefaultVersionNumber = new t.Type( + 'DefaultVersionNumber', + version.is, + (input): Either => (input == null ? t.success(1) : version.decode(input)), + t.identity +); + +export type DefaultVersionNumberC = typeof DefaultVersionNumber; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/iso_date_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/iso_date_string.ts index d63c18154c5d4..4e12a45f21d0b 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/iso_date_string.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/iso_date_string.ts @@ -7,13 +7,11 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type IsoDateStringC = t.Type; - /** * Types the IsoDateString as: * - A string that is an ISOString */ -export const IsoDateString: IsoDateStringC = new t.Type( +export const IsoDateString = new t.Type( 'IsoDateString', t.string.is, (input, context): Either => { @@ -34,3 +32,5 @@ export const IsoDateString: IsoDateStringC = new t.Type }, t.identity ); + +export type IsoDateStringC = typeof IsoDateString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists_default_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists_default_array.ts index 8244f4a29e193..8cdd865469112 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists_default_array.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists_default_array.ts @@ -13,7 +13,6 @@ import { list_values_operator as listOperator, } from '../common/schemas'; -export type ListsDefaultArrayC = t.Type; export type List = t.TypeOf; export type ListValues = t.TypeOf; export type ListOperator = t.TypeOf; @@ -22,7 +21,7 @@ export type ListOperator = t.TypeOf; * Types the ListsDefaultArray as: * - If null or undefined, then a default array will be set for the list */ -export const ListsDefaultArray: ListsDefaultArrayC = new t.Type( +export const ListsDefaultArray = new t.Type( 'listsWithDefaultArray', t.array(listAnd).is, (input): Either => @@ -30,4 +29,6 @@ export const ListsDefaultArray: ListsDefaultArrayC = new t.Type; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.test.ts new file mode 100644 index 0000000000000..0a88b87421e70 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { NonEmptyString } from './non_empty_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('non_empty_string', () => { + test('it should validate a regular string', () => { + const payload = '1'; + const decoded = NonEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = NonEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate an empty string', () => { + const payload = ''; + const decoded = NonEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate empty spaces', () => { + const payload = ' '; + const decoded = NonEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value " " supplied to ""']); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/types/non_empty_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.ts similarity index 81% rename from x-pack/plugins/lists/common/schemas/types/non_empty_string.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.ts index d1e2094bbcad3..b3fad548932d5 100644 --- a/x-pack/plugins/lists/common/schemas/types/non_empty_string.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.ts @@ -7,13 +7,11 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type NonEmptyStringC = t.Type; - /** * Types the NonEmptyString as: * - A string that is not empty */ -export const NonEmptyString: NonEmptyStringC = new t.Type( +export const NonEmptyString = new t.Type( 'NonEmptyString', t.string.is, (input, context): Either => { @@ -25,3 +23,5 @@ export const NonEmptyString: NonEmptyStringC = new t.Type { + test('it should validate a boolean false as false', () => { + const payload = false; + const decoded = OnlyFalseAllowed.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a boolean true', () => { + const payload = true; + const decoded = OnlyFalseAllowed.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "true" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = OnlyFalseAllowed.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default false', () => { + const payload = null; + const decoded = OnlyFalseAllowed.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.ts new file mode 100644 index 0000000000000..b22562e2ab9dc --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the OnlyFalseAllowed as: + * - If null or undefined, then a default false will be set + * - If true is sent in then this will return an error + * - If false is sent in then this will allow it only false + */ +export const OnlyFalseAllowed = new t.Type( + 'DefaultBooleanTrue', + t.boolean.is, + (input, context): Either => { + if (input == null) { + return t.success(false); + } else { + if (typeof input === 'boolean' && input === false) { + return t.success(false); + } else { + return t.failure(input, context); + } + } + }, + t.identity +); + +export type OnlyFalseAllowedC = typeof OnlyFalseAllowed; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/positive_integer.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/positive_integer.ts index ac98dd6f5d85c..298487a3fae98 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/positive_integer.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/positive_integer.ts @@ -7,14 +7,12 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type PositiveIntegerC = t.Type; - /** * Types the positive integer are: * - Natural Number (positive integer and not a float), * - zero or greater */ -export const PositiveInteger: PositiveIntegerC = new t.Type( +export const PositiveInteger = new t.Type( 'PositiveInteger', t.number.is, (input, context): Either => { @@ -24,3 +22,5 @@ export const PositiveInteger: PositiveIntegerC = new t.Type; - /** * Types the positive integer greater than zero is: * - Natural Number (positive integer and not a float), * - 1 or greater */ -export const PositiveIntegerGreaterThanZero: PositiveIntegerGreaterThanZeroC = new t.Type< - number, - number, - unknown ->( +export const PositiveIntegerGreaterThanZero = new t.Type( 'PositiveIntegerGreaterThanZero', t.number.is, (input, context): Either => { @@ -28,3 +22,5 @@ export const PositiveIntegerGreaterThanZero: PositiveIntegerGreaterThanZeroC = n }, t.identity ); + +export type PositiveIntegerGreaterThanZeroC = typeof PositiveIntegerGreaterThanZero; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.test.ts index 43e2dbdac1fe1..83142c8d65777 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.test.ts @@ -4,15 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ReferencesDefaultArray } from './references_default_array'; +import { DefaultStringArray } from './default_string_array'; import { pipe } from 'fp-ts/lib/pipeable'; import { left } from 'fp-ts/lib/Either'; import { foldLeftRight, getPaths } from '../../../test_utils'; -describe('references_default_array', () => { +describe('default_string_array', () => { test('it should validate an empty array', () => { const payload: string[] = []; - const decoded = ReferencesDefaultArray.decode(payload); + const decoded = DefaultStringArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); @@ -21,7 +21,7 @@ describe('references_default_array', () => { test('it should validate an array of strings', () => { const payload = ['value 1', 'value 2']; - const decoded = ReferencesDefaultArray.decode(payload); + const decoded = DefaultStringArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); @@ -30,7 +30,7 @@ describe('references_default_array', () => { test('it should not validate an array with a number', () => { const payload = ['value 1', 5]; - const decoded = ReferencesDefaultArray.decode(payload); + const decoded = DefaultStringArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); @@ -39,7 +39,7 @@ describe('references_default_array', () => { test('it should return a default array entry', () => { const payload = null; - const decoded = ReferencesDefaultArray.decode(payload); + const decoded = DefaultStringArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.ts index 57a7ed4e4d456..b809181ce8c32 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.ts @@ -7,20 +7,16 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type ReferencesDefaultArrayC = t.Type; - /** * Types the ReferencesDefaultArray as: * - If null or undefined, then a default array will be set */ -export const ReferencesDefaultArray: ReferencesDefaultArrayC = new t.Type< - string[], - string[], - unknown ->( +export const ReferencesDefaultArray = new t.Type( 'referencesWithDefaultArray', t.array(t.string).is, (input): Either => input == null ? t.success([]) : t.array(t.string).decode(input), t.identity ); + +export type ReferencesDefaultArrayC = typeof ReferencesDefaultArray; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/risk_score.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/risk_score.ts index c44fae3c6f3e7..7f057a6d178e1 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/risk_score.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/risk_score.ts @@ -7,14 +7,12 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type RiskScoreC = t.Type; - /** * Types the risk score as: * - Natural Number (positive integer and not a float), * - Between the values [0 and 100] inclusive. */ -export const RiskScore: RiskScoreC = new t.Type( +export const RiskScore = new t.Type( 'RiskScore', t.number.is, (input, context): Either => { @@ -24,3 +22,5 @@ export const RiskScore: RiskScoreC = new t.Type( }, t.identity ); + +export type RiskScoreC = typeof RiskScore; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/uuid.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/uuid.ts index 88e9db5964198..3676aa5686cd6 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/uuid.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/uuid.ts @@ -7,8 +7,6 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type UUIDC = t.Type; - const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; /** @@ -16,7 +14,7 @@ const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; * - Natural Number (positive integer and not a float), * - Between the values [0 and 100] inclusive. */ -export const UUID: UUIDC = new t.Type( +export const UUID = new t.Type( 'UUID', t.string.is, (input, context): Either => { @@ -26,3 +24,5 @@ export const UUID: UUIDC = new t.Type( }, t.identity ); + +export type UUIDC = typeof UUID; diff --git a/x-pack/plugins/security_solution/common/exact_check.test.ts b/x-pack/plugins/security_solution/common/exact_check.test.ts index a5701603de0d6..96a1b1266ea9a 100644 --- a/x-pack/plugins/security_solution/common/exact_check.test.ts +++ b/x-pack/plugins/security_solution/common/exact_check.test.ts @@ -86,6 +86,23 @@ describe('exact_check', () => { expect(message.schema).toEqual({ a: 'test' }); }); + test('it will work with decoding a null payload when the schema expects a null', () => { + const someType = t.union([ + t.exact( + t.type({ + a: t.string, + }) + ), + t.null, + ]); + const payload = null; + const decoded = someType.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(null); + }); + test('it should find no differences recursively with two empty objects', () => { const difference = findDifferencesRecursive({}, {}); expect(difference).toEqual([]); @@ -151,4 +168,9 @@ describe('exact_check', () => { ); expect(difference).toEqual(['d']); }); + + test('it should not find any differences when the original and decoded are both null', () => { + const difference = findDifferencesRecursive(null, null); + expect(difference).toEqual([]); + }); }); diff --git a/x-pack/plugins/security_solution/common/exact_check.ts b/x-pack/plugins/security_solution/common/exact_check.ts index 30c5b585a3480..48afc35b56ba1 100644 --- a/x-pack/plugins/security_solution/common/exact_check.ts +++ b/x-pack/plugins/security_solution/common/exact_check.ts @@ -25,7 +25,10 @@ import { isObject, get } from 'lodash/fp'; * @param decoded The decoded either which has either an existing error or the * decoded object which could have additional keys stripped from it. */ -export const exactCheck = (original: T, decoded: Either): Either => { +export const exactCheck = ( + original: unknown, + decoded: Either +): Either => { const onLeft = (errors: t.Errors): Either => left(errors); const onRight = (decodedValue: T): Either => { const differences = findDifferencesRecursive(original, decodedValue); @@ -45,7 +48,11 @@ export const exactCheck = (original: T, decoded: Either): Either }; export const findDifferencesRecursive = (original: T, decodedValue: T): string[] => { - if (decodedValue == null) { + if (decodedValue === null && original === null) { + // both the decodedValue and the original are null which indicates that they are equal + // so do not report differences + return []; + } else if (decodedValue == null) { try { // It is null and painful when the original contains an object or an array // the the decoded value does not have. diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx index 3eedbcc97bbd1..5a08b0a20d1fc 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx @@ -13,6 +13,8 @@ import { StepAboutRule } from '.'; import { mockAboutStepRule } from '../../../pages/detection_engine/rules/all/__mocks__/mock'; import { StepRuleDescription } from '../description_step'; import { stepAboutDefaultValue } from './default_value'; +import { wait } from '@testing-library/react'; +import { AboutStepRule } from '../../../pages/detection_engine/rules/types'; const theme = () => ({ eui: euiDarkVars, darkMode: true }); @@ -57,31 +59,31 @@ describe('StepAboutRuleComponent', () => { ); - const nameInput = wrapper - .find('input[aria-describedby="detectionEngineStepAboutRuleName"]') - .at(0); - nameInput.simulate('change', { target: { value: 'Test name text' } }); + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleName"] input') + .first() + .simulate('change', { target: { value: 'Test name text' } }); const descriptionInput = wrapper - .find('textarea[aria-describedby="detectionEngineStepAboutRuleDescription"]') - .at(0); - const nextButton = wrapper.find('button[data-test-subj="about-continue"]').at(0); - nextButton.simulate('click'); + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first(); + wrapper.find('button[data-test-subj="about-continue"]').first().simulate('click'); expect( - wrapper.find('input[aria-describedby="detectionEngineStepAboutRuleName"]').at(0).props().value + wrapper.find('[data-test-subj="detectionEngineStepAboutRuleName"] input').first().props() + .value ).toEqual('Test name text'); expect(descriptionInput.props().value).toEqual(''); expect( wrapper - .find('EuiFormRow[data-test-subj="detectionEngineStepAboutRuleDescription"] label') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] label') + .first() .hasClass('euiFormLabel-isInvalid') ).toBeTruthy(); expect( wrapper - .find('EuiFormRow[data-test-subj="detectionEngineStepAboutRuleDescription"] EuiTextArea') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] EuiTextArea') + .first() .prop('isInvalid') ).toBeTruthy(); }); @@ -101,39 +103,40 @@ describe('StepAboutRuleComponent', () => { ); - const descriptionInput = wrapper - .find('textarea[aria-describedby="detectionEngineStepAboutRuleDescription"]') - .at(0); - descriptionInput.simulate('change', { target: { value: 'Test description text' } }); + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first() + .simulate('change', { target: { value: 'Test description text' } }); const nameInput = wrapper - .find('input[aria-describedby="detectionEngineStepAboutRuleName"]') - .at(0); - const nextButton = wrapper.find('button[data-test-subj="about-continue"]').at(0); - nextButton.simulate('click'); + .find('[data-test-subj="detectionEngineStepAboutRuleName"] input') + .first(); + + wrapper.find('button[data-test-subj="about-continue"]').first().simulate('click'); expect( wrapper - .find('textarea[aria-describedby="detectionEngineStepAboutRuleDescription"]') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first() .props().value ).toEqual('Test description text'); expect(nameInput.props().value).toEqual(''); expect( wrapper - .find('EuiFormRow[data-test-subj="detectionEngineStepAboutRuleName"] label') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleName"] label') + .first() .hasClass('euiFormLabel-isInvalid') ).toBeTruthy(); expect( wrapper - .find('EuiFormRow[data-test-subj="detectionEngineStepAboutRuleName"] EuiFieldText') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleName"] EuiFieldText') + .first() .prop('isInvalid') ).toBeTruthy(); }); - test('it allows user to click continue if "name" and "description" are defined', () => { + test('it allows user to click continue if "name" and "description" are defined', async () => { + const stepDataMock = jest.fn(); const wrapper = mount( { isReadOnlyView={false} isLoading={false} setForm={jest.fn()} - setStepData={jest.fn()} + setStepData={stepDataMock} /> ); - const descriptionInput = wrapper - .find('textarea[aria-describedby="detectionEngineStepAboutRuleDescription"]') - .at(0); - descriptionInput.simulate('change', { target: { value: 'Test description text' } }); + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first() + .simulate('change', { target: { value: 'Test description text' } }); + + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleName"] input') + .first() + .simulate('change', { target: { value: 'Test name text' } }); + + wrapper.find('button[data-test-subj="about-continue"]').first().simulate('click').update(); + await wait(); + const expected: Omit = { + description: 'Test description text', + falsePositives: [''], + name: 'Test name text', + note: '', + references: [''], + riskScore: 50, + severity: 'low', + tags: [], + threat: [ + { + framework: 'MITRE ATT&CK', + tactic: { id: 'none', name: 'none', reference: 'none' }, + technique: [], + }, + ], + }; + expect(stepDataMock.mock.calls[1][1]).toEqual(expected); + }); - const nameInput = wrapper - .find('input[aria-describedby="detectionEngineStepAboutRuleName"]') - .at(0); - nameInput.simulate('change', { target: { value: 'Test name text' } }); + test('it allows user to set the risk score as a number (and not a string)', async () => { + const stepDataMock = jest.fn(); + const wrapper = mount( + + + + ); - const nextButton = wrapper.find('button[data-test-subj="about-continue"]').at(0); - nextButton.simulate('click'); + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleName"] input') + .first() + .simulate('change', { target: { value: 'Test name text' } }); + + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first() + .simulate('change', { target: { value: 'Test description text' } }); + + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleRiskScore"] input') + .first() + .simulate('change', { target: { value: '80' } }); + + wrapper.find('[data-test-subj="about-continue"]').first().simulate('click').update(); + await wait(); + const expected: Omit = { + description: 'Test description text', + falsePositives: [''], + name: 'Test name text', + note: '', + references: [''], + riskScore: 80, + severity: 'low', + tags: [], + threat: [ + { + framework: 'MITRE ATT&CK', + tactic: { id: 'none', name: 'none', reference: 'none' }, + technique: [], + }, + ], + }; + expect(stepDataMock.mock.calls[1][1]).toEqual(expected); }); }); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/schema.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/schema.tsx index 42ffab10ff469..59ecebaeb9e4e 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/schema.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/schema.tsx @@ -87,6 +87,7 @@ export const schema: FormSchema = { }, riskScore: { type: FIELD_TYPES.RANGE, + serializer: (input: string) => Number(input), label: i18n.translate( 'xpack.securitySolution.detectionEngine.createRule.stepAboutRule.fieldRiskScoreLabel', { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts index 9246d8cb3519b..23d5d7eb8d385 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts @@ -6,11 +6,7 @@ import { SavedObjectsFindResponse } from 'kibana/server'; import { ActionResult } from '../../../../../../actions/server'; -import { - SignalsStatusRestParams, - SignalsQueryRestParams, - SignalSearchResponse, -} from '../../signals/types'; +import { SignalSearchResponse } from '../../signals/types'; import { DETECTION_ENGINE_RULES_URL, DETECTION_ENGINE_SIGNALS_STATUS_URL, @@ -26,45 +22,11 @@ import { IRuleSavedAttributesSavedObjectAttributes, HapiReadableStream, } from '../../rules/types'; -import { RuleAlertParamsRest, PrepackagedRules } from '../../types'; +import { RuleAlertParamsRest } from '../../types'; import { requestMock } from './request'; import { RuleNotificationAlertType } from '../../notifications/types'; - -export const mockPrepackagedRule = (): PrepackagedRules => ({ - rule_id: 'rule-1', - description: 'Detecting root and admin users', - index: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], - interval: '5m', - name: 'Detect Root/Admin Users', - output_index: '.siem-signals', - risk_score: 50, - type: 'query', - from: 'now-6m', - to: 'now', - severity: 'high', - query: 'user.name: root or user.name: admin', - language: 'kuery', - threat: [ - { - framework: 'fake', - tactic: { id: 'fakeId', name: 'fakeName', reference: 'fakeRef' }, - technique: [{ id: 'techniqueId', name: 'techniqueName', reference: 'techniqueRef' }], - }, - ], - throttle: null, - enabled: true, - filters: [], - immutable: false, - references: [], - meta: {}, - tags: [], - version: 1, - false_positives: [], - max_signals: 100, - note: '', - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', -}); +import { QuerySignalsSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/query_signals_index_schema'; +import { SetSignalsStatusSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/set_signal_status_schema'; export const typicalPayload = (): Partial => ({ rule_id: 'rule-1', @@ -89,25 +51,25 @@ export const typicalPayload = (): Partial => ({ ], }); -export const typicalSetStatusSignalByIdsPayload = (): Partial => ({ +export const typicalSetStatusSignalByIdsPayload = (): SetSignalsStatusSchemaDecoded => ({ signal_ids: ['somefakeid1', 'somefakeid2'], status: 'closed', }); -export const typicalSetStatusSignalByQueryPayload = (): Partial => ({ +export const typicalSetStatusSignalByQueryPayload = (): SetSignalsStatusSchemaDecoded => ({ query: { bool: { filter: { range: { '@timestamp': { gte: 'now-2M', lte: 'now/M' } } } } }, status: 'closed', }); -export const typicalSignalsQuery = (): Partial => ({ +export const typicalSignalsQuery = (): QuerySignalsSchemaDecoded => ({ query: { match_all: {} }, }); -export const typicalSignalsQueryAggs = (): Partial => ({ +export const typicalSignalsQueryAggs = (): QuerySignalsSchemaDecoded => ({ aggs: { statuses: { terms: { field: 'signal.status', size: 10 } } }, }); -export const setStatusSignalMissingIdsAndQueryPayload = (): Partial => ({ +export const setStatusSignalMissingIdsAndQueryPayload = (): SetSignalsStatusSchemaDecoded => ({ status: 'closed', }); @@ -170,14 +132,14 @@ export const getDeleteBulkRequestById = () => requestMock.create({ method: 'delete', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, - body: [{ id: 'rule-04128c15-0d1b-4716-a4c5-46997ac7f3bd' }], + body: [{ id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd' }], }); export const getDeleteAsPostBulkRequestById = () => requestMock.create({ method: 'post', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, - body: [{ id: 'rule-04128c15-0d1b-4716-a4c5-46997ac7f3bd' }], + body: [{ id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd' }], }); export const getDeleteAsPostBulkRequest = () => @@ -448,7 +410,7 @@ export const getResult = (): RuleAlertType => ({ references: ['http://www.example.com', 'https://ww.example.com'], note: '# Investigative notes', version: 1, - exceptions_list: [ + exceptionsList: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts index 241d362753d53..4b65ee5efdff0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts @@ -13,18 +13,16 @@ import { } from '../__mocks__/request_responses'; import { requestContextMock, serverMock } from '../__mocks__'; import { addPrepackedRulesRoute } from './add_prepackaged_rules_route'; -import { PrepackagedRules } from '../../types'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; jest.mock('../../rules/get_prepackaged_rules', () => { return { - getPrepackagedRules: (): PrepackagedRules[] => { + getPrepackagedRules: (): AddPrepackagedRulesSchemaDecoded[] => { return [ { tags: [], - immutable: true, rule_id: 'rule-1', - output_index: '.siem-signals', risk_score: 50, description: 'some description', from: 'now-5m', @@ -34,6 +32,16 @@ jest.mock('../../rules/get_prepackaged_rules', () => { severity: 'low', interval: '5m', type: 'query', + query: 'user.name: root or user.name: admin', + language: 'kuery', + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: 100, + threat: [], + throttle: null, + exceptions_list: [], version: 2, // set one higher than the mocks which is set to 1 to trigger updates }, ]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index d5628877ee16e..39eea16c6290a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -29,7 +29,7 @@ export const addPrepackedRulesRoute = (router: IRouter) => { tags: ['access:securitySolution'], }, }, - async (context, request, response) => { + async (context, _, response) => { const siemResponse = buildSiemResponse(response); try { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts index 6875b0fc76ecc..1df6070bc33a6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts @@ -180,7 +180,7 @@ describe('create_rules_bulk', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because [child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]]' + 'Invalid value "unexpected_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index dc0b65cef61d0..7af58adca7529 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -4,8 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import uuid from 'uuid'; - +import { createRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/create_rules_type_dependents'; +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { + CreateRulesBulkSchemaDecoded, + createRulesBulkSchema, +} from '../../../../../common/detection_engine/schemas/request/create_rules_bulk_schema'; import { rulesBulkSchema } from '../../../../../common/detection_engine/schemas/response/rules_bulk_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; @@ -13,26 +17,24 @@ import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; import { createRules } from '../../rules/create_rules'; -import { RuleAlertParamsRest } from '../../types'; import { readRules } from '../../rules/read_rules'; import { getDuplicates } from './utils'; import { transformValidateBulkError, validate } from './validate'; import { getIndexExists } from '../../index/get_index_exists'; -import { - transformBulkError, - createBulkErrorObject, - buildRouteValidation, - buildSiemResponse, -} from '../utils'; -import { createRulesBulkSchema } from '../schemas/create_rules_bulk_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; + +import { transformBulkError, createBulkErrorObject, buildSiemResponse } from '../utils'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { PartialFilter } from '../../types'; export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.post( { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, validate: { - body: buildRouteValidation(createRulesBulkSchema), + body: buildRouteValidation( + createRulesBulkSchema + ), }, options: { tags: ['access:securitySolution'], @@ -59,19 +61,19 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => .filter((rule) => rule.rule_id == null || !dupes.includes(rule.rule_id)) .map(async (payloadRule) => { const { - actions, + actions: actionsRest, anomaly_threshold: anomalyThreshold, description, enabled, false_positives: falsePositives, from, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, machine_learning_job_id: machineLearningJobId, output_index: outputIndex, saved_id: savedId, meta, - filters, + filters: filtersRest, rule_id: ruleId, index, interval, @@ -89,23 +91,42 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => timeline_id: timelineId, timeline_title: timelineTitle, version, - exceptions_list, + exceptions_list: exceptionsList, } = payloadRule; - const ruleIdOrUuid = ruleId ?? uuid.v4(); try { + const validationErrors = createRuleValidateTypeDependents(payloadRule); + if (validationErrors.length) { + return createBulkErrorObject({ + ruleId, + statusCode: 400, + message: validationErrors.join(), + }); + } + + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; throwHttpError(await mlAuthz.validateRuleType(type)); const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return createBulkErrorObject({ - ruleId: ruleIdOrUuid, + ruleId, statusCode: 400, message: `To create a rule, the index must exist first. Index ${finalIndex} does not exist`, }); } if (ruleId != null) { - const rule = await readRules({ alertsClient, ruleId }); + const rule = await readRules({ alertsClient, ruleId, id: undefined }); if (rule != null) { return createBulkErrorObject({ ruleId, @@ -131,7 +152,7 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => timelineTitle, meta, filters, - ruleId: ruleIdOrUuid, + ruleId, index, interval, maxSignals, @@ -145,7 +166,7 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => references, note, version, - exceptions_list, + exceptionsList, actions: throttle === 'rule' ? actions : [], // Only enable actions if throttle is set to rule, otherwise we are a notification and should not enable it, }); @@ -159,9 +180,9 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => name, }); - return transformValidateBulkError(ruleIdOrUuid, createdRule, ruleActions); + return transformValidateBulkError(ruleId, createdRule, ruleActions); } catch (err) { - return transformBulkError(ruleIdOrUuid, err); + return transformBulkError(ruleId, err); } }) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts index 7984b84729821..5abd7b1e76a76 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts @@ -170,7 +170,7 @@ describe('create_rules', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]' + 'Invalid value "unexpected_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.ts index 6138db4dcb0ff..78d67e0e9366c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -4,8 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import uuid from 'uuid'; - +import { createRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/create_rules_type_dependents'; +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { + createRulesSchema, + CreateRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/create_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; @@ -13,42 +18,48 @@ import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; import { createRules } from '../../rules/create_rules'; import { readRules } from '../../rules/read_rules'; -import { RuleAlertParamsRest } from '../../types'; import { transformValidate } from './validate'; import { getIndexExists } from '../../index/get_index_exists'; -import { createRulesSchema } from '../schemas/create_rules_schema'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { PartialFilter } from '../../types'; export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void => { router.post( { path: DETECTION_ENGINE_RULES_URL, validate: { - body: buildRouteValidation(createRulesSchema), + body: buildRouteValidation( + createRulesSchema + ), }, options: { tags: ['access:securitySolution'], }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const validationErrors = createRuleValidateTypeDependents(request.body); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } const { - actions, + actions: actionsRest, anomaly_threshold: anomalyThreshold, description, enabled, false_positives: falsePositives, from, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, output_index: outputIndex, saved_id: savedId, timeline_id: timelineId, timeline_title: timelineTitle, meta, machine_learning_job_id: machineLearningJobId, - filters, + filters: filtersRest, rule_id: ruleId, index, interval, @@ -63,11 +74,21 @@ export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void type, references, note, - exceptions_list, + exceptions_list: exceptionsList, } = request.body; - const siemResponse = buildSiemResponse(response); - try { + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + const alertsClient = context.alerting?.getAlertsClient(); const clusterClient = context.core.elasticsearch.legacy.client; const savedObjectsClient = context.core.savedObjects.client; @@ -89,7 +110,7 @@ export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void }); } if (ruleId != null) { - const rule = await readRules({ alertsClient, ruleId }); + const rule = await readRules({ alertsClient, ruleId, id: undefined }); if (rule != null) { return siemResponse.error({ statusCode: 409, @@ -114,7 +135,7 @@ export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void meta, machineLearningJobId, filters, - ruleId: ruleId ?? uuid.v4(), + ruleId, index, interval, maxSignals, @@ -128,7 +149,7 @@ export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void references, note, version: 1, - exceptions_list, + exceptionsList, actions: throttle === 'rule' ? actions : [], // Only enable actions if throttle is rule, otherwise we are a notification and should not enable it, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts index f2da3ab4be8f6..4c1c1046a9fcd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts @@ -105,11 +105,33 @@ describe('delete_rules', () => { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, body: [{}], }); - const result = server.validate(request); + const response = await server.inject(request, context); + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + error: { message: 'either "id" or "rule_id" must be set', status_code: 400 }, + rule_id: '(unknown id)', + }, + ]); + }); - expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because ["value" must contain at least one of [id, rule_id]]' - ); + test('rejects requests with both id and rule_id', async () => { + const request = requestMock.create({ + method: 'post', + path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, + body: [{ id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f', rule_id: 'rule_1' }], + }); + const response = await server.inject(request, context); + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + error: { + message: 'both "id" and "rule_id" cannot exist, choose one or the other', + status_code: 400, + }, + rule_id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f', + }, + ]); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index c1e359b36caa1..12f908ce7e8b5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -4,26 +4,32 @@ * you may not use this file except in compliance with the Elastic License. */ +import { queryRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/query_rules_type_dependents'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { + queryRulesBulkSchema, + QueryRulesBulkSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/query_rules_bulk_schema'; import { rulesBulkSchema } from '../../../../../common/detection_engine/schemas/response/rules_bulk_schema'; import { IRouter, RouteConfig, RequestHandler } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { queryRulesBulkSchema } from '../schemas/query_rules_bulk_schema'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; -import { transformBulkError, buildRouteValidation, buildSiemResponse } from '../utils'; -import { DeleteRulesRequestParams } from '../../rules/types'; +import { transformBulkError, buildSiemResponse, createBulkErrorObject } from '../utils'; import { deleteRules } from '../../rules/delete_rules'; import { deleteNotifications } from '../../notifications/delete_notifications'; import { deleteRuleActionsSavedObject } from '../../rule_actions/delete_rule_actions_saved_object'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; -type Config = RouteConfig; -type Handler = RequestHandler; +type Config = RouteConfig; +type Handler = RequestHandler; export const deleteRulesBulkRoute = (router: IRouter) => { const config: Config = { validate: { - body: buildRouteValidation(queryRulesBulkSchema), + body: buildRouteValidation( + queryRulesBulkSchema + ), }, path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, options: { @@ -46,6 +52,15 @@ export const deleteRulesBulkRoute = (router: IRouter) => { request.body.map(async (payloadRule) => { const { id, rule_id: ruleId } = payloadRule; const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; + const validationErrors = queryRuleValidateTypeDependents(payloadRule); + if (validationErrors.length) { + return createBulkErrorObject({ + ruleId: idOrRuleIdOrUnknown, + statusCode: 400, + message: validationErrors.join(), + }); + } + try { const rule = await deleteRules({ alertsClient, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts index e30f332ecd1ca..8530b845e9bb9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts @@ -92,11 +92,12 @@ describe('delete_rules', () => { path: DETECTION_ENGINE_RULES_URL, query: {}, }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" must contain at least one of [id, rule_id]' - ); + const response = await server.inject(request, context); + expect(response.status).toEqual(400); + expect(response.body).toEqual({ + message: ['either "id" or "rule_id" must be set'], + status_code: 400, + }); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.ts index a2256b8338d2f..f4aa51c6dcfc3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -4,14 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ +import { queryRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/query_rules_type_dependents'; +import { + queryRulesSchema, + QueryRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/query_rules_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRules } from '../../rules/delete_rules'; -import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError } from './utils'; import { transformValidate } from './validate'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; -import { DeleteRuleRequestParams } from '../../rules/types'; +import { transformError, buildSiemResponse } from '../utils'; import { deleteNotifications } from '../../notifications/delete_notifications'; import { deleteRuleActionsSavedObject } from '../../rule_actions/delete_rule_actions_saved_object'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; @@ -21,7 +25,9 @@ export const deleteRulesRoute = (router: IRouter) => { { path: DETECTION_ENGINE_RULES_URL, validate: { - query: buildRouteValidation(queryRulesSchema), + query: buildRouteValidation( + queryRulesSchema + ), }, options: { tags: ['access:securitySolution'], @@ -29,6 +35,10 @@ export const deleteRulesRoute = (router: IRouter) => { }, async (context, request, response) => { const siemResponse = buildSiemResponse(response); + const validationErrors = queryRuleValidateTypeDependents(request.query); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } try { const { id, rule_id: ruleId } = request.query; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/export_rules_route.ts index ad0b3c87ff145..8df9f114559a8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -4,23 +4,32 @@ * you may not use this file except in compliance with the Elastic License. */ +import { + exportRulesQuerySchema, + ExportRulesQuerySchemaDecoded, + exportRulesSchema, + ExportRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/export_rules_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { ConfigType } from '../../../../config'; -import { ExportRulesRequestParams } from '../../rules/types'; import { getNonPackagedRulesCount } from '../../rules/get_existing_prepackaged_rules'; -import { exportRulesSchema, exportRulesQuerySchema } from '../schemas/export_rules_schema'; import { getExportByObjectIds } from '../../rules/get_export_by_object_ids'; import { getExportAll } from '../../rules/get_export_all'; -import { transformError, buildRouteValidation, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; export const exportRulesRoute = (router: IRouter, config: ConfigType) => { router.post( { path: `${DETECTION_ENGINE_RULES_URL}/_export`, validate: { - query: buildRouteValidation(exportRulesQuerySchema), - body: buildRouteValidation(exportRulesSchema), + query: buildRouteValidation( + exportRulesQuerySchema + ), + body: buildRouteValidation( + exportRulesSchema + ), }, options: { tags: ['access:securitySolution'], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.test.ts index b4591a8141f7b..892b7a2dd7315 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.test.ts @@ -91,7 +91,7 @@ describe('find_rules', () => { }); const result = server.validate(request); - expect(result.badRequest).toHaveBeenCalledWith('"invalid_value" is not allowed'); + expect(result.badRequest).toHaveBeenCalledWith('invalid keys "invalid_value"'); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts index 7d99be908d064..eceb953762090 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -4,22 +4,28 @@ * you may not use this file except in compliance with the Elastic License. */ +import { findRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/find_rules_type_dependents'; +import { + findRulesSchema, + FindRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/find_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { findRules } from '../../rules/find_rules'; -import { FindRulesRequestParams } from '../../rules/types'; -import { findRulesSchema } from '../schemas/find_rules_schema'; import { transformValidateFindAlerts } from './validate'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { getRuleActionsSavedObject } from '../../rule_actions/get_rule_actions_saved_object'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; export const findRulesRoute = (router: IRouter) => { router.get( { path: `${DETECTION_ENGINE_RULES_URL}/_find`, validate: { - query: buildRouteValidation(findRulesSchema), + query: buildRouteValidation( + findRulesSchema + ), }, options: { tags: ['access'], @@ -27,6 +33,10 @@ export const findRulesRoute = (router: IRouter) => { }, async (context, request, response) => { const siemResponse = buildSiemResponse(response); + const validationErrors = findRuleValidateTypeDependents(request.query); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } try { const { query } = request; @@ -45,6 +55,7 @@ export const findRulesRoute = (router: IRouter) => { sortField: query.sort_field, sortOrder: query.sort_order, filter: query.filter, + fields: query.fields, }); const ruleStatuses = await Promise.all( rules.data.map(async (rule) => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts index d7c6d317227fa..c2f396c874a7c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts @@ -66,7 +66,7 @@ describe('find_statuses', () => { }); const result = server.validate(request); - expect(result.badRequest).toHaveBeenCalledWith('"id" is not allowed'); + expect(result.badRequest).toHaveBeenCalledWith('Invalid value "undefined" supplied to "ids"'); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index a923c1bb49200..c02e28456111a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -4,28 +4,25 @@ * you may not use this file except in compliance with the Elastic License. */ +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { findRulesStatusesSchema } from '../schemas/find_rules_statuses_schema'; -import { - FindRulesStatusesRequestParams, - RuleStatusResponse, - IRuleStatusAttributes, -} from '../../rules/types'; -import { - buildRouteValidation, - transformError, - convertToSnakeCase, - buildSiemResponse, -} from '../utils'; +import { RuleStatusResponse, IRuleStatusAttributes } from '../../rules/types'; +import { transformError, convertToSnakeCase, buildSiemResponse } from '../utils'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { + findRulesStatusesSchema, + FindRulesStatusesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/find_rule_statuses_schema'; export const findRulesStatusesRoute = (router: IRouter) => { router.post( { path: `${DETECTION_ENGINE_RULES_URL}/_find_statuses`, validate: { - body: buildRouteValidation(findRulesStatusesSchema), + body: buildRouteValidation( + findRulesStatusesSchema + ), }, options: { tags: ['access:securitySolution'], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts index 31aad769d5a3d..c3f4695a20461 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts @@ -44,6 +44,7 @@ export const getPrepackagedRulesStatusRoute = (router: IRouter) => { sortField: 'enabled', sortOrder: 'desc', filter: 'alert.attributes.tags:"__internal_immutable:false"', + fields: undefined, }); const prepackagedRules = await getExistingPrepackagedRules({ alertsClient }); const rulesToInstall = getRulesToInstall(rulesFromFileSystem, prepackagedRules); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts index a7d5e579b074d..0762fbc7dd6e3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts @@ -250,14 +250,16 @@ describe('import_rules_route', () => { errors: [ { error: { - message: 'child "rule_id" fails because ["rule_id" is required]', + // TODO: Change the formatter to do better than output [object Object] + message: '[object Object],[object Object]', status_code: 400, }, rule_id: '(unknown id)', }, { error: { - message: 'child "rule_id" fails because ["rule_id" is required]', + // TODO: Change the formatter to do better than output [object Object] + message: '[object Object],[object Object]', status_code: 400, }, rule_id: '(unknown id)', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts index cbe583a11d1c1..c8b61414608a9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -8,8 +8,15 @@ import { chunk } from 'lodash/fp'; import { extname } from 'path'; import { - ImportRulesSchema, - importRulesSchema, + importRulesQuerySchema, + ImportRulesQuerySchemaDecoded, + importRulesPayloadSchema, + ImportRulesPayloadSchemaDecoded, + ImportRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/import_rules_schema'; +import { + ImportRulesSchema as ImportRulesResponseSchema, + importRulesSchema as importRulesResponseSchema, } from '../../../../../common/detection_engine/schemas/response/import_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { createPromiseFromStreams } from '../../../../../../../../src/legacy/utils/streams'; @@ -19,11 +26,9 @@ import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; import { createRules } from '../../rules/create_rules'; -import { ImportRulesRequestParams } from '../../rules/types'; import { readRules } from '../../rules/read_rules'; import { getIndexExists } from '../../index/get_index_exists'; import { - buildRouteValidation, createBulkErrorObject, ImportRuleResponse, BulkError, @@ -32,14 +37,15 @@ import { transformError, buildSiemResponse, } from '../utils'; -import { ImportRuleAlertRest } from '../../types'; import { patchRules } from '../../rules/patch_rules'; -import { importRulesQuerySchema, importRulesPayloadSchema } from '../schemas/import_rules_schema'; import { getTupleDuplicateErrorsAndUniqueRules } from './utils'; import { validate } from './validate'; import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { HapiReadableStream } from '../../rules/types'; +import { PartialFilter } from '../../types'; -type PromiseFromStreams = ImportRuleAlertRest | Error; +type PromiseFromStreams = ImportRulesSchemaDecoded | Error; const CHUNK_PARSED_OBJECT_SIZE = 10; @@ -48,8 +54,13 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP { path: `${DETECTION_ENGINE_RULES_URL}/_import`, validate: { - query: buildRouteValidation(importRulesQuerySchema), - body: buildRouteValidation(importRulesPayloadSchema), + query: buildRouteValidation( + importRulesQuerySchema + ), + body: buildRouteValidation< + typeof importRulesPayloadSchema, + ImportRulesPayloadSchemaDecoded + >(importRulesPayloadSchema), }, options: { tags: ['access:securitySolution'], @@ -74,7 +85,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP const mlAuthz = buildMlAuthz({ license: context.licensing.license, ml, request }); - const { filename } = request.body.file.hapi; + const { filename } = (request.body.file as HapiReadableStream).hapi; const fileExtension = extname(filename).toLowerCase(); if (fileExtension !== '.ndjson') { return siemResponse.error({ @@ -94,7 +105,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP const objectLimit = config.maxRuleImportExportSize; const readStream = createRulesStreamFromNdJson(objectLimit); const parsedObjects = await createPromiseFromStreams([ - request.body.file, + request.body.file as HapiReadableStream, ...readStream, ]); const [duplicateIdErrors, uniqueParsedObjects] = getTupleDuplicateErrorsAndUniqueRules( @@ -128,13 +139,13 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP false_positives: falsePositives, from, immutable, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, machine_learning_job_id: machineLearningJobId, output_index: outputIndex, saved_id: savedId, meta, - filters, + filters: filtersRest, rule_id: ruleId, index, interval, @@ -151,13 +162,24 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP timeline_id: timelineId, timeline_title: timelineTitle, version, - exceptions_list, + exceptions_list: exceptionsList, } = parsedRule; try { + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + throwHttpError(await mlAuthz.validateRuleType(type)); - const rule = await readRules({ alertsClient, ruleId }); + const rule = await readRules({ alertsClient, ruleId, id: undefined }); if (rule == null) { await createRules({ alertsClient, @@ -190,7 +212,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP references, note, version, - exceptions_list, + exceptionsList, actions: [], // Actions are not imported nor exported at this time }); resolve({ rule_id: ruleId, status_code: 200 }); @@ -202,7 +224,6 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP enabled, falsePositives, from, - immutable, query, language, outputIndex, @@ -225,9 +246,10 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP references, note, version, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, + actions: undefined, }); resolve({ rule_id: ruleId, status_code: 200 }); } else if (rule != null) { @@ -267,12 +289,12 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP return false; } }); - const importRules: ImportRulesSchema = { + const importRules: ImportRulesResponseSchema = { success: errorsResp.length === 0, success_count: successes.length, errors: errorsResp, }; - const [validated, errors] = validate(importRules, importRulesSchema); + const [validated, errors] = validate(importRules, importRulesResponseSchema); if (errors != null) { return siemResponse.error({ statusCode: 500, body: errors }); } else { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts index 24b2d5631b3a7..d5145e1dceae0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts @@ -155,11 +155,18 @@ describe('patch_rules_bulk', () => { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, body: [{ ...typicalPayload(), rule_id: undefined }], }); - const result = server.validate(request); + const response = await server.inject(request, context); - expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because ["value" must contain at least one of [id, rule_id]]' - ); + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + error: { + message: 'id or rule_id should have been defined', + status_code: 404, + }, + rule_id: '(unknown id)', + }, + ]); }); test('allows query rule type', async () => { @@ -182,7 +189,7 @@ describe('patch_rules_bulk', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because [child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]]' + 'Invalid value "unknown_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts index d1347786ddc1b..16f491547a9e6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts @@ -4,28 +4,35 @@ * you may not use this file except in compliance with the Elastic License. */ +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { + patchRulesBulkSchema, + PatchRulesBulkSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/patch_rules_bulk_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { rulesBulkSchema } from '../../../../../common/detection_engine/schemas/response/rules_bulk_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { transformBulkError, buildRouteValidation, buildSiemResponse } from '../utils'; +import { transformBulkError, buildSiemResponse } from '../utils'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; -import { patchRulesBulkSchema } from '../schemas/patch_rules_bulk_schema'; import { patchRules } from '../../rules/patch_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; import { readRules } from '../../rules/read_rules'; +import { PartialFilter } from '../../types'; export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.patch( { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, validate: { - body: buildRouteValidation(patchRulesBulkSchema), + body: buildRouteValidation( + patchRulesBulkSchema + ), }, options: { tags: ['access:securitySolution'], @@ -46,7 +53,7 @@ export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => const rules = await Promise.all( request.body.map(async (payloadRule) => { const { - actions, + actions: actionsRest, description, enabled, false_positives: falsePositives, @@ -58,7 +65,7 @@ export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersRest, rule_id: ruleId, id, index, @@ -77,8 +84,13 @@ export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => version, anomaly_threshold: anomalyThreshold, machine_learning_job_id: machineLearningJobId, + exceptions_list: exceptionsList, } = payloadRule; const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + try { if (type) { // reject an unauthorized "promotion" to ML @@ -123,6 +135,7 @@ export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => anomalyThreshold, machineLearningJobId, actions, + exceptionsList, }); if (rule != null && rule.enabled != null && rule.name != null) { const ruleActions = await updateRulesNotifications({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts index 9ae7e83ef7989..09230d45ee785 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts @@ -167,11 +167,11 @@ describe('patch_rules', () => { path: DETECTION_ENGINE_RULES_URL, body: { ...typicalPayload(), rule_id: undefined }, }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" must contain at least one of [id, rule_id]' - ); + const response = await server.inject(request, context); + expect(response.body).toEqual({ + message: ['either "id" or "rule_id" must be set'], + status_code: 400, + }); }); test('allows query rule type', async () => { @@ -194,7 +194,7 @@ describe('patch_rules', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]' + 'Invalid value "unknown_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.ts index 8f0d222ebaa64..385eec0fe1180 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.ts @@ -4,35 +4,48 @@ * you may not use this file except in compliance with the Elastic License. */ +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { patchRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/patch_rules_type_dependents'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { + PatchRulesSchemaDecoded, + patchRulesSchema, +} from '../../../../../common/detection_engine/schemas/request/patch_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; import { patchRules } from '../../rules/patch_rules'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { patchRulesSchema } from '../schemas/patch_rules_schema'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; import { readRules } from '../../rules/read_rules'; +import { PartialFilter } from '../../types'; export const patchRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.patch( { path: DETECTION_ENGINE_RULES_URL, validate: { - body: buildRouteValidation(patchRulesSchema), + body: buildRouteValidation( + patchRulesSchema + ), }, options: { tags: ['access:securitySolution'], }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const validationErrors = patchRuleValidateTypeDependents(request.body); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } const { - actions, + actions: actionsRest, description, enabled, false_positives: falsePositives, @@ -44,7 +57,7 @@ export const patchRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersRest, rule_id: ruleId, id, index, @@ -63,10 +76,13 @@ export const patchRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { version, anomaly_threshold: anomalyThreshold, machine_learning_job_id: machineLearningJobId, + exceptions_list: exceptionsList, } = request.body; - const siemResponse = buildSiemResponse(response); - try { + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + const alertsClient = context.alerting?.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; @@ -119,6 +135,7 @@ export const patchRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { anomalyThreshold, machineLearningJobId, actions, + exceptionsList, }); if (rule != null && rule.enabled != null && rule.name != null) { const ruleActions = await updateRulesNotifications({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/read_rules_route.ts index c9b218a3f0898..4a568643ccc2e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -4,14 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ +import { queryRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/query_rules_type_dependents'; +import { + queryRulesSchema, + QueryRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/query_rules_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { getIdError } from './utils'; import { transformValidate } from './validate'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { readRules } from '../../rules/read_rules'; -import { queryRulesSchema } from '../schemas/query_rules_schema'; -import { ReadRuleRequestParams } from '../../rules/types'; import { getRuleActionsSavedObject } from '../../rule_actions/get_rule_actions_saved_object'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; @@ -20,15 +24,22 @@ export const readRulesRoute = (router: IRouter) => { { path: DETECTION_ENGINE_RULES_URL, validate: { - query: buildRouteValidation(queryRulesSchema), + query: buildRouteValidation( + queryRulesSchema + ), }, options: { tags: ['access:securitySolution'], }, }, async (context, request, response) => { - const { id, rule_id: ruleId } = request.query; const siemResponse = buildSiemResponse(response); + const validationErrors = queryRuleValidateTypeDependents(request.query); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } + + const { id, rule_id: ruleId } = request.query; const alertsClient = context.alerting?.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts index 74b135bcb4d8c..2f331938e3ca8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts @@ -126,16 +126,18 @@ describe('update_rules_bulk', () => { describe('request validation', () => { test('rejects payloads with no ID', async () => { - const request = requestMock.create({ + const noIdRequest = requestMock.create({ method: 'put', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, body: [{ ...typicalPayload(), rule_id: undefined }], }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because ["value" must contain at least one of [id, rule_id]]' - ); + const response = await server.inject(noIdRequest, context); + expect(response.body).toEqual([ + { + error: { message: 'either "id" or "rule_id" must be set', status_code: 400 }, + rule_id: '(unknown id)', + }, + ]); }); test('allows query rule type', async () => { @@ -158,7 +160,7 @@ describe('update_rules_bulk', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because [child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]]' + 'Invalid value "unknown_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index ec2b0168c18bf..3ca4a28dd93ee 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -4,27 +4,35 @@ * you may not use this file except in compliance with the Elastic License. */ +import { updateRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/update_rules_type_dependents'; +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { + updateRulesBulkSchema, + UpdateRulesBulkSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/update_rules_bulk_schema'; import { rulesBulkSchema } from '../../../../../common/detection_engine/schemas/response/rules_bulk_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; -import { UpdateRuleAlertParamsRest } from '../../rules/types'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; -import { buildRouteValidation, transformBulkError, buildSiemResponse } from '../utils'; -import { updateRulesBulkSchema } from '../schemas/update_rules_bulk_schema'; +import { transformBulkError, buildSiemResponse, createBulkErrorObject } from '../utils'; import { updateRules } from '../../rules/update_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { PartialFilter } from '../../types'; export const updateRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.put( { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, validate: { - body: buildRouteValidation(updateRulesBulkSchema), + body: buildRouteValidation( + updateRulesBulkSchema + ), }, options: { tags: ['access:securitySolution'], @@ -46,21 +54,21 @@ export const updateRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => const rules = await Promise.all( request.body.map(async (payloadRule) => { const { - actions, + actions: actionsRest, anomaly_threshold: anomalyThreshold, description, enabled, false_positives: falsePositives, from, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, machine_learning_job_id: machineLearningJobId, output_index: outputIndex, saved_id: savedId, timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersRest, rule_id: ruleId, id, index, @@ -77,11 +85,32 @@ export const updateRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => references, note, version, - exceptions_list, + exceptions_list: exceptionsList, } = payloadRule; const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; try { + const validationErrors = updateRuleValidateTypeDependents(payloadRule); + if (validationErrors.length) { + return createBulkErrorObject({ + ruleId, + statusCode: 400, + message: validationErrors.join(), + }); + } + + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + throwHttpError(await mlAuthz.validateRuleType(type)); const rule = await updateRules({ @@ -116,7 +145,7 @@ export const updateRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => references, note, version, - exceptions_list, + exceptionsList, actions, }); if (rule != null) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts index 25556d8d10fd4..f8b7636080b1b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts @@ -138,13 +138,16 @@ describe('update_rules', () => { const noIdRequest = requestMock.create({ method: 'put', path: DETECTION_ENGINE_RULES_URL, - body: { ...typicalPayload(), rule_id: undefined }, + body: { + ...typicalPayload(), + rule_id: undefined, + }, + }); + const response = await server.inject(noIdRequest, context); + expect(response.body).toEqual({ + message: ['either "id" or "rule_id" must be set'], + status_code: 400, }); - const result = await server.validate(noIdRequest); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" must contain at least one of [id, rule_id]' - ); }); test('allows query rule type', async () => { @@ -167,7 +170,7 @@ describe('update_rules', () => { const result = await server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]' + 'Invalid value "unknown type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts index 2680db8abdd4d..f2b47f195ca5c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -4,48 +4,62 @@ * you may not use this file except in compliance with the Elastic License. */ +import { updateRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/update_rules_type_dependents'; +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { + updateRulesSchema, + UpdateRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/update_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; -import { UpdateRuleAlertParamsRest } from '../../rules/types'; -import { updateRulesSchema } from '../schemas/update_rules_schema'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; import { updateRules } from '../../rules/update_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { PartialFilter } from '../../types'; export const updateRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.put( { path: DETECTION_ENGINE_RULES_URL, validate: { - body: buildRouteValidation(updateRulesSchema), + body: buildRouteValidation( + updateRulesSchema + ), }, options: { tags: ['access:securitySolution'], }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const validationErrors = updateRuleValidateTypeDependents(request.body); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } + const { - actions, + actions: actionsRest, anomaly_threshold: anomalyThreshold, description, enabled, false_positives: falsePositives, from, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, machine_learning_job_id: machineLearningJobId, output_index: outputIndex, saved_id: savedId, timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersRest, rule_id: ruleId, id, index, @@ -62,11 +76,21 @@ export const updateRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { references, note, version, - exceptions_list, + exceptions_list: exceptionsList, } = request.body; - const siemResponse = buildSiemResponse(response); - try { + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + const alertsClient = context.alerting?.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; const siemClient = context.securitySolution?.getAppClient(); @@ -112,7 +136,7 @@ export const updateRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { references, note, version, - exceptions_list, + exceptionsList, actions: throttle === 'rule' ? actions : [], // Only enable actions if throttle is rule, otherwise we are a notification and should not enable it }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts index df158d23c0e24..3b2750bbbf664 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts @@ -19,7 +19,7 @@ import { } from './utils'; import { getResult } from '../__mocks__/request_responses'; import { INTERNAL_IDENTIFIER } from '../../../../../common/constants'; -import { ImportRuleAlertRest, RuleAlertParamsRest, RuleTypeParams } from '../../types'; +import { RuleTypeParams } from '../../types'; import { BulkError, ImportSuccessError } from '../utils'; import { getSimpleRule, getOutputRuleAlertForRest } from '../__mocks__/utils'; import { createPromiseFromStreams } from '../../../../../../../../src/legacy/utils/streams'; @@ -28,8 +28,10 @@ import { SanitizedAlert } from '../../../../../../alerts/server/types'; import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; import { RuleAlertType } from '../../rules/types'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { CreateRulesBulkSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/create_rules_bulk_schema'; +import { ImportRulesSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/import_rules_schema'; -type PromiseFromStreams = ImportRuleAlertRest | Error; +type PromiseFromStreams = ImportRulesSchemaDecoded | Error; describe('utils', () => { beforeAll(() => { @@ -485,7 +487,7 @@ describe('utils', () => { { rule_id: 'value3' }, {}, {}, - ] as RuleAlertParamsRest[], + ] as CreateRulesBulkSchemaDecoded, 'rule_id' ); const expected = ['value2', 'value3']; @@ -499,7 +501,7 @@ describe('utils', () => { { rule_id: 'value3' }, {}, {}, - ] as RuleAlertParamsRest[], + ] as CreateRulesBulkSchemaDecoded, 'rule_id' ); const expected: string[] = []; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts index 5329ff04435ca..3ed45bd8367fc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts @@ -8,6 +8,8 @@ import { pickBy, countBy } from 'lodash/fp'; import { SavedObject, SavedObjectsFindResponse } from 'kibana/server'; import uuid from 'uuid'; +import { ImportRulesSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/import_rules_schema'; +import { CreateRulesBulkSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/create_rules_bulk_schema'; import { PartialAlert, FindResult } from '../../../../../../alerts/server'; import { INTERNAL_IDENTIFIER } from '../../../../../common/constants'; import { @@ -19,7 +21,7 @@ import { isRuleStatusFindTypes, isRuleStatusSavedObjectType, } from '../../rules/types'; -import { OutputRuleAlertRest, ImportRuleAlertRest, RuleAlertParamsRest } from '../../types'; +import { OutputRuleAlertRest } from '../../types'; import { createBulkErrorObject, BulkError, @@ -29,10 +31,9 @@ import { OutputError, } from '../utils'; import { hasListsFeature } from '../../feature_flags'; -// import { transformAlertToRuleAction } from '../../../../../common/detection_engine/transform_actions'; import { RuleActions } from '../../rule_actions/types'; -type PromiseFromStreams = ImportRuleAlertRest | Error; +type PromiseFromStreams = ImportRulesSchemaDecoded | Error; export const getIdError = ({ id, @@ -148,7 +149,7 @@ export const transformAlertToRule = ( last_failure_message: ruleStatus?.attributes.lastFailureMessage, last_success_message: ruleStatus?.attributes.lastSuccessMessage, // TODO: (LIST-FEATURE) Remove hasListsFeature() check once we have lists available for a release - exceptions_list: hasListsFeature() ? alert.params.exceptions_list : null, + exceptions_list: hasListsFeature() ? alert.params.exceptionsList : null, }); }; @@ -243,7 +244,10 @@ export const transformOrImportError = ( } }; -export const getDuplicates = (ruleDefinitions: RuleAlertParamsRest[], by: 'rule_id'): string[] => { +export const getDuplicates = ( + ruleDefinitions: CreateRulesBulkSchemaDecoded, + by: 'rule_id' +): string[] => { const mappedDuplicates = countBy( by, ruleDefinitions.filter((r) => r[by] != null) @@ -265,21 +269,17 @@ export const getTupleDuplicateErrorsAndUniqueRules = ( acc.rulesAcc.set(uuid.v4(), parsedRule); } else { const { rule_id: ruleId } = parsedRule; - if (ruleId != null) { - if (acc.rulesAcc.has(ruleId) && !isOverwrite) { - acc.errors.set( - uuid.v4(), - createBulkErrorObject({ - ruleId, - statusCode: 400, - message: `More than one rule with rule-id: "${ruleId}" found`, - }) - ); - } - acc.rulesAcc.set(ruleId, parsedRule); - } else { - acc.rulesAcc.set(uuid.v4(), parsedRule); + if (acc.rulesAcc.has(ruleId) && !isOverwrite) { + acc.errors.set( + uuid.v4(), + createBulkErrorObject({ + ruleId, + statusCode: 400, + message: `More than one rule with rule-id: "${ruleId}" found`, + }) + ); } + acc.rulesAcc.set(ruleId, parsedRule); } return acc; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts deleted file mode 100644 index 66356a1d65352..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts +++ /dev/null @@ -1,1658 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams, PrepackagedRules } from '../../types'; -import { addPrepackagedRulesSchema } from './add_prepackaged_rules_schema'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('add prepackaged rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate', () => { - expect(addPrepackagedRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[rule_id] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - interval: '5m', - index: ['index-1'], - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, query, index, interval, version] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, version] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does not validate because output_index is not allowed', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - version: 1, - }).error.message - ).toEqual('"output_index" is not allowed'); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, version] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You can send in an empty array to threat', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - version: 1, - }).error - ).toBeFalsy(); - }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, version, s] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - threat: [ - { - framework: 'someFramework', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - version: 1, - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as valid', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('defaults references to an array', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).value.references - ).toEqual([]); - }); - - test('defaults immutable to true', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).value.immutable - ).toEqual(true); - }); - - test('immutable cannot be set in a pre-packaged rule', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - immutable: true, - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).error.message - ).toEqual('child "immutable" fails because ["immutable" is not allowed]'); - }); - - test('defaults enabled to false', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).value.enabled - ).toEqual(false); - }); - - test('rule_id is required', () => { - expect( - addPrepackagedRulesSchema.validate>({ - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).error.message - ).toEqual('child "rule_id" fails because ["rule_id" is required]'); - }); - - test('references cannot be numbers', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { references: number[] } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - version: 1, - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { index: number[] } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('defaults interval to 5 min', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - version: 1, - }).value.interval - ).toEqual('5m'); - }); - - test('defaults max signals to 100', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - version: 1, - }).value.max_signals - ).toEqual(100); - }); - - test('saved_id is required when type is saved_query and will not validate without out', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - version: 1, - }).error.message - ).toEqual('child "saved_id" fails because ["saved_id" is required]'); - }); - - test('saved_id is required when type is saved_query and validates with it', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - version: 1, - }).error - ).toBeFalsy(); - }); - - test('filters cannot be a string', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: 'some string', - version: 1, - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('language validates with kuery', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - version: 1, - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - version: 1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - version: 1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You can optionally send in an array of tags', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: ['tag_1', 'tag_2'], - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of tags that are numbers', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { tags: number[] } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: [0, 1, 2], - version: 1, - }).error.message - ).toEqual( - 'child "tags" fails because ["tags" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot send in an array of threat that are missing "framework"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - version: 1, - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "tactic"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - version: 1, - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "technique"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - }, - ], - version: 1, - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('You can optionally send in an array of false positives', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - false_positives: ['false_1', 'false_2'], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of false positives that are numbers', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { false_positives: number[] } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - false_positives: [5, 4], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "false_positives" fails because ["false_positives" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot set the risk_score to 101', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 101, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be less than 101]'); - }); - - test('You cannot set the risk_score to -1', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: -1, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be greater than -1]'); - }); - - test('You can set the risk_score to 0', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 0, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set the risk_score to 100', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 100, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set meta to any object you want', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot create meta as a string', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial & { meta: string }> - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: 'should not work', - version: 1, - }).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('You can omit the query string when filters are present', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - version: 1, - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_id: 'timeline-id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_id: 'timeline-id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_id: 'timeline-id', - timeline_title: '', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - index: ['auditbeat-*'], - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - index: ['auditbeat-*'], - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - index: ['auditbeat-*'], - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.actions - ).toEqual([]); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: Array>; - } - >({ - actions: [ - { - id: 'id', - action_type_id: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: Array>; - } - >({ - actions: [ - { - group: 'group', - action_type_id: 'action_type_id', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: Array>; - } - >({ - actions: [ - { - group: 'group', - id: 'id', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: Array>; - } - >({ - actions: [ - { - group: 'group', - id: 'id', - action_type_id: 'action_type_id', - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: AlertAction[]; - } - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('The default for "throttle" will be null', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - index: ['auditbeat-*'], - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.throttle - ).toEqual(null); - }); - - describe('note', () => { - test('You can set note to any string you want', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: '# test header', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot create note as anything other than a string', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial & { note: object }> - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: { - somethingMadeUp: { somethingElse: true }, - }, - version: 1, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - version: 1, - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - { - name: '678', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - version: 1, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { - expect( - addPrepackagedRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - version: 1, - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { - expect( - addPrepackagedRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - version: 1, - }).value.exceptions_list - ).toEqual([]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts deleted file mode 100644 index f1bffdaf83522..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - actions, - enabled, - description, - false_positives, - filters, - from, - immutable, - index, - rule_id, - interval, - query, - language, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note, - version, - lists, - anomaly_threshold, - machine_learning_job_id, -} from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -import { DEFAULT_MAX_SIGNALS } from '../../../../../common/constants'; -import { hasListsFeature } from '../../feature_flags'; - -/** - * Big differences between this schema and the createRulesSchema - * - rule_id is required here - * - output_index is not allowed (and instead the space index must be used) - * - immutable is forbidden but defaults to true instead of to false and it can only ever be true - * - enabled defaults to false instead of true - * - version is a required field that must exist - * - index is a required field that must exist if type !== machine_learning - */ -export const addPrepackagedRulesSchema = Joi.object({ - actions: actions.default([]), - anomaly_threshold: anomaly_threshold.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - description: description.required(), - enabled: enabled.default(false), - false_positives: false_positives.default([]), - filters, - from: from.default('now-6m'), - rule_id: rule_id.required(), - immutable: immutable.forbidden().default(true).valid(true), - index: index.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: Joi.required(), - }), - interval: interval.default('5m'), - query: query.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: query.allow('').default(''), - }), - language: language.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: language.default('kuery'), - }), - machine_learning_job_id: machine_learning_job_id.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - saved_id: saved_id.when('type', { - is: 'saved_query', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - timeline_id, - timeline_title, - meta, - risk_score: risk_score.required(), - max_signals: max_signals.default(DEFAULT_MAX_SIGNALS), - name: name.required(), - severity: severity.required(), - tags: tags.default([]), - to: to.default('now'), - type: type.required(), - threat: threat.default([]), - throttle: throttle.default(null), - references: references.default([]), - note: note.allow(''), - version: version.required(), - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.test.ts deleted file mode 100644 index 0bf59759a6db6..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.test.ts +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { createRulesBulkSchema } from './create_rules_bulk_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -// only the basics of testing are here. -// see: create_rules_schema.test.ts for the bulk of the validation tests -// this just wraps createRulesSchema in an array -describe('create_rules_bulk_schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('can take an empty array and validate it', () => { - expect( - createRulesBulkSchema.validate>>([]).error - ).toBeFalsy(); - }); - - test('made up values do not validate', () => { - expect( - createRulesBulkSchema.validate<[{ madeUp: string }]>([ - { - madeUp: 'hi', - }, - ]).error - ).toBeTruthy(); - }); - - test('single array of [id] does validate', () => { - expect( - createRulesBulkSchema.validate>>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - ]).error - ).toBeFalsy(); - }); - - test('two values of [id] does validate', () => { - expect( - createRulesBulkSchema.validate>>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - { - rule_id: 'rule-2', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - ]).error - ).toBeFalsy(); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).value[0].from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).value[0].to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).error.message - ).toEqual( - '"value" at position 0 fails because [child "severity" fails because ["severity" must be one of [low, medium, high, critical]]]' - ); - }); - - test('You can set "note" to a string', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '# test markdown', - version: 1, - }, - ]).error - ).toBeFalsy(); - }); - - test('You can set "note" to an empty string', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '', - version: 1, - }, - ]).error - ).toBeFalsy(); - }); - - test('You cannot set "note" to anything other than string', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: { - something: 'some object', - }, - version: 1, - }, - ]).error.message - ).toEqual( - '"value" at position 0 fails because [child "note" fails because ["note" must be a string]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).value[0].actions - ).toEqual([]); - }); - - test('The default for "throttle" will be null', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).value[0].throttle - ).toEqual(null); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.ts deleted file mode 100644 index bcc4475f2d9f0..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -import { createRulesSchema } from './create_rules_schema'; - -export const createRulesBulkSchema = Joi.array().items(createRulesSchema); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts deleted file mode 100644 index 013db2020a146..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts +++ /dev/null @@ -1,1623 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { createRulesSchema } from './create_rules_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams, RuleAlertParamsRest } from '../../types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('create rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate', () => { - expect(createRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - createRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[rule_id] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - interval: '5m', - index: ['index-1'], - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('You can send in an empty array to threat', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - threat: [ - { - framework: 'someFramework', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as valid', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('defaults references to an array', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).value.references - ).toEqual([]); - }); - - test('references cannot be numbers', () => { - expect( - createRulesSchema.validate< - Partial> & { references: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - createRulesSchema.validate> & { index: number[] }>( - { - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - } - ).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('defaults interval to 5 min', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - }).value.interval - ).toEqual('5m'); - }); - - test('defaults max signals to 100', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).value.max_signals - ).toEqual(100); - }); - - test('saved_id is required when type is saved_query and will not validate without out', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - }).error.message - ).toEqual('child "saved_id" fails because ["saved_id" is required]'); - }); - - test('saved_id is required when type is saved_query and validates with it', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - }).error - ).toBeFalsy(); - }); - - test('filters cannot be a string', () => { - expect( - createRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: 'some string', - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('language validates with kuery', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - createRulesSchema.validate< - Partial & { language: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can optionally send in an array of tags', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: ['tag_1', 'tag_2'], - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of tags that are numbers', () => { - expect( - createRulesSchema.validate> & { tags: number[] }>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: [0, 1, 2], - }).error.message - ).toEqual( - 'child "tags" fails because ["tags" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot send in an array of threat that are missing "framework"', () => { - expect( - createRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "tactic"', () => { - expect( - createRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "technique"', () => { - expect( - createRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('You can optionally send in an array of false positives', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: ['false_1', 'false_2'], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of false positives that are numbers', () => { - expect( - createRulesSchema.validate< - Partial> & { false_positives: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: [5, 4], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual( - 'child "false_positives" fails because ["false_positives" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot set the immutable when trying to create a rule', () => { - expect( - createRulesSchema.validate< - Partial> & { immutable: number } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: 5, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('"immutable" is not allowed'); - }); - - test('You cannot set the risk_score to 101', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 101, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be less than 101]'); - }); - - test('You cannot set the risk_score to -1', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: -1, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be greater than -1]'); - }); - - test('You can set the risk_score to 0', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 0, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set the risk_score to 100', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 100, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set meta to any object you want', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - }).error - ).toBeFalsy(); - }); - - test('You cannot create meta as a string', () => { - expect( - createRulesSchema.validate & { meta: string }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: 'should not work', - }).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('You can omit the query string when filters are present', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: '', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.actions - ).toEqual([]); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: AlertAction[]; - } - > - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('The default for "throttle" will be null', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.throttle - ).toEqual(null); - }); - - describe('note', () => { - test('You can set note to a string', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '# documentation markdown here', - }).error - ).toBeFalsy(); - }); - - test('You can set note to an emtpy string', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '', - }).error - ).toBeFalsy(); - }); - - test('You cannot create note as an object', () => { - expect( - createRulesSchema.validate & { note: object }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: { - somethingHere: 'something else', - }, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).error - ).toBeFalsy(); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - { - name: '678', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { - expect( - createRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { - expect( - createRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).value.exceptions_list - ).toEqual([]); - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.ts deleted file mode 100644 index dec8b5ccbc790..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.ts +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - actions, - anomaly_threshold, - enabled, - description, - false_positives, - filters, - from, - index, - rule_id, - interval, - query, - language, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note, - version, - lists, - machine_learning_job_id, -} from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -import { DEFAULT_MAX_SIGNALS } from '../../../../../common/constants'; -import { hasListsFeature } from '../../feature_flags'; - -export const createRulesSchema = Joi.object({ - actions: actions.default([]), - anomaly_threshold: anomaly_threshold.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - description: description.required(), - enabled: enabled.default(true), - false_positives: false_positives.default([]), - filters, - from: from.default('now-6m'), - rule_id, - index, - interval: interval.default('5m'), - query: query.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: query.allow('').default(''), - }), - language: language.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: language.default('kuery'), - }), - output_index, - saved_id: saved_id.when('type', { - is: 'saved_query', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - timeline_id, - timeline_title, - meta, - machine_learning_job_id: machine_learning_job_id.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - risk_score: risk_score.required(), - max_signals: max_signals.default(DEFAULT_MAX_SIGNALS), - name: name.required(), - severity: severity.required(), - tags: tags.default([]), - to: to.default('now'), - type: type.required(), - threat: threat.default([]), - throttle: throttle.default(null), - references: references.default([]), - note: note.allow(''), - version: version.default(1), - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.test.ts deleted file mode 100644 index 0e71237f75232..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.test.ts +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { exportRulesSchema, exportRulesQuerySchema } from './export_rules_schema'; -import { ExportRulesRequestParams } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('create rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - describe('exportRulesSchema', () => { - test('null value or absent values validate', () => { - expect(exportRulesSchema.validate(null).error).toBeFalsy(); - }); - - test('empty object does not validate', () => { - expect( - exportRulesSchema.validate>({}).error - ).toBeTruthy(); - }); - - test('empty object array does validate', () => { - expect( - exportRulesSchema.validate>({ objects: [] }).error - ).toBeTruthy(); - }); - - test('array with rule_id validates', () => { - expect( - exportRulesSchema.validate>({ - objects: [{ rule_id: 'test-1' }], - }).error - ).toBeFalsy(); - }); - - test('array with id does not validate as we do not allow that on purpose since we export rule_id', () => { - expect( - exportRulesSchema.validate>({ - objects: [{ id: 'test-1' }], - }).error.message - ).toEqual( - 'child "objects" fails because ["objects" at position 0 fails because ["id" is not allowed]]' - ); - }); - }); - - describe('exportRulesQuerySchema', () => { - test('default value for file_name is export.ndjson', () => { - expect( - exportRulesQuerySchema.validate>({}).value - .file_name - ).toEqual('export.ndjson'); - }); - - test('default value for exclude_export_details is false', () => { - expect( - exportRulesQuerySchema.validate>({}).value - .exclude_export_details - ).toEqual(false); - }); - - test('file_name validates', () => { - expect( - exportRulesQuerySchema.validate>({ - file_name: 'test.ndjson', - }).error - ).toBeFalsy(); - }); - - test('file_name does not validate with a number', () => { - expect( - exportRulesQuerySchema.validate< - Partial & { file_name: number }> - >({ - file_name: 5, - }).error.message - ).toEqual('child "file_name" fails because ["file_name" must be a string]'); - }); - - test('exclude_export_details validates with a boolean true', () => { - expect( - exportRulesQuerySchema.validate>({ - exclude_export_details: true, - }).error - ).toBeFalsy(); - }); - - test('exclude_export_details does not validate with a weird string', () => { - expect( - exportRulesQuerySchema.validate< - Partial< - Omit & { - exclude_export_details: string; - } - > - >({ - exclude_export_details: 'blah', - }).error.message - ).toEqual( - 'child "exclude_export_details" fails because ["exclude_export_details" must be a boolean]' - ); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.ts deleted file mode 100644 index a14d81604d9f8..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { objects, exclude_export_details, file_name } from './schemas'; -/* eslint-disable @typescript-eslint/camelcase */ - -export const exportRulesSchema = Joi.object({ - objects, -}) - .min(1) - .allow(null); - -export const exportRulesQuerySchema = Joi.object({ - file_name: file_name.default('export.ndjson'), - exclude_export_details: exclude_export_details.default(false), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.test.ts deleted file mode 100644 index ffbfd193873a8..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.test.ts +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { findRulesSchema } from './find_rules_schema'; -import { FindParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('find rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do validate', () => { - expect(findRulesSchema.validate>({}).error).toBeFalsy(); - }); - - test('all values validate', () => { - expect( - findRulesSchema.validate>({ - per_page: 5, - page: 1, - sort_field: 'some field', - fields: ['field 1', 'field 2'], - filter: 'some filter', - sort_order: 'asc', - }).error - ).toBeFalsy(); - }); - - test('made up parameters do not validate', () => { - expect( - findRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('per_page validates', () => { - expect( - findRulesSchema.validate>({ per_page: 5 }).error - ).toBeFalsy(); - }); - - test('page validates', () => { - expect( - findRulesSchema.validate>({ page: 5 }).error - ).toBeFalsy(); - }); - - test('sort_field validates', () => { - expect( - findRulesSchema.validate>({ sort_field: 'some value' }).error - ).toBeFalsy(); - }); - - test('fields validates with a string', () => { - expect( - findRulesSchema.validate>({ fields: ['some value'] }).error - ).toBeFalsy(); - }); - - test('fields validates with multiple strings', () => { - expect( - findRulesSchema.validate>({ - fields: ['some value 1', 'some value 2'], - }).error - ).toBeFalsy(); - }); - - test('fields does not validate with a number', () => { - expect( - findRulesSchema.validate> & { fields: number[] }>({ - fields: [5], - }).error.message - ).toEqual( - 'child "fields" fails because ["fields" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('per page has a default of 20', () => { - expect(findRulesSchema.validate>({}).value.per_page).toEqual(20); - }); - - test('page has a default of 1', () => { - expect(findRulesSchema.validate>({}).value.page).toEqual(1); - }); - - test('filter works with a string', () => { - expect( - findRulesSchema.validate>({ - filter: 'some value 1', - }).error - ).toBeFalsy(); - }); - - test('filter does not work with a number', () => { - expect( - findRulesSchema.validate> & { filter: number }>({ - filter: 5, - }).error.message - ).toEqual('child "filter" fails because ["filter" must be a string]'); - }); - - test('sort_order requires sort_field to work', () => { - expect( - findRulesSchema.validate>({ - sort_order: 'asc', - }).error.message - ).toEqual('child "sort_field" fails because ["sort_field" is required]'); - }); - - test('sort_order and sort_field validate together', () => { - expect( - findRulesSchema.validate>({ - sort_order: 'asc', - sort_field: 'some field', - }).error - ).toBeFalsy(); - }); - - test('sort_order validates with desc and sort_field', () => { - expect( - findRulesSchema.validate>({ - sort_order: 'desc', - sort_field: 'some field', - }).error - ).toBeFalsy(); - }); - - test('sort_order does not validate with a string other than asc and desc', () => { - expect( - findRulesSchema.validate< - Partial> & { sort_order: string } - >({ - sort_order: 'some other string', - sort_field: 'some field', - }).error.message - ).toEqual('child "sort_order" fails because ["sort_order" must be one of [asc, desc]]'); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.ts deleted file mode 100644 index 3cc5b9ca44530..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { queryFilter, fields, per_page, page, sort_field, sort_order } from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -export const findRulesSchema = Joi.object({ - fields, - filter: queryFilter, - per_page, - page, - sort_field: Joi.when(Joi.ref('sort_order'), { - is: Joi.exist(), - then: sort_field.required(), - otherwise: sort_field.optional(), - }), - sort_order, -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_statuses_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_statuses_schema.ts deleted file mode 100644 index 5b8661e69e206..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_statuses_schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -export const findRulesStatusesSchema = Joi.object({ - ids: Joi.array().items(Joi.string()), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts deleted file mode 100644 index cb03c4781cb6c..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts +++ /dev/null @@ -1,1841 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { - importRulesSchema, - importRulesQuerySchema, - importRulesPayloadSchema, -} from './import_rules_schema'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams, ImportRuleAlertRest } from '../../types'; -import { ImportRulesRequestParams } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('import rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - describe('importRulesSchema', () => { - test('empty objects do not validate', () => { - expect(importRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - importRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[rule_id] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - interval: '5m', - index: ['index-1'], - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('You can send in an empty array to threat', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - threat: [ - { - framework: 'someFramework', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as valid', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('defaults references to an array', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).value.references - ).toEqual([]); - }); - - test('references cannot be numbers', () => { - expect( - importRulesSchema.validate< - Partial> & { references: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - importRulesSchema.validate< - Partial> & { index: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('defaults interval to 5 min', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - }).value.interval - ).toEqual('5m'); - }); - - test('defaults max signals to 100', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).value.max_signals - ).toEqual(100); - }); - - test('saved_id is required when type is saved_query and will not validate without out', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - }).error.message - ).toEqual('child "saved_id" fails because ["saved_id" is required]'); - }); - - test('saved_id is required when type is saved_query and validates with it', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - }).error - ).toBeFalsy(); - }); - - test('filters cannot be a string', () => { - expect( - importRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: 'some string', - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('language validates with kuery', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can optionally send in an array of tags', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: ['tag_1', 'tag_2'], - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of tags that are numbers', () => { - expect( - importRulesSchema.validate> & { tags: number[] }>( - { - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: [0, 1, 2], - } - ).error.message - ).toEqual( - 'child "tags" fails because ["tags" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot send in an array of threat that are missing "framework"', () => { - expect( - importRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "tactic"', () => { - expect( - importRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "technique"', () => { - expect( - importRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('You can optionally send in an array of false positives', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: ['false_1', 'false_2'], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of false positives that are numbers', () => { - expect( - importRulesSchema.validate< - Partial> & { false_positives: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: [5, 4], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual( - 'child "false_positives" fails because ["false_positives" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You can optionally set the immutable to be false', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannnot set immutable to be true', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: true, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "immutable" fails because ["immutable" must be one of [false]]'); - }); - - test('You cannot set the immutable to be a number', () => { - expect( - importRulesSchema.validate< - Partial> & { immutable: number } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: 5, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "immutable" fails because ["immutable" must be a boolean]'); - }); - - test('You cannot set the risk_score to 101', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 101, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be less than 101]'); - }); - - test('You cannot set the risk_score to -1', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: -1, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be greater than -1]'); - }); - - test('You can set the risk_score to 0', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 0, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set the risk_score to 100', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 100, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set meta to any object you want', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - }).error - ).toBeFalsy(); - }); - - test('You cannot create meta as a string', () => { - expect( - importRulesSchema.validate & { meta: string }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: 'should not work', - }).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('You can omit the query string when filters are present', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: '', - }).error.message - ).toEqual( - 'child "timeline_title" fails because ["timeline_title" is not allowed to be empty]' - ); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('rule_id is required and you cannot get by with just id', () => { - expect( - importRulesSchema.validate>({ - id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error.message - ).toEqual('child "rule_id" fails because ["rule_id" is required]'); - }); - - test('it validates with created_at, updated_at, created_by, updated_by values', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - created_at: '2020-01-09T06:15:24.749Z', - updated_at: '2020-01-09T06:15:24.749Z', - created_by: 'Braden Hassanabad', - updated_by: 'Evan Hassanabad', - }).error - ).toBeFalsy(); - }); - - test('it does not validate with epoch strings for created_at', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - created_at: '1578550728650', - updated_at: '2020-01-09T06:15:24.749Z', - created_by: 'Braden Hassanabad', - updated_by: 'Evan Hassanabad', - }).error.message - ).toEqual('child "created_at" fails because ["created_at" must be a valid ISO 8601 date]'); - }); - - test('it does not validate with epoch strings for updated_at', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - created_at: '2020-01-09T06:15:24.749Z', - updated_at: '1578550728650', - created_by: 'Braden Hassanabad', - updated_by: 'Evan Hassanabad', - }).error.message - ).toEqual('child "updated_at" fails because ["updated_at" must be a valid ISO 8601 date]'); - }); - }); - - describe('importRulesQuerySchema', () => { - test('overwrite gets a default value of false', () => { - expect( - importRulesQuerySchema.validate>({}).value - .overwrite - ).toEqual(false); - }); - - test('overwrite validates with a boolean true', () => { - expect( - importRulesQuerySchema.validate>({ - overwrite: true, - }).error - ).toBeFalsy(); - }); - - test('overwrite does not validate with a weird string', () => { - expect( - importRulesQuerySchema.validate< - Partial< - Omit & { - overwrite: string; - } - > - >({ - overwrite: 'blah', - }).error - ).toBeTruthy(); - }); - }); - - describe('importRulesPayloadSchema', () => { - test('does not validate with an empty object', () => { - expect(importRulesPayloadSchema.validate({}).error).toBeTruthy(); - }); - - test('does validate with a file object', () => { - expect(importRulesPayloadSchema.validate({ file: {} }).error).toBeFalsy(); - }); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - language: 'kuery', - max_signals: 1, - version: 1, - }).value.to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.actions - ).toEqual([]); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: AlertAction[]; - } - > - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('The default for "throttle" will be null', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.throttle - ).toEqual(null); - }); - - describe('note', () => { - test('You can set note to a string', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: '# test header', - }).error - ).toBeFalsy(); - }); - - test('You can set note to an empty string', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: '', - }).error - ).toBeFalsy(); - }); - - test('You cannot create note set to null', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: null, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - - test('You cannot create note as something other than a string', () => { - expect( - importRulesSchema.validate & { note: object }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: { - somethingMadeUp: { somethingElse: true }, - }, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - { - name: '678', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate and exceptions_list is empty', () => { - expect( - importRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate', () => { - expect( - importRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).value.exceptions_list - ).toEqual([]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.ts deleted file mode 100644 index d3c728ebac1a9..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.ts +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - id, - actions, - created_at, - updated_at, - created_by, - updated_by, - enabled, - description, - false_positives, - filters, - from, - immutable, - index, - rule_id, - interval, - query, - language, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note, - version, - lists, - anomaly_threshold, - machine_learning_job_id, -} from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -import { DEFAULT_MAX_SIGNALS } from '../../../../../common/constants'; -import { hasListsFeature } from '../../feature_flags'; - -/** - * Differences from this and the createRulesSchema are - * - rule_id is required - * - id is optional (but ignored in the import code - rule_id is exclusively used for imports) - * - created_at is optional (but ignored in the import code) - * - updated_at is optional (but ignored in the import code) - * - created_by is optional (but ignored in the import code) - * - updated_by is optional (but ignored in the import code) - */ -export const importRulesSchema = Joi.object({ - anomaly_threshold: anomaly_threshold.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - id, - actions: actions.default([]), - description: description.required(), - enabled: enabled.default(true), - false_positives: false_positives.default([]), - filters, - from: from.default('now-6m'), - rule_id: rule_id.required(), - immutable: immutable.default(false).valid(false), - index, - interval: interval.default('5m'), - query: query.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: query.allow('').default(''), - }), - language: language.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: language.default('kuery'), - }), - output_index, - machine_learning_job_id: machine_learning_job_id.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - saved_id: saved_id.when('type', { - is: 'saved_query', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - timeline_id, - timeline_title, - meta, - risk_score: risk_score.required(), - max_signals: max_signals.default(DEFAULT_MAX_SIGNALS), - name: name.required(), - severity: severity.required(), - tags: tags.default([]), - to: to.default('now'), - type: type.required(), - threat: threat.default([]), - throttle: throttle.default(null), - references: references.default([]), - note: note.allow(''), - version: version.default(1), - created_at, - updated_at, - created_by, - updated_by, - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}); - -export const importRulesQuerySchema = Joi.object({ - overwrite: Joi.boolean().default(false), -}); - -export const importRulesPayloadSchema = Joi.object({ - file: Joi.object().required(), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.test.ts deleted file mode 100644 index e87c732e8a2f7..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.test.ts +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { patchRulesBulkSchema } from './patch_rules_bulk_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -// only the basics of testing are here. -// see: patch_rules_schema.test.ts for the bulk of the validation tests -// this just wraps patchRulesSchema in an array -describe('patch_rules_bulk_schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('can take an empty array and validate it', () => { - expect( - patchRulesBulkSchema.validate>>([]).error - ).toBeFalsy(); - }); - - test('made up values do not validate', () => { - expect( - patchRulesBulkSchema.validate<[{ madeUp: string }]>([ - { - madeUp: 'hi', - }, - ]).error - ).toBeTruthy(); - }); - - test('single array of [id] does validate', () => { - expect( - patchRulesBulkSchema.validate>>([ - { - id: 'rule-1', - }, - ]).error - ).toBeFalsy(); - }); - - test('two values of [id] does validate', () => { - expect( - patchRulesBulkSchema.validate>>([ - { - id: 'rule-1', - }, - { - id: 'rule-2', - }, - ]).error - ).toBeFalsy(); - }); - - test('can set "note" to be a string', () => { - expect( - patchRulesBulkSchema.validate>>([ - { - id: 'rule-1', - note: 'hi', - }, - ]).error - ).toBeFalsy(); - }); - - test('can set "note" to be an empty string', () => { - expect( - patchRulesBulkSchema.validate>>([ - { - id: 'rule-1', - note: '', - }, - ]).error - ).toBeFalsy(); - }); - - test('cannot set "note" to be anything other than a string', () => { - expect( - patchRulesBulkSchema.validate< - Array & { note: object }>> - >([ - { - id: 'rule-1', - note: { - someprop: 'some value here', - }, - }, - ]).error.message - ).toEqual( - '"value" at position 0 fails because [child "note" fails because ["note" must be a string]]' - ); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.ts deleted file mode 100644 index ff813bce84add..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -import { patchRulesSchema } from './patch_rules_schema'; - -export const patchRulesBulkSchema = Joi.array().items(patchRulesSchema); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts deleted file mode 100644 index 218cae68db036..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts +++ /dev/null @@ -1,1362 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { patchRulesSchema } from './patch_rules_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams } from '../../types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('patch rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate as they require at least id or rule_id', () => { - expect(patchRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - patchRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[id] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - }).error - ).toBeFalsy(); - }); - - test('[rule_id] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeFalsy(); - }); - - test('[id] and [rule_id] does not validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'id-1', - rule_id: 'rule-1', - }).error.message - ).toEqual('"value" contains a conflict between exclusive peers [id, rule_id]'); - }); - - test('[rule_id, description] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeFalsy(); - }); - - test('[id, description] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - }).error - ).toBeFalsy(); - }); - - test('[id, risk_score] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - risk_score: 10, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, name] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, name] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, name, severity] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, name, severity] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, name, severity, type] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, name, severity, type, interval] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, index, name, severity, interval, type] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, index, name, severity, interval, type, query] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, index, name, severity, interval, type, query, language] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, type, filter] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, index, name, severity, type, filter] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as a valid value to patch with', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('does not default references to an array', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).value.references - ).toEqual(undefined); - }); - - test('does not default interval', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - }).value.interval - ).toEqual(undefined); - }); - - test('does not default max signal', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).value.max_signals - ).toEqual(undefined); - }); - - test('references cannot be numbers', () => { - expect( - patchRulesSchema.validate< - Partial> & { references: number[] } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - patchRulesSchema.validate< - Partial> & { index: number[] } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('saved_id is not required when type is saved_query and will validate without it', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - }).error - ).toBeFalsy(); - }); - - test('saved_id validates with saved_query', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - }).error - ).toBeFalsy(); - }); - - test('language validates with kuery', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - patchRulesSchema.validate< - Partial & { language: string }> - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('meta can be patched', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - meta: { whateverYouWant: 'anything_at_all' }, - }).error - ).toBeFalsy(); - }); - - test('You cannot patch meta as a string', () => { - expect( - patchRulesSchema.validate & { meta: string }>>( - { - id: 'rule-1', - meta: 'should not work', - } - ).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('filters cannot be a string', () => { - expect( - patchRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - type: 'query', - filters: 'some string', - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('threat is not defaulted to empty array on patch', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).value.threat - ).toBe(undefined); - }); - - test('threat is not defaulted to undefined on patch with empty array', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - }).value.threat - ).toMatchObject([]); - }); - - test('threat is valid when updated with all sub-objects', () => { - const expected: ThreatParams[] = [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ]; - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).value.threat - ).toMatchObject(expected); - }); - - test('threat is invalid when updated with missing property framework', () => { - expect( - patchRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('threat is invalid when updated with missing tactic sub-object', () => { - expect( - patchRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('threat is invalid when updated with missing technique', () => { - expect( - patchRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: 'some-id', - timeline_title: 'some-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: 'some-id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: 'timeline-id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: 'some-id', - timeline_title: '', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - describe('note', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, note] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - note: '# some documentation markdown', - }).error - ).toBeFalsy(); - }); - - test('note can be patched', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - note: '# new documentation markdown', - }).error - ).toBeFalsy(); - }); - - test('You cannot patch note as an object', () => { - expect( - patchRulesSchema.validate< - Partial & { note: object }> - >({ - id: 'rule-1', - note: { - someProperty: 'something else here', - }, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: AlertAction[]; - } - > - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - { - name: '678', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('exceptions_list can be patched', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'some id', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { - expect( - patchRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { - expect( - patchRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).value.exceptions_list - ).toEqual([]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts deleted file mode 100644 index 503bc64df237c..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - actions, - enabled, - description, - false_positives, - filters, - from, - index, - rule_id, - interval, - query, - language, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note, - id, - version, - lists, - anomaly_threshold, - machine_learning_job_id, -} from './schemas'; -import { hasListsFeature } from '../../feature_flags'; -/* eslint-enable @typescript-eslint/camelcase */ - -export const patchRulesSchema = Joi.object({ - actions, - anomaly_threshold, - description, - enabled, - false_positives, - filters, - from, - rule_id, - id, - index, - interval, - query: query.allow(''), - language, - machine_learning_job_id, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note: note.allow(''), - version, - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}).xor('id', 'rule_id'); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.test.ts deleted file mode 100644 index 389c5ff7ea617..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { queryRulesBulkSchema } from './query_rules_bulk_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -// only the basics of testing are here. -// see: query_rules_bulk_schema.test.ts for the bulk of the validation tests -// this just wraps queryRulesSchema in an array -describe('query_rules_bulk_schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('can take an empty array and validate it', () => { - expect( - queryRulesBulkSchema.validate>>([]).error - ).toBeFalsy(); - }); - - test('both rule_id and id being supplied do not validate', () => { - expect( - queryRulesBulkSchema.validate>>([ - { - rule_id: '1', - id: '1', - }, - ]).error.message - ).toEqual( - '"value" at position 0 fails because ["value" contains a conflict between exclusive peers [id, rule_id]]' - ); - }); - - test('both rule_id and id being supplied do not validate if one array element works but the second does not', () => { - expect( - queryRulesBulkSchema.validate>>([ - { - id: '1', - }, - { - rule_id: '1', - id: '1', - }, - ]).error.message - ).toEqual( - '"value" at position 1 fails because ["value" contains a conflict between exclusive peers [id, rule_id]]' - ); - }); - - test('only id validates', () => { - expect( - queryRulesBulkSchema.validate>>([{ id: '1' }]).error - ).toBeFalsy(); - }); - - test('only id validates with two elements', () => { - expect( - queryRulesBulkSchema.validate>>([ - { id: '1' }, - { id: '2' }, - ]).error - ).toBeFalsy(); - }); - - test('only rule_id validates', () => { - expect( - queryRulesBulkSchema.validate>>([{ rule_id: '1' }]) - .error - ).toBeFalsy(); - }); - - test('only rule_id validates with two elements', () => { - expect( - queryRulesBulkSchema.validate>>([ - { rule_id: '1' }, - { rule_id: '2' }, - ]).error - ).toBeFalsy(); - }); - - test('both id and rule_id validates with two separate elements', () => { - expect( - queryRulesBulkSchema.validate>>([ - { id: '1' }, - { rule_id: '2' }, - ]).error - ).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.ts deleted file mode 100644 index 13ccac282281d..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import Joi from 'joi'; - -import { queryRulesSchema } from './query_rules_schema'; - -export const queryRulesBulkSchema = Joi.array().items(queryRulesSchema); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.test.ts deleted file mode 100644 index 68be4c627780c..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { queryRulesSchema } from './query_rules_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('queryRulesSchema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate', () => { - expect(queryRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('both rule_id and id being supplied do not validate', () => { - expect( - queryRulesSchema.validate>({ rule_id: '1', id: '1' }).error - .message - ).toEqual('"value" contains a conflict between exclusive peers [id, rule_id]'); - }); - - test('only id validates', () => { - expect( - queryRulesSchema.validate>({ id: '1' }).error - ).toBeFalsy(); - }); - - test('only rule_id validates', () => { - expect( - queryRulesSchema.validate>({ rule_id: '1' }).error - ).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.test.ts deleted file mode 100644 index 4752d1794ff28..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { querySignalsSchema } from './query_signals_index_schema'; -import { SignalsQueryRestParams } from '../../signals/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('query, aggs, size, _source and track_total_hits on signals index', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('query, aggs, size, _source and track_total_hits simultaneously', () => { - expect( - querySignalsSchema.validate>({ - query: {}, - aggs: {}, - size: 1, - track_total_hits: true, - _source: ['field'], - }).error - ).toBeFalsy(); - }); - - test('query only', () => { - expect( - querySignalsSchema.validate>({ - query: {}, - }).error - ).toBeFalsy(); - }); - - test('aggs only', () => { - expect( - querySignalsSchema.validate>({ - aggs: {}, - }).error - ).toBeFalsy(); - }); - - test('size only', () => { - expect( - querySignalsSchema.validate>({ - size: 1, - }).error - ).toBeFalsy(); - }); - - test('track_total_hits only', () => { - expect( - querySignalsSchema.validate>({ - track_total_hits: true, - }).error - ).toBeFalsy(); - }); - - test('_source only', () => { - expect( - querySignalsSchema.validate>({ - _source: ['field'], - }).error - ).toBeFalsy(); - }); - - test('missing query, aggs, size, _source and track_total_hits is invalid', () => { - expect(querySignalsSchema.validate>({}).error).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.ts deleted file mode 100644 index 26a32d2e4980b..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -export const querySignalsSchema = Joi.object({ - query: Joi.object(), - aggs: Joi.object(), - size: Joi.number().integer(), - track_total_hits: Joi.boolean(), - _source: Joi.array().items(Joi.string()), -}).min(1); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/schemas.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/schemas.ts deleted file mode 100644 index ae951ea5e33d2..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/schemas.ts +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -export const anomaly_threshold = Joi.number().integer().greater(-1).less(101); -export const description = Joi.string(); -export const enabled = Joi.boolean(); -export const exclude_export_details = Joi.boolean(); -export const false_positives = Joi.array().items(Joi.string()); -export const file_name = Joi.string(); -export const filters = Joi.array(); -export const from = Joi.string(); -export const immutable = Joi.boolean(); -export const rule_id = Joi.string(); -export const id = Joi.string(); -export const index = Joi.array().items(Joi.string()).single(); -export const interval = Joi.string(); -export const query = Joi.string(); -export const language = Joi.string().valid('kuery', 'lucene'); -export const objects = Joi.array().items( - Joi.object({ - rule_id, - }).required() -); -export const output_index = Joi.string(); -export const saved_id = Joi.string(); -export const timeline_id = Joi.string(); -export const timeline_title = Joi.string().when('timeline_id', { - is: Joi.exist(), - then: Joi.required(), - otherwise: Joi.forbidden(), -}); -export const meta = Joi.object(); -export const max_signals = Joi.number().integer().greater(0); -export const name = Joi.string(); -export const risk_score = Joi.number().integer().greater(-1).less(101); -export const severity = Joi.string().valid('low', 'medium', 'high', 'critical'); -export const status = Joi.string().valid('open', 'closed'); -export const to = Joi.string(); -export const type = Joi.string().valid('query', 'saved_query', 'machine_learning'); -export const machine_learning_job_id = Joi.string(); -export const queryFilter = Joi.string(); -export const references = Joi.array().items(Joi.string()).single(); -export const per_page = Joi.number().integer().min(0).default(20); -export const page = Joi.number().integer().min(1).default(1); -export const signal_ids = Joi.array().items(Joi.string()); -export const signal_status_query = Joi.object(); -export const sort_field = Joi.string(); -export const sort_order = Joi.string().valid('asc', 'desc'); -export const tags = Joi.array().items(Joi.string()); -export const fields = Joi.array().items(Joi.string()).single(); -export const threat_framework = Joi.string(); -export const threat_tactic_id = Joi.string(); -export const threat_tactic_name = Joi.string(); -export const threat_tactic_reference = Joi.string(); -export const threat_tactic = Joi.object({ - id: threat_tactic_id.required(), - name: threat_tactic_name.required(), - reference: threat_tactic_reference.required(), -}); -export const threat_technique_id = Joi.string(); -export const threat_technique_name = Joi.string(); -export const threat_technique_reference = Joi.string(); -export const threat_technique = Joi.object({ - id: threat_technique_id.required(), - name: threat_technique_name.required(), - reference: threat_technique_reference.required(), -}); -export const threat_techniques = Joi.array().items(threat_technique.required()); -export const threat = Joi.array().items( - Joi.object({ - framework: threat_framework.required(), - tactic: threat_tactic.required(), - technique: threat_techniques.required(), - }) -); -export const created_at = Joi.string().isoDate().strict(); -export const updated_at = Joi.string().isoDate().strict(); -export const created_by = Joi.string(); -export const updated_by = Joi.string(); -export const version = Joi.number().integer().min(1); -export const action_group = Joi.string(); -export const action_id = Joi.string(); -export const action_action_type_id = Joi.string(); -export const action_params = Joi.object(); -export const action = Joi.object({ - group: action_group.required(), - id: action_id.required(), - action_type_id: action_action_type_id.required(), - params: action_params.required(), -}); -export const actions = Joi.array().items(action); -export const throttle = Joi.string().allow(null); -export const note = Joi.string(); - -// NOTE: Experimental list support not being shipped currently and behind a feature flag -// TODO: (LIST-FEATURE) Remove this comment once we lists have passed testing and is ready for the release -export const list_field = Joi.string(); -export const list_values_operator = Joi.string().valid(['included', 'excluded']); -export const list_values_types = Joi.string().valid(['match', 'match_all', 'list', 'exists']); -export const list_values = Joi.object({ - name: Joi.string().required(), - id: Joi.string(), - description: Joi.string(), - created_at, -}); -export const list = Joi.object({ - field: list_field.required(), - values_operator: list_values_operator.required(), - values_type: list_values_types.required(), - values: Joi.when('values_type', { - is: 'exists', - then: Joi.forbidden(), - otherwise: Joi.array().items(list_values).required(), - }), -}); -export const list_and = Joi.object({ - and: Joi.array().items(list), -}); -export const lists = Joi.array().items(list.concat(list_and)); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.test.ts deleted file mode 100644 index 953532a6e1c26..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { setSignalsStatusSchema } from './set_signal_status_schema'; -import { SignalsStatusRestParams } from '../../signals/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('set signal status schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('signal_ids and status is valid', () => { - expect( - setSignalsStatusSchema.validate>({ - signal_ids: ['somefakeid'], - status: 'open', - }).error - ).toBeFalsy(); - }); - - test('query and status is valid', () => { - expect( - setSignalsStatusSchema.validate>({ - query: {}, - status: 'open', - }).error - ).toBeFalsy(); - }); - - test('signal_ids and missing status is invalid', () => { - expect( - setSignalsStatusSchema.validate>({ - signal_ids: ['somefakeid'], - }).error.message - ).toEqual('child "status" fails because ["status" is required]'); - }); - - test('query and missing status is invalid', () => { - expect( - setSignalsStatusSchema.validate>({ - query: {}, - }).error.message - ).toEqual('child "status" fails because ["status" is required]'); - }); - - test('status is present but query or signal_ids is missing is invalid', () => { - expect( - setSignalsStatusSchema.validate>({ - status: 'closed', - }).error.message - ).toEqual('"value" must contain at least one of [signal_ids, query]'); - }); - - test('signal_ids is present but status has wrong value', () => { - expect( - setSignalsStatusSchema.validate< - Partial< - Omit & { - status: string; - } - > - >({ - status: 'fakeVal', - }).error.message - ).toEqual('child "status" fails because ["status" must be one of [open, closed]]'); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.ts deleted file mode 100644 index c8a06619287df..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { signal_ids, signal_status_query, status } from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -export const setSignalsStatusSchema = Joi.object({ - signal_ids, - query: signal_status_query, - status: status.required(), -}).xor('signal_ids', 'query'); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.test.ts deleted file mode 100644 index d329070eaaa0a..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { updateRulesBulkSchema } from './update_rules_bulk_schema'; -import { UpdateRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -// only the basics of testing are here. -// see: update_rules_schema.test.ts for the bulk of the validation tests -// this just wraps updateRulesSchema in an array -describe('update_rules_bulk_schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('can take an empty array and validate it', () => { - expect( - updateRulesBulkSchema.validate>>([]).error - ).toBeFalsy(); - }); - - test('made up values do not validate', () => { - expect( - updateRulesBulkSchema.validate<[{ madeUp: string }]>([ - { - madeUp: 'hi', - }, - ]).error - ).toBeTruthy(); - }); - - test('single array of [id] does validate', () => { - expect( - updateRulesBulkSchema.validate>>([ - { - id: 'id-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - ]).error - ).toBeFalsy(); - }); - - test('two values of [id] does validate', () => { - expect( - updateRulesBulkSchema.validate>>([ - { - id: 'id-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - { - id: 'id-2', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - ]).error - ).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.ts deleted file mode 100644 index 123ec2d5b7e15..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -import { updateRulesSchema } from './update_rules_schema'; - -export const updateRulesBulkSchema = Joi.array().items(updateRulesSchema); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts deleted file mode 100644 index 8bda16de97775..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts +++ /dev/null @@ -1,1645 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { updateRulesSchema } from './update_rules_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams, RuleAlertParamsRest } from '../../types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('create rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate as they require at least id or rule_id', () => { - expect(updateRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - updateRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[rule_id] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeTruthy(); - }); - - test('[id] and [rule_id] does not validate', () => { - expect( - updateRulesSchema.validate>({ - id: 'id-1', - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }).error.message - ).toEqual('"value" contains a conflict between exclusive peers [id, rule_id]'); - }); - - test('[rule_id, description] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - interval: '5m', - index: ['index-1'], - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('You can send in an empty array to threat', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - threat: [ - { - framework: 'someFramework', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as valid', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('defaults references to an array', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).value.references - ).toEqual([]); - }); - - test('references cannot be numbers', () => { - expect( - updateRulesSchema.validate< - Partial> & { references: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - updateRulesSchema.validate> & { index: number[] }>( - { - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - } - ).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('defaults interval to 5 min', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - }).value.interval - ).toEqual('5m'); - }); - - test('defaults max signals to 100', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).value.max_signals - ).toEqual(100); - }); - - test('saved_id is required when type is saved_query and will not validate without out', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - }).error.message - ).toEqual('child "saved_id" fails because ["saved_id" is required]'); - }); - - test('saved_id is required when type is saved_query and validates with it', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - }).error - ).toBeFalsy(); - }); - - test('filters cannot be a string', () => { - expect( - updateRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: 'some string', - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('language validates with kuery', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - updateRulesSchema.validate< - Partial & { language: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can optionally send in an array of tags', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: ['tag_1', 'tag_2'], - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of tags that are numbers', () => { - expect( - updateRulesSchema.validate> & { tags: number[] }>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: [0, 1, 2], - }).error.message - ).toEqual( - 'child "tags" fails because ["tags" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot send in an array of threat that are missing "framework"', () => { - expect( - updateRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "tactic"', () => { - expect( - updateRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "technique"', () => { - expect( - updateRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('You can optionally send in an array of false positives', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: ['false_1', 'false_2'], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of false positives that are numbers', () => { - expect( - updateRulesSchema.validate< - Partial> & { false_positives: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: [5, 4], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual( - 'child "false_positives" fails because ["false_positives" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot set the immutable when trying to create a rule', () => { - expect( - updateRulesSchema.validate< - Partial> & { immutable: number } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: 5, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('"immutable" is not allowed'); - }); - - test('You cannot set the risk_score to 101', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 101, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be less than 101]'); - }); - - test('You cannot set the risk_score to -1', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: -1, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be greater than -1]'); - }); - - test('You can set the risk_score to 0', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 0, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set the risk_score to 100', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 100, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set meta to any object you want', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - }).error - ).toBeFalsy(); - }); - - test('You cannot create meta as a string', () => { - expect( - updateRulesSchema.validate & { meta: string }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: 'should not work', - }).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('You can omit the query string when filters are present', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: '', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.actions - ).toEqual([]); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: AlertAction[]; - } - > - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('The default for "throttle" will be null', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.throttle - ).toEqual(null); - }); - - describe('note', () => { - test('You can set note to a string', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '# some documentation title', - }).error - ).toBeFalsy(); - }); - - test('You can set note to an empty string', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '', - }).error - ).toBeFalsy(); - }); - - // Note: If you're looking to remove `note`, omit `note` entirely - test('You cannot set note to null', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: null, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - - test('You cannot set note as an object', () => { - expect( - updateRulesSchema.validate & { note: object }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: { - somethingMadeUp: { somethingElse: true }, - }, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { - expect( - updateRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { - expect( - updateRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).value.exceptions_list - ).toEqual([]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.ts deleted file mode 100644 index b1b37801b644f..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.ts +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - actions, - enabled, - description, - false_positives, - filters, - from, - index, - rule_id, - interval, - query, - language, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - id, - note, - version, - lists, - anomaly_threshold, - machine_learning_job_id, -} from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -import { DEFAULT_MAX_SIGNALS } from '../../../../../common/constants'; -import { hasListsFeature } from '../../feature_flags'; - -/** - * This almost identical to the create_rules_schema except for a few details. - * - The version will not be defaulted to a 1. If it is not given then its default will become the previous version auto-incremented - * This does break idempotency slightly as calls repeatedly without it will increment the number. If the version number is passed in - * this will update the rule's version number. - * - id is on here because you can pass in an id to update using it instead of rule_id. - */ -export const updateRulesSchema = Joi.object({ - actions: actions.default([]), - anomaly_threshold: anomaly_threshold.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - description: description.required(), - enabled: enabled.default(true), - id, - false_positives: false_positives.default([]), - filters, - from: from.default('now-6m'), - rule_id, - index, - interval: interval.default('5m'), - query: query.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: query.allow('').default(''), - }), - language: language.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: language.default('kuery'), - }), - machine_learning_job_id: machine_learning_job_id.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - output_index, - saved_id: saved_id.when('type', { - is: 'saved_query', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - timeline_id, - timeline_title, - meta, - risk_score: risk_score.required(), - max_signals: max_signals.default(DEFAULT_MAX_SIGNALS), - name: name.required(), - severity: severity.required(), - tags: tags.default([]), - to: to.default('now'), - type: type.required(), - threat: threat.default([]), - throttle: throttle.default(null), - references: references.default([]), - note: note.allow(''), - version, - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}).xor('id', 'rule_id'); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts index a8819bbd7432c..f3109a911203d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts @@ -101,11 +101,12 @@ describe('set signal status', () => { path: DETECTION_ENGINE_SIGNALS_STATUS_URL, body: setStatusSignalMissingIdsAndQueryPayload(), }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" must contain at least one of [signal_ids, query]' - ); + const response = await server.inject(request, context); + expect(response.status).toEqual(400); + expect(response.body).toEqual({ + message: ['either "signal_ids" or "query" must be set'], + status_code: 400, + }); }); test('rejects if signal_ids but no status', async () => { @@ -118,7 +119,7 @@ describe('set signal status', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "status" fails because ["status" is required]' + 'Invalid value "undefined" supplied to "status"' ); }); @@ -132,7 +133,7 @@ describe('set signal status', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "status" fails because ["status" is required]' + 'Invalid value "undefined" supplied to "status"' ); }); @@ -150,7 +151,7 @@ describe('set signal status', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "status" fails because ["status" is required]' + 'Invalid value "undefined" supplied to "status"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index e3e19d83d8f0d..18c3440ab93e1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -4,18 +4,24 @@ * you may not use this file except in compliance with the Elastic License. */ +import { setSignalStatusValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/set_signal_status_type_dependents'; +import { + SetSignalsStatusSchemaDecoded, + setSignalsStatusSchema, +} from '../../../../../common/detection_engine/schemas/request/set_signal_status_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/constants'; -import { SignalsStatusRestParams } from '../../signals/types'; -import { setSignalsStatusSchema } from '../schemas/set_signal_status_schema'; -import { transformError, buildRouteValidation, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; export const setSignalsStatusRoute = (router: IRouter) => { router.post( { path: DETECTION_ENGINE_SIGNALS_STATUS_URL, validate: { - body: buildRouteValidation(setSignalsStatusSchema), + body: buildRouteValidation( + setSignalsStatusSchema + ), }, options: { tags: ['access:securitySolution'], @@ -26,6 +32,10 @@ export const setSignalsStatusRoute = (router: IRouter) => { const clusterClient = context.core.elasticsearch.legacy.client; const siemClient = context.securitySolution?.getAppClient(); const siemResponse = buildSiemResponse(response); + const validationErrors = setSignalStatusValidateTypeDependents(request.body); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } if (!siemClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts index 8d7b171a8537b..f0863164a3f23 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts @@ -128,9 +128,12 @@ describe('query for signal', () => { path: DETECTION_ENGINE_QUERY_SIGNALS_URL, body: {}, }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith('"value" must have at least 1 children'); + const response = await server.inject(request, context); + expect(response.status).toEqual(400); + expect(response.body).toEqual({ + message: '"value" must have at least 1 children', + status_code: 400, + }); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts index a93f4ebff58d4..5f62ff426ecd0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -6,16 +6,22 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; -import { SignalsQueryRestParams } from '../../signals/types'; -import { querySignalsSchema } from '../schemas/query_signals_index_schema'; -import { transformError, buildRouteValidation, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; + +import { + querySignalsSchema, + QuerySignalsSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/query_signals_index_schema'; export const querySignalsRoute = (router: IRouter) => { router.post( { path: DETECTION_ENGINE_QUERY_SIGNALS_URL, validate: { - body: buildRouteValidation(querySignalsSchema), + body: buildRouteValidation( + querySignalsSchema + ), }, options: { tags: ['access:securitySolution'], @@ -23,9 +29,22 @@ export const querySignalsRoute = (router: IRouter) => { }, async (context, request, response) => { const { query, aggs, _source, track_total_hits, size } = request.body; + const siemResponse = buildSiemResponse(response); + if ( + query == null && + aggs == null && + _source == null && + // eslint-disable-next-line @typescript-eslint/camelcase + track_total_hits == null && + size == null + ) { + return siemResponse.error({ + statusCode: 400, + body: '"value" must have at least 1 children', + }); + } const clusterClient = context.core.elasticsearch.legacy.client; const siemClient = context.securitySolution!.getAppClient(); - const siemResponse = buildSiemResponse(response); try { const result = await clusterClient.callAsCurrentUser('search', { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.mock.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.mock.ts new file mode 100644 index 0000000000000..d00bffb96ad05 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.mock.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CreateRulesOptions } from './types'; +import { alertsClientMock } from '../../../../../alerts/server/mocks'; + +export const getCreateRulesOptionsMock = (): CreateRulesOptions => ({ + alertsClient: alertsClientMock.create(), + anomalyThreshold: undefined, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: 'user.name: root or user.name: admin', + language: 'kuery', + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: undefined, + filters: [], + ruleId: 'rule-1', + immutable: false, + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Query with a rule id', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'query', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], +}); + +export const getCreateMlRulesOptionsMock = (): CreateRulesOptions => ({ + alertsClient: alertsClientMock.create(), + anomalyThreshold: 55, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: undefined, + language: undefined, + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: 'new_job_id', + filters: [], + ruleId: 'rule-1', + immutable: false, + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Machine Learning Job', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'machine_learning', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.test.ts index f086166d0685e..b58d64c86142d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.test.ts @@ -4,36 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { alertsClientMock } from '../../../../../alerts/server/mocks'; -import { getMlResult } from '../routes/__mocks__/request_responses'; import { createRules } from './create_rules'; +import { getCreateMlRulesOptionsMock } from './create_rules.mock'; describe('createRules', () => { - let alertsClient: ReturnType; - - beforeEach(() => { - alertsClient = alertsClientMock.create(); - }); - it('calls the alertsClient with ML params', async () => { - const params = { - ...getMlResult().params, - anomalyThreshold: 55, - machineLearningJobId: 'new_job_id', - }; - - await createRules({ - alertsClient, - ...params, - ruleId: 'new-rule-id', - enabled: true, - interval: '', - name: '', - tags: [], - actions: [], - }); - - expect(alertsClient.create).toHaveBeenCalledWith( + const ruleOptions = getCreateMlRulesOptionsMock(); + await createRules(ruleOptions); + expect(ruleOptions.alertsClient.create).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ params: expect.objectContaining({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.ts index 67e066c6670fb..83e9b0de16f06 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.ts @@ -7,7 +7,7 @@ import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; import { Alert } from '../../../../../alerts/common'; import { APP_ID, SIGNALS_ID } from '../../../../common/constants'; -import { CreateRuleParams } from './types'; +import { CreateRulesOptions } from './types'; import { addTags } from './add_tags'; import { hasListsFeature } from '../feature_flags'; @@ -42,11 +42,11 @@ export const createRules = async ({ references, note, version, - exceptions_list, + exceptionsList, actions, -}: CreateRuleParams): Promise => { +}: CreateRulesOptions): Promise => { // TODO: Remove this and use regular exceptions_list once the feature is stable for a release - const exceptionsListParam = hasListsFeature() ? { exceptions_list } : {}; + const exceptionsListParam = hasListsFeature() ? { exceptionsList } : {}; return alertsClient.create({ data: { name, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts index 8044692ab90b1..73d3c65774b3d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts @@ -6,12 +6,12 @@ import { Readable } from 'stream'; import { createRulesStreamFromNdJson } from './create_rules_stream_from_ndjson'; import { createPromiseFromStreams } from 'src/legacy/utils/streams'; -import { ImportRuleAlertRest } from '../types'; import { BadRequestError } from '../errors/bad_request_error'; +import { ImportRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/import_rules_schema'; -type PromiseFromStreams = ImportRuleAlertRest | Error; +type PromiseFromStreams = ImportRulesSchemaDecoded | Error; -export const getOutputSample = (): Partial => ({ +export const getOutputSample = (): Partial => ({ rule_id: 'rule-1', output_index: '.siem-signals', risk_score: 50, @@ -25,7 +25,7 @@ export const getOutputSample = (): Partial => ({ type: 'query', }); -export const getSampleAsNdjson = (sample: Partial): string => { +export const getSampleAsNdjson = (sample: Partial): string => { return `${JSON.stringify(sample)}\n`; }; @@ -64,8 +64,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', exceptions_list: [], max_signals: 100, tags: [], @@ -90,8 +88,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', exceptions_list: [], max_signals: 100, tags: [], @@ -154,8 +150,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, tags: [], exceptions_list: [], @@ -180,8 +174,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -227,8 +219,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -253,8 +243,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -300,8 +288,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -327,8 +313,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -373,8 +357,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -383,8 +365,9 @@ describe('create_rules_stream_from_ndjson', () => { references: [], version: 1, }); + // TODO: Change the formatter to output something better than [object Object] expect(resultOrError[1].message).toEqual( - 'child "description" fails because ["description" is required]' + '[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]' ); expect(resultOrError[2]).toEqual({ actions: [], @@ -402,8 +385,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts index 034813b8d100d..932a4ef9eed92 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts @@ -4,13 +4,21 @@ * you may not use this file except in compliance with the Elastic License. */ import { Transform } from 'stream'; -import { ImportRuleAlertRest } from '../types'; +import * as t from 'io-ts'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { importRuleValidateTypeDependents } from '../../../../common/detection_engine/schemas/request/import_rules_type_dependents'; +import { exactCheck } from '../../../../common/exact_check'; +import { + importRulesSchema, + ImportRulesSchema, + ImportRulesSchemaDecoded, +} from '../../../../common/detection_engine/schemas/request/import_rules_schema'; import { createSplitStream, createMapStream, createConcatStream, } from '../../../../../../../src/legacy/utils/streams'; -import { importRulesSchema } from '../routes/schemas/import_rules_schema'; import { BadRequestError } from '../errors/bad_request_error'; import { parseNdjsonStrings, @@ -19,14 +27,22 @@ import { } from '../../../utils/read_stream/create_stream_from_ndjson'; export const validateRules = (): Transform => { - return createMapStream((obj: ImportRuleAlertRest) => { + return createMapStream((obj: ImportRulesSchema) => { if (!(obj instanceof Error)) { - const validated = importRulesSchema.validate(obj); - if (validated.error != null) { - return new BadRequestError(validated.error.message); - } else { - return validated.value; - } + const decoded = importRulesSchema.decode(obj); + const checked = exactCheck(obj, decoded); + const onLeft = (errors: t.Errors): BadRequestError | ImportRulesSchemaDecoded => { + return new BadRequestError(errors.join()); + }; + const onRight = (schema: ImportRulesSchema): BadRequestError | ImportRulesSchemaDecoded => { + const validationErrors = importRuleValidateTypeDependents(schema); + if (validationErrors.length) { + return new BadRequestError(validationErrors.join()); + } else { + return schema as ImportRulesSchemaDecoded; + } + }; + return pipe(checked, fold(onLeft, onRight)); } else { return obj; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.test.ts index f96a9e38d6a6c..ddc1b509eaf02 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.test.ts @@ -49,7 +49,7 @@ describe('deleteRules', () => { expect(result).toEqual({ id: notificationId }); }); - it('should call alertsClient.delete if ruleId was null', async () => { + it('should call alertsClient.delete if ruleId was undefined', async () => { (readRules as jest.Mock).mockResolvedValue({ id: null, }); @@ -57,7 +57,7 @@ describe('deleteRules', () => { const result = await deleteRules({ alertsClient, id: notificationId, - ruleId: null, + ruleId: undefined, }); expect(alertsClient.delete).toHaveBeenCalledWith( @@ -68,7 +68,7 @@ describe('deleteRules', () => { expect(result).toEqual({ id: null }); }); - it('should return null if alertsClient.delete rejects with 404 if ruleId was null', async () => { + it('should return null if alertsClient.delete rejects with 404 if ruleId was undefined', async () => { (readRules as jest.Mock).mockResolvedValue({ id: null, }); @@ -82,7 +82,7 @@ describe('deleteRules', () => { const result = await deleteRules({ alertsClient, id: notificationId, - ruleId: null, + ruleId: undefined, }); expect(alertsClient.delete).toHaveBeenCalledWith( @@ -93,7 +93,7 @@ describe('deleteRules', () => { expect(result).toEqual(null); }); - it('should return error object if alertsClient.delete rejects with status different than 404 and if ruleId was null', async () => { + it('should return error object if alertsClient.delete rejects with status different than 404 and if ruleId was undefined', async () => { (readRules as jest.Mock).mockResolvedValue({ id: null, }); @@ -111,7 +111,7 @@ describe('deleteRules', () => { await deleteRules({ alertsClient, id: notificationId, - ruleId: null, + ruleId: undefined, }); } catch (error) { errorResult = error; @@ -125,7 +125,7 @@ describe('deleteRules', () => { expect(errorResult).toEqual(errorObject); }); - it('should return null if ruleId and id was null', async () => { + it('should return null if ruleId and id was undefined', async () => { (readRules as jest.Mock).mockResolvedValue({ id: null, }); @@ -133,7 +133,7 @@ describe('deleteRules', () => { const result = await deleteRules({ alertsClient, id: undefined, - ruleId: null, + ruleId: undefined, }); expect(result).toEqual(null); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.ts index 92a80bc50afc6..cde95a4967d86 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.ts @@ -5,9 +5,9 @@ */ import { readRules } from './read_rules'; -import { DeleteRuleParams } from './types'; +import { DeleteRuleOptions } from './types'; -export const deleteRules = async ({ alertsClient, id, ruleId }: DeleteRuleParams) => { +export const deleteRules = async ({ alertsClient, id, ruleId }: DeleteRuleOptions) => { const rule = await readRules({ alertsClient, id, ruleId }); if (rule == null) { return null; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/find_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/find_rules.ts index c634f07387825..18b851c440e20 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/find_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/find_rules.ts @@ -6,7 +6,7 @@ import { FindResult } from '../../../../../alerts/server'; import { SIGNALS_ID } from '../../../../common/constants'; -import { FindRuleParams } from './types'; +import { FindRuleOptions } from './types'; export const getFilter = (filter: string | null | undefined) => { if (filter == null) { @@ -24,7 +24,7 @@ export const findRules = async ({ filter, sortField, sortOrder, -}: FindRuleParams): Promise => { +}: FindRuleOptions): Promise => { return alertsClient.find({ options: { fields, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_existing_prepackaged_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_existing_prepackaged_rules.ts index a3119131a0037..b7ff1cb698e17 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_existing_prepackaged_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_existing_prepackaged_rules.ts @@ -34,6 +34,7 @@ export const getRulesCount = async ({ page: 1, sortField: 'createdAt', sortOrder: 'desc', + fields: undefined, }); return firstRule.total; }; @@ -53,6 +54,7 @@ export const getRules = async ({ page: 1, sortField: 'createdAt', sortOrder: 'desc', + fields: undefined, }); if (isAlertTypes(rules.data)) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts index 38cf8008f65c8..1a965842348ac 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts @@ -51,7 +51,7 @@ export const getRulesFromObjects = async ( objects.reduce>>((accumPromise, object) => { const exportWorkerPromise = new Promise(async (resolve) => { try { - const rule = await readRules({ alertsClient, ruleId: object.rule_id }); + const rule = await readRules({ alertsClient, ruleId: object.rule_id, id: undefined }); if (rule != null && isAlertType(rule) && rule.params.immutable !== true) { const transformedRule = transformAlertToRule(rule); resolve({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.test.ts index b2e1ed794043a..597a74f6efbbd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.test.ts @@ -5,8 +5,8 @@ */ import { getPrepackagedRules } from './get_prepackaged_rules'; -import { PrepackagedRules } from '../types'; import { isEmpty } from 'lodash/fp'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; describe('get_existing_prepackaged_rules', () => { test('should not throw any errors with the existing checked in pre-packaged rules', () => { @@ -14,9 +14,9 @@ describe('get_existing_prepackaged_rules', () => { }); test('no rule should have the same rule_id as another rule_id', () => { - const prePacakgedRules = getPrepackagedRules(); - let existingRuleIds: PrepackagedRules[] = []; - prePacakgedRules.forEach((rule) => { + const prePackagedRules = getPrepackagedRules(); + let existingRuleIds: AddPrepackagedRulesSchemaDecoded[] = []; + prePackagedRules.forEach((rule) => { const foundDuplicate = existingRuleIds.reduce((accum, existingRule) => { if (existingRule.rule_id === rule.rule_id) { return `Found duplicate rule_id of ${rule.rule_id} between these two rule names of "${rule.name}" and "${existingRule.name}"`; @@ -33,14 +33,16 @@ describe('get_existing_prepackaged_rules', () => { }); test('should throw an exception if a pre-packaged rule is not valid', () => { + // TODO: Improve the error formatter around [object Object] expect(() => getPrepackagedRules([{ not_valid_made_up_key: true }])).toThrow( - 'name: "(rule name unknown)", rule_id: "(rule rule_id unknown)" within the folder rules/prepackaged_rules is not a valid detection engine rule. Expect the system to not work with pre-packaged rules until this rule is fixed or the file is removed. Error is: child "description" fails because ["description" is required], Full rule contents are:\n{\n "not_valid_made_up_key": true\n}' + 'name: "(rule name unknown)", rule_id: "(rule rule_id unknown)" within the folder rules/prepackaged_rules is not a valid detection engine rule. Expect the system to not work with pre-packaged rules until this rule is fixed or the file is removed. Error is: [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object], Full rule contents are:\n{\n "not_valid_made_up_key": true\n}' ); }); test('should throw an exception with a message having rule_id and name in it', () => { + // TODO: Improve the error formatter around [object Object] expect(() => getPrepackagedRules([{ name: 'rule name', rule_id: 'id-123' }])).toThrow( - 'name: "rule name", rule_id: "id-123" within the folder rules/prepackaged_rules is not a valid detection engine rule. Expect the system to not work with pre-packaged rules until this rule is fixed or the file is removed. Error is: child "description" fails because ["description" is required]' + 'name: "rule name", rule_id: "id-123" within the folder rules/prepackaged_rules is not a valid detection engine rule. Expect the system to not work with pre-packaged rules until this rule is fixed or the file is removed. Error is: [object Object],[object Object],[object Object],[object Object],[object Object], Full rule contents are:\n{\n "name": "rule name",\n "rule_id": "id-123"\n}' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.ts index d150db1875065..d2af93c329636 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.ts @@ -4,8 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PrepackagedRules } from '../types'; -import { addPrepackagedRulesSchema } from '../routes/schemas/add_prepackaged_rules_schema'; +import * as t from 'io-ts'; +import { fold } from 'fp-ts/lib/Either'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { exactCheck } from '../../../../common/exact_check'; +import { + addPrepackagedRulesSchema, + AddPrepackagedRulesSchema, + AddPrepackagedRulesSchemaDecoded, +} from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { BadRequestError } from '../errors/bad_request_error'; import { rawRules } from './prepackaged_rules'; @@ -14,26 +21,34 @@ import { rawRules } from './prepackaged_rules'; * that they are adding incorrect schema rules. Also this will auto-flush in all the default * aspects such as default interval of 5 minutes, default arrays, etc... */ -export const validateAllPrepackagedRules = (rules: PrepackagedRules[]): PrepackagedRules[] => { +export const validateAllPrepackagedRules = ( + rules: AddPrepackagedRulesSchema[] +): AddPrepackagedRulesSchemaDecoded[] => { return rules.map((rule) => { - const validatedRule = addPrepackagedRulesSchema.validate(rule); - if (validatedRule.error != null) { + const decoded = addPrepackagedRulesSchema.decode(rule); + const checked = exactCheck(rule, decoded); + + const onLeft = (errors: t.Errors): AddPrepackagedRulesSchemaDecoded => { const ruleName = rule.name ? rule.name : '(rule name unknown)'; const ruleId = rule.rule_id ? rule.rule_id : '(rule rule_id unknown)'; throw new BadRequestError( `name: "${ruleName}", rule_id: "${ruleId}" within the folder rules/prepackaged_rules ` + `is not a valid detection engine rule. Expect the system ` + `to not work with pre-packaged rules until this rule is fixed ` + - `or the file is removed. Error is: ${ - validatedRule.error.message - }, Full rule contents are:\n${JSON.stringify(rule, null, 2)}` + `or the file is removed. Error is: ${errors.join()}, Full rule contents are:\n${JSON.stringify( + rule, + null, + 2 + )}` ); - } else { - return validatedRule.value; - } + }; + + const onRight = (schema: AddPrepackagedRulesSchema): AddPrepackagedRulesSchemaDecoded => { + return schema as AddPrepackagedRulesSchemaDecoded; + }; + return pipe(checked, fold(onLeft, onRight)); }); }; -export const getPrepackagedRules = (rules = rawRules): PrepackagedRules[] => { - return validateAllPrepackagedRules(rules); -}; +export const getPrepackagedRules = (rules = rawRules): AddPrepackagedRulesSchemaDecoded[] => + validateAllPrepackagedRules(rules); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.test.ts index ee76bf2ef15b8..04e3ecc4e0ac0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.test.ts @@ -5,7 +5,8 @@ */ import { getRulesToInstall } from './get_rules_to_install'; -import { getResult, mockPrepackagedRule } from '../routes/__mocks__/request_responses'; +import { getResult } from '../routes/__mocks__/request_responses'; +import { getAddPrepackagedRulesSchemaDecodedMock } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock'; describe('get_rules_to_install', () => { test('should return empty array if both rule sets are empty', () => { @@ -14,7 +15,7 @@ describe('get_rules_to_install', () => { }); test('should return empty array if the two rule ids match', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; const installedRule = getResult(); @@ -24,7 +25,7 @@ describe('get_rules_to_install', () => { }); test('should return the rule to install if the id of the two rules do not match', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; const installedRule = getResult(); @@ -34,10 +35,10 @@ describe('get_rules_to_install', () => { }); test('should return two rules to install if both the ids of the two rules do not match', () => { - const ruleFromFileSystem1 = mockPrepackagedRule(); + const ruleFromFileSystem1 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem1.rule_id = 'rule-1'; - const ruleFromFileSystem2 = mockPrepackagedRule(); + const ruleFromFileSystem2 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem2.rule_id = 'rule-2'; const installedRule = getResult(); @@ -47,13 +48,13 @@ describe('get_rules_to_install', () => { }); test('should return two rules of three to install if both the ids of the two rules do not match but the third does', () => { - const ruleFromFileSystem1 = mockPrepackagedRule(); + const ruleFromFileSystem1 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem1.rule_id = 'rule-1'; - const ruleFromFileSystem2 = mockPrepackagedRule(); + const ruleFromFileSystem2 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem2.rule_id = 'rule-2'; - const ruleFromFileSystem3 = mockPrepackagedRule(); + const ruleFromFileSystem3 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem3.rule_id = 'rule-3'; const installedRule = getResult(); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.ts index 4b56bc104b817..69e0255e9b55b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PrepackagedRules } from '../types'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { RuleAlertType } from './types'; export const getRulesToInstall = ( - rulesFromFileSystem: PrepackagedRules[], + rulesFromFileSystem: AddPrepackagedRulesSchemaDecoded[], installedRules: RuleAlertType[] -): PrepackagedRules[] => { +): AddPrepackagedRulesSchemaDecoded[] => { return rulesFromFileSystem.filter( (rule) => !installedRules.some((installedRule) => installedRule.params.ruleId === rule.rule_id) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.test.ts index 40e303bddac1a..5b2eb24bcdcd2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.test.ts @@ -5,7 +5,8 @@ */ import { getRulesToUpdate } from './get_rules_to_update'; -import { getResult, mockPrepackagedRule } from '../routes/__mocks__/request_responses'; +import { getResult } from '../routes/__mocks__/request_responses'; +import { getAddPrepackagedRulesSchemaDecodedMock } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock'; describe('get_rules_to_update', () => { test('should return empty array if both rule sets are empty', () => { @@ -14,7 +15,7 @@ describe('get_rules_to_update', () => { }); test('should return empty array if the id of the two rules do not match', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 2; @@ -26,7 +27,7 @@ describe('get_rules_to_update', () => { }); test('should return empty array if the id of file system rule is less than the installed version', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 1; @@ -38,7 +39,7 @@ describe('get_rules_to_update', () => { }); test('should return empty array if the id of file system rule is the same as the installed version', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 1; @@ -50,7 +51,7 @@ describe('get_rules_to_update', () => { }); test('should return the rule to update if the id of file system rule is greater than the installed version', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 2; @@ -62,7 +63,7 @@ describe('get_rules_to_update', () => { }); test('should return 1 rule out of 2 to update if the id of file system rule is greater than the installed version of just one', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 2; @@ -79,11 +80,11 @@ describe('get_rules_to_update', () => { }); test('should return 2 rules out of 2 to update if the id of file system rule is greater than the installed version of both', () => { - const ruleFromFileSystem1 = mockPrepackagedRule(); + const ruleFromFileSystem1 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem1.rule_id = 'rule-1'; ruleFromFileSystem1.version = 2; - const ruleFromFileSystem2 = mockPrepackagedRule(); + const ruleFromFileSystem2 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem2.rule_id = 'rule-2'; ruleFromFileSystem2.version = 2; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.ts index 4deb01eff8b63..577ad44789bdc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PrepackagedRules } from '../types'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { RuleAlertType } from './types'; export const getRulesToUpdate = ( - rulesFromFileSystem: PrepackagedRules[], + rulesFromFileSystem: AddPrepackagedRulesSchemaDecoded[], installedRules: RuleAlertType[] -): PrepackagedRules[] => { +): AddPrepackagedRulesSchemaDecoded[] => { return rulesFromFileSystem.filter((rule) => installedRules.some((installedRule) => { return ( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/install_prepacked_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/install_prepacked_rules.ts index 7b2cef9060f8c..a51acf99b570c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/install_prepacked_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/install_prepacked_rules.ts @@ -4,14 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { Alert } from '../../../../../alerts/common'; import { AlertsClient } from '../../../../../alerts/server'; import { createRules } from './create_rules'; -import { PrepackagedRules } from '../types'; +import { PartialFilter } from '../types'; export const installPrepackagedRules = ( alertsClient: AlertsClient, - rules: PrepackagedRules[], + rules: AddPrepackagedRulesSchemaDecoded[], outputIndex: string ): Array> => rules.reduce>>((acc, rule) => { @@ -21,7 +22,6 @@ export const installPrepackagedRules = ( enabled, false_positives: falsePositives, from, - immutable, query, language, machine_learning_job_id: machineLearningJobId, @@ -29,7 +29,7 @@ export const installPrepackagedRules = ( timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersObject, rule_id: ruleId, index, interval, @@ -44,8 +44,11 @@ export const installPrepackagedRules = ( references, note, version, - exceptions_list, + exceptions_list: exceptionsList, } = rule; + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const filters: PartialFilter[] | undefined = filtersObject as PartialFilter[]; + return [ ...acc, createRules({ @@ -55,7 +58,7 @@ export const installPrepackagedRules = ( enabled, falsePositives, from, - immutable, + immutable: true, // At the moment we force all prepackaged rules to be immutable query, language, machineLearningJobId, @@ -79,7 +82,7 @@ export const installPrepackagedRules = ( references, note, version, - exceptions_list, + exceptionsList, actions: [], // At this time there is no pre-packaged actions }), ]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.mock.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.mock.ts new file mode 100644 index 0000000000000..e711d8d2ac287 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.mock.ts @@ -0,0 +1,183 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PatchRulesOptions } from './types'; +import { alertsClientMock } from '../../../../../alerts/server/mocks'; +import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; +import { INTERNAL_RULE_ID_KEY, INTERNAL_IMMUTABLE_KEY } from '../../../../common/constants'; +import { SanitizedAlert } from '../../../../../alerts/common'; + +const rule: SanitizedAlert = { + id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + name: 'Detect Root/Admin Users', + tags: [`${INTERNAL_RULE_ID_KEY}:rule-1`, `${INTERNAL_IMMUTABLE_KEY}:false`], + alertTypeId: 'siem.signals', + consumer: 'siem', + params: { + anomalyThreshold: undefined, + description: 'Detecting root and admin users', + ruleId: 'rule-1', + index: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], + falsePositives: [], + from: 'now-6m', + immutable: false, + query: 'user.name: root or user.name: admin', + language: 'kuery', + machineLearningJobId: undefined, + outputIndex: '.siem-signals', + timelineId: 'some-timeline-id', + timelineTitle: 'some-timeline-title', + meta: { someMeta: 'someField' }, + filters: [ + { + query: { + match_phrase: { + 'host.name': 'some-host', + }, + }, + }, + ], + riskScore: 50, + maxSignals: 100, + severity: 'high', + to: 'now', + type: 'query', + threat: [ + { + framework: 'MITRE ATT&CK', + tactic: { + id: 'TA0040', + name: 'impact', + reference: 'https://attack.mitre.org/tactics/TA0040/', + }, + technique: [ + { + id: 'T1499', + name: 'endpoint denial of service', + reference: 'https://attack.mitre.org/techniques/T1499/', + }, + ], + }, + ], + references: ['http://www.example.com', 'https://ww.example.com'], + note: '# Investigative notes', + version: 1, + exceptionsList: [ + { + field: 'source.ip', + values_operator: 'included', + values_type: 'exists', + }, + { + field: 'host.name', + values_operator: 'excluded', + values_type: 'match', + values: [ + { + name: 'rock01', + }, + ], + and: [ + { + field: 'host.id', + values_operator: 'included', + values_type: 'match_all', + values: [ + { + name: '123', + }, + { + name: '678', + }, + ], + }, + ], + }, + ], + }, + createdAt: new Date('2019-12-13T16:40:33.400Z'), + updatedAt: new Date('2019-12-13T16:40:33.400Z'), + schedule: { interval: '5m' }, + enabled: true, + actions: [], + throttle: null, + createdBy: 'elastic', + updatedBy: 'elastic', + apiKeyOwner: 'elastic', + muteAll: false, + mutedInstanceIds: [], + scheduledTaskId: '2dabe330-0702-11ea-8b50-773b89126888', +}; + +export const getPatchRulesOptionsMock = (): PatchRulesOptions => ({ + alertsClient: alertsClientMock.create(), + savedObjectsClient: savedObjectsClientMock.create(), + anomalyThreshold: undefined, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: 'user.name: root or user.name: admin', + language: 'kuery', + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: undefined, + filters: [], + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Query with a rule id', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'query', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], + rule, +}); + +export const getPatchMlRulesOptionsMock = (): PatchRulesOptions => ({ + alertsClient: alertsClientMock.create(), + savedObjectsClient: savedObjectsClientMock.create(), + anomalyThreshold: 55, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: undefined, + language: undefined, + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: 'new_job_id', + filters: [], + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Machine Learning Job', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'machine_learning', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], + rule, +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.test.ts index 0dffa665f780b..1ca10d9067bd9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.test.ts @@ -4,83 +4,53 @@ * you may not use this file except in compliance with the Elastic License. */ -import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; -import { alertsClientMock } from '../../../../../alerts/server/mocks'; -import { getResult, getMlResult } from '../routes/__mocks__/request_responses'; import { patchRules } from './patch_rules'; +import { getPatchRulesOptionsMock, getPatchMlRulesOptionsMock } from './patch_rules.mock'; +import { PatchRulesOptions } from './types'; describe('patchRules', () => { - let alertsClient: ReturnType; - let savedObjectsClient: ReturnType; - - beforeEach(() => { - alertsClient = alertsClientMock.create(); - savedObjectsClient = savedObjectsClientMock.create(); - }); - - it('should call alertsClient.disable is the rule was enabled and enabled is false', async () => { - const existingRule = getResult(); - const params = getResult().params; - - await patchRules({ - alertsClient, - savedObjectsClient, - rule: existingRule, - ...params, + it('should call alertsClient.disable if the rule was enabled and enabled is false', async () => { + const rulesOptionsMock = getPatchRulesOptionsMock(); + const ruleOptions: PatchRulesOptions = { + ...rulesOptionsMock, enabled: false, - interval: '', - name: '', - tags: [], - }); - - expect(alertsClient.disable).toHaveBeenCalledWith( + }; + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.disable).toHaveBeenCalledWith( expect.objectContaining({ - id: existingRule.id, + id: ruleOptions.rule?.id, }) ); }); - it('should call alertsClient.enable is the rule was disabled and enabled is true', async () => { - const existingRule = { - ...getResult(), - enabled: false, - }; - const params = getResult().params; - - await patchRules({ - alertsClient, - savedObjectsClient, - rule: existingRule, - ...params, + it('should call alertsClient.enable if the rule was disabled and enabled is true', async () => { + const rulesOptionsMock = getPatchRulesOptionsMock(); + const ruleOptions: PatchRulesOptions = { + ...rulesOptionsMock, enabled: true, - interval: '', - name: '', - tags: [], - }); - - expect(alertsClient.enable).toHaveBeenCalledWith( + }; + if (ruleOptions.rule != null) { + ruleOptions.rule.enabled = false; + } + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.enable).toHaveBeenCalledWith( expect.objectContaining({ - id: existingRule.id, + id: ruleOptions.rule?.id, }) ); }); it('calls the alertsClient with ML params', async () => { - const existingRule = getMlResult(); - const params = { - ...getMlResult().params, - anomalyThreshold: 55, - machineLearningJobId: 'new_job_id', + const rulesOptionsMock = getPatchMlRulesOptionsMock(); + const ruleOptions: PatchRulesOptions = { + ...rulesOptionsMock, + enabled: true, }; - - await patchRules({ - alertsClient, - savedObjectsClient, - rule: existingRule, - ...params, - }); - - expect(alertsClient.update).toHaveBeenCalledWith( + if (ruleOptions.rule != null) { + ruleOptions.rule.enabled = false; + } + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ params: expect.objectContaining({ @@ -94,25 +64,22 @@ describe('patchRules', () => { describe('regression tests', () => { it("updates the rule's actions if provided", async () => { - const existingRule = getResult(); - - const action = { - action_type_id: '.slack', - id: '2933e581-d81c-4fe3-88fe-c57c6b8a5bfd', - params: { - message: 'Rule {{context.rule.name}} generated {{state.signals_count}} signals', - }, - group: 'default', + const rulesOptionsMock = getPatchRulesOptionsMock(); + const ruleOptions: PatchRulesOptions = { + ...rulesOptionsMock, + actions: [ + { + action_type_id: '.slack', + id: '2933e581-d81c-4fe3-88fe-c57c6b8a5bfd', + params: { + message: 'Rule {{context.rule.name}} generated {{state.signals_count}} signals', + }, + group: 'default', + }, + ], }; - - await patchRules({ - alertsClient, - savedObjectsClient, - actions: [action], - rule: existingRule, - }); - - expect(alertsClient.update).toHaveBeenCalledWith( + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ actions: [ @@ -131,9 +98,10 @@ describe('patchRules', () => { }); it('does not update actions if none are specified', async () => { - const existingRule = { - ...getResult(), - actions: [ + const ruleOptions = getPatchRulesOptionsMock(); + delete ruleOptions.actions; + if (ruleOptions.rule != null) { + ruleOptions.rule.actions = [ { actionTypeId: '.slack', id: '2933e581-d81c-4fe3-88fe-c57c6b8a5bfd', @@ -142,16 +110,11 @@ describe('patchRules', () => { }, group: 'default', }, - ], - }; - - await patchRules({ - alertsClient, - savedObjectsClient, - rule: existingRule, - }); + ]; + } - expect(alertsClient.update).toHaveBeenCalledWith( + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ actions: [ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts index 950a3e90fb70c..3796df353abb8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts @@ -7,10 +7,11 @@ import { defaults } from 'lodash/fp'; import { PartialAlert } from '../../../../../alerts/server'; import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; -import { PatchRuleParams } from './types'; +import { PatchRulesOptions } from './types'; import { addTags } from './add_tags'; import { calculateVersion, calculateName, calculateInterval } from './utils'; import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; +import { Meta } from '../types'; export const patchRules = async ({ alertsClient, @@ -27,7 +28,6 @@ export const patchRules = async ({ meta, filters, from, - immutable, index, interval, maxSignals, @@ -42,11 +42,11 @@ export const patchRules = async ({ references, note, version, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, actions, -}: PatchRuleParams): Promise => { +}: PatchRulesOptions): Promise => { if (rule == null) { return null; } @@ -60,7 +60,7 @@ export const patchRules = async ({ savedId, timelineId, timelineTitle, - meta, + meta: meta as Meta | undefined, // TODO: Remove this cast once we fix the types for calculate version and patch, filters, from, index, @@ -76,7 +76,7 @@ export const patchRules = async ({ references, version, note, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, }); @@ -89,7 +89,6 @@ export const patchRules = async ({ description, falsePositives, from, - immutable, query, language, outputIndex, @@ -108,7 +107,7 @@ export const patchRules = async ({ references, note, version: calculatedVersion, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, } @@ -117,7 +116,7 @@ export const patchRules = async ({ const update = await alertsClient.update({ id: rule.id, data: { - tags: addTags(tags ?? rule.tags, rule.params.ruleId, immutable ?? rule.params.immutable), + tags: addTags(tags ?? rule.tags, rule.params.ruleId, rule.params.immutable), throttle: null, name: calculateName({ updatedName: name, originalName: rule.name }), schedule: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.test.ts index ef8e70c78422c..b17a7358cfa52 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.test.ts @@ -81,18 +81,6 @@ describe('read_rules', () => { } }); - test('should return the output from alertsClient if id is set but ruleId is null', async () => { - const alertsClient = alertsClientMock.create(); - alertsClient.get.mockResolvedValue(getResult()); - - const rule = await readRules({ - alertsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ruleId: null, - }); - expect(rule).toEqual(getResult()); - }); - test('should return the output from alertsClient if id is undefined but ruleId is set', async () => { const alertsClient = alertsClientMock.create(); alertsClient.get.mockResolvedValue(getResult()); @@ -126,25 +114,12 @@ describe('read_rules', () => { const rule = await readRules({ alertsClient, - id: null, + id: undefined, ruleId: 'rule-1', }); expect(rule).toEqual(getResult()); }); - test('should return null if id and ruleId are null', async () => { - const alertsClient = alertsClientMock.create(); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - - const rule = await readRules({ - alertsClient, - id: null, - ruleId: null, - }); - expect(rule).toEqual(null); - }); - test('should return null if id and ruleId are undefined', async () => { const alertsClient = alertsClientMock.create(); alertsClient.get.mockResolvedValue(getResult()); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.ts index a8b76aeb8c453..e4bb65a907e2d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.ts @@ -7,7 +7,7 @@ import { SanitizedAlert } from '../../../../../alerts/common'; import { INTERNAL_RULE_ID_KEY } from '../../../../common/constants'; import { findRules } from './find_rules'; -import { ReadRuleParams, isAlertType } from './types'; +import { isAlertType, ReadRuleOptions } from './types'; /** * This reads the rules through a cascade try of what is fastest to what is slowest. @@ -21,7 +21,7 @@ export const readRules = async ({ alertsClient, id, ruleId, -}: ReadRuleParams): Promise => { +}: ReadRuleOptions): Promise => { if (id != null) { try { const rule = await alertsClient.get({ id }); @@ -43,6 +43,10 @@ export const readRules = async ({ alertsClient, filter: `alert.attributes.tags: "${INTERNAL_RULE_ID_KEY}:${ruleId}"`, page: 1, + fields: undefined, + perPage: undefined, + sortField: undefined, + sortOrder: undefined, }); if (ruleFromFind.data.length === 0 || !isAlertType(ruleFromFind.data[0])) { return null; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts index 70d53090f81cc..8bdb1287c6df2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts @@ -13,29 +13,67 @@ import { SavedObjectsFindResponse, SavedObjectsClientContract, } from 'kibana/server'; +import { RuleAlertAction } from '../../../../common/detection_engine/types'; +import { ListsDefaultArraySchema } from '../../../../common/detection_engine/schemas/types/lists_default_array'; +import { + FalsePositives, + From, + RuleId, + Immutable, + DescriptionOrUndefined, + Interval, + MaxSignals, + RiskScore, + OutputIndex, + Name, + Severity, + Tags, + Threat, + To, + Type, + References, + Version, + AnomalyThresholdOrUndefined, + QueryOrUndefined, + LanguageOrUndefined, + SavedIdOrUndefined, + TimelineIdOrUndefined, + TimelineTitleOrUndefined, + MachineLearningJobIdOrUndefined, + IndexOrUndefined, + NoteOrUndefined, + MetaOrUndefined, + Description, + Enabled, + VersionOrUndefined, + IdOrUndefined, + RuleIdOrUndefined, + EnabledOrUndefined, + FalsePositivesOrUndefined, + FromOrUndefined, + OutputIndexOrUndefined, + IntervalOrUndefined, + MaxSignalsOrUndefined, + RiskScoreOrUndefined, + NameOrUndefined, + SeverityOrUndefined, + TagsOrUndefined, + ToOrUndefined, + ThreatOrUndefined, + TypeOrUndefined, + ReferencesOrUndefined, + ListAndOrUndefined, + PerPageOrUndefined, + PageOrUndefined, + SortFieldOrUndefined, + QueryFilterOrUndefined, + FieldsOrUndefined, + SortOrderOrUndefined, +} from '../../../../common/detection_engine/schemas/common/schemas'; import { AlertsClient, PartialAlert } from '../../../../../alerts/server'; import { Alert, SanitizedAlert } from '../../../../../alerts/common'; import { SIGNALS_ID } from '../../../../common/constants'; -import { RuleAlertParams, RuleTypeParams, RuleAlertParamsRest } from '../types'; - -export type PatchRuleAlertParamsRest = Partial & { - id: string | undefined; - rule_id: RuleAlertParams['ruleId'] | undefined; -}; - -export type UpdateRuleAlertParamsRest = RuleAlertParamsRest & { - id: string | undefined; - rule_id: RuleAlertParams['ruleId'] | undefined; -}; - -export interface FindParamsRest { - per_page: number; - page: number; - sort_field: string; - sort_order: 'asc' | 'desc'; - fields: string[]; - filter: string; -} +import { RuleAlertParams, RuleTypeParams, PartialFilter } from '../types'; export interface RuleAlertType extends Alert { params: RuleTypeParams; @@ -90,81 +128,17 @@ export interface HapiReadableStream extends Readable { filename: string; }; } -export interface ImportRulesRequestParams { - query: { overwrite: boolean }; - body: { file: HapiReadableStream }; -} - -export interface ExportRulesRequestParams { - body: { objects: Array<{ rule_id: string }> | null | undefined }; - query: { - file_name: string; - exclude_export_details: boolean; - }; -} - -export interface RuleRequestParams { - id: string | undefined; - rule_id: string | undefined; -} - -export type ReadRuleRequestParams = RuleRequestParams; -export type DeleteRuleRequestParams = RuleRequestParams; -export type DeleteRulesRequestParams = RuleRequestParams[]; - -export interface FindRuleParams { - alertsClient: AlertsClient; - perPage?: number; - page?: number; - sortField?: string; - filter?: string; - fields?: string[]; - sortOrder?: 'asc' | 'desc'; -} - -export interface FindRulesRequestParams { - per_page: number; - page: number; - search?: string; - sort_field?: string; - filter?: string; - fields?: string[]; - sort_order?: 'asc' | 'desc'; -} - -export interface FindRulesStatusesRequestParams { - ids: string[]; -} export interface Clients { alertsClient: AlertsClient; } +// TODO: Try and remove this patch export type PatchRuleParams = Partial> & { rule: SanitizedAlert | null; savedObjectsClient: SavedObjectsClientContract; } & Clients; -export type UpdateRuleParams = Omit & { - id: string | undefined | null; - savedObjectsClient: SavedObjectsClientContract; -} & Clients; - -export type DeleteRuleParams = Clients & { - id: string | undefined; - ruleId: string | undefined | null; -}; - -export type CreateRuleParams = Omit & { - ruleId: string; -} & Clients; - -export interface ReadRuleParams { - alertsClient: AlertsClient; - id?: string | undefined | null; - ruleId?: string | undefined | null; -} - export const isAlertTypes = (partialAlert: PartialAlert[]): partialAlert is RuleAlertType[] => { return partialAlert.every((rule) => isAlertType(rule)); }; @@ -190,3 +164,131 @@ export const isRuleStatusFindTypes = ( ): obj is Array> => { return obj ? obj.every((ruleStatus) => isRuleStatusFindType(ruleStatus)) : false; }; + +export interface CreateRulesOptions { + alertsClient: AlertsClient; + anomalyThreshold: AnomalyThresholdOrUndefined; + description: Description; + enabled: Enabled; + falsePositives: FalsePositives; + from: From; + query: QueryOrUndefined; + language: LanguageOrUndefined; + savedId: SavedIdOrUndefined; + timelineId: TimelineIdOrUndefined; + timelineTitle: TimelineTitleOrUndefined; + meta: MetaOrUndefined; + machineLearningJobId: MachineLearningJobIdOrUndefined; + filters: PartialFilter[]; + ruleId: RuleId; + immutable: Immutable; + index: IndexOrUndefined; + interval: Interval; + maxSignals: MaxSignals; + riskScore: RiskScore; + outputIndex: OutputIndex; + name: Name; + severity: Severity; + tags: Tags; + threat: Threat; + to: To; + type: Type; + references: References; + note: NoteOrUndefined; + version: Version; + exceptionsList: ListsDefaultArraySchema; + actions: RuleAlertAction[]; +} + +export interface UpdateRulesOptions { + id: IdOrUndefined; + savedObjectsClient: SavedObjectsClientContract; + alertsClient: AlertsClient; + anomalyThreshold: AnomalyThresholdOrUndefined; + description: Description; + enabled: Enabled; + falsePositives: FalsePositives; + from: From; + query: QueryOrUndefined; + language: LanguageOrUndefined; + savedId: SavedIdOrUndefined; + timelineId: TimelineIdOrUndefined; + timelineTitle: TimelineTitleOrUndefined; + meta: MetaOrUndefined; + machineLearningJobId: MachineLearningJobIdOrUndefined; + filters: PartialFilter[]; + ruleId: RuleIdOrUndefined; + index: IndexOrUndefined; + interval: Interval; + maxSignals: MaxSignals; + riskScore: RiskScore; + outputIndex: OutputIndex; + name: Name; + severity: Severity; + tags: Tags; + threat: Threat; + to: To; + type: Type; + references: References; + note: NoteOrUndefined; + version: VersionOrUndefined; + exceptionsList: ListsDefaultArraySchema; + actions: RuleAlertAction[]; +} + +export interface PatchRulesOptions { + savedObjectsClient: SavedObjectsClientContract; + alertsClient: AlertsClient; + anomalyThreshold: AnomalyThresholdOrUndefined; + description: DescriptionOrUndefined; + enabled: EnabledOrUndefined; + falsePositives: FalsePositivesOrUndefined; + from: FromOrUndefined; + query: QueryOrUndefined; + language: LanguageOrUndefined; + savedId: SavedIdOrUndefined; + timelineId: TimelineIdOrUndefined; + timelineTitle: TimelineTitleOrUndefined; + meta: MetaOrUndefined; + machineLearningJobId: MachineLearningJobIdOrUndefined; + filters: PartialFilter[]; + index: IndexOrUndefined; + interval: IntervalOrUndefined; + maxSignals: MaxSignalsOrUndefined; + riskScore: RiskScoreOrUndefined; + outputIndex: OutputIndexOrUndefined; + name: NameOrUndefined; + severity: SeverityOrUndefined; + tags: TagsOrUndefined; + threat: ThreatOrUndefined; + to: ToOrUndefined; + type: TypeOrUndefined; + references: ReferencesOrUndefined; + note: NoteOrUndefined; + version: VersionOrUndefined; + exceptionsList: ListAndOrUndefined; + actions: RuleAlertAction[] | undefined; + rule: SanitizedAlert | null; +} + +export interface ReadRuleOptions { + alertsClient: AlertsClient; + id: IdOrUndefined; + ruleId: RuleIdOrUndefined; +} + +export interface DeleteRuleOptions { + alertsClient: AlertsClient; + id: IdOrUndefined; + ruleId: RuleIdOrUndefined; +} + +export interface FindRuleOptions { + alertsClient: AlertsClient; + perPage: PerPageOrUndefined; + page: PageOrUndefined; + sortField: SortFieldOrUndefined; + filter: QueryFilterOrUndefined; + fields: FieldsOrUndefined; + sortOrder: SortOrderOrUndefined; +} diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.test.ts index ede5c51d1e5e7..1945d00c75c88 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.test.ts @@ -6,12 +6,10 @@ import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; import { alertsClientMock } from '../../../../../alerts/server/mocks'; -import { - mockPrepackagedRule, - getFindResultWithSingleHit, -} from '../routes/__mocks__/request_responses'; +import { getFindResultWithSingleHit } from '../routes/__mocks__/request_responses'; import { updatePrepackagedRules } from './update_prepacked_rules'; import { patchRules } from './patch_rules'; +import { getAddPrepackagedRulesSchemaDecodedMock } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock'; jest.mock('./patch_rules'); describe('updatePrepackagedRules', () => { @@ -33,7 +31,7 @@ describe('updatePrepackagedRules', () => { }, ]; const outputIndex = 'outputIndex'; - const prepackagedRule = mockPrepackagedRule(); + const prepackagedRule = getAddPrepackagedRulesSchemaDecodedMock(); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); await updatePrepackagedRules( @@ -44,9 +42,14 @@ describe('updatePrepackagedRules', () => { ); expect(patchRules).toHaveBeenCalledWith( - expect.not.objectContaining({ - enabled: true, - actions, + expect.objectContaining({ + actions: undefined, + }) + ); + + expect(patchRules).toHaveBeenCalledWith( + expect.objectContaining({ + enabled: undefined, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.ts index c793d7eb9b6dc..c4792eaa97ee1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.ts @@ -5,15 +5,16 @@ */ import { SavedObjectsClientContract } from 'kibana/server'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { AlertsClient } from '../../../../../alerts/server'; import { patchRules } from './patch_rules'; -import { PrepackagedRules } from '../types'; import { readRules } from './read_rules'; +import { PartialFilter } from '../types'; export const updatePrepackagedRules = async ( alertsClient: AlertsClient, savedObjectsClient: SavedObjectsClientContract, - rules: PrepackagedRules[], + rules: AddPrepackagedRulesSchemaDecoded[], outputIndex: string ): Promise => { await Promise.all( @@ -22,12 +23,11 @@ export const updatePrepackagedRules = async ( description, false_positives: falsePositives, from, - immutable, query, language, saved_id: savedId, meta, - filters, + filters: filtersObject, rule_id: ruleId, index, interval, @@ -42,10 +42,18 @@ export const updatePrepackagedRules = async ( references, version, note, + anomaly_threshold: anomalyThreshold, + timeline_id: timelineId, + timeline_title: timelineTitle, + machine_learning_job_id: machineLearningJobId, + exceptions_list: exceptionsList, } = rule; const existingRule = await readRules({ alertsClient, ruleId, id: undefined }); + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const filters: PartialFilter[] | undefined = filtersObject as PartialFilter[]; + // Note: we do not pass down enabled as we do not want to suddenly disable // or enable rules on the user when they were not expecting it if a rule updates return patchRules({ @@ -53,7 +61,6 @@ export const updatePrepackagedRules = async ( description, falsePositives, from, - immutable, query, language, outputIndex, @@ -75,6 +82,13 @@ export const updatePrepackagedRules = async ( references, version, note, + anomalyThreshold, + enabled: undefined, + timelineId, + timelineTitle, + machineLearningJobId, + exceptionsList, + actions: undefined, }); }) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts new file mode 100644 index 0000000000000..7812c66a74d1f --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UpdateRulesOptions } from './types'; +import { alertsClientMock } from '../../../../../alerts/server/mocks'; +import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; + +export const getUpdateRulesOptionsMock = (): UpdateRulesOptions => ({ + id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + alertsClient: alertsClientMock.create(), + savedObjectsClient: savedObjectsClientMock.create(), + anomalyThreshold: undefined, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: 'user.name: root or user.name: admin', + language: 'kuery', + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: undefined, + filters: [], + ruleId: undefined, + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Query with a rule id', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'query', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], +}); + +export const getUpdateMlRulesOptionsMock = (): UpdateRulesOptions => ({ + id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + alertsClient: alertsClientMock.create(), + savedObjectsClient: savedObjectsClientMock.create(), + anomalyThreshold: 55, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: undefined, + language: undefined, + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: 'new_job_id', + filters: [], + ruleId: undefined, + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Machine Learning Job', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'machine_learning', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts index 222411deb37ab..cf59d2bb5e8c4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts @@ -4,96 +4,69 @@ * you may not use this file except in compliance with the Elastic License. */ -import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; -import { alertsClientMock } from '../../../../../alerts/server/mocks'; import { getResult, getMlResult } from '../routes/__mocks__/request_responses'; import { updateRules } from './update_rules'; +import { getUpdateRulesOptionsMock, getUpdateMlRulesOptionsMock } from './update_rules.mock'; +import { AlertsClientMock } from '../../../../../alerts/server/alerts_client.mock'; describe('updateRules', () => { - let alertsClient: ReturnType; - let savedObjectsClient: ReturnType; - - beforeEach(() => { - alertsClient = alertsClientMock.create(); - savedObjectsClient = savedObjectsClientMock.create(); - }); - - it('should call alertsClient.disable is the rule was enabled and enabled is false', async () => { - const rule = getResult(); - alertsClient.get.mockResolvedValue(getResult()); - - await updateRules({ - alertsClient, - savedObjectsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ...rule.params, + it('should call alertsClient.disable if the rule was enabled and enabled is false', async () => { + const rulesOptionsMock = getUpdateRulesOptionsMock(); + const ruleOptions = { + ...rulesOptionsMock, enabled: false, - interval: '', - name: '', - tags: [], - actions: [], - }); + }; + ((ruleOptions.alertsClient as unknown) as AlertsClientMock).get.mockResolvedValue(getResult()); + + await updateRules(ruleOptions); - expect(alertsClient.disable).toHaveBeenCalledWith( + expect(ruleOptions.alertsClient.disable).toHaveBeenCalledWith( expect.objectContaining({ - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + id: rulesOptionsMock.id, }) ); }); - it('should call alertsClient.enable is the rule was disabled and enabled is true', async () => { - const rule = getResult(); - alertsClient.get.mockResolvedValue({ + it('should call alertsClient.enable if the rule was disabled and enabled is true', async () => { + const rulesOptionsMock = getUpdateRulesOptionsMock(); + const ruleOptions = { + ...rulesOptionsMock, + enabled: true, + }; + + ((ruleOptions.alertsClient as unknown) as AlertsClientMock).get.mockResolvedValue({ ...getResult(), enabled: false, }); - await updateRules({ - alertsClient, - savedObjectsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ...rule.params, - enabled: true, - interval: '', - name: '', - tags: [], - actions: [], - }); + await updateRules(ruleOptions); - expect(alertsClient.enable).toHaveBeenCalledWith( + expect(ruleOptions.alertsClient.enable).toHaveBeenCalledWith( expect.objectContaining({ - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + id: rulesOptionsMock.id, }) ); }); it('calls the alertsClient with ML params', async () => { - alertsClient.get.mockResolvedValue(getMlResult()); - - const params = { - ...getMlResult().params, - anomalyThreshold: 55, - machineLearningJobId: 'new_job_id', + const rulesOptionsMock = getUpdateMlRulesOptionsMock(); + const ruleOptions = { + ...rulesOptionsMock, + enabled: true, }; - await updateRules({ - alertsClient, - savedObjectsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ...params, - enabled: true, - interval: '', - name: '', - tags: [], - actions: [], - }); + ((ruleOptions.alertsClient as unknown) as AlertsClientMock).get.mockResolvedValue( + getMlResult() + ); + + await updateRules(ruleOptions); - expect(alertsClient.update).toHaveBeenCalledWith( + expect(ruleOptions.alertsClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ params: expect.objectContaining({ - anomalyThreshold: 55, - machineLearningJobId: 'new_job_id', + anomalyThreshold: rulesOptionsMock.anomalyThreshold, + machineLearningJobId: rulesOptionsMock.machineLearningJobId, }), }), }) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts index 54031b6e35bf1..0236c357988d5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts @@ -7,11 +7,12 @@ import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; import { PartialAlert } from '../../../../../alerts/server'; import { readRules } from './read_rules'; -import { UpdateRuleParams } from './types'; +import { UpdateRulesOptions } from './types'; import { addTags } from './add_tags'; import { calculateVersion } from './utils'; import { hasListsFeature } from '../feature_flags'; import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; +import { Meta } from '../types'; export const updateRules = async ({ alertsClient, @@ -43,11 +44,11 @@ export const updateRules = async ({ references, version, note, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, actions, -}: UpdateRuleParams): Promise => { +}: UpdateRulesOptions): Promise => { const rule = await readRules({ alertsClient, ruleId, id }); if (rule == null) { return null; @@ -62,7 +63,7 @@ export const updateRules = async ({ savedId, timelineId, timelineTitle, - meta, + meta: meta as Meta, // TODO: Remove this cast once we fix the types for calculate version and patch filters, from, index, @@ -83,7 +84,7 @@ export const updateRules = async ({ }); // TODO: Remove this and use regular exceptions_list once the feature is stable for a release - const exceptionsListParam = hasListsFeature() ? { exceptions_list } : {}; + const exceptionsListParam = hasListsFeature() ? { exceptionsList } : {}; const update = await alertsClient.update({ id: rule.id, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/create_ndjson_prepackaged_rules.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/create_ndjson_prepackaged_rules.sh new file mode 100755 index 0000000000000..29c69ae857f3e --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/create_ndjson_prepackaged_rules.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# +# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +# or more contributor license agreements. Licensed under the Elastic License; +# you may not use this file except in compliance with the Elastic License. +# + +i=0; +for f in ../rules/prepackaged_rules/*.json ; do + ((i++)); + echo "converting $f" + cat ../rules/prepackaged_rules/windows_msxsl_network.json | tr -d '\n' | tr -d ' ' >> pre_packaged_rules.ndjson + echo "" >> pre_packaged_rules.ndjson +done +echo "{\"exported_count\":$i,\"missing_rules\":[],\"missing_rules_count\":0}" >> pre_packaged_rules.ndjson + diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts index 2d75ba4f42d12..46a16e7dca153 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts @@ -44,7 +44,7 @@ export const sampleRuleAlertParams = ( meta: undefined, threat: undefined, version: 1, - exceptions_list: [ + exceptionsList: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts index b33a2376589ef..d4efd9a2e8a1a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts @@ -189,7 +189,7 @@ export const buildQueryExceptions = ({ }: { query: string; language: Language; - lists: RuleAlertParams['exceptions_list']; + lists: RuleAlertParams['exceptionsList']; }): Query[] => { if (lists && lists !== null) { const exceptions = buildExceptions({ lists, language, query }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts index 93d4e5e7719b2..de8de1bc513e3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts @@ -72,7 +72,7 @@ export const buildRule = ({ version: ruleParams.version, created_at: createdAt, updated_at: updatedAt, - exceptions_list: ruleParams.exceptions_list, + exceptions_list: ruleParams.exceptionsList, machine_learning_job_id: ruleParams.machineLearningJobId, anomaly_threshold: ruleParams.anomalyThreshold, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts index 07435fda0da2e..29b8b54d162df 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts @@ -14,7 +14,7 @@ import { RuleAlertParams } from '../types'; interface FilterEventsAgainstList { listClient: ListClient; - exceptionsList: RuleAlertParams['exceptions_list']; + exceptionsList: RuleAlertParams['exceptionsList']; logger: Logger; eventSearchResult: SignalSearchResponse; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts index 1630192b3c03a..c464238715afd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts @@ -22,7 +22,7 @@ export const getQueryFilter = ( language: Language, filters: PartialFilter[], index: string[], - lists: RuleAlertParams['exceptions_list'] + lists: RuleAlertParams['exceptionsList'] ) => { const indexPattern = { fields: [], @@ -53,7 +53,7 @@ interface GetFilterArgs { savedId: string | undefined | null; services: AlertServices; index: string[] | undefined | null; - lists: RuleAlertParams['exceptions_list']; + lists: RuleAlertParams['exceptionsList']; } interface QueryAttributes { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts index e44b82224d1ce..b7bea906475db 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts @@ -18,7 +18,7 @@ interface SearchAfterAndBulkCreateParams { ruleParams: RuleTypeParams; services: AlertServices; listClient: ListClient | undefined; // TODO: undefined is for temporary development, remove before merged - exceptionsList: RuleAlertParams['exceptions_list']; + exceptionsList: RuleAlertParams['exceptionsList']; logger: Logger; id: string; inputIndexPattern: string[]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts index 81a6ce9b08f02..d42ba8fe57005 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts @@ -39,5 +39,5 @@ export const signalParamsSchema = () => type: schema.string(), references: schema.arrayOf(schema.string(), { defaultValue: [] }), version: schema.number({ defaultValue: 1 }), - exceptions_list: schema.maybe(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), + exceptionsList: schema.maybe(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts index 6885b4c814679..567274be6a9f8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts @@ -79,7 +79,7 @@ export const signalRulesAlertType = ({ query, to, type, - exceptions_list: exceptionsList, + exceptionsList, } = params; const searchAfterSize = Math.min(maxSignals, DEFAULT_SEARCH_AFTER_PAGE_SIZE); let hasError: boolean = false; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts index 90497b6e34cb4..869c81f640561 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts @@ -21,20 +21,6 @@ export interface SignalsStatusParams { status: 'open' | 'closed'; } -export interface SignalQueryParams { - query: object | undefined | null; - aggs: object | undefined | null; - _source: string[] | undefined | null; - size: number | undefined | null; - track_total_hits: boolean | undefined | null; -} - -export type SignalsStatusRestParams = Omit & { - signal_ids: SignalsStatusParams['signalIds']; -}; - -export type SignalsQueryRestParams = SignalQueryParams; - export type SearchTypes = | string | string[] diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/tags/read_tags.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/tags/read_tags.ts index 2bb2b5ec47e2f..5bf2b47c78181 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/tags/read_tags.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/tags/read_tags.ts @@ -61,6 +61,7 @@ export const readRawTags = async ({ page: 1, sortField: 'createdAt', sortOrder: 'desc', + filter: undefined, }); // Get all the rules to aggregate over all the tags of the rules const rules = await findRules({ @@ -70,6 +71,7 @@ export const readRawTags = async ({ sortField: 'createdAt', sortOrder: 'desc', page: 1, + filter: undefined, }); const tagSet = convertTagsToSet(rules.data); return Array.from(tagSet); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts index 53c8a9bf0a7e7..9062de49fa6ce 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts @@ -68,7 +68,7 @@ export interface RuleAlertParams { type: RuleType; version: number; throttle: string | undefined | null; - exceptions_list: ListsDefaultArraySchema | null | undefined; + exceptionsList: ListsDefaultArraySchema | null | undefined; } export type RuleTypeParams = Omit< @@ -83,6 +83,7 @@ export type RuleAlertParamsRest = Omit< | 'falsePositives' | 'immutable' | 'maxSignals' + | 'exceptionsList' | 'machineLearningJobId' | 'savedId' | 'riskScore' @@ -101,6 +102,7 @@ export type RuleAlertParamsRest = Omit< | 'lastFailureMessage' > & { anomaly_threshold: RuleAlertParams['anomalyThreshold']; + exceptions_list: RuleAlertParams['exceptionsList']; rule_id: RuleAlertParams['ruleId']; false_positives: RuleAlertParams['falsePositives']; saved_id?: RuleAlertParams['savedId']; @@ -127,24 +129,6 @@ export type OutputRuleAlertRest = RuleAlertParamsRest & { immutable: boolean; }; -export type ImportRuleAlertRest = Omit & { - id: string | undefined | null; - rule_id: string; - immutable: boolean; -}; - -export type PrepackagedRules = Omit< - RuleAlertParamsRest, - | 'status' - | 'status_date' - | 'last_failure_at' - | 'last_success_at' - | 'last_failure_message' - | 'last_success_message' - | 'updated_at' - | 'created_at' -> & { rule_id: string; immutable: boolean }; - // eslint-disable-next-line @typescript-eslint/no-explicit-any export type CallWithRequest, V> = ( endpoint: string, diff --git a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts index 2b5b34edca140..ca2f881d6abd8 100644 --- a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts +++ b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ import { transformDataToNdjson } from './create_stream_from_ndjson'; -import { ImportRuleAlertRest } from '../../lib/detection_engine/types'; import { sampleRule } from '../../lib/detection_engine/signals/__mocks__/es_results'; +import { ImportRulesSchemaDecoded } from '../../../common/detection_engine/schemas/request/import_rules_schema'; -export const getOutputSample = (): Partial => ({ +export const getOutputSample = (): Partial => ({ rule_id: 'rule-1', output_index: '.siem-signals', risk_score: 50, @@ -21,7 +21,7 @@ export const getOutputSample = (): Partial => ({ type: 'query', }); -export const getSampleAsNdjson = (sample: Partial): string => { +export const getSampleAsNdjson = (sample: Partial): string => { return `${JSON.stringify(sample)}\n`; }; diff --git a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.ts b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.ts index 7da9fbcfb7662..f455ac0696e4e 100644 --- a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.ts +++ b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.ts @@ -5,9 +5,17 @@ */ import { Transform } from 'stream'; import { has, isString } from 'lodash/fp'; -import { ImportRuleAlertRest } from '../../lib/detection_engine/types'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import * as t from 'io-ts'; +import { importRuleValidateTypeDependents } from '../../../common/detection_engine/schemas/request/import_rules_type_dependents'; +import { + ImportRulesSchemaDecoded, + importRulesSchema, + ImportRulesSchema, +} from '../../../common/detection_engine/schemas/request/import_rules_schema'; +import { exactCheck } from '../../../common/exact_check'; import { createMapStream, createFilterStream } from '../../../../../../src/legacy/utils/streams'; -import { importRulesSchema } from '../../lib/detection_engine/routes/schemas/import_rules_schema'; import { BadRequestError } from '../../lib/detection_engine/errors/bad_request_error'; export interface RulesObjectsExportResultDetails { @@ -28,20 +36,28 @@ export const parseNdjsonStrings = (): Transform => { }; export const filterExportedCounts = (): Transform => { - return createFilterStream( + return createFilterStream( (obj) => obj != null && !has('exported_count', obj) ); }; export const validateRules = (): Transform => { - return createMapStream((obj: ImportRuleAlertRest) => { + return createMapStream((obj: ImportRulesSchema) => { if (!(obj instanceof Error)) { - const validated = importRulesSchema.validate(obj); - if (validated.error != null) { - return new BadRequestError(validated.error.message); - } else { - return validated.value; - } + const decoded = importRulesSchema.decode(obj); + const checked = exactCheck(obj, decoded); + const onLeft = (errors: t.Errors): BadRequestError | ImportRulesSchemaDecoded => { + return new BadRequestError(errors.join()); + }; + const onRight = (schema: ImportRulesSchema): BadRequestError | ImportRulesSchemaDecoded => { + const validationErrors = importRuleValidateTypeDependents(schema); + if (validationErrors.length) { + return new BadRequestError(validationErrors.join()); + } else { + return schema as ImportRulesSchemaDecoded; + } + }; + return pipe(checked, fold(onLeft, onRight)); } else { return obj; } diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules.ts index e91b735e1629b..5626d63b8f230 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules.ts @@ -92,12 +92,12 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete it', async () => { const { body } = await supertest - .delete(`${DETECTION_ENGINE_RULES_URL}?id=fake_id`) + .delete(`${DETECTION_ENGINE_RULES_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) .set('kbn-xsrf', 'true') .expect(404); expect(body).to.eql({ - message: 'id: "fake_id" not found', + message: 'id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', status_code: 404, }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules_bulk.ts index 687551c2d8313..04f168d5b7953 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules_bulk.ts @@ -114,17 +114,17 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete an id', async () => { const { body } = await supertest .delete(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: 'fake_id' }]) + .send([{ id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); expect(body).to.eql([ { error: { - message: 'id: "fake_id" not found', + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', status_code: 404, }, - id: 'fake_id', + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', }, ]); }); @@ -139,14 +139,20 @@ export default ({ getService }: FtrProviderContext): void => { const { body } = await supertest .delete(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: bodyWithCreatedRule.id }, { id: 'fake_id' }]) + .send([{ id: bodyWithCreatedRule.id }, { id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body[0]); expect([bodyToCompare, body[1]]).to.eql([ getSimpleRuleOutputWithoutRuleId(), - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + error: { + status_code: 404, + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', + }, + }, ]); }); }); @@ -241,17 +247,17 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete an id', async () => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: 'fake_id' }]) + .send([{ id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); expect(body).to.eql([ { error: { - message: 'id: "fake_id" not found', + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', status_code: 404, }, - id: 'fake_id', + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', }, ]); }); @@ -266,14 +272,20 @@ export default ({ getService }: FtrProviderContext): void => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: bodyWithCreatedRule.id }, { id: 'fake_id' }]) + .send([{ id: bodyWithCreatedRule.id }, { id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body[0]); expect([bodyToCompare, body[1]]).to.eql([ getSimpleRuleOutputWithoutRuleId(), - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + error: { + status_code: 404, + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', + }, + }, ]); }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts index e3c4233383be4..66962df14e22d 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts @@ -120,16 +120,6 @@ export default ({ getService }: FtrProviderContext): void => { }); }); - it('should report that it failed to import a thousand and one (10001) simple rules', async () => { - const { body } = await supertest - .post(`${DETECTION_ENGINE_RULES_URL}/_import`) - .set('kbn-xsrf', 'true') - .attach('file', getSimpleRuleAsNdjson(new Array(10001).fill('rule-1')), 'rules.ndjson') - .expect(500); - - expect(body).to.eql({ message: "Can't import more than 10000 rules", status_code: 500 }); - }); - it('should be able to read an imported rule back out correctly', async () => { await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_import`) diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts index 099ea950d128c..01138779ee39c 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts @@ -207,12 +207,12 @@ export default ({ getService }: FtrProviderContext) => { const { body } = await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send({ id: 'fake_id', name: 'some other name' }) + .send({ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }) .expect(404); expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts index 0bf80204e2445..26a39a46d07f7 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts @@ -261,11 +261,17 @@ export default ({ getService }: FtrProviderContext) => { const { body } = await supertest .patch(`${DETECTION_ENGINE_RULES_URL}/_bulk_update`) .set('kbn-xsrf', 'true') - .send([{ id: 'fake_id', name: 'some other name' }]) + .send([{ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }]) .expect(200); expect(body).to.eql([ - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + error: { + status_code: 404, + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', + }, + }, ]); }); @@ -333,7 +339,7 @@ export default ({ getService }: FtrProviderContext) => { .set('kbn-xsrf', 'true') .send([ { id: createdBody.id, name: 'some other name' }, - { id: 'fake_id', name: 'some other name' }, + { id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }, ]) .expect(200); @@ -346,10 +352,10 @@ export default ({ getService }: FtrProviderContext) => { outputRule, { error: { - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', status_code: 404, }, - id: 'fake_id', + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', }, ]); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/read_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/read_rules.ts index bd83ef00ccf1a..59717724e4201 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/read_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/read_rules.ts @@ -92,14 +92,14 @@ export default ({ getService }: FtrProviderContext) => { it('should return 404 if given a fake id', async () => { const { body } = await supertest - .get(`${DETECTION_ENGINE_RULES_URL}?id=fake_id`) + .get(`${DETECTION_ENGINE_RULES_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) .set('kbn-xsrf', 'true') .send(getSimpleRule()) .expect(404); expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts index 83fb991ecef1b..127f688dfbc28 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts @@ -212,7 +212,7 @@ export default ({ getService }: FtrProviderContext) => { it('should give a 404 if it is given a fake id', async () => { const simpleRule = getSimpleRule(); - simpleRule.id = 'fake_id'; + simpleRule.id = '5096dec6-b6b9-4d8d-8f93-6c2602079d9d'; delete simpleRule.rule_id; const { body } = await supertest @@ -223,7 +223,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts index 655f2b5d2e33f..54f29939fb6b4 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts @@ -269,7 +269,7 @@ export default ({ getService }: FtrProviderContext) => { it('should return a 200 but give a 404 in the message if it is given a fake id', async () => { const ruleUpdate = getSimpleRule('rule-1'); - ruleUpdate.id = 'fake_id'; + ruleUpdate.id = '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5'; delete ruleUpdate.rule_id; const { body } = await supertest @@ -279,7 +279,13 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); expect(body).to.eql([ - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5', + error: { + status_code: 404, + message: 'id: "1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5" not found', + }, + }, ]); }); @@ -358,7 +364,7 @@ export default ({ getService }: FtrProviderContext) => { const rule2 = getSimpleRule(); delete rule2.rule_id; - rule2.id = 'fake_id'; + rule2.id = 'b3aa019a-656c-4311-b13b-4d9852e24347'; rule2.name = 'some other name'; const { body } = await supertest @@ -376,10 +382,10 @@ export default ({ getService }: FtrProviderContext) => { outputRule, { error: { - message: 'id: "fake_id" not found', + message: 'id: "b3aa019a-656c-4311-b13b-4d9852e24347" not found', status_code: 404, }, - id: 'fake_id', + id: 'b3aa019a-656c-4311-b13b-4d9852e24347', }, ]); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts index e91b735e1629b..5626d63b8f230 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts @@ -92,12 +92,12 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete it', async () => { const { body } = await supertest - .delete(`${DETECTION_ENGINE_RULES_URL}?id=fake_id`) + .delete(`${DETECTION_ENGINE_RULES_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) .set('kbn-xsrf', 'true') .expect(404); expect(body).to.eql({ - message: 'id: "fake_id" not found', + message: 'id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', status_code: 404, }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts index 687551c2d8313..04f168d5b7953 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts @@ -114,17 +114,17 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete an id', async () => { const { body } = await supertest .delete(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: 'fake_id' }]) + .send([{ id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); expect(body).to.eql([ { error: { - message: 'id: "fake_id" not found', + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', status_code: 404, }, - id: 'fake_id', + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', }, ]); }); @@ -139,14 +139,20 @@ export default ({ getService }: FtrProviderContext): void => { const { body } = await supertest .delete(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: bodyWithCreatedRule.id }, { id: 'fake_id' }]) + .send([{ id: bodyWithCreatedRule.id }, { id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body[0]); expect([bodyToCompare, body[1]]).to.eql([ getSimpleRuleOutputWithoutRuleId(), - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + error: { + status_code: 404, + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', + }, + }, ]); }); }); @@ -241,17 +247,17 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete an id', async () => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: 'fake_id' }]) + .send([{ id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); expect(body).to.eql([ { error: { - message: 'id: "fake_id" not found', + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', status_code: 404, }, - id: 'fake_id', + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', }, ]); }); @@ -266,14 +272,20 @@ export default ({ getService }: FtrProviderContext): void => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: bodyWithCreatedRule.id }, { id: 'fake_id' }]) + .send([{ id: bodyWithCreatedRule.id }, { id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body[0]); expect([bodyToCompare, body[1]]).to.eql([ getSimpleRuleOutputWithoutRuleId(), - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + error: { + status_code: 404, + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', + }, + }, ]); }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts index e3c4233383be4..66962df14e22d 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts @@ -120,16 +120,6 @@ export default ({ getService }: FtrProviderContext): void => { }); }); - it('should report that it failed to import a thousand and one (10001) simple rules', async () => { - const { body } = await supertest - .post(`${DETECTION_ENGINE_RULES_URL}/_import`) - .set('kbn-xsrf', 'true') - .attach('file', getSimpleRuleAsNdjson(new Array(10001).fill('rule-1')), 'rules.ndjson') - .expect(500); - - expect(body).to.eql({ message: "Can't import more than 10000 rules", status_code: 500 }); - }); - it('should be able to read an imported rule back out correctly', async () => { await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_import`) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts index a199382f29213..3219ae7e0e2d4 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts @@ -210,12 +210,12 @@ export default ({ getService }: FtrProviderContext) => { const { body } = await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send({ id: 'fake_id', name: 'some other name' }) + .send({ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }) .expect(404); expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts index 0bf80204e2445..26a39a46d07f7 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts @@ -261,11 +261,17 @@ export default ({ getService }: FtrProviderContext) => { const { body } = await supertest .patch(`${DETECTION_ENGINE_RULES_URL}/_bulk_update`) .set('kbn-xsrf', 'true') - .send([{ id: 'fake_id', name: 'some other name' }]) + .send([{ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }]) .expect(200); expect(body).to.eql([ - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + error: { + status_code: 404, + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', + }, + }, ]); }); @@ -333,7 +339,7 @@ export default ({ getService }: FtrProviderContext) => { .set('kbn-xsrf', 'true') .send([ { id: createdBody.id, name: 'some other name' }, - { id: 'fake_id', name: 'some other name' }, + { id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }, ]) .expect(200); @@ -346,10 +352,10 @@ export default ({ getService }: FtrProviderContext) => { outputRule, { error: { - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', status_code: 404, }, - id: 'fake_id', + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', }, ]); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts index bd83ef00ccf1a..59717724e4201 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts @@ -92,14 +92,14 @@ export default ({ getService }: FtrProviderContext) => { it('should return 404 if given a fake id', async () => { const { body } = await supertest - .get(`${DETECTION_ENGINE_RULES_URL}?id=fake_id`) + .get(`${DETECTION_ENGINE_RULES_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) .set('kbn-xsrf', 'true') .send(getSimpleRule()) .expect(404); expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts index 003c8645f1b22..0b1b49e379d17 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts @@ -214,7 +214,7 @@ export default ({ getService }: FtrProviderContext) => { it('should give a 404 if it is given a fake id', async () => { const simpleRule = getSimpleRule(); - simpleRule.id = 'fake_id'; + simpleRule.id = '5096dec6-b6b9-4d8d-8f93-6c2602079d9d'; delete simpleRule.rule_id; const { body } = await supertest @@ -225,7 +225,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts index 655f2b5d2e33f..54f29939fb6b4 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts @@ -269,7 +269,7 @@ export default ({ getService }: FtrProviderContext) => { it('should return a 200 but give a 404 in the message if it is given a fake id', async () => { const ruleUpdate = getSimpleRule('rule-1'); - ruleUpdate.id = 'fake_id'; + ruleUpdate.id = '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5'; delete ruleUpdate.rule_id; const { body } = await supertest @@ -279,7 +279,13 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); expect(body).to.eql([ - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5', + error: { + status_code: 404, + message: 'id: "1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5" not found', + }, + }, ]); }); @@ -358,7 +364,7 @@ export default ({ getService }: FtrProviderContext) => { const rule2 = getSimpleRule(); delete rule2.rule_id; - rule2.id = 'fake_id'; + rule2.id = 'b3aa019a-656c-4311-b13b-4d9852e24347'; rule2.name = 'some other name'; const { body } = await supertest @@ -376,10 +382,10 @@ export default ({ getService }: FtrProviderContext) => { outputRule, { error: { - message: 'id: "fake_id" not found', + message: 'id: "b3aa019a-656c-4311-b13b-4d9852e24347" not found', status_code: 404, }, - id: 'fake_id', + id: 'b3aa019a-656c-4311-b13b-4d9852e24347', }, ]); }); From bc5d8c20c1b1ebeedf2aa21a3c6b0656094e2154 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jun 2020 03:36:12 +0100 Subject: [PATCH 29/91] chore(NA): skip endpoint Endpoint Alert Page: when es has data and user has navigated to the page (#68596) --- x-pack/test/functional_endpoint/apps/endpoint/alerts.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts b/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts index e41cf3fb90bad..e57efc8a7ce7a 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts @@ -12,7 +12,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const browser = getService('browser'); - describe('Endpoint Alert Page: when es has data and user has navigated to the page', function () { + // SKIPPED as it is failing in ES PROMOTION: https://github.com/elastic/kibana/issues/68596 + describe.skip('Endpoint Alert Page: when es has data and user has navigated to the page', function () { this.tags(['ciGroup7']); before(async () => { await esArchiver.load('endpoint/alerts/api_feature'); From e74440b138ae78416ad1fbae8761b5888729b352 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jun 2020 03:50:27 +0100 Subject: [PATCH 30/91] chore(NA): skip apis Endpoint plugin Endpoint alert API when data is in elasticsearch (#68613) --- x-pack/test/api_integration/apis/endpoint/alerts/index.ts | 3 ++- x-pack/test/functional_endpoint/apps/endpoint/alerts.ts | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/test/api_integration/apis/endpoint/alerts/index.ts b/x-pack/test/api_integration/apis/endpoint/alerts/index.ts index 67ef3ea42cf16..9ad83f509fc50 100644 --- a/x-pack/test/api_integration/apis/endpoint/alerts/index.ts +++ b/x-pack/test/api_integration/apis/endpoint/alerts/index.ts @@ -70,7 +70,8 @@ export default function ({ getService }: FtrProviderContext) { let nullableEventId = ''; - describe('Endpoint alert API', () => { + // SKIPPED as it is failing ES PROMOTION: https://github.com/elastic/kibana/issues/68613 + describe.skip('Endpoint alert API', () => { describe('when data is in elasticsearch', () => { before(async () => { await esArchiver.load('endpoint/alerts/api_feature'); diff --git a/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts b/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts index e57efc8a7ce7a..e41cf3fb90bad 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts @@ -12,8 +12,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const browser = getService('browser'); - // SKIPPED as it is failing in ES PROMOTION: https://github.com/elastic/kibana/issues/68596 - describe.skip('Endpoint Alert Page: when es has data and user has navigated to the page', function () { + describe('Endpoint Alert Page: when es has data and user has navigated to the page', function () { this.tags(['ciGroup7']); before(async () => { await esArchiver.load('endpoint/alerts/api_feature'); From 88754d2cb2c5454d5b58d19722e66285e9a01638 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 9 Jun 2020 10:04:05 +0300 Subject: [PATCH 31/91] [TSVB] Allows the user to change the tooltip mode (#67775) * Allows the user to select the tooltip mode * Fix problem on new TSVB and add new field to schema * Change default value on tooltip dropdown for the focused series option --- .../components/panel_config/timeseries.js | 39 +++++++++++++++++++ .../components/vis_types/timeseries/vis.js | 1 + .../visualizations/views/timeseries/index.js | 3 +- .../public/metrics_type.ts | 1 + .../server/routes/post_vis_schema.ts | 3 ++ 5 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js index 0b8b4be67b7a0..3e5e335a9ea39 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js +++ b/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js @@ -61,6 +61,7 @@ class TimeseriesPanelConfigUi extends Component { axis_min: '', legend_position: 'right', show_grid: 1, + tooltip_mode: 'show_all', }; const model = { ...defaults, ...this.props.model }; const { selectedTab } = this.state; @@ -85,6 +86,22 @@ class TimeseriesPanelConfigUi extends Component { value: 'left', }, ]; + const tooltipModeOptions = [ + { + label: intl.formatMessage({ + id: 'visTypeTimeseries.timeseries.tooltipOptions.showAll', + defaultMessage: 'Show all values', + }), + value: 'show_all', + }, + { + label: intl.formatMessage({ + id: 'visTypeTimeseries.timeseries.tooltipOptions.showFocused', + defaultMessage: 'Show focused values', + }), + value: 'show_focused', + }, + ]; const selectedPositionOption = positionOptions.find((option) => { return model.axis_position === option.value; }); @@ -134,6 +151,10 @@ class TimeseriesPanelConfigUi extends Component { return model.legend_position === option.value; }); + const selectedTooltipMode = tooltipModeOptions.find((option) => { + return model.tooltip_mode === option.value; + }); + let view; if (selectedTab === 'data') { view = ( @@ -356,6 +377,24 @@ class TimeseriesPanelConfigUi extends Component { + + + + + + + + diff --git a/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js index b4c563f3c11fd..ddfaf3c1428d9 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js @@ -250,6 +250,7 @@ export class TimeseriesVisualization extends Component { showGrid={Boolean(model.show_grid)} legend={Boolean(model.show_legend)} legendPosition={model.legend_position} + tooltipMode={model.tooltip_mode} xAxisLabel={getAxisLabelString(interval)} xAxisFormatter={this.xAxisFormatter(interval)} annotations={this.prepareAnnotations()} diff --git a/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js index 274b46bce2715..c53482b5db075 100644 --- a/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js +++ b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js @@ -61,6 +61,7 @@ export const TimeSeries = ({ showGrid, legend, legendPosition, + tooltipMode, xAxisLabel, series, yAxis, @@ -131,7 +132,7 @@ export const TimeSeries = ({ baseTheme={theme} tooltip={{ snap: true, - type: TooltipType.VerticalCursor, + type: tooltipMode === 'show_focused' ? TooltipType.Follow : TooltipType.VerticalCursor, headerFormatter: tooltipFormatter, }} /> diff --git a/src/plugins/vis_type_timeseries/public/metrics_type.ts b/src/plugins/vis_type_timeseries/public/metrics_type.ts index 2b0734ceb4d4d..c06f94efb3c49 100644 --- a/src/plugins/vis_type_timeseries/public/metrics_type.ts +++ b/src/plugins/vis_type_timeseries/public/metrics_type.ts @@ -69,6 +69,7 @@ export const metricsVisDefinition = { axis_scale: 'normal', show_legend: 1, show_grid: 1, + tooltip_mode: 'show_all', }, component: VisEditor, }, diff --git a/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts b/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts index e8838f57ae365..bf2ea8651c5a2 100644 --- a/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts +++ b/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts @@ -247,6 +247,9 @@ export const visPayloadSchema = schema.object({ series: schema.arrayOf(seriesItems), show_grid: numberIntegerRequired, show_legend: numberIntegerRequired, + tooltip_mode: schema.maybe( + schema.oneOf([schema.literal('show_all'), schema.literal('show_focused')]) + ), time_field: stringOptionalNullable, time_range_mode: stringOptionalNullable, type: stringRequired, From 5377dbb75897f7f7b64b888b85b1ac35b7b9a2d2 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Tue, 9 Jun 2020 11:25:59 +0200 Subject: [PATCH 32/91] [ML] Functional tests - stabilize DFA job creation (#68495) This PR stabilizes the classification and regression creation tests. --- .../apps/ml/data_frame_analytics/classification_creation.ts | 5 ++--- .../ml/data_frame_analytics/outlier_detection_creation.ts | 2 +- .../apps/ml/data_frame_analytics/regression_creation.ts | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts index c8baa13b56408..b0376b35ebd2f 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts @@ -11,8 +11,7 @@ export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); - // flaky test, see https://github.com/elastic/kibana/issues/68356 - describe.skip('classification creation', function () { + describe('classification creation', function () { before(async () => { await esArchiver.loadIfNeeded('ml/bm_classification'); await ml.testResources.createIndexPatternIfNeeded('ft_bank_marketing', '@timestamp'); @@ -66,7 +65,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('selects the source data and loads the job wizard page', async () => { - ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); + await ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); }); it('selects the job type', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts index b5c2b7528437c..2daae60b0ad20 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts @@ -63,7 +63,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('selects the source data and loads the job wizard page', async () => { - ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); + await ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); }); it('selects the job type', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts index c818619a18378..35425e47526dd 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts @@ -11,8 +11,7 @@ export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); - // flaky test, see https://github.com/elastic/kibana/issues/68352 - describe.skip('regression creation', function () { + describe('regression creation', function () { before(async () => { await esArchiver.loadIfNeeded('ml/egs_regression'); await ml.testResources.createIndexPatternIfNeeded('ft_egs_regression', '@timestamp'); @@ -66,7 +65,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('selects the source data and loads the job wizard page', async () => { - ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); + await ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); }); it('selects the job type', async () => { From 0b3391a8fd087960e741c615b2d433811fb99d67 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Tue, 9 Jun 2020 11:28:43 +0200 Subject: [PATCH 33/91] [ML] Functional tests - fix job validation API test with maxModelMemoryLimit (#68501) This PR fixes the job validation API integration test for the scenario that the test environment has xpack.ml.max_model_memory_limit set. --- .../api_integration/apis/ml/job_validation/validate.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/x-pack/test/api_integration/apis/ml/job_validation/validate.ts b/x-pack/test/api_integration/apis/ml/job_validation/validate.ts index 55497940190cb..fc8f837744221 100644 --- a/x-pack/test/api_integration/apis/ml/job_validation/validate.ts +++ b/x-pack/test/api_integration/apis/ml/job_validation/validate.ts @@ -226,6 +226,15 @@ export default ({ getService }: FtrProviderContext) => { .send(requestBody) .expect(200); + // The existance and value of maxModelMemoryLimit depends on ES settings + // and may vary between test environments, e.g. cloud vs non-cloud, + // so it should not be part of the validation + body.forEach((element: any) => { + if (element.hasOwnProperty('maxModelMemoryLimit')) { + delete element.maxModelMemoryLimit; + } + }); + expect(body).to.eql([ { id: 'job_id_valid', From 004df98c8712e707195c6580ab788b70a5412983 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Tue, 9 Jun 2020 11:30:15 +0200 Subject: [PATCH 34/91] [ML] Sample data modules - use event.dataset instead of index name (#68538) This PR adds event.dataset to the Kibana ecommerce sample data and makes the ML modules for ecommerce and weblog sample data use event.dataset to recognize the modules and also as the corresponding datafeed query instead of looking for the index name. --- .../data_sets/ecommerce/ecommerce.json.gz | Bin 814280 -> 819503 bytes .../data_sets/ecommerce/field_mappings.ts | 7 +++++++ .../data_sets/ecommerce/saved_objects.ts | 2 +- .../sample_data_ecommerce/manifest.json | 2 +- .../ml/datafeed_high_sum_total_sales.json | 2 +- .../modules/sample_data_weblogs/manifest.json | 2 +- .../ml/datafeed_low_request_rate.json | 2 +- .../ml/datafeed_response_code_rates.json | 2 +- .../ml/datafeed_url_scanning.json | 2 +- 9 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/ecommerce.json.gz b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/ecommerce.json.gz index b1a5dff7b2b5f402f1c468f4ea9e6376706ad08a..d47426df12ddfcd36f0ae33a122c91268d2941db 100644 GIT binary patch literal 819503 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

h|u;sPJ(0JL7j9(d=j( zf7dBUq)X6R@2uaQcat^zNtPHcqvJilK>S!t{m1xFz@19b@)}v41MZSMp+{vNnUr_7XX4(ZEj^Vzr9gK{ zk)ekJ(c7G+@L9U$NnCcDDrIXI(0h+Zv{YVv7FkLAn>)F0%*W9#o{WwMjsBK=HUhhg z*)fxQN&hU%c?&+c)nP3G`vNaK?~fYX{n-acS#)TeL~hx#P$Sc-!TKQz|XP!Gz-}Tmg^P z(v_z@TkePsk`z&N#Q?G&`OU-4>i1pb#vb~jp~;w7@hq!?oq4r`pI4Y4U5`p;kj*uz z;d%Av_4-XQzU_^U&;z=|^)VSGeyV=d9;p zdH3I3yZBv)(Ws5CFyqjlRy>8f79K`nr}q>OdhPr(9DN^;t@3pv=7%g@yL=xF1YU}@1wO(l7i$j^GwD=YLW#tl zHMg|m6REFfT3pf;uJz-+LVIxcvNS_O@iNh5hjni`;t$J;$_U+pkeYL}Y9VyBuM9$}dOlNkEixPPmE z(dgdG{f#bLZ8EqI7S>20fgB`nC($|k_8x$;(};s=$qJx&w>jJYyaK4z8JLqyNcQIR zQp@gY?G}gdl3^x_R=U>3VLv|@bg^^}QC%Q2%EPQH$3~@3A2IA|x)D`-w=pA-Y32A% z=rtedAVPXYxLQ_iVaqwVz=Oav(=4HQ<(C2LQ8FDj zxRY+gS{TG0fbaobAJF8Nu1CQoT^V-vz~ayvUy@>P^m;9^XT{Vv{2yDwN_1`i=W(%} zwno|vfIQ71+NekUtB^cK=3i8Md>#mAL(=<5p)pk`s~~Pdg^7%5n6i#4l_&rSLIv?y zcxMz?@>NuI1bRMO1wo*=MuUV%=a^PLAHy56uShyV!yF>E9uc$E!*l}dEry1!8MOOE zpl@l-2IPVeBS#ewk(mX?CHh6JzhAr=1X|lmTYWC$C7;8SXU<7z5l-^EqL(? zVg3Dyt}*0)vq8a$Kn?!HZAHc=9~#|xc#e@JEMXUY5r;Lr7@^v_*W<#Mly%J*C96&H zPn`p8Tv3so*T+bS;@~g|Uv2`mc8&j9TB2PS5E5UXvH{WmWdc>LTD;z$^;Hk}bZ6$g-Ly9H=hRZBXh_!%lTK9Q zyR)<7;yA2as+IN>_$TK^NsWAYtQvIizi%M0IEfE>pR(3`17NY7tW9CTF`^0KunhcLB2a3`6`!EL<8#}RF z1H}Em;+)cQL&kIi)D`C-;u5l*X|g~Uk7qDVl&|?N;r-5xnChWw_>I+osw!{nU_*@h zP#aVEjNIZbmX3+QXOD$M_+<0Dw^roc-+M){!j7%}8w$#OkAklgib9!+_NJEP-HnT9 z6EQsf+iKt>qQwZEPq~@@+(k0!8Qm%m=>D-FIA%!=e$0A49!%-c*FpLaa)tC(q(7jH zDmKJGcvlRJmonr_jW&P(zU{+A<9YPqG;IYx461+~(Wm9TmSm+fyUBzd8#kIzh%r@9 z|0a7@q4FUpptDmAg1|F$c~w#!Ir~d)^r~T;Yxqh=a^Kxs#k*SG9%tihfUyw=^TSaIMRtgDCeJy9l55H~0 ztGHd05Gh77^3?k&nY&=yx~PgRE7zIDSHS#tf8gzUagAWaBCa#=8DXlb`Rie;8oQb2 zI^y($-%%y*hK2XM=8V@T#ri##C@bxG#*ytV_y<;{wqN^e`GuECl*VbD_C%5Rju5_S z?k2v+w-ffMB)FO1mGkXY!!B#Cg6K&x+k%r=Qxvj&Dj&ObWq-lta@cAVmdMS3JLY%; zLTS$KQyn1PMqU5_?#KeHwF+Z(j(D(mp&0WTQ$M@j9+pwr*Pdb%8L=}Qul0#D2v#$y zmk>-73m}d+;dr3C!PTlH2C+)}rD`QO|EzV6Ygm1JsLu@jBwi%d@gPFu<_aYUz5n{B z_U}otKA`u9tmcr+l8zbZ@)YwpxItBYlo{I_)+dm2OMiPL`1}TzExBpEYVRza%Yr?O zk+LMVJ{%mth>BB<;09B|4y!#F2V!6*rfKdyY_B zIK7a^3Z3E?)X7smA(RC^tGn;k4Jp(^#_(hITN(h@Zty)`!fu^V*=;N6-hbYLQmRS`|Q@al=?C$&iO#I76rGw zr0|zAh-J)Xy#pNja`WcaB%`@5^1}Vuv|7f1EnXMm(YOG__U~XjEoIE)eUXY1@Z)|j zRh8l0c^d}rdqnx>C5tEZeEt0I*-Fde+1k9Tm*@#1l29;cL+->r2S#hn=Br?`@g|RF zjheE#uJ_g3rKXVj${Yunop`M`x-IVF7tqa)cl3aZ6UQeg@-z+)n=OuNA%ta#JH-w-CSuuLSP`98CTJxpf}6B`>skD*y(&B3JM z7`ke+fa#OpZJjOdvj{-e4YWnaO5@M89)(`f%#%9AW2%V&ow>>K>p3`VmNVU0DS*7( z=&7^2=^^=dsmnEN4oJOa6@2M!MM_DN00kxI@z^}h!N&~rcBmAhC%arq5l{+mlvKu0$h!j?UcyOSxbS%FISe0x&qb`I%~L7 zGf?_dkL^Q@v>;RAilkY8+HHG`2H;6u67Qd3FzzazAFIQauX|V?FQLlkycMN8h`*|i zT*&qR>>UXeURu=4JcA9EHi3sJXy0oLvj7&y|DK!EU}h@VDi}opBT_LLWHqD*4=f4A zJp7tb^9~}W6GFQ8o~dbjfp3TAY}pGM|HIWgM(5du-P%zbyD^)jL1Wu)Y}>Y)q_J(= zwr$&1V>=D^mFIoO_wBKN=3hqcJ8P|To^u`(BrzK^0Xje~MHe$+stV}NF^ulB=T-We(rRt607vfN7#9`Y&6!J*YOa? zYi9Nx=6?8zFiEN&YJ-`xRPGxp|DE;pkPikNfW_v-u{F6|h5#J`X@8%H*yCb1f{ONX zQT;tF^yX#euvVRSDTy=jM|&tL2*%zy>J`a;NRmu6fUWjqf8HLXW59sXho~hAyY^_w zv`+VtzrFG_TuvT*+0aMTGq#stCW}%YS7TQ%^fu1#5R9bfOdBVS3ENli;?%HYFtC45XXzH}9eM=kfYi*1 zYxvXe?E8=t2Rpb8Y>$gf_#%HSFoN8G0W~q@YdbYG1O&a)e^#|jA~0G8$VUfNTT^dM zwI-T?@tgD!6S5xmwMg?ABNpyAOOz;?dX*p9E*!cbbul0<2YdfhjC1t>#c(&75h;p7 zBZ*%trXqf8GWJq!R5jin6E_btsw_{_TfU0HUc1yKK=^yXJwpXxPe{rRcytt|VWZ%^ z03@SI?$@1X*n$k{7Lc?my?zgP!9xputI(BBJ>?R#fNn+$^8A%T`AFv4wxzw<8bUq8 z@M$>l7$fHgkhjwcbIpFMq=}>!U`O{Q-fh)v^U~|~8l-RcTYI|s90qQiBQ112S=#cx z{MO0J$=R%jvKRc%@2lzeWXj7T^oR=w=_cf2w6lllzu0;ij6JAK1?7qXcvY3-swJs% z@I1E!fcgR_Bo+8`hGZZuiQdcHsR*pUWIaY=?F1@H%D)(ig;J4I^_IKbMRzBG>rY5; z-QHSk=;NdHt5S*JPw2Ow6B<_+{L5#5A~P}to&#rcU2ISBq%iy<=hbIhsHT<|z*s}s z?96)_Q|CY${umJTUgkT-y@FF!$e7t08Amzt1D78?$Yj2m)YcGa8at`M&*J=jMrNfC zoMpKxh6wf0A`V-g#OeAJxSncm)P6O9+Zt6(zGyJjls&wW{C&zE25;1|vlGY)O&Et% ztWbq4S~_>h<=V{F!<|!crc^G;#2W!Y!YoS0TDn_)kmz}H%(F_q7kj;60HLkPl|L|U zA`{Mr;_ItG<7zGujAvg;x|d?mCf_TJAgbf@4}RfqzvI_xBS3*u(X-OlcuC+GB=v|q z&=pMoIdmJKgg67gwJ$(cQ-dQCdd!lJ#A+!2DGK85l zO7&0wRloZ8a`#a%y2XyoEjS*NMF zP$3B-Ha9#8;g?xYX~=&<*RwVtH8*V8i2rc6+}t9d zYSSvWXV*Bb-a>3W7Q znSF+uY_Bu7$CH^}2ICZi)QUSsgstI45$ZN(L4wgLM?3&`p%}?-LwJ&UG87l6WL>XB z#P{@z2aLCeD4D#h54%ccRY*@ap0uQh?tZV%Tmz3AL95nrhNTuS?P?%fwQldyBF;P+ zf*zr64RDF|Ihi#)jFZ-SJ|c^v4SGkR_4b$T#||G`21sjB3^c4;JTa{S5=zO^hlSsV z;Pj++<#f8@oQ-x~s-Y*)*${s+{za2BpT*&K8GB^_=d*0Zd0}u0Z3L9(jsM!!Bp9~# z8`)d47|eWCA?X_fxP2PMc*BEF_DD!2sqQCKLCIPx(ItLu$)2YQ2XwW<1i9KIu#dT3 zr#MMS7=$@{QcxR;4T=3-8*JWaD2zRp_b#>LT=Rbk^u7Sxu&rFxtF+=j78(MPVYmO)ntBIkdts7 zBoYXhsa`vU1UkrAx_eVxNu6jsAdKKlM)xa>L_$!{1RJoa3;N%WP!*(7sh1S4Q!Ima zGme+r7yFp7)%qS7DyKBuq>X$dqw*fqaWmrb#(4OW&ZVSM+;gptIo%QP70k82LTYsr z(>CX_4kz`UHA-^D#aV&fnYZpWJuJ_EZ;l0v62(G+k53_$OtE8Ji=WjkGvD@ZAz4Nu z6~XO_NfVf+fc~dJB;`k4+|zsg29jLf(0mB{0-=a~~ zWF!96H`-j4>f7tc428}caA)`oE{Z0{|7B|mg$DlV3U&0f9#%FiYh1D4xHN3~nE^kG z?x_S*4jz<9v|ZEwPa+j)T)oV6E$wxihS0F*Q<~FmQba+m){PK$O=pJn2f+ePncTl*(nZ^$ElhzR@aK77TDn zpdrixa@{-VETV4pD!v|D_9*}3F`f6mUA!uh+E>wJi{uCg4_`ZC2EbD_%%Kzp`KGa{ z$U&$j8qtEVh?asv&h}O*HiC&8Y=Now{Yd&pVJ0RUt;Dz|to#v_`JA=mo%~^e4gFn$ zRzCrrt9CFX?^Mz0m`2n)C(12I8^t(rIX_}0>*F&iNC@w17!qf98)i? z!_*X0%pNbl8x>B}5d=d9f!J}*mA2%A6PW7NlG6QT|a^;1^c*yGP5 zfnzx6Am>HqtrPTH@_z6!TsdT`NYe(nVwSwyoy+7IIrF5GgXfR)l#DEV+EFZXJ>|Me z&l0bPZN0IPTJtJt3ucS7puDNM(q6qnIR%0H@%u{XI%15##yv=f5|#H=YmRSooz&JG z42?zb^V<7t31TMswAQxeY=L+CNk0t?gLB=0;q)~@A#JWhze$Z)vEpGNxf{`MY_M6f zX5mY5y&-^^^{2#FtM!LSSQZ-tluY$=O-Bu7T#0ZyBKpCXkedG<)6Bok&4LtWR(EJv z)NkE4d(o{jMMZi3vPHSEa8O2YUzIwNDjGO_ltyc1J_0RMN}feF(qlFLBPU8N%q zrHq9i25EnhAy3An$i12MLq$n|woKQ?UNwRO17XQ)5Cc-a#3+v5n--cTkFtp37O}3_dxor`En-R9tjej?WKZb)llt5giLa##&P% z!ztw!k=W-}r1~b{gNE79ZYG6(SQE{eGX;Rt)6y?GFQS0^0$a^C1^6+sue6tz?bFo8 z9Vd}T>JlBu3XGNxcZXOjnI!}fe==y46=*$7NBe)!wd=QlS0@ z`mp`p;f;no8Bngdqnw4LsGbjesk1$th5j0pWqX$o`MHm8X{^#SvYqlAVC1J!_o{FcKl&%fOtjVqJuh~gRnKg}%M4RUzcC*y z+KYQPozBr1dUI*61^AP1FQ?_D3D)FaQMMR(TsXr{m^|iL%*}nNGhw#1b=juEGFO`*G=4->l!mM5RY?5WLJlFNYYtqL3rQj+eRZ!~;!am9>xr98 zR77<&qOi+Y+sr7WFc+-{a^^+f5c+Ff%VDDp%#YDO#ay=%3jeu{6uP%Is*s-^PlF&V z?Iz1(xrV=5iP*(*7}$`)b~l;I2UC<3ft;&cM!d1>WsBcwfK@u&DS@%j2c2M}9gFq} z`c^SY*q34jp}ymEYo_D16!mxi{&_$6iK)8#EY`Ww^tfc^Pqmz*quI8RHCzt9KSM(x zeBwT`dC%rqeQGppEj;w!Y%MWqBwHpas+yie9A4=G5hjeZ;9qUSQs9a|p}Err(;b5- z{_GYto>QxBTf4DFZ}`igsmjAozO=f@3^g&1DH1qY-V9qxNcy8mp8-M`eXcUzOOGe< z=DO?hd(pqnHY4(SoN@q%zAU_;L8T{!O zbp;_LP{2gj2DjU#wxA!DH&w5mIk6Y;|x8ug4ty=XAx>5zNJS-C#7iUlhGiM^JXXvuG@^g^$v?AC+=vWdxPQ& z%Z8*gl{Yy^;ok;G>Wn;Ce78Yn=gJ?Fv<7M#~7+)&UMjB$vy}?Jg zo2O!p=C$`S{)Q4Y8o%1AQ8$d!B&x`y378p*JrqtH9pz6_ZtW5?D=SYQVFK^6Zu&q# zPR3a$JNb+M?y&fC4B;M*bE)4B27sRlBCV%MVJNpV&x(&rjf9|aObci98`@;IzE1>6 zlD7{)4!F;P;^TT2V1B7a`;QJBPt<#fk7C-u(4D2xTx4eEOv-)Q57k`JcY7GA#S@N! z#S_Zs{O>QolhDM^#^GRU8ihRyrK+0yxA%ObEMcz2!^2brUnAK<$gqEPh}>4wZZ0ob z7#XceM2(5-N$?IC<&)sEpSlYtXN0=}*kg^8I7={$lg zIUBAgf5F8}lB{A_pR{brp<;30qoT4(U7Gz2hGM9&76r0X!CU2Nq14e)`efV2F5#EN z#I^3(8vpsmoK#Kb#9ymh2oFQ52BXfH^0wv^`bE&Jb)J!!VvUSQAaY__;C9 zp#h&jXFdt>8die>Y{*Bka{L0NkoQ-)kASGpxMJV&*U%m50T7kyX#C1-I$4cpJ_b2$ zZ*6FwMVN9RzpCAeq}RNG!6Y7WlN%Fw19^LLzy!u($$6O5e6vhL7C*kjSBr&@)0luu zW=J|33|kD)o?l`W0;}doAI%u4Y+Q>qtDL)SZNSyEv-WNMfBYUuR;Uzt`=1hEOV-3D z*LL$noW3;eAjm=O76EDazd00c1$g)lgjtF1lIamCO0s+khWwrvy^>CyR8%C!LSk@U zn|5$G=(%~m901feEZ!g)I?SNi6Y~P|qCEh^qfe$N*(Nz+|8`l}xCiyPzU?F{HL^a6 z2k~4AMmuMJ`u*8Rg#EYnL{*0cSQ9zltp&6DOp9P57Cdg-_JCXNxITxYjqM=Ah~-9& znwa-#U33T@tq9c& z)1Ag4FOmsn`1g6A{36x*9;I+@-GhAK2PC;zG8Sq-8`&0CnpQg0u-Vi%PLeTiME7$c zDsU#?5r^~Kp~GF;zkmrVnpyWECvvG62vbQc{|a;e4MQt2#&_AJK}#TV`gYC@`_%pl z!f>9*!enf$ zP3!o$gI>%Dar@-~I{un1U>CQjc*YyVOwCFTaAmv?_Ou&Zo% z7R)cq4Lx8;3WAL9iv2fFTTZ@G_PQl{o7nmnj)lBoX!uxdQ|iNn)8L5=#}f=6qoz2% z)#l3rp84M~s7?_P*#JuG%K{$9*&k&e!9Xd$nHjzejP?OxSSGstW2>wH&fljIE(Q*F zlX6erZZj4_+B@SOqZV2AsJao=MzE}j>LABVi)8XsuTz(O|eNiwM+g|TV;?Euovg=2Fb zybD6N)ks2CH)_bwx~weSkUOZu?pnJ&cB8LeK>;hz%M9*UH_)3W0Ktz)PqW-cL1iQh z8e*)DM6(Htne;G!HzasLGqYuETn6(6uHRJ+L#bJy&{Rgc$H%pwe(~pLokmQN==xsW zLNi2_OsI*{>$Fw#)iML|HdGyzJyl4~y}B~6xK=x#w&EBD>tQLlegGh%J~nFGhek|K z|IEw8tyuQqzHBiBOW;WAmiK^wMVoTxw7J!T_)uGEw4&EORH1cG{OXG7hKtqyS1h?aWHQDjpnpMc3izLQuZ(I6M&?@ zUuM}leo^@Aps>&0Z*mzAH%fMltN+M18vnf2Y!rnJsc(BhMhxdGF(oj8mH%PzY%NsU z1`>faW|v3&DG&lftUCKZDxsUW4gz1TUMm0@DUTDq zs8^lBR0DU}R&aoWn$qV(-teg+(4uCKiI(WC7sk}D4vd0kOI{xwye8`0th;3peX7&^ z|KKKT?4)ht-*LM-JA8stMon$a#`RS_PCBhMg&3Ucj!h z4^vSjBdw!iUEzMM38cSRzaMezAe90NL*7_4st$Q{!>c>K)zN?c&f@{!uUrw9o~Kka z&S3T&*@e+GRaJTrX^WmH%LHIF)pAhh8TJ7D1LI?D==(Q^To|~|n=2EhY{>Qnf*GcZ zy!ttm@Prbqq6*g*+JF=@Q}Q$|MTqn00BS6Mr`i^H@R}2aS#ktmgSiV=`ZoiA3h$U2H%XWM3R$sHhP+qXE-G1YEVMlceD>|2}?)Ij@gJ4l=K=+%|bmIl#-?z zd*6hQ`sIfz|Ms1SQp%_Ctwp#ul2E$>LM&g4sCUUAbPb~g@%No2i!;LPIH_cPXFA?7 z(xGxOY1No^8{t%1%P?-m_*m7@`?jDRXG5*BG1hQ2G%U1veI70!{ydy$c$VTYXuEz_ zhAattlKVpeA@cC^lIGn2bE5kX4oEV|LYTc@%YN7oGtIpz{RQ#mc| zO=Ue;+SZ1IzTi?Z*9)qjlZK#>@|t#472)hyG2YpLV*h1ehP_iRuijTlIk@-NR3g*X zHhL12MlUrqEk5V48Adu)?>KTOA z5GrE)*Ns_B6Ta}|?60NOtks986ZiwME+z%7<+i(KSb+^muO;ZGX6&gaYcFv3qA%K1 z+ZmFTT^uk_8OI2X6U8jn0R6bTb7hN{77a}0wL~t2#_F1HDG7-GUmMXV&_+aH^jdf9 z(VESfuycI0bnLtSLuOvBSWfKkPweBf7${xUzFm-jp{}K+)e0#_ogD?oomF=Q^;g9% z`=8Af$ppGq=`~kIzAiuGRG-vfM5AkVJkn7{=(a~7j&5djFpD^!PX_{Mb{-C@Dala4 zS{ijMb_$V`il7)eb%I**57hZh0r*W0^~J%Q7PD84M?178>x?zF1u&QKAd3v$*~yBS zyiobhte7vdw#e}inmEf(SR0=*v%7bBUTpCXl9%nx@E_)pfH`}UmM^yWD7rk@3B?JIIX2b_W7j;t70Y=qx*_a7eubbJ2#?$K7j$r(IB3aBR z_m|Y+_&%R}zK+5>gaT^;8|~|wzm7@V_d&( zn9P4BeePLr0HtEmlVsrjqt{1lwBsK;o=Jb}Y(zesTFj4zwY$Xxw8iW3;7F6F+u%1p ztslA*Lf^(ajuj5fKp}S(`;+@Npgz5h#kar4OpFF|Xc8?d+EmVsCinNxU_jEbc|@)T zqrlH3Ow11CETx12yy4iCr%o%b0~nJNF*m?;3Rnh(^cQD2=M}UOK4m?U3`Fw#?ip0A zN67(Ga=Y2IEOsBH-sqXno9NkoQQ1VR07E=IhXp|U19xYfAZE5Lr`&Zd#;zz-B9>OkN41jgg_kUKTQcz9$#6JWTEh(^mIJK!=G^S6q ziI{bJI4y;+1=q77XiaZDjLiY_x!;vq^{sDuGlss8U;65oh?gOy`IK4jh>(j+e1O9E zct--5%YRR4Nn?dncgDm6dG&l}PbZ+w(3$`0WmU<>#;V7KOuh^?W-}c})_GHp|z zyk$3HMY+9(KwF2a>heEXh`Ph2jQ}%a;^Hz%y8>w*4C!wnAKO&wu>GI*(kf?daE9mn zf9ll6bohZ7D4K0u0a%GhC*(cYw+ubPwPZ_C&ranHF5=_t`akI;YT+We3qC$!+#{l2 z^l^)>Hgf&`;MXhoN(2^>R!fIK02`NF$6uC4pWx84x&8l@=Qrv@SLkN$=@91IrWE$c z8A&k#J6>(ByidchclL6Y3VW8!QeM!|OVE4f7F2g@-{}*0XU)2a@m6_>)U;989|L;Y zVj)3A!<3G87n5#R$uS&D;2Hkwr2U*)THdpk{T$9ZE8xYq0rJ|H_{j^(r{Apga_lAz z5e%ArZK;FI7Sxt|S>;&bZAMg<%=YdW+_8+g7Q_%tHiNOyfT7(%+-tE~KK%hKXetu% zsB7HbC0Zvjd5VQUB7TY^-~X2?<|M#rsiMQ&acS~1V^k`nc40k(*M`EtNHu)PTv-q0 zdbC|{K&IG+s$j7H=>{qfBtInJ=@qt&1C^}Ehy~2-KGgUp6~Lr%Mqo<6MOK$*%Az9yqy4?r>{o5BonQA%sjCsoa#w>c#l3e>@ zoUyL!nsc44>c>FVJzKM`3xr>A?m)1qjw%b()q$ndtT_fAXW~z=-fhqzL?(BXLqltz zyHqn2GY)bJOyYHQTpNA)6JR7=hTUIvMZk7sY#ZbP{%mOLFt9;PooG&)3Jx8$fddv+ zQ~hfc&|zi8(v5uo&b;k;aJOkrCMgkX4`PF3&0q~bSNKRd%*=>pG<6KfjsA#F9N)g! zK}@=8v%ukUD_@i#kfr+_obRI0Pl3|B))M{7+krf_xQN~Y@c@(G&Eyn85Y=bbd)>!vbjsXPo3)Ik>Awp`IJ`@{Q#Zy;qLH2$DwO^ z4{{a`g1Oc~@k{L=dL^E`>K`oEbd0NiA;i-4NcP5k4|@ZkVMDPFQO+rn04HUt>PpnX+=(q@m4>3Zd9l z*97uuvmC%(5*&-)x?jEuuqQ61Ai zbg2*wdm`q5l33%(%$G2Ch{kZv5&^Z%;4b=nD4yze9xvfE3=Wx#Lfl~N{fo&FptNn= zmw0yVPvo{+n)Xlc)59~)%m`#Wwhi#j?nzkT>pT6)*J@c-)-g0!i%~W z@kBAUXZ2GS5MMh4{Z4?+Ccv?AEjZ!!>a)KF;?E}2_mCInHb?#4n-^0V) zUb5^9bYxI&oNrz4ZtWW$e!YtGySf96DHJam=76Ck+bYW4^P@j*AH34U#OYZM{Q85% z<>cdpJAZntS?5>F0((8x{bAqCQi+Elt_{b78|41$dqCSDYQG?_%ffCUii>=5P#<98 z1!dDlorD-NWWOH8bPU#Mv5unvENbuQQSF!9zWt8loxlbFYJh%!!0!beEZIw-}2Ow znlmWCgAdg=gDOG1U zq|pN5PCX}{5@e*dq85pfDo>2S z1)lW}`i;Pj%EIoMmWTwa&Pvwz>@SqzzZJxH@MB9B(#WB z!ANL-Xe+pRv~{f38RfJIHz$Es8#chBq`c#PIf1MdKx-_2&?D0Jt0mna+T`*97dLe` z6sMpxYNiL(=W@vB#z*ad$%y2j8ch(2r>vP2Wm(Uv-xNPS4Xx=q}tRWC-q_7X#oP;FP*B( zrhRh=EZjG+F8k}_z5%rTyJOM3tWg`D&CFbuTL9wia6cMWwny1KH#cNKI=MQy;%lE` z`<8~BcU&&Uh_mR%2b-9r#c&%{=`4N#ydjki=R6Xkuy%GqKT9H_O8eNP0_x9?6K(U) zynED^juQnKFdk_p6o3(y!)|faGG9Tg%1#Y($MWqm$~a}>i1&F;{f~R19NWBNw_(^) zkz)1y2r@=MtSw>5_oy0l>4Wj6*ja!vgmxYhN1rcw*Gf!I21BMyW692QUfk&8s)JQ(tCivBoG2 ztZj1p)a?T)K%C}Z)ej?w3KAd9_YZB+uyHk&Egl@KHB=>?-isi-0GT@_%!W$bGBUp zSc)FkG|p)@i&l&p(s`}nD-9IbC@0y;dIppVVXRNvV8uq9jv9(<74rk~NDZivf#uQO zu-6>9CY!oJg;;B%X6?y!xk2fnRLT zyY`~IiQlT90NSf8z;TNII)1Top{TBnc}E}UAqhh8Xcv_RWFgi3tzw`zP&+-*H&Hq( z(N5NmU!afP-feRP)3I70T!5R2pEvy+Y0 zs`UXqK`h%Z`Sz3{kIa&ZW(cORWNxv}|R;X$SHfdv{(3q_Z*%&}mJVT1*UpHR z!|~crSQGzH+f2&$0c?C-Rf|e)0Z|w^*Ao1y7=Lq-ZtYEqIWrfNzA{Iz!iSGv?H?a7 zPFSrR2~LRqETD_REb*-c&ZgCyl#(IVo`v;f5c>CDWfOamv(M*lR5x>H=AbPTampwM zO7x7}wZ>}l&CV?)T!6@4kUK)t6w&@!NU^Z-OP3*?-|R@*YwcEIU4M>JkYL^FTggOc zx>wH`?3Oyl%2d#sK?4m2Mw9~+{G!f$`^)tuE#iU3-~3oz9%1RA3HN9)9K~J7EOxQ+ zCzn_}`t{I!as7>C1}@3#S|YVo{@I!a2})>4dFSiYD9S6E2%sR9aD*~1%C>dQr_Ih| zP0I|q(F=a7YiETbLwx^dQ9K%8<&(DC>f~REiU?<7uQ9r-o(Eksb%Ol}@}9=3_Q}(7 zF>CLmR+d|#H5&O-Laz&MR%by6 zZ6d*sP^uzB@!G8LBpEZdse;q(2o!-{G)aA6lKDDiM#4%OS5#pEOa`o+Z$2GU86Xv~rHZCM!Y8(g$SEDawjC?E@KvxQC8 z^Y{4l$0Mu%Ys_V28bIF=G0*tA(p^FP*^Y((lcz=%6Kkfoy@4atsAs)8z#d!~@q0WiB7({3bUSYZKxM{gT`hdRYG~@ni#UkOoO*c}Oj|z>x#R+`3xRk6ue8 zl%rhss7Cs?x9Cx+|K9CCoACSET;(qhzCwCBH7(c~BP)~bVu8qgs~W!Cm;76DqaHMX z>Q|Sp>%F5L@JD!`o!^>I*{~&Jl3*#RNnQUjmC*>TrhCgH1*nt}Ab^c84h|%FPSUb% z9h%&$&0Xz%U5#{q^rtE-Ky)<^ zfU3Y~nW-9V#?rN6z-UY2R-lc<;}SnjJGQTs;aLJ1%i&DizW=1FgfThS%UqOFE6{_i z=rl4!(O{@gTvdN1Vb)1iWxZ37#so{%!UW`NvWlY%tNob@Uo249mVCOqU6qjgQI}!%rNjcl{1Ob(FA1$^we)uf7_NY;mk?WnP%Qy`2>k;n@X*|SB%slt5=Ph|vF6%uCOUoSu@EgwRg^jiF`X~7Qe zI_$M2>A4idtrzxT5c*r6Bu^cP*4M>GqXA5`Ns^IM$35s~T4l|nRT~Oh>6S-`M)>cA z+>g>6C9B4Lllp&b?vw8KNk<<4i)!JJ&)itjl9zU?0ZMeBzK&Z$()CeIhP=a4j;?n1 z&6FH$ETk`AhXm5a*YsG!sAW0m9dUN9ub-fHt2S;Oybw(0@5MZ*1AFBlP}byBChLFVH4KYTPZ8S_YUi`0Y1<+Vmxq-Iz)2$zk3_= zp_6POR?&$Vl_lVSGrblF$F(wS>d@Gr?;COT&3YsNeNAv-Kj=wwe+<&Fj5_cY@UEO2 zD_DkC-mWi4u)!{_!}kIZQGMk|p6CcYK;nAi&?+zFQMeDShJ6bYC>KydRh^9T3UYrt zy=FP>Zg3Y?gG|J*v5?l5J~s)Sh_ackjIh&i7*R3np5n52=DjP3)fJ7)>DCy>p@ zai|L6>35ePsH{mZnx4G-792wV$&e~lZOmtiSa*t!8e^>CeO(1&+I<^W0*Elu zpDBSS?km^)nHs48{kq4y|Eo*I(8u#uRdi#YHL6-rzD%#}(SIeZ2v`UubS_v^uan}Q zM)BnvhW8{;=Qt7m?cqASkPDkw2SY*&>&rbOpeO{F`gY8LwWMN}5lAI*S&?WwnZ z)C?fUTsXS9HL+AjE`Rek(UT&x4DCENX^SeK9W8_^^Nun1(stINFLVZ^wECtv67uNUi@x{%s`-}zxMuNiQ`c5cc;R=I#;<<5Y^CE-1E-rAJ0H{C3B z&pMX{#6KcgObm!M1uTqKKAmJ5KMw#|GvN6W0!Gk})aVbjjR z1~4bI2-ZW#hyyS9o8<`NWj5kG8DgMXsO#T40|~-4SGJWiWAO`>aO)7oH*hHeEQt=to_DyOq@&{2grAQ zvz>LAK{y_iKD+#NRQ(mU@6^G@pRrV+f-tRZC!~>39rdkIb3I)7w&b0wlBF%XHCSF% zARHN*{vmYjf{`L!1-lrK&w?k4wrRx#!SsPLV|0zCZJntZ+A{l@Gibz$f2=yE=xxQR zT}Ib1A2qH??don)wb4j}K$omO=2q{$w)ZoMrX2!z;#qJWHMmYy?VXsdG?l_ zldzVz^+*ngPV*(ET2(X<{>#8>&nR>*VU4#%Sbz0-%i!idgHgHFFsW;wec(%9dyQ(e zjw2$9e$X7M%<*RIp-DFoKVCxD^UK4s`gKK2qhpwd;xdFh^n!y?00< zb#-Z>U9pnDMm6u$;(^qCq*8WV%{jIY8M9bc z_@&~ENjSzR=3 zHr(1xLyNwXyX)zV#Yzaedcf~n+dB<6FZznb$%6nn5S?LRpND-Hpy8~&lQq_7=Xq?T z;UyR+SwK~#7?(7ySK*+OFc!_05HzGMc9wv>rU4%q#zMIg6r-j#>R%CrH=wdTUTuh> zdcJ)l`}XbipG84O=(v-VPi%=V@pP)8Aqd!~)PnwP7kWOWiaosETvQj^Zn*QGK-01a z{E9{|3UZZZmt39=?Z^JwqZ0?MPm90!3KxEcsr%tv!gz7z-%Vj3(*0V}tEb*|PD8b% zQyTqSqZ;Dxk+I=)%mG$+JlSX~ULbzgU{eKm8fvIgjqFJ7dkukf#HBRdNdTs{Y^Zhp z0z2K_PH8d*#nyGrjz?4VPxEZcZX}x?@bwYZk!@+q7NRdakBEr_)-CDMwuaTXaq`k) z6qksrtXu2oUQm6#D6pY_FZ7ztTGlD%n`#;CvwB7kYk{YSO8IOT*{|Xokfmqetv0fu z`m(}Elt`R!%LW42@jEZU9g5$Qxa=ynZ-MT@gQHXON2`8)&1h)!2_PQ%H%<5Wrez7N zF;#088r>37)xWd(O%tODlQA}@YULJ9EZmoA>K-4^=61%t_BQ{kh7=o2PX-5p@a)z7uAjJjv zgG1}JdtaAmQFf!s8iSujI`PjN-+XL5s zZSGiRy|7Dm*9!r4PiSdmI_jm(L~G0@(^Z|Kr6*=gX0R6@7X#$cC3BwJ-xTaahyY4K zm`5Fck12OSq-n0i3{3UB)+}tOte89zRC(CxVZajg8q-r83s=vW9EXu;Uk!E~(B!qd z%=;KU2b1V=x+Gt359>osygw@})T*#Sw5%LYar~-YUtY}`h|&g5it>O?23|hQ(uHOh zxnbL}Z@~b%>|)(7LoC!mIr+hpe;GQbyqmVK?;9_tT=jZ~MMBZ9?wTsGFUt&|xgLs$ zgJ;@HrN|ia7H$)S0}EV#xm<>bQ5g89Xa~dct)wl7{|R)@EGgih zo`%`|0y+OLnxn$-MUQELVo?nYOV91?ilt^V?M^^RlHK5-$k;?F)cPruflv(=psP|B zLn6&L{#+a+fgcpG2D;T~bjaMY~L4DOn2;x<;?Ws2S{wW)WFfGM-J=P;O6o|Z?y?}Wjo zv@Y?X#6Yt>D1ny*m;j%Bn>0McY|Q0ajQACa=iUSm?DVBWM~5;%w&H#h8T(q;Qp*~B z@N5DUoa3DDKooo_M{V3)FZuRVu7Dfp3IPk~k1Zm5M01GrBKA+>L8B545NW~hH z1`?x6HPlR#FSuezdw$B2rA3;O-uOCi^ZO1>ybb9Ui%Da%LbQl;P7Ud-y-B*&yC5>% z4s<_^Djn|IWl5fSq z@69@o-Ad%|E3C256N_=o8+xTz`QrZWu3e-W5`?Jz<6cZ!P>@x{hpjtr2ev2S`3S&s z$S+4%aETZH>3gh$YAW-KP&O?dw%N_A@8>SLcoZgb54qkJwOe*bt70zsX>$O@H(asZ z0dQOS0t0@Io>WSJ{s#;~wb%r{%gHG=1bOM4gbo$!uV`RAa>UG%J06G zHEP}n4F32X3N;7ynp9w<%DG>8P1Ki^@~IgRMY|HVN+VzolYiwA5u6puIv9#^W!lg@ znB&)_WWI_OiUNOB8EY2n3-H4Mn~eCsli;!Cy0-rR#(EjfD?Wo)9!e@nb9f6*rCv$< zrCU%}rD;DpIG)GNe?Cr&7*qKXm(%18va^qw3k|Tm4CsfR2z}5jB^hmy;JcC6UV}9y z-?ei7U~Rpv>WUw5IoV`4dYBPv>%pqqq}CIRZ1Y%&Xj!smd>`rvlguPL5kpsRE?&_s zsdb8}actgj8cj1hov?u#Urw0b%MnT};fVY1;clYN3!MhNf zUo4cgTmC0#qQ3Di-`e*&IB=+QTD37@P)HPiSH}mrM$rB|@er!?3GLy-h`tJQ&m*4U z1B*3%xZ4F@FeDgWs%Xo+{i8+tr;vj*W!%|tY493VXY3*Xt$GmH@aVM{paJ>`g8Cou-7Kk7R8 zw3o{J`x`V$ZY}L<@k#Jq-CpCx8As;rBh=E!Uq#gi360w6ha;pLQqq7`&3J@vo2d{9 zIp5g-MgHhLy$p;)^m0IKJBR$H-R|AnPD&ykO?L<_ZsT2@1o`8|e4RPm=dBFnyR>R% zulgbH^15dZ*Uv%UYurdetHdbAUWc!Zz+tCjwP@sAl>wKC`p7E&b?O(sc|d)Smy3)d zx~;!a*A0E$=x129sBUQGcYUSgLWw|kq#&d21jc9UF}QIJ`w1k~a?Uoz)R_50S9}kk z&CBeYGke-MvS=bN7JA7Hum2yO-hv^jwr$&{Te@3Hy1P{x1nHq;=(SXD-pDiV_`R?UGvTl`NXc|VI z%{^sb1z@NoZVq`%nebV2K#L>{y1bwX5_zurUeDY939n(&`m~ySR*y6u!Dn?{yRI1k>H$V z&^{#WNMpxo)@7~I87w(G&lS#V2aP5+#n!nJj|u~K@cjWjW!pLKvJx~^V8l~Qum*ND zP}bY1jArtw)je@XoCcxIf}($c&`7p1O1=xM;A;G?I?S;w0*gA|gzPDE&611F>(pYU z*{48S0+qMiBur3qy*3XB2kF9H5lzJtyRhh@mCpwCx2vR z#>a&*y$Kn-3l%O78SKm&{NEy~iybtI#@&MaGX3LDOM`~@8hh)-YY&tdY^2KejP0Mu z$=~O*6|AEEpNEjIeP)kC|KoxNydEu24{B^Gnsui%+ramlm^p?blQkRX1H!TfB}Ro< zXXBwleEhey-2cl%uJHQ|?GyAHnvu7bAWGY_H7g?t#

@T+S~tghUG@OV##`I_dRctCocintDWfThWT6!O-rsnt_E{bSft%}2 z(-bwN5P~`tnkt4orOQ+4OmrqzQA$Nch_cRdHjrp>9bi$*AaYUPmayYmpal&pFM zAq}-kF?ofBWA#dOrbt|a_^2`#z-bh88cTctN5cus)VVz$AV@jw(2D*5D;6iEH}oJL zwUmniMJ@8#cP@*8|B))1Yt>-<7bdP&@SBv20WU8!_Lgt+6bK1BQ#0>NNpSI%$G8FC z{8|6Jyjb4S)kbD)WH-eWzKoPk8M){q1`&swTZp`Y>wA$-PEbvzP&{8zWI=Rd?D+v5ZpLw3;P0% zoXI<(u}6#AVU#O|Z6SpL!AdD(INUJnk9&KSYynghj8#Kpqhcx7ob*CCQ)Bl}a6l4l z*X#r1mu;j5E+XjE)`T~0P>15!{At}Z%TiDrawFfwUCUsh=9iLWp&yU12e1B1Xk&2PU;}Jcl5%3CDpEzWig5r&Um3ounja{$NDtVh7h2?ed3P)`~#ZcEQOs%N_XXWma@Cae|G0<2OC6742pK05Ea(S*(}5rp?(}=SLEcfQ7#0;olj3T zYBcH@+i#wBHA@jYceNEZs3jkcAL|li^#Ud=Vb0rNKN|V1B^?n&6L<;96udUeeW_Q! zSu2;k3mZYqz`Y;)sO!eW>KnC&=8+al>0-Q-!riF#-eZtM>HIkLXQh^=Dp?dRD1cfC z`6t>g)>V3OL$uqljALmC^+&|)QK#W2?B%vB5gYeIP`g`MsqUTwxho8HW9tB_$}VTjCOXSR*vMStugb z%B6G8%*Uq6XMZPL2Y<(r&t-4ebaVpH7arpAte9wC^J}5QG4cEae|srvZ1jl-TUn}K z0DWC)Tu#VHbi^E)XEAw#7P4&k!b_1fqCt@+yT3orUT+ZIYQewNQ zS4vGSd`Vu*C&Gq)*Uo^}-U=P$*4-+Ma_CPrX=I<|H_wruAIvQtS}={gq_G1}mxH<; zila*p@EIZ=n3=Z0iY9si?*TW8bd-@zlR_a0?gP0G_#S&A;7nY9MupQ^T2x+zKR&wX zNhQ~XIf5?szisxOdOPBW3^r>d#|GHjIT_nWHW;hS^r5J?CyzDR^Q6VROO^M-%DSF% z3OrCn(h`lgg|<-p%=hD#^(U7}a~vM|Y`7Hd&@Xo%9fS7jv?6}n(;YsLLRSI#c>_JqEhGo4h;*Z2xbQzt30QRQ$@86VL{iu0!jI@%TKw_iQ2a3z zWoA~qUhR~kG(Z=;z~|BupjNq=F8t4|1-2D8@yXafS>3^Eq)F1jHg6BZLSZEl5zJj= zUXGciN9Z(D`@GC_6C;4uCX}lm%nzU%($}HZO)H^p3yb)4?lJy8R8E(g_iH8$sE{FLBYW23@wJw?Bi$`FQH38s>^w8p5;oOf;*F?k zrqCA2G%*82ZFJAy=T@kGY-kDi*%?`mqhkU>O2c|@xFD@&*EPh#t6UpWH;B)uZNssC zJkzX7x_n0;)rh$xFutRX;#kL)X^G#=DdSB4JL#j0HYB&P8hOB&i|11&uGM=deHz}5 zmjG-w$wnThZ3sAvcG|97;8BiQv6di>3z(K9gHrd%XosY8#IjygPuLp1%%hXzbcqP$ z1_P75;xCQu^s4V^NCWY3tvYpCWPwkRMlAW&7u{Z8{27_Kn0xaMf2u?jEZ;%>b5Q7& zFH}Di#6WOUXSJQmpT9lc#s|Mr{4OB9)fLH2!9RA|EH{#RHdt0o(2CByC)?JmdDI;5@i*Z|Ir zOmi7=qPPhzMLLV954&|C1jhgI%$z_^V~I%O}1J9-vZ`iDaE**3by3a097v9KT;#dph&v+n@k#G2P@S zp}E}Lv*9^8$Og~*A5fcUro)T-WAtRhx@nF62r#f`{F6y@f*EWW4O*edcjOw`0P~hu z){8qtd7h*{9sq+C#$xjB=8avf7#e1#&=$qhslJ|k*1k9T4c(~zDT2FMGXvkzl{iWw8%eC^Ku11fa`dy{%)i>W}zWHj*DB8Zhpwa zp@9Vr>K_=Utwks3^*hru=NAT@8c$(3Wd%(9UPNU`FP-o_Zrl4vU)@9hiv>#J=Qttu zI`%<@XNnN>CP>x7v)Y5soOZ1aeSn`8riv*HI!)gt{k1$NpRorgbe#{6QtE8y+K886 z8@)ZGrT?F!;Qw}TB>m{ycz&*F=b}ZNViv!Jr?$k6-^G>0t0qXXaDG-dNqFw8V6=VU z?U#rW%dFf0rG1njdanIG1i<<*;57hQ{bYV1wbTa6uRqI)~tS(R&ak)~J*dkWWv1s-RW>YaaWloP2_> zbud@+i}w1(_oLNJQzHCU{#&xwpZ>IGjtZ|gvYyH@!-uAUSdgMy0Elu+juo9QY%a$X zMje8`G%GxAn{*9LUTYvFx$lQGBnj+^T|-NUz(5b`@M^{osr`r>)WWwGGEG75iXJen zRG_)fISP@gKwCYa6Yf*uq06A=rQ$M?#Mg?MzG~Dp*vN2ta^fLdKlFdpTaRC?=t5;i zz>`2@eC*VJ16tN;4qAJzz8mUi*Li8x!iyoM^04?CQ+#$6O;#6z;{13Aw?YAOwsnZP zZG4JwDd-hZNnF}U-2ViMx<(9w1w(}#K_RA;15vd7s{mN=O)NX`ksba~(-YyHrKB9t zHRUG<^}Kw|ff{b;ZIh9&1#m5Y-Uv7U!$vCnvvY>N***-js#a_~970X^5Dq3CF~k6%NxM}h?X z-IX=+=k53`2wu7P)fYTM0J15-CmJ$J$yzQ;7s2~SqxF_3kBgALVE<0IaQKq;u44Fva2Zo zLCK6!#Q3i!4`HMv|L)_C3*?W&zn2lN?Cn)?eg6+(vx|B)gR3BsJj-qSUe zZ8YPSHc-+39Bq;S4+jtI#O4mHnm~MG;DDNYaA zJM~XX7Ip{kxo`*dp4x8Qi2V^jgRuDJFAG^^qaGejgCM|ON~B$nUT^^K;0ZXrM_C+E z1|XPJb@Z9})(OzE36g(31q{yJN`K`FzMOg6ew*9mX42U$l{tb7> zE$+-6cwf&`1Ia#QW6C$*N=}4mP#7VukdL6mqW9wXe&S>SNZTC|($1-4C0Np1Z%CPG zFkv%5f-Lt#zOin$yx?4$^~x=V5Uv~!mMF4?HhI0fK)922AMN;tU?uPF2waM7$S1aV zBcOQ_XcxY?>M8ITWJ~U?KCV}N=hpv?|BXH$%)TO%U+;VGPepg6K8x6ddct3?8!Z~| zdb^Hc;a>J{pS<#Gj5 z<;1i%O${wJmzhv$C{jkt&cuu!5VB5b%j&b0KOM|7ngu#{(15OO0nsTjYi;ggxy9kF zy+f_s+-d6K`2$-Vm(TIE^@Yz}N<0k+yz5g~-Iz&y*O2-WtMZct#9(*1a+Ff_&7(J6 zrp8Km8@`+h=+-x;wEw^Y8^^ybvlD%0KLGKMJd5$L^~vw&iCPu;Q5J_@mH+VN+ntMD zbkjNWwvfi`V_Iv*=x<5+UE>p$-ixvVBh?r;R+cK|0yWL+XWKuKa<0oMZj!6Zw{CY3 zX*45JWg5Vny6E9Mi1WG5T^Y$@9RK50X6qbc?gmGR5kRh7`HFoKs!BV7#!WVd<{q~W zee5}t9#s!Bm)VqtYfF8#!jq-KV+;%?fBnuMVi)ZuopwpE{ziatz5Rnge;dtQ0y8q0 z3;7%Ds977IA-iPXoIU)IaMU9k>gfqY9Qms^mB503FA&&^-J0VAp2eIJ;q<~>w*2|) zZcU_7xABocImYhqN^^EB)j#E4voU{dAN(9+S!++Ni=ZtnZF+j{;WspI6Hs zDX~OYatkvsWmMxQr_h&&Ckx1j*nTMs0bk62{JA^eYZ;_Pv0qXNpUR)#-c(bjwOW6< zX6fV|7bfv#)MUbdl9im`{CklX#TX|6=J0M}!Du$q!CyN{I&`vQ-X}7|+k>l;tLmN* zv9-F9^X1snuFwntm`O+FHV}G#Z=kpbaF(jsrMjVH(e!veGBRZc{yAYgXXUSVKQLtu zqgFHitvI1=Jmx;UJdXXJJEw5pL5vughy86@LxUnV!#R;Am1*YFLe|E4^2=7=n=#Di zhdyQ|Ugz=qPV1m(iF~T73Ed7p`2_Nhg9$abGiD4hg5NsXt#NQ;VH$qJ5q}F=3YC12 zuFqp~_|^Ha({%s&EV?-j0c(Q0V|`}CaNMbAo?XBc2E#xcUrM>mW5^;=)fS3P`6#&!+G8;%jj4nGWEDFEYvViBh8m5%odsI98c7@@fVa!w zJ@XW~jR{QXwunz4_ZPj7bGUqmr=;Ji;~It$;NHH7)%6qKWmo%x6}$Khw(!06T~WuZ z@)cjltiO6CtGQeM{5Fxf?Db_~zIm$g_4aq;^ABa2+s>%Nrb-q6+!6uhsr}!^K)9r{ zb+NeV{F@S68jm6aC}nA@6}<*3`$M{gbrAu65AejajaowsC;0N6ra?*SFS`eivXUsT z&?fcp&_f?F+uJ-UxH_oYP{~VV_t#cOYp}dEU-N8v*$kkaH)1qWP1W@W|=v#@wU?5iF%UmudKR1#~7ka#YtcRl#{@Ph|c0Z*1 znCM&DK<(+-4w_8mbN#eZtKJg8i|0D<=Y_>g=^K2m7!{2UB54%F^_Sot!gvrkjad{a zeiVcyfWP(jc`AbltJ_&V($Zh*Owh?7Zxpub0le@iBdRC(C4Y5&GQb@umKfp^MV zpRX(thW+ZmjlTnOfm>C*N|*IvFlT|L(SogamZqo3(p- zCoAqj&%OM9o3XjC`*oMK z!@$BE{hf7-vzSn`QyLsoERA;hbdHr7iMqhoagK4-ish0;XJ(wi?L%wUoNTb7=U7i{ zMBb35qpRl{6ZPUQx~sW)gWWD{2&dN0x4EK7=0Ixpj8P<+otStuK*n~1dP*4{WwGgF zssqXM>R~>rMsXsEi>H=zn0dlA7d%DG}>#A%Ah1-;{KZgSI`aLOjzW6V;2Z{H%&{azMtR4 zZ+_qB%srdq04)tFiauwA{m(gi3phucE7o*tVNfdSqj~w2@iA>?*cMUYd6yY#v>Z3F z-)|vBi6WPz0*Xe-1X}ktfRK1n?LLcr>37pwv7pqB5E#43PRVHN&daC&2Ye(WkqZq^#%4DI+{9j6(ZxN2-MUgr z1;2UpkkI7!njJC<3%a;=cUYN0z#O<{;uVAq;@r-jfFjJ1Z2+HvA%HAdpx}PBiOwhb zihcD+U@9wN09OeZepzn?eyw!Hou+HSN(Y1{5Em2YdYiv?F4h)--p83hGDB5O0{qcc zHb1XT_hPPWqU>L^*>s&P_7_TdZBYnCQMtPyW?H5BUE>DbK6CpYh%uJEgxTScSG6)E zN%}cPI&BaDg_}5Ln{%*j?c58UqJo;sO6sDq(^(n>eg#t`F|g^f#L5VeK8-z+q`V0M z&gM-UsOdRdlN`ilx9q0{k$$+Z)WbOA$Lra70!daoQQvP)%%$NC_*r=$nzpQ%DNqPK z#fuGBkGVGv@$>Z?pH9zWEf8qtM0Fu{a>S%&z-#dME?%Q=Vz`5fm14cSYIr9D@Xxp3 z)?i!n?QYF@%ug(RsdA{NPRDDx61Vs#Ji1=Xq-Dnb!s*hmMn>C8SzGzv{mQ_Inb*3eOxWCB?-qjP`dwyq#9xe zh;P?EUIwo?vD6uAN>EP9m{rR^-e26ebt*xE5_`VqVf0ttIC z4GO1ZqLa?9mN?n6lI@Wa`esAaCv!6dHZ2O@J-p%qG#dZ{CAxwNc5_#B)_*}>H!pYU zB2SJgpYFfeHd+an>HA}T|DK7= zu6R};v1P!DE30JU($BW&fwehJ;w-#&fY!62<@YPh%JQ$={qd`vpwJ(sK!)rMA-i^& z+scOG0R#fRepQ8b9q#V0^j?GNfgnoSLe!NI)nEQV1Yoxv;ADA&aPOvwm=a|vz833sTw*9G8 z^1ye+Fqto3KH~3>#k=eF7P`S+JLdTxE;QVD7eG9W|FZmv7GHqOtgS4Pvdhd;Eec)@ z7Yd=&XfOg5;Kn^JY3gACbyE%?Nvy2zg}Uv`_MHRr3+3d)EX3yp^n9`F)byzDmf#tZ zBRncd5?F)L!q7xBzP(hxgr=7;=qBh7OrL-&{en-D4yo6?o{1)j`lARdb(9?+Y37h9 zFuElpZ~Ashbh3$SBGmK_OsjihB+@}VfDOg3RFe1Fz%C$8Tw~+mG&mphdwsoK1D1*t zSOea*nX7wnYN&lqGa8|}TkD8&Y+c3Rt<;!3U~sI@8aONv%N%8oFx8|<&4un#mJrDpFuaw z~QrHc;%}lDP|t)o1<4g6=sWzewD-D&puW~8vEKEdxzy(b_qY(cd>bX z$CZ|qTFQm20HyT5o10(_&&UtsGI3hS{Frgei0}ckZuF{vzEQK#RcqrmjbMBaZ-)bM z>hZuk=k|a~_77I!OM`z36aVAY=(=sJ+HUYb4i^keB+#JeJKMxpizUj*Vi)z?yypfI z(D@~kobrAZ;mxeqUr2I1P@!J(pX=vuGU|jghx3)0gJMjMJrsw0^NqVRPxXF3KcLG_D?Z2 z3pV_HO$2oDV>mX`Xxo@0-+>J-dZ18`8}B}xV84`NXvvaO#$=9Wc2j~WAwuN@l7;R4 zwPNn9hd1!68*j=C`>NFt_*(n}-B(D&^c!sY-cCd;7}7rtWJpvWB{;IIsNSAsB@G~? z@7*#d7E}w0mq@P=4^sTPPnX`A(-!SMM|C~dc#zD6APsU24Pb@^&I6w8veID-F-`ss zM(2@A2&2(G)mc{qT6~Sb%Y9{v6Nb+wMG*$xtKQ$taK|n_|u?X(}M*5e*p2}P7rXx0zy<6fc&-yj& z-%FvpfC~%7e2AlW4)tbrxbl!zq8D&j>6$oDCPcN{=ME7e58Fr}m<-}C7u|0jFBEm`4yjVNms1z>4i^xa?nl`JB>UsyllWj`yxiSMSz{76Zcb zgH@lB)$=Ok!E?~+iNE_g@dT9jpHxfUDWCHO#|g~Gn7j$ueehILx7nz>d@_kxZ9@&n zi-3;1E}ueFpF$LsLR2K`)6NAFZmZJ;k^*OT57seid?zubG|*Zhb#Et%HsvTE7t9?0 z^wBV*+9OJ}dPVap^M{J%f1(XIDQy851kSd2&?FHlG_)@u#G*5Ju!e z4a}$^=}h~1I043X0drENqFf~7eP?iqibwc&1R zYFIu%;4Z3=(^c9VM+FaP(08d2@3#Q~VaB=|Kh{RhnNKUj;wmJcEB=T!gZ`F1gY6kV zMbub6032Xz@%FLlWiN&0>;;VFrU6WL4k9C8;lBedY1#HdoSG+pYVSsT*rKJO?-t^I-_MJ{b^A!5R+1EmU zD?ve)@`p>>u^cLVHN_hP%2eGx;48GeX1<=5i@@}B7fjQ~ie@`}=TN-v#ZB_*hcYwj z?D0>uH2!Q%`H;$=*a6XpZDn#!^V#Qgn(DH^HH5@7fJ%;c|92VVL=>>=OBXnDY!PBt zt|A|Qu+S$s$J*t9BIF?7i86>Im&ffo4asmef(H&r-s;9t+?#PJtI&!O73(RwMv}ju zpbatr_JC~gd!x0)(-o0uD3+$_pPS&OC~+i`B~IOq85aFZ2Ny3L)+!$~gktuq+RRT1 zLrHlT_fF0y`tf~`yM*aq-vOweO@1PDqaH;8`y`<>pmKz8(rt@pY2|dP{)Tb?F9}#4 z*5-45_@3kO-}X(8HoRpL=;NW$OrRO*tK;K~zK~)4pm)uOe68m{=xh&eVVdYTf&h2{ zw8=NGmSt&cAKOLa>>fph6D7%!s9+ual9ni3neuq|@L8J9{G`l>@W*$)shu&7q(mG# zT4@EjU3h!P2u_9wcrwpBc7({6v#4i7|7D_-#ZM6ez8!q@u*z;xM(zma*Ok6i;auh6K2x@N7?c_2pMWn}!}3>gczq0ndoF8pe&ixRCF zJbZKVRJ|;?ul`k4c86zf>Wbv%-=Z1Q zZD9Ass^V*I!C4fCQ>v@Hw2l>+OX&;&9cc3 zq*2?SkOAuxFHtK!02uKrfXTW#VIDSX|>2o5oEIGwsA zOdzT=j*9MKL~Rh9NNpLUK)Ia3Mk|~)&TBSz6@6zXo~dtz@O8p`fBW!Yd1ALgJEg?+ zBkC)%kxor!U$nd_J>XPYJ2BU>DGIivIFR{CGVDa>Y0N>3NHWW&wqU1QRBtD&1dN!x zM$J`nbZjEb-bOa+3VIsuc(eJQ2h!aDcv8>)J$o%n@^=3d^lq)6%$RV}(v9eQ0pLml zFF_a!U;CE%{JVO(@3x+z-4A`46Jx8BJOs3OvC_fy-05fJQiq(Y^s~*iK@fLce{rSd zbhkd%i~YU6;?nd}rhfaVC7q^~XV^bdripVd|Ckg(BFaAbnxM8of$3F~0(y|Iu`VsOdA2kS2WMfz;3eL24K1o5>P%dS50$ z0+77_(pDeMTNH{-V8b=Pi6DYZ5S0eG^$&rxcPXJ!dL)*Z_GG9np0@z#LGIm%2RtL- zRVBH4^Qu-LT}UyoO%2?XHL~r3=+cqTB&!S<`+Pv|op5kW`Xpr%8K?uhlDulPXt6co zv_wqW7`R6jJ=u$&c#KPMZ>|Gx!ma72wi2`;wy~{>#RpqY$z`l-2ya!~UwYNh0WfHD;(G;; ztK#mX$n9yy%Zvf`t~BF&vpe_%VDWX?p) zNj-PaGc9>|^H@iOB^G?N;iL8`EO%v`5>3&ryqVNuv`P*~I#?nhqtcI|>F$^HT#%Zs zCnv|;J!2JXTqQW!cB$+#QiP(5y|-GuVx$vl2$VqQKp7kOR0Wq3jl-A??Fp?1%#ti0 z(;5e=vNNK*iL;@bcmr{)aki#}z$tG+IYukU%nWCWq&1PZhhyxkId|GpsRc z;@MY!#`0w^Hv^$l#nzfxr#$sT_khmV#*WsE1W5v*{5N&vgHF*1c8ccYc=m>2f$)9a z_(P_9BI(;G__P!7!d^{2aiaa$L&l zjl8xl@I6>)THeEs*^qaEX$wMVP7ZBu)@I99k-Ni1mkEMV#7xZtDyV);6aZJ)N(Dh- z#0`Np2T;4FmfTA&?GRwuyZPsf+M4a5{fOnrzDFQMD9;sVv=Q^}MflyRShhT2(@9s$ z*gPfuVLoZUNLsv)zGdv?OF`osGOXwmZ_y1O9JxVH<7YZ;MSGsjMmTATG9I$;NaD?3 zKl$HT;DFvoiJ12OL)1=W?wyvP|GNH37FeI5!JY%&GK%%!KOH)!ECiY@)g=1q6y$jg z2BicLq*Q)=o)m;6&njS6rnr=bCDonsCRtHANKTnLb}V9fajF#iHxKx)h3e2^lrt`z zqKxK1QKsOu=q8TS9j&RZAK#a@tj5Do>y~~}#E9zYr)1dNjYudrA+$5NcCo6;9(QAy90)bpPMsu5E|HC$at zJ>)O3G~o}@SlgpONRMQONvw)$sT_cPj%od-Qv{Z}Azu6h3?xv`u2IDc2!GO2W3p&b zOxHaK0>tuk!f~{yX#V~ymEJu-?s-DBgg&W4v+Jk#+K{C_J}nI!R|C>8C1c```P0AY z6M~$wH`t)9icsVyD9AwIe!l0Ux;6AI{hTLomPvf=Pe|)LhUidZntc~}9uMZUUPbpP zB;{EU%@56-RF6NxngKXZ8`RML5&k!@m{$R;;kku^HD}xG9MBxaIZTxN?sx=K0EZV; zGCG`fcu>Cg=3HKU14*gP?NHb@Dac*3*f~b9GxTwGQ|-i5+wdISCBu{05WOh-T2~j^ z6C-%=Kju^_Sg(r}XM`8|7P%&b&0(u?(YUzkQdi3vU1GGO7UFl#7I1Q?S(0 zp`igd^|(3WlbcFLQ&sG971rj4dx}qC8iNwDYWCmC&w$qaPfS_6PQ_>Z2|)<&%1tH9 z_W`R**yxD^9pa)vV41~S9)cKINTn0$4VYsx!gOFKU^E{=#F<8;vDlK|zo=!*M+DZM)I`9qZNblmyl8 z)UKQy)V1AdSAJ?VyJd^4*S{w|cfFW!I{T+y^g|TD+=@PBkIgMSkOV}X2;!xdkXA4J zU9GQU4$Q9(_StecA%&?5=H>%%^wrqMS4-x3V^G3tb~H|D3kIx&f!GmMdh+!^M2gU{ zx}uz;c*W1!k|+b%DP&4ltR9c3;Ps=NM$^~S`vrDB=r`X>DQ1D%0^BkDZEjH3Ngv+8 zh7xs2*4G{`ZMt8T5jnIz{XDp{L+PJHe2it=)@V1itWYQRomnf#-!F7rAuR3w@XV3E z=Rwa}E7xjyTyR3spG1#4t)WX_c)1O)@Xc~qv9~tICDIH61clTLMBG-DBib9aU*}{y z-Z59nQ#WediO1t}8Ue%(T+{0@DK+5M{8R7^WcjYchNa>zf6BDc4}bl}Nz~h-Di&>h zXvQaBCp!Npp8N(=Ov;_t3d71pIWs42(aHa*R9)TxFWY@L=bnTZC~7VK%Hd}qTV!F@ zZT-z5<~u4`71G}3k4v$03+b-(q%y2mXwAgFGDfA?{EuZL_Q5p8uF6(kKHQRBZ6)KD zIfQ%a&>9_~GDNC&Ke5weuOV1!zc^cP8?w-NyzyrDuFRD65!4%3et=@`ng{bWr9fId zYR9XD3ejnZPyba?hc{1(fi&{*5Nda}DrG!?i1cbG0veSfx+m6_q*S;m>DUD$;SU4R z1X=!w8li=HaBQd!z9~IeW~RSEDkN0z060cM++!dAmjHL0ZHn?EbpG&>EFQCn+_QU4p9HZb+fn?(SS*~C+zhVUP}d_pvQo15 zQwd}XX;$fm2Kmy&nEpyd2`T@H>Fc@lV*Tx*`vei1EPo3+1$*`32i6q!yV0DW{=kv( z&N7u~=bxC}Sg8OGs>AJ@SZcGWYb*1?J7xG-dS2lCi7R=)8Xsx@C&u}Q9MNr@;|BCV zX|Dwnm%M5*@^A(Y0slmzIR(AbUOj{&g-i;FCF*+HTew9P&ZMk!*4Kp*JD7VW@M~=2 zBsc(V&UPoIrutgwkdIs+LIID!2$O4&LwkN;*Cd))w)2PP*?F%&OG}F_5AcFVu95|d z>T4_ET+!^~oi#`^R0j^h>e3}If&e2FXlfmd-@3piT+O;XvOfyza94O+&=x!p1LMv? zij>m7R4ZyvB++6pSK2^Fy6qo2hIG-z;@pT21eIqsb{)^mxC$+17$eg=EP0E>->#8+ zhn^w4M#4XTf$Xo(J=#tHvGA^JXz}46VjtFR@qc=EmJ%s|GCn4J{^XQLxeKLY{K~GZ zyrRklsz&@1jtzDKPEt5&rUb-T=2TL^^LOhEFp#;~``&uDpYS$SzDoD-9hP~sm|BG6_|T@E!SNH+yXi-_ERvr>?>vGmdT<;M zzG-iEicB(RX(F@FvKz*B1^+Ah=0y70mYV9b@=dkes|d`TS&zwA;T9x!fm-3~aYXj2 z&w9?3g6s%}1Ao79x=7+{f|aHD`Hj3!KKHY`xF{X~uX*uu_=nB!3lrfp&B+WD6T7ks zd|GdZ(mhdi!YcF))Lze3wJPn#3CYRbR6$+2Zhy{!)&OEP{pb{q=l2@wLWg2j2Ag$u z=;ufM5-ZQZR-{9lGGijraR051!W?B)Bc3-)NUGrH`_qUr{IyaFDAv7$=|5DxL!At9 zv9z9b>8mIo(-L3(|GreV#*oTVgmude>c<`Rgi1*%vD$%!gOagkfOYZOTdzmWCE{59^6dDWmNS;aeD;|md~jypmaj0H|&k(fE5zhwHvTSg^!8-G{h?y}uQ zEvBN`cE=|jM>Ox7e~@39-ql$js7)^3=GbXb4k2fO$v*MzkW!FW_0#iG#UbhEvNB~r z8)pq>z9-e^5OSIfGlLL@J58~;EZdGiS;~Gtc@0KeBBMp7@sjyIMDsPVxaOWFa3Gu& zZQ5xD7d~aSyNou7;5hZg^2Z9gdC85Eoy_ZRF*-yY8qpm!_*Y5OSkE^WHma<~czgAC5TydUpv%(_??{}2fE5IYP2E#jQ zWL+|=mc1HWo1oFOT2+b`j|Qa2wsmxCXqWF*{F5B2WjCUrlGkE3{74SRx(iaVTKf== zLXW~+MrM4q*F;!=7k1(!h#$+HGdusuKtxwQ}$Jx4qJgAJ^ z3!9<5oYp_fVjAPkh_A+$kG^dzjzd5xjU0I&c|AUvisPiGRm4iCe^=EaVKQFDErHa* z;Y%d7ewU$DlMFK(C8T$nHX+Qvv#Rscm}u8NzNAl&T4#tHa6%OLi9T#c<{pXgLJS^TXH5HL(Q5X zL!%zA?Rwybhx(jTm=zzZ%Ia?(up`3wS7X-E6Pp2um2wiUwlRs3Eh4pg<)gB}z*ST2 zp=JIC$His5$Kzg*qOV=|L$PS4W?yzH1+*lS^y&~lYo2``L1&k~wAhz1YaRZTgB-C( zor}%A-w}|2KIvICM{biZ@YtkgkvbvR+1#!g)PopV%>$@usSrhM?(gvj%zU(BaaS^1 zi8`7aG@J)D_afMESQQ9<(Sei%z`VHC;AVqlhfBfdQS=>pGZ*W{#dq4Ky2MA*3WDF3 zTZR^dB4=a;g$yXn74jWd@nE`89J)~I&m7ue&HWTs_u0_Dbm98B07QpU(z{miKl~ee zt0T~#uW|@X^->MWGDq9Xt-7){DmNI+pTMmk|Ic4gc$Zx32Z77O&`gy3sISIkTYrOQ z8N{sSOFVh2_Qf%w>=MR7uk$-CaXiIxA!07-tl@20-r}0T-xf=TNdDR-?m7A$PSzEK zrf{5a>?UY8{FW@i6C#!K869&mDiramsE7|H5u3eDbVzBFT zx%C3!Z@mRFdw&&*Dpay962YZH zS%=J)*aZBfTdkZ(8FXS#>JkYe-z`2bh;{z;@vy%#Vs?OHsC9gRBD*&zIFIa6P=+OW zA51x-E`R&5#`ghrT|=aN&bBp1BWf4{ZO5CK{G6sP4OO0=jjj$Cf1s|#C5RZlXcU>b zX56Xjw1W3_{OEKFow3rK#Nr9goe)Uc_xtC55+F&gZ|m?yG5U%?G7UPgCQafc10`B_ zniGm^XY1CcRV+XVrwT0}6D{dsF;?EE?az?kL=-FZ1>MsX9TFU_cktyHeg7(=kRbrh zMN|E{I^n<)a@lF{&p!KXR#Wd1V;A-y1S#4mpTtcezl_^0kgq@vd|g>wL0DR`gkg%O zpygXtW{USo>m4sjZiQ8+IlCzy)9j=Yb|6zZbCf?llbjaAK5112g3oJS#f#4OWP5H8 z`+CU1pyr1&$;Q!}JLF%Ks^u&bZ6`iI`OALe`<7^Gvw+$z6qaBANtEb>v|VU1qu_97 zggtG1SOTGCnx{9CCrKvu?HqI_VaE0(as2wdgJGQ2)I06*n(Demd(bi$4#g3dTwX~a z#-|@mAAKO@B(7;V>f2IEFxI2XW|zbJbt=#Chjv(7f0?H1;igTh!qPTOw~~319N9Ey zn{Es}&fLR$)2O+-kZ(N3zjeH7l5#{I+wz@Ti5dC}-1#z#CdC;M+XrqTT7e(k$}&k& zRTF2xGWoX_26VKsntTe%PANT{YBuON#GX<--(mTN#N*5LPp(^Dv(CQ=WLDej6deY< zkJ%mr>nUJ?LwZPTWL0swK$xnyCK+F;Idhq6MzoiLrUE{)eEuzPQQ?~+6#es<@!eU5 zXN}v$50w>g4C^F^_4hMIrb0qf1c^ia+Nj4;xheEamZ0zL{1RY0`=dO_CC6i9MR#(^ zb5BLs2=WQXQYbfh_nhjS%ZLVzl&YIobu+h4v>S4e?Rr5=WKt5pI+etAyjMkHui@{o z?g-n1AK`>d(-eeJ+-xYI(6SHB{_ygO1lyJx(L4f*N6f+99s=WbtY69v{%O7bUi!@c zfxJ(Emv|P;9is}JII=S!W%yGD1r*}BnqX__2=Lj5h)n{GYW6o%djBkUQ>dLoV z`Ow<`!3v?CeZmmG*Nk10$uD9Sy$QkGK=Y#Y=5emqvNus>J*b`cE%AY{mxW(A!4P}iG^6nq}1d1O5j(< zheKyAb1jj79?K$~>01!*qxq*aar3yj!zt{A%pkLphkZwcs0(?%BI0Krr6KXeD42eJ z5h#uyRX^1$^%}ieZ8=fa&o91xSrAh5{%IOfW8VRB0)=uqAD8A{nur^Vf3=7Z`Q*$T zh;tgEx*$4ChTmxwaBBB_wmO>`8xLPn)u9#)8C`R_=6Nj5m?~!7ou=U-w{1x>*cJQb z?uFWp5X>ge(^r9e4SfhG;XGo}HGBJY~1wBC(n&Oal9*YNdS2 z9u{T4$!M)Uukm7q6n%7ynTORQkN^=)y70KGnD7iW>2D31FnQtJsbDV5h1LnCJD~}bMp4BVe8>uObL7nzx6p?@!@12@U@Y`}R&({tFZ1v+ z2*YL^nNtb*M#bT<=ae zn431o=O^IKFwH^Ugw!kjOEn^I&ph+bEaK1JX-Es?e}9$Cz)~_N>fJ||zY4N*iB(q1 z>)c1~n|EjKaJHk@I(1d_HH5u$yW(J79b#XaTMwyKJU(fsQIz;Zb36ZT;!CG7`83zv zV(sbfb=v#%dKmmoN^QBAcMBCnu*y|qtTrCP}+!@0HfV7!b7erIngcJlt9@NrA0 z-0g_m!NMaH=Bm_8(k0P;GIC{pNMArdvtL7Wr#3;Tb3t?iCwc;>Hxn3#p2ST6G!dh` z7zt|$AWyS!OvJAb-;k43f zMFG-qG7ASHTuX*&mPfj8F89~V`rRCbDx^1=5TlPbna}+K6oWVI>4o6jQ4y)xJ+8t{ zgc`po5#Ea@{4rl%a7%0BxmHUMNAbgvV~Q*Y(+D9=za6iLj;V%ys*LDwu7iE_|Hso? zMa9)M(W1D!ySvl4Ly+Jujk~)`&;-}u4#C~s-Q67mp>arXhuhzO&p9tWMnCjR@3m{q zno@O^R@H*$9U-z@%q6KD@!3CJANF)hnEc`D$Hhp_z`X1q7g$r~?X4kv5xzmuh~w9u zptIi(GcMHQ+}gq(*-9dpY&7y5^@2Y1bC1!=<&6BlWi4!^*3yy9CWqQA4p3S8%mMfy-L@p7x9tGCQ7%exJ|5;}K z04fV=%HCW%3-E=tBCYI4>KE+Pd09%2a|CY!DJ^7z?HrbjY_1KaIX**HjOjle23iTp zZpx247l9Nnnky~HHrTK<9P49aAYG>kp@8Kr!Da`+PGQ&5U1IvA$broLDUr$5i&x$l zlpuO@vV@<~U}Trsp;<*sEt4u*0%1}c<>pU|{Ag{SsmjyW*_mm(V24JnUdkC*-tAeyYZmTIho07 zpG!spmVHI4IWvDG8A?+^CYrL4n-t82Hv(u0-q2Y=(1O(Qjyj{~+vLFm((p zfMWD)Y4G$C zxaAubVBL)Jk6t;AgUddK8Uu|ZSW%)_QcO``iHh`T$Qre$FTX#NI-XadO0`nQg z1M&E?tgJ18k$prP{E?CN=2or_G}c4lh4ec8FI{EcHCdaZWgG!Uw$M3|5l^l2iuU;h zL^*4eE-8~!D~aOl{WAGkV7xqzaTKkwpyOwJ^QWHWhi*i_pJZ}CWP`6uukDj-0+x?0wL0OYJ?vBiB(RN ztt%+KCy$nXlC#3(`)GAWgl1}M0897i8 z;(WJ=K|6LtD&(zOa4?XnXkudfBT>Wp+?Hk}wI0(1JyZg&5Re#hkTJ%=d2!_hBK=vM z7$73kQ?Bl^u@9q_sWU>gK%l5A@@$dKiD|lQKohJ=f zYqCV)WG7@f^lVycgwMd19$C$C;h;CfKXTAx-q>}H_NnPkU#)|gswN2^^zX>4ne@Fg zm9f%l6~lOM1lCp(wTPF$7c@Q$1qiz{qlSSl?$EpfLtv1nlwrg$rO3p1l_$+2yx)Xq zfi!I@^)6`0X6_e4@5n^o)Z8sla0Et;;ry@6*#ouu+LZnNBPnukQ#M(Ss z1H1aZlI;O9G7kx)=&;78`B@|>VdeMiDH+Y6Vr+;s8~XV==$93wH}?^?Y&WFifMP#>$uHF zjHe9kHZzZc486JgOe#nDz>(rBt0S99+PI}*Zl;Hf@r<+85i|zC7ck_pn<`la#=B8r zqx^SsDrX^^`t&I}!1dv?_WkPl_yCQPu|vLjTr%=2bG@2a;aOv);rn58n?Ywm#h}_g ztX)qJj0-%LNwCX4_}2@)6-FnZ1}b5(rG6eoCtRP@MA&X7UwflhCo%@5_h+SQEeZrx z)f3e&>+jH538h#JpD23TBb&=!Mgsd-62mmq)N?GM@T5vMs6VWzWnf-H1k5R>48i6$ zrxR3X>Qs~9zF3I2FfsB2D>Bp499cj&5c*OHOW+4AruxOa9ic{`GBqujs!I9rb=P3K z|EB{=S(P_j=S%+QlZ74-d~^)GZHlXf(2t7B-jyJR1o?1(O>ScGQHw0r zRoUlg!<%0;l^x|q(6=!*4`XWgGtU2o>C@&!$dGqSP&uz7V|O`bV^i2U&z0b)*vJj5 zh5M{9D|jYeb7(jfFg9rO<6ms7G}M%;bB88}Yo#pV6DORT!7|<`=;K=l-@c;m{;6=M z?)HvW&G8MSv|IV5mIZl(Gy!Oi)q zwCW_GGUspQY~hxjXuv-=^)751y|Koo; z$`X#lur#oEYaqHYZJoBieoH69lv!Kw?L$R6BZf$tLH%$(`LZ%K{qB` z4taTOY@m983b#u{&?|~}yHwa*aYcd*ToaG;Mz-&12SlHi@lY%*frC_5rtul0oz)>k zlyB*yhw`%2@j1~Zy94|@j-Ua>2I7zgFH2%+N*oH(aToP&@fZyDgNY@JGPuoyAM2&a zx>b`u<(l~guEQx9;_IRi%*=gSJO|q*EAvU^;b}mgW`5zhBh5~uViNK%KjfJd2v}r= zXGHr(8xwzFIm8untA)_sgU$Rt4eit->LIjSFo_P>L#J7n?%Sq#pko?1G5Y6_VgKN4 zcZBa7|F2t$1b0g>aw5IX6{gwcb3+LBp_hl|Kd-!`@^+nCy{e+GUh(M6i}QRYeta0Rtt`--m-FQp1u^XCbo}O0VA|!~o~X0AtSI;gPW;%TYn$uVq%j5^&`4M> z6uZtUsX~3tfLBE@Mb<3JivSOUN}rO2P^O3H26x+u$yZ-|6bpW_L_qVsk3stIm$%Z| zg^gb_Z%R|qumqx2P{70Sd|%`S)40CR<>XNL%MEcKJciRL*|!~bspX`<)4ggG|3ih+ zurc`~9&Q;diLQ`}Vx|>y;0WRmoaNN<$**#0rv*4S0RGw?qpw-` zCk>^L(cp}3xRB>(0DS|#`JoDRh7H2C7?c7t_%W{$hnRCRmy`L8gz(aE zwFN+-oQN^T7}N7(6&nR1$~oq*0c3x{i)wN{AzV4~d6m;U#VIvVm>}4ZEf85`DW(S+ z8CK*>7I+T8OgY|KY9K7dMo@evj&cT$C^zFJxS(Q${dGQBQ~YsnpY}^&PcJUBP2$;L zhant;4pvmg`W`Ai!m^Z>?mXk$)=xUnvP=!NP&;R67Rz@B*7E-nPWbZ>dV-WfLjG97}tJ`IB{Q9WSAc6ktH0G+tDA zb%*EW>CoMrEm>Np;)Yd5j}g8_#ja**- z3}$uiVA1^#?{7fhJW5aR)Uo8wK9Qvf3S>QtK~YeVMxQmzkqHNrMJeax6tKs(379!XlM=o-Xq*k&OCU@CPqMVJ&N>^Hlwno22m!Y zT8O1rZ~Jqj`lAlPKnNauLG>rb~Sk3l>;$1qT zT^O1)m*aWF|DI`*B_c?NMrfuEOd}gJD6L1~(f(D7I0L?=4vQNxoQSow$<054Tcccb zGar06&Gn_Mj01B@!TgktG94)=QU;*~EVyi~l$D81MyMm&mpBQv^DK4j#r|Rwv^vM} zev(pR~ z2kfSH?K*BuMmJ2cv)EG)Y8lU=$&2z=Z;7e;eh`vN5a#cTimqB$*b4Q8iR{RyJN~e7 zX~0tU5zx&Uqhmkjm$OcjYZeWb6&$Pgp>f4##|MD zLQO`OaFPiVeYl8e^=@xNt~k!Lj>o%giLp7g(v>4nRFSPpWJT>$SDk{(~)lytL5(h9KLD~y?Bici%@2%#lv1*_+d1LsRJ8O;@! zpB|TenqRx{#TC*7Y3y1Pe-#`WWPKzjQegAMo#3d2NUt&DIgp`pLBO05Q5h2iKb&6G z#{#4}1~5QkbT)eQwg$*~pFKeK^cB+6bME}2gqXUscgOs~0*v&CS07(tRL?T(^%dW| zOhfXrUhOX;r^;qH@9KuD(>O}EOpb1T5@XWN5cQ0T$@0LT9B~Ss*oHK}G5~PV20Xz0 zl>pQS1j4LKY`@Z4gS+;;Jw?3`qDQ2%K%2{d2;~ZPO4LhRQWDr{VC-kR@l~QpO_67t zdvWm)CT(?YYV4+URS7{BA;pwZRVGxN@O$gF;4mp0CT}<~(}E8_&UEgV0DItP2ojVi zdu^4UG-1w>J(uW`Xt%biZT1ImUdf!e0r>mETEj@5X;j`G%}A6*dyCu%a)FiLi@-E5 zEd^|PJxWVDvPWsL3@^08f9UAp3xNnkfv@UK{6{aT)_020*C8uEsr79L+r{GkJorNz z!NkD>V)G)GM&brYt&ow{%jqzp_=tN4o*p&ya&4g$=aia&LZRxyEQj`riSP*f#{bsb z$MiYyRA2l(Q{u1d6@Zx>ceNbXE{5#@{&wg5Gtl2CmSsq~05wY=y(Dk70Dlirdim8A z*P5P+y8fjp6j397wCKwOB0Ysdre!`kHdO?ynv}9-gPbx0)lAZV#W4~?=5cFgMQu?I z#A+4v@7aQkHh5>r0xxa48{Naq;E}%p*^4t7S>)zQ@iAG08NvkYjRxsW zHml3&Jdq#h65lL@b7Z%m#4}Bk_kX^KiJZ}lmEN~M#XplV+PXn0L_u(f^c!D*wDJ-h zBgE=1{1jX5Zk3Lo(2;!t+O^39=a7+^(b24CbnwH|wa)_CtLSrf%S?59FW{!zYQS#1 z){dS+squStUqZU+0<1-qpRqjXw}iz^DkdysZUvi}6M&v9K86RVJD^S?1(zQ?&INok zz^C#=zaW5?zVfS>It=;KnBAi=C-Y{{^Q2J5X`$!D$<{{EpGmwRH^ym!S9rb>m#c!u zhg`y4^(e^uuq#%(aqp^k+%?py(*kg=@R}a#ZHKU6JNrg&F9~IV#(M+cWA#y7Und-4 z>3o8ytu~aAF|K=~nN8`6%O=mv0=$qJa=|UeMIBJJ>DcAqgR8o_yKRA-3?gI-?Aw1L zfqc!JC-QQVHS5uy&>ywu(sX6_mR zdF57@=G&&&rtZa*)pSF&cY9cNR`rRH$4yuSN(8@Vj!(LCc9Nv0+9Ay}OX0R+nkCXp zI!DVf<@4g^l_Wu@GgimxNF@`@vmV8Ig{lw&Dw&AevE;kvS2*$tz8BoQ!DDjZ@*U^; z%Ihw&kiKZ1#cBR)N-lx&;;JZTXBpYjxfZ`o1(U2~A6O(nPc*YX_nI~aJutvpNf(2X zPW+-N%LV?qjcMtEV`ym<5=*m+<$K98t>xL@Z+Od)1ZajuOM)Y$AF4`#aP?qeAY=cG za!+rIi(W8PvvHrc`{ch9=Y``u%S|0$8IbeKt4};kyH0biT>}}^#4QyscxM|GQ$Qp7ey@&pC_D#zcOlww6x5yyRyOqV?!BSPRo%J0R%b6qW`Rn`YG!JngszfY28h-38YcJj( zh6uE2W9GjmwW96?l$Hh0A@#C%W3)Z!Mi&LQ#H9P1RKlPdF16#qWT|c4J^?203w+Ys`2aeI8yFKqXEzRv z7O>vA1<6glj@=sQF45l31ml^#{JWcs&)fo+M%o;*bHNA5{az~A77GNeX?$ctEtt_d z+GV$BZSTIO>aBOKWL(M0712TbB4(o>hY>c>c0F&X+}{Ul-HHLBZbit_E6-d6VZ;4D zy>oGpe@92}9DYQ+rnVVj@;<1WTbqBIa4eepTR)f4AuLN|^&rKpg9Ql5r`1^dy*VyV zWeqExep>Mr1B^I%mI#jc=m(DY_AZ-Gw;1sGNo1DL3`T1<@`uwJoFCdanDlK3V~jpy zPL+BxYTCSav9##cTp{zAXhVr{Y;%q;3QGJAvotja-E1og3Gh+y#Bgc9=9EK2#K(rv z=-{p#Hz6iBMD;FTW;H{nX!5U(z&@um7)f+OK65h@u=K9xJN$)rg_H{!xp#OU5@f!_ z-rk?D+DsyM0eo|qUMcP_L5cmqGgKxgBhs?AH8!g>bZ<{g2-9UeP)?u8Q-&M$>Q<~h zE@(=TeYd7cXXln$8W=2Z)3>uXB~UQ+6^M{_{m-&gSuL6`SATR|5i8Oy{fU_sk#5J| zks)7Wjzw)fHB86?lwA@n6u>IZw6#dd_ipN5DFJE@$Ik3CL&Yb@kzZn+i-mvWF&i;L%ohZ z7(glUs-hzI8irsD2yCWW&}HLkOv*AXdkG+DG}-M&I~pumiM?q{J`Rj4dT3v?MyPi=*Hax0{7A1I}+Yl~VH zboYt`tUJ8`pp#cTf77e)AWSMAmeO=b^zDB?GqT8ZT%?g(!og!#p(X@1r;bzBoNM!i zUi&)pk;VGgO+EJ*>lpF-6YvS!CjudpCiwB{QE2htrip0az}Riwgp5(P8h+w0GR6{E zO>j~pWeo@X5e8F~b!ckXfVcVJpjk0(wbq@2-0xXg+@Wd{Co1VXAV8(fR4}J=0 zSM1gIB*4e=HkR#f)a*aVCZ!&*B%-wIghIadZ#CLc%zEayb=InzSmdkO6Wt~i?XjB$ zz3Bew?dewF=kkPZzaM_j1ZSlqOzC2xEhntIZU&E5@oL-6?`~4=DjgzR)@D6T;vLW=icE z__iQNT{o$At~B><(qs;K*EDxvxSPU7F0GrBE;Y|DruyYTHv9X=_OE(oSW-raY_%|w zyj!_{(7rL~Ti8S(uA?q3Hhx~hPM!P7(^)R_X%vzx-DLE3x;~XVu=~pg;pLqTxZF_bfR>MMd)M`OdLCn5 z`_vhAXXkZMpD+aO9oAyXVzSg2+=*>Dziv0aFMdgSA8MuD8*F?qy>f|}e6|kH3BqI1 zS+ZGbGu80dd%4`nXc{rQ!ZIup&KM94w6UD)oodNnM?Ci&Wlp(qql4jxprM#6J|?Q1jwmdF^qe;YWvB!GV#6q|y8mo5oQJ#AuX zi@l>P%GhWz`R8(v;C0yL;2V6XDf3}SPKt1Db?RXOe8JpUqJSW&fWG}(x0b>e@u1(C z=xd$K0|O^NC9T7So@qQ{9lS12{DqNcW`O0kjB1;Q~?>jd#A6ktV7;ZTzh!TPXW zC5Aa9x6r8g0_6VZFvP{ykG{_A3bFXK|9V#KxihAIli(rPBdD=yg2Z--T-A~X)9Ym2 zFHj#~*{2XHrUw403Dv20dKmPuaaA8jglNLSE6rhk>jggt!{GW6AegNgo%eq&R|O~4 zZwH~aqvZ`VU;%r2evLG4YUSik&-oGoV6F?xYG!yT7rq{yF;dE8gZ`%22AS;|LR_*R zI}_^;#JD_y$eoZ$@)7!9ixcBDM6mPsBYRiH#L3;0n04ye@%amMPJ#x?jPw z#0WD$FBWFOx+^iOl(Bw!zEY}g+-41_W!61H1?P*nlQ_b-q;5fO;HG&5+pJo;HBEkQ z9tv}ejN?q$3nOZS@!Z?gx`BQ1V=TW0uO+YN7sjHaSrqS^25P^_4W0Fcfz*cS+2OEw zI0R3=d7~gu1$}8@v-uMsi8ixj<9E)$!6O5my+a5w*bFHBX(CLwJG|*)@-Vm+F_FL} zm5rOTg~W^v)-g;$Xi6Eul{Oe@bl@?c3?3K%|0cSx{;8|immHBWJ>2}vECx0gtf(AA z9Q0_)FP{M~;v3lajOw$WZ(cI|bmbxiNgwOVqIjT$(;+aZoWmdNS$<>?z&v9r;IOO^ zJfp)POqf+1dq52bz00X42}f9#HyLztX#gJ49SEVdYUQiuE&?O^1YyrE9O=evJdy&D zBZ4AIBdAZc|4hH|%)-G;3(J}KGU_y968^*iT4X;Rk)JWDQYuINZJq|d930Uce3=EM zEXdj#5AY|;Z91D5XH_{`Rk(xQl}nVHIu)PKj#uFIM?Ha3%8QS+Q&}pWf->y>J=& z8=A}Fw=ain_rs(f#S$07t2z;99;{PYm$bgkC7t1h`i8`}%sEF$YeKp?Fo?(hm{HlS zoNt2=dib84WDQEz|3f3f;M<;>z`3C$=hTX71YPPL?RUkT$j5jPn%${4ynm{H-YrLj zER2(|8a&Y*3>)RJQRbw}I~gfK+5bQ8G?znEW2I8;RKBpv^F8Q%#A9Po1!`&+iRv5k zd~eziv_2cI$%~;QE2pjtBC^?&VZRJ);)NXy95*Z;aPQwzIr0^Q_)e(&xvDq63}hnV z;uQe6`F#Mbf1{?++76o&nN|lHF(p9#CrHOn+V}s30sO15cNcARx7%Uc53;TIJcTWzS=s z!&lm~U2!;HtXJ`B!qLe&kHYg&Wnq`f>J#O)T2*Ptpfc+Y9yvG7iN&fEGycy2&|$+E zJ14@LDwQvq^C?+THZ?Mnep#Mg`hFGQq8ga67J^-FOUW^Sy2y$cBft`<^4%dtBkm<` zom(Viq?9a8{&q!nXBToV*vRGLnZesfN`NEWAOsK6S2Zs9bqQ`C@XC;qaMKu}ILuh9lS~ncI-+%BXL_#B8qN;lCcq z833NfWyZoz!)0kEj1+hAHTHVDb3BqWbLhKpjA3*v!%Rs#=jvfQQ>|#sV|O%X4(F#f zF1pI7V=uwb4aZQYxh15@wTJ1+tQ`)joNELj7y;6D~UHy+EamuuHT^# zR>E}Gu4D)Ra9gV^w115#8DBd;DUc@Bb?eHRo$8*B$zfpyw-Mb6u!nMq zMb+R+wlYo^;7EJ{ylZ^^(bvVm!j?ISst3?HC}vq%jnQdF>~Jl}tncz)eg7mL;$WFF zkuV@hub^g3tcKhL=PK|?!(F?}hCYJ8W3ErxP_`$#j@fed8)T?)zi-4Sy}Q6oDP-o! zIEibTbOiYDExDJZ8E2)$)snA4y=uc=tT^YNp|v5LClgsg6c1QIyx|wye>|v@rq=$l zu#hYfVakkyT|`aAbFpZ(B?<_5iegYsBH-f|;8IH8k4R7Lkba5D*ns|d&CO~;c*f*p ztfL)Ev!YPZ@gHNOrIo)XqSZp^aG#UyyQ)f3#rQ``iEzwrQkW?vH#8LoW_i6oe_tK! z$N276px+nOl!U^g36hXNgQWwScmA7)*%+Ex)iN-Ci(}cmG=Ddk^SqIK!-#l4h z_h4o<0U}e_DuO~XSg3l>le;YUf#vFgwXD(D-p5`6*fMC(e#d40f#*k^*pLqW`_r<) zK;Z5m8RBgypj(E@{_b699Uu!Z-oXH)Wcq|3mofajXr02_xUNuJ$J4Dnv~tDZBIN-a z;=Bgtilu9_%IA(nv}*SY641S+4MI!qvOR-heu8Db@vc}bu4wrsY@lX()2XBfpP_UR z!;el9G?{<7G^?V+q`W<6G!1;Pjbi@(g7*sA_t5~d86A*!y76TkycXIj*mdBsEWUoK z4h9eeY%?nbWg(}&K6MGq6ELEvp~Eh6T)=L!Hj7%L+yB}`X2w4j6Ehy0Il09Bl>h!39Ks_2 zje-~X4{l}N&SeX2HZc<`>95gzj>!aBH0{K_j0r<1!*#}00+wWVZ70=6;%AGUU&C^G z7x%`?8K@AB*7+= zQ?SV-0rb`?VbP_(rhlbJa8wPT2uDc6bNNd5<|`wm~{9YhA+=ndvxYl&<# ztL1-uOm_Ge{OU9?ALC*RQQ%TUjb20Fo0Za*QnRpEXl%7|W_5ruvFPj}oD_C(Xzr{X z-M!Q`Q|dHnCnd6&VU zlvs6h=I%HD_zRU|^YQnN>l}K%@&!&*^Of>GBTHmd1G((<6GM?O=1;77Yy){sZ=^99 zEO#?HPI5F_r~GZS1O{mH6Fw#~mid+!A8 zT=>Zz_khH4J!{(iT0xrMkj%pv|9Nf~gxWeqwUcp;np}UQCmyY|?*-rEUuk)Nx2|ZW zD)0XcV%q)V`5T}SCU?ql5;H*)HuBf^rv?`)SS3{ov3z*EANu1aveLmmLX-hXw4?3b z|0wd7JAc{boO^;+$AD}hTU|VW#r(+{@E8HR^kJx+Crb=NzEjUAutGwJm3AjUu=@oWilnKWTOvd@@p(Mn*;})0=OP^cT^C> zD&cnko26IQOA$JE4C4oG;o175`Xf0 zc;AkHZ0|2rweE{K;#9bL;Ah$TraRZ5NCKYzm+ncC@$uH0Nnh$(=|XQh`7hnm#LJh> znue{C+!QeQvQ8{LwU(r~$8B7+hmYK?gVn^3s71887dCs9enwZsOYhq%fG)mys?$f{c$+#U=C7X^Dh^s9SmgrPN^;Gpmh=yQgK~{QxD*^wiKzmSTL4#=K=@R20FqW z9m`tRb&@N#MxwFb$^GMFWaHco8u9c04E{l3^(2jlV?2OLD|neC3EuvrCUfsxZ?_< zEqjJPul}9&^2g3To|e`qDi1W+j)wBHtIl2AZ47F4u_i1Drp4o=pt(T^wb-&BPaZC~ zzMDdiK_iiK>0;tgcD^e|;ch|L;ab@P+x>fs4?UX35PuwTp#T8RkECTac&@!?K+o37>dKi>I9sH`tj^6#6)JHi{pq^kY-S>iCdAKa!0undj6v=LpVw>nVo-0d{~A+sOjsc(UU3QRQT|lXPpD&S;F>J{ zCFC2@EzHfGSKB7krCqH1Mc3|E%sNLNK*?RBCip8}zfu$}mSZOk`J^rQCI&$Uvx7NT zxj4#gvW%Rss0^#!$$e#nW6DZO6%6&tgfth7Ff4&&O2TF|cq9nmVsD_@)h6+KVf1oo z3w%c7c>~uOSK2g)eyhbk{B^5PriilWcqVz*UR5Z=G*4neAhQ($>}^l{aeYg^MkGx(b_Ntz*f_!k$*Op!h#sz+S~Xzt&FO`H;02 zSXU(`-h1?qiu+NS7}NS8)y9}z=Iq>DE8%G_6meC_d zLlv=Q^**rgC$(4o`d;?nMLp{wC1{?vBDWEl2#kp4F{hZ+g1;x+U6MGq45$)rd8WWP z`kUnQ>!Dq-%tFpij6o6a%iwncWc+Qiylfb-p8!vD4=7yrynvZ{#UZ+bbhH`;?$sMf z2Tg>A(Wn2U*U`UPcD{HSuYh75mi#}WPRj1z!ZVDbh^UxW#J0z#Fm^5(gnPnrjVZR! zGY&d)!vE<3OmFlWhkEd)9K@!4qG5-BI*7%9i%;V;qzNCH98+PPFDIOzfv0Z%(6`2S zzL-~E-`naQz_j56f;a8Zc50F3OPC@*6)TZI_|O3{u7d0+Hcgjrj+~!kRdfn$ zC40uV`W|OGU}Ao?y4Ndm$;syoh4(uQJ|@7xzlOxmdVIhPj3h3UoNL!%yu4ZL$nGjK zSX4@P$%e(JxMPr$LDvZV{IE|QCaoBd>Nik$bK}SYSJF-Y;c})X(W2J`TiWW#Fa399 z{|3>#HA%bj_@_9}e|U*pQ-K|%X*~&*2AWLG9hi7ixvXtsL+-f zRg(xhsi?0uo5$@#jDs&O;K(EV)O%mgwHf?YPQJ5qnS~FksLZELd{;?80hIl_VRyAc z38K(@VJiw`K{b0czg+YK_w^Nb`XK)dh@reY2Upjr;%8E~tjV=PtILniLLdMx$$&>a zf8o9LbL2~YhhyfA11axH5@`vK4BaBprJw>0OXTG^35tmBF?S1)5=j9kAv*EBQ|gN|h~(#lM(w@(Z)wfc2Hq@9Il%`i8flqlgTfTPjsu)ryG@id zZn3`sU@jruAlQd6DjIPc9L&$T!x}sgMf*#4vvQft4-vq(O;UecWS*it7&VaueQMFb z0Jg=CSwazr=$9qNg9#50(doYFN<$AfjgJl59%kwY36o2%EmJJqv!qgWbHe$Zb-U@d zRDA)KVarH+>HJDPkuy>vS^-P0aN=jexUHozD+Tb%W~t>&WRozpWx^1@Pjb zm_si~@H26+@Qf1@+2)q0pp&3tE^ew`dK~*POL5GpZpls-1s6yI)f`{o>ZD+9qR+>>6E+)rH7f% z=*--P;npVEbw5raO=M}|VOK{0CrR{i(RQ9J3UxTaq1N`wO400BT+?j4t8D2GBF!*d zV3nbS$0n}Lx5NER-*oR_*-S?(nnb}g>IU&*Y_c30{b+H`tit|6LFSfUdG>=@_!5RY z59fX8;$i1jvU*^%2`50z*{ z+#!v&`b?(^`eUubhq z8b+e29@FayhtwtiUg>ot!pH}sy$vbQ3Xa((G}APt;+gA0BAc0BAk#Lg$wx3s=-vF3 z%}~>0-zi)a93>T1Lrn~CtYZPLtm!*NdMFhe)K-qk36w4U?IMq4Th7f3%IBbVR&nb~~<0|O@6}|K$`{LSbk~U@= zU;I=TLWe)*8do9BOZGiw`n@BY))UGHDbq{t)PcxiXwgDb8s{7ebo?x`ce@30Nrcr1 zYmpRLG&-y+*3Fi(S*)(|W{Pytsz0;@#!v=>FCBoF)W&q0lyMJ)fFM$-ptU7fv) zIOG-ND2GFHqdcM)oBn1Z`!gtyKu3L0d zi6Rm^Fl$cs^`7VVZC;-2XSz#!Xzx;tc%g(Mma8$RCi{311xZarH9ov>^@9i>7L2sw$m(s@J!ht!xZT(rZVm6<}EJnd2asdv`EF-c$_S*;ZiGsL znmX&Q{)@j*xvHdjV!-=ox@1U_w#s?sa;Bv;>{cXzeiEYMwc%6yao+#u$u_`n^P!JV z?AzU2WZ1^je_7xUEA#p|ol#PU(VpEK%d;@#xD0wXDz{YHhK)#)c%>7#^t_lsbym5w zl6nfe39>9z^JmN@_z-$?ii!Jy&0~+g(yEp9d36~AI7)gB1aR7_^$&l`ps<1ib4QXQ zT|LE@MsKEQOiZKg$Vk4L2TJL?i?>sK_1e!{GWh6Ge-z~>0un|XC(;A7E~6Iq4^*O` zlJw=kk}WYYfndp`jfW35$fV2rB~iukq2m%9!Go$R3^e6xr&2hCpnFXO?1uVF@%_wk zlk2JQpOzBf*f-cLUGtK|i-+i~ulmMCNoMJ#ToXscu|{W4Yo6HueHe%I?EEQ`0p00v zn6G|}611$Mx3c0UnBaux?VW1eV#w#R0?yNU^|;}#Wh?Z4JCtC7)TyP5iTFC!!Kj(Y z(W-+mpSohThYvHze&>L|mf|Gs7{?O(&T#SXXY{vBmr1v7MFQBtxe_oB(Xkbw9i8~g zfM6yQoJOylczGj}(k81?61IHkwRa)F(=?S*h5ZmVNlk~w3N+$ZR7&)FNRc{rht14d zl$8fFB&vO^+*pUz>PT0-i_j~((v#c4#J7PFQF~Z<)*CvnQr_z_sR6X$GI$6NoKjO~ zg*U~?XYJK)5vfFuQWM@D!(J{yRr5#9?lX~!W8v4v?*tFyCKE6z``Yqb;OG;>moW2e z6og|x=q(RLpMqQr=9vn&p?OE$R;RKXd$;(-;>@;WoIb|rsow;pP35K=EQrWVr__OO z0NXp&QyB|!b(6$I%Y(cylS|3%eGJPVD27Q?!1TkdA$plzg@{(AJgqA5_6i>`LE7M- zrPJO+NkYlw%C$W)c3@zCrc7U7wlUAY9MXV&Uz_YhnlY`eL63|*#>i#{+ZH6+#GPJG z;U&%Q;i0g&pazE3O11Kpb7vwMl<)CQA(=Q58911{`+up}>29FX*C={Ni)BqE6r(i; z^UwO6i~loHu4)-F^}ttrJo~Kx81te&9-c2$mJK^ zLlWYDKH{Xs@ErDpojw(wHi~z9%T92Bc(8vyo~?pPp$@1i2})U7;5aM*;N|9y3Z6m` z3Zu45y~pL?5wN@#PkZR3i4c}%UkBIsg&W{plI6di!6v2!=!MH6nU`VWffLtyLSLl> z5>`kevWDFNIpY)mOqELmQiQq-nMP0;GiiV_M^iHPSt#SUn;LU%oSXu~4*%Cwo)$lT zHP$z#*D$w~EvLIDINUMLWNtzK8QlQB$2NlR{PHg^5v>I~71xt#RFnvkBl_$w^;-ne z7kSkOrE&%V;GxWQdUEt}xZn^(LXj8IzxJ|Rsk_smXR#EoPJ?ZKT_<=K>A6lsa0pUG zpL@$KXH%4|xcRa&z0jnd;;L|JeLt4v657-@8VdPbqps>>gbuAu#XZ7YGieVdhP-;~ z8dWmNgaq@F`+dlr+koYR%;f1%U=FM#OJK};5HH+GQ#E)UCWEWG z`C~p-fg;!#AJbkI-#raz zI#x4fImj#RD(POZiqU4F~q|xN&6k}R{?>a8v_Ce?l ze@)kSexYNbIHI;;v4o7wRhQ8i9m?os756W8R;GHSbuN@wP&tK{iTh7YHG1#-Ts6I_ zkKw=%qntB>nQB_ok9%1|xA)ag|6v!#?qmge2?S&dHp{8s4?Yw&~tpj|zw7B2ClZ+a>*`TLpm?vq7+_3lHEp0JXDkM?g0HCt)8!BI69|HabiSI<{A z^KSl?g+*BNF6JU0W)#e z^%wuXaD-Z!qlm>g+7GDb71yJzXdTVx@N?~K$ zcWps}dB~r0SP#Byh>PhKi};I0SHcIJb<0Ada{(_4jA$<|*7V5COkrS#V6llTKY<7H z=7ZuYkCXo}1n!Y(*KJJb8h->+0HC`R=K}q>v}BN549&#}gRL*g{STz@C6;9}r=VC8 z48e>B5Tjw^8=o*4Cld(W4Z0F)ss@=O8uW@T{)^X_f3CZ*&;bs;4B=@1EjYr~@};av zuH@t6f6{vP(sRMdUyb`V%pbb{;N(apWt7kxQ}g$qJBvIzh;ly`9Qx*7Gc{YxoC3OH z*>E(@pK<(hFEGsSc(B3tTsi`4UpA$gXEO0+f(tt<_>jM4@cS;2`A&u6W7 zGECE3RwNs6${GBQWV@9WKV(HaG&hP z2q8fIgr8D%6-X(I@=5tABjftt01aEV(7pHQvM|4_0&}A`g(cyCb@~yuD%Kil98>8K z#{%Fia0jLFu|*1YXfY!a3(X6y3&cOqwc%!Er--kbX5rZ;DZcfk?-4Q)ANTePUkY@T z$tv|VST~QpdAQz|WCfk4$z;dmO)O8lQ1?M`Q((%^W#t-|s>mFRj6^9an{`uj%>Xn& zO=CmrHPKNeh}t7kx&(OO*oA1E#$>-uYitMu{Z1H1R|2c{%-vGE7{VI428)pLj{BfP z72p5I)msKt^}g@hN_Tg6Zo0d>d(+*Gf}|kbNOyO4N_TfkH&RNMz<>Gq{$`$;=bdkK z_Q3XD>%OkzJkA8FePBnOv}Vqdb^y5um7>x!dv02irK7>(gW8-A69sur4 zrWS4F*aHLDnYMnP(_)^sCMN$zegL7FbMCY>hmg;iJ^%1bPlaKS9bSIexYI4O9osoB{;drJ)Ga zeyr#`2gj2u+CCVEBW$gJJ&FSyIzMrdjX!4dI3Dw8cEqj!x#w~EUqV#c73{;YndKkr z#lg2bbs*tf;#UG7a&B)hCT|pYtnY+_QGB20S7l-j?nKv8fG?wVYHQ=^*w1cN!^}}( zVZ%&-9>48a;~Jbb-~5h~OEvza@`pyLPqAh^-sR_wxSopmqAgk%QgZ@g3U%St2$sx0 z2v)uSQPD*AUWU}$986N_0+La~g%PU@9)rN4B0f@OA3h;cprlYzF+ums+EUrF{nX<< zEON|tJ<>rQ*lRn=Z}h` ziC>$in_;@Q^#)Zv`83c2;cE`{SwuZzN1xma+r+>ak0%>s17)013PF=BcUa9-4S>z9 zyzwlKukBTRP{-ASBKan+W#m8#J<}md#wS{XBG>iINSGeL_uy-xY-2wH+yd1F;argMT~2d!8j3<`tS=&6co;Z*iLW*OE|(|%p|AWH%sm+WWq_QdxuC{ zQeewr)J|WrWwYGlp)t7?Sl^ScyV+}LL0aiulhmm(#;&Un>V#92=g_dZHb>Bm091Pz zo8y!lXT9n2tybZ&=V#GV$E;RGpRxJWIyZvHeeildkMo6zjZQ9Dz>iySfq-uZ^C_zN zXO&mKH2-w1nKG_seqt5!>SP%vnTJ{YcnAb1ky1`2Ng$I4W|ksy82m%DE)51&z^2)$ z6A|;!`~_D1d^fcxJ7Gb{YU6#M7ZL*3bWq)p2}^Mgs&_vK3`!G)5&tyeR?;+iGW>O^ zZ)2rv?7Nfr(DNm?>8qZfjI z-CKX@R`{gxRn}3rN>&|-+xi3-w;%v|Oq`F)5*q;Qh4NX{+W!S7?hWE!6Fr)ybH}+o zzWMm4z%!RtfAR*He#MF`X5|x}oy)>^!a6VNb1%p@DaKQxfOQ&6TD8SKM~!WiZ!_fU z{`~{TRag85|}0KIutKnHbUU(Hk6nLxdwDkf`oq#Yn59Zo_AbcDlLH5f`&>Yy9)L zb%3Tn(1I`9^XFH@55vng)2*0dyv*FwEbe^o;`u59f%_&tA(A8Q>*vlbEGcQw&)k-r zc=~!4{E>e#czKnp|0Gy?YS8~gU|9gx)BU_3b_NTBWwRi4{yjpEPH(&e@@v<*^92zz zoA=_reWLPWi(d`eaT!Jg|2-Iz&MK>1A63A_1{>w(ywQ=4Q|lh?FxOoo%`D3Sq*Z?( z8y4TF%Yf@!1ut*d%(s>}31bk@5me7-K?HbqjKgM_5newK_RMB+xeh@K&2dac4nkdw z?NNTiav4)UV+X|$^}CuRufCCIx!8S0aj^slL|fY6l~n<}W-9&hmoA}2(a}e2SD__i zCt{P7)6%=ZN06AP5TP!>Ut7Ajc(&D?p8OW5Ee_K=(9PKt9wL@jYo8h9?B;-9mVHjy zHwv>7dXVm`883w~-Qa-Y-WVwzfh{m*1Xle)s6CN4n0+deu|E^2;*>mj&Up*F-1;0L zjpY)s>&QX}yN78A*$SqJc>$O>>oaD*HKh2;i_>Y8DKt0Wk2bC4DNn@qw8FQ&M#l$z z<&*bTJeF1rG1prYSJav568d(w1MC@Xf`ek+_koze0P3q2V$L`-zj&AC99mvhM?)*k`Yy}L)#*qTe2M2{& zQts32EF`OX6!JXNmWq({XV^ftBk_o~CHqO`^YjA{92Z*mqj7yBJfe86iO(rKd_7?TE^#zTv! zUViCG#wEMrMi)2hrdXz87!n1-@F`{f8Xs9W?r%OyAC}tk(Pra3;$<_k;Et$J@{5;0 z*#^b@O}K5%=vW}^DqqVoQ2K2@RDEK-xl%K|f{|vmd7OTBjf>AH5Rs9dHc~5{~4|r}lKXt184!8W=)#mq;OdPT*LkI3C znSZVgr2b+nA(#vg8fEP324p{$nwpL1>A(bURQRq}z}@7=&tJ32T0##PnWRZUPa_#c z!yOH6I5nMr6jl^8(25jOMDX+Zm}q*7sxInHUy1%y*6oDQ$H&`@Hjn6{=_sLP5T4x>6Y`MK$)3XH&3lA zsACaPN(6;kmX!rV-b=BMm(x}Os?%_{B~3r+2THoeYkdxu#uo={u(lDJuGcrKLsXuZ zphSxlY?Tl{+t$fsi9Fn%A{;_j2Cex~dEoTX?qR`cJc+x&>?LJvwpPiRaS2n>tYYLC z>}W8luZe-+(oMYa$5^&FwvmPUdgI_)YZLL6AUlpV%B>xohy(rAop=QMh2;A7ojLW? zB!Rqk>KO9+*4wxKOU@R=%6*5HOGeWP~-$-8id7>bM#al^I$*j8ZDK1RFd$+rra;7>Fr8)OAX?&UH#f zV9BmQB$e*5QPHCivJMZIN~1fUi}}#R`TmG zs;<2>&ue!x4|d^QBk9Dp89`|HFa;78jq_m0_`$bsgpl@4*?$A|`kAv#7KKAK z1~vMq=i6?4QQVLlou6Ut0}Ko-W}{P4ChbowgqF`MFwVlh%12yl9tFZuxj2>BY+m?{ zl<>)4NH6!TWya6e7i3m%EJIVVJO1PxOZE%RXc+ED9;?JIP|}*6k+cT`!{8ZR*lkMc zNw`1eNKkx2R_M(8hIB&b*i}VQWheaz9fAp`%)N}ZrXm$$VQy3eu}I&}I?%rZ>pS1j zymuzd-{~^Wq(1?;W|eusg`LEKSJ$hn_Wj`4n9ZJi)rm7bTt*_w)kyhF>h^4JrXq*s z6ayl}gTr!%rzfm!xz_jxS%sr{K@Tz7+&pk2iLlvZgt+L}1uG?ueJ`S=pvIu}%IRDj zWPccEO236+$SBZt%{Z*&`w$rXZe31$C&$U zqGwo1P&YP8xTOazxJlVP%)T~~`KcsB8)6MW|6BiuefF6+bchsRO%S>0mtlPcSY>^U z7C23qV`)dn7Ve8T>j_091NQiAD&Ej~5^Q@`L6X(Bmad;!)Y{y%OE;G4pJ~z&X_!l` zI3XE_MPq;9oUwbd+o#aR zP$&rld`{h-0k5DYOE6HZAD$+%YW$)CXrAW5|~a-5fxffFe8NJz#GAV|3a`kBqjco z2LfA??RJ&IxjsKn&G>VrCs<-C=H<*UmV7JqRQ4hJ+58c;1ujXX_vM^KMA)V+kS0`J zn7Izjl!3#|r5cUy;MvFJ2{tL=3vtGBJn&}aW>eIcAKyomQSHXHhg(=|`uo}u zE`~g04EOZa;A^=P&F`9uCpYg_Z`j6PIA_kwd|6XC6Jrl*ruVk&)Ln$HOwX3}pDPga zX6b;qIeDib!%yYkCMr60=Ii4D=aC%Qn8|eFmN_L6<(Nk{iBh^0j%*C=InPD7RPy`t zQ%XaN0kps&K~Emw(m`6HJBg##cK(U?yL>CTiEHG?9yDw#_I*B(>>d-GQNOf7Mn&&l z$KNOUv0vuxeoRdbjyd4u3(Egstql>taOZR0Cc+DG|9=)$d|mGQznF7FQx|4iFKV9} zLeM=R*2gB)H!jKq{Z`Lk*^@0?m@tGo!|QOL*Ob516BUmpSAHq+vymFCL%NF_fYZiL z%tr4`VEcYhPsQf`=W0*r*XSG1b?R_}nd zzpuly2kf+>DiHz3%?KR~pGRi*VRy!-`9DMyV<~DzarO~}$N9DixPl;kuHG@y-^`U^ z-z`gEmv`z+mD9gk6q?-h{m$rmm2O0;ibqCh$k}92S@c&`q1o@qda#sV*bq!tJX$u_ zkBsgM?2O6YiHlIa3Z)0uS#oRSRV7KpgXZ3aC0+J&D9)ko^s*`o{Vh9ubK}}9qm2E< zWW*1qEpGF`s#ilqENGQx#%Yx@2Kul8ZMBQwK*SP+0XCv}Z;!|RjtSO&O#m2r<>R@j zy~`TAhzXI`UstlNirTnHKftmTdJhLjHc?*TtxwY0(1?DO&k1(kGo3j{U5~wurYE+! zTkyYK;>=4rQ85S?|5+SNWB@#q$_8yBj?W6 zm2F>Dc~bRqe-lgYH3{Y7{dPswsDw7AsH@UN22b&Vr>=|)-WWxs1J=952z_gNBI7^w zoa*5^)?nY!KZ*q3>!9hi64Y37ddrs&2%RF+DLRXypCdmm|5OS}p+EO}j2F#TuI>KL zn*H3>N?P>E*<}VtTxn3}w8Zr*hPl-0c;-Gl2R0)StSL3_26tvW6(8UQu)9|YbD$ap z2k*f}FMO7_GVyKskmF3xalY0YZVf4siyW59#b2B=Z@}9*Y01C~3hz9(Cxl0ALQesd zfOX8yHK5pDknM#@i!U|Di?fU9OW5AwxevDlCYP%=IB zXV*O6l7#Rf9I#6*S)dQFpb*d-(pHDlx4oi>Fcqsw4jLdNye5k2ML^dx=}M?}zsqr| zyctII;>Hm&Tokw>PEkh{PRAqhU5^tX@nw15Suh{)enq&D*#?Yj!t}?j9AVFz(jJ@S z0$#&^-)zDKyVe{o?r}ObX`Qq-6^~A9HdK^GDbM8%`y{jKko;eU<~2PJ=AJID?FwN zPP7ISexfq|jySLb3uRVf14cIt$Dxb>GblxD)>&dqkcYe;FtN2SA(WB58Hg*$DbOGVbRx*y!h z@XxC*a6d{1HG8W6rG+e;A#;E8z&?+x$8j(O+?f!^6hZ*tRkT4}3)K~gL-4=6?YxVo zDC6Z@H%H(cu5G0wtv4X4pA;aXCJBcw+ztaSdNTudH{D+Loj z_U#IPB^z8{-QhYv<0P|mmdYDI!ge<=){HaZbScX!+q3-s;~bk(VJ@F2NSy=68Xq*u zF_7<(J)U3#NV=Jr3DEa{&q`^3sT&O{^;qb4X)r(z_1ht|tt0oI<;9SZSOze& zJW$2fXG%Q}y8=#Q)}}Zt94z@cZA3eOsXcpebLUVqduFHaQPhtUof+?GQ9Gf}-THOu z5*LYa6sogxxgSTjYuZH)I|%u1L_iww{Pd;1?6*SLF)3HDSzFxi8x@f^5)&QTN9T!I z(&LUtZ5mp(6insCKAu1|B1B|^4}rOUF}gISUil*u11W&tF9|3y+4L7I^Pkv^*>i!- z;5xYJD>NS2JJqYJ0Yyz&i#Y^e#Pbb=_i6nm9^|z^~_lnxN9^5-zov6l_uEHQvz5o@2GLh_1 zJdSS;2i6uj^|T}z)y4?)amH*y&ev4vZT0cPx>Y0B8oKe|5peq@(vgk7ds+Fcy2`^M z6(2+G$I6E`;eh2xEkl?(z7Ya~1ghnmyP_Oo+Bp<8T9fbnAYNe9*4Lb;7r%$IonCc; zxe3h5-P|Buj7X4pe=Biy6T+Mmni|(li=K{>RT$p&30SEwLOvi_9s$UKTmp!!TWdKZId^BqH$)tW4b46GzZ= z3T7FP<0<3_F5YNYmIMcZ{qwNPA4 z9}=_**iKwJ$O?8j-@7B#G{cB|*K&WtX1qnlM7r}>EF537J5wt=Ogb|43S6;8mboaF zgFs9;bj`q&{{YAN-}JWv$^14?{OrCvGNqUwr;(LXd;mLmeHzWwHfLyA1%~{t7dm1J z%~iq+JINoiA3($r&m2n9^R2Hgv*tX8;+*9?U+})*-BmQ+)#PfOuESS)rKR2I!h>i) zlK@Ng@|im`1(g|c5MOI7=HhVw=LP^cf89JkV|_ijRuf9aHa}ap{G5*ms8-wA7oA6j z;1!fHu+#(-4RgrGbdd8mnV3Tvn~GRz|&b_OnM%B zHQUTz&9P~U$tATBz?=gEiQBVgy9Oz(&T81T8C|p^YjEM9XHRq{_Y|;}J=GLh(`WlS zKF7iLuK&;()zS_uVu!rDAFXnG@*!-39DSoFH8nh*^IC5uka+NLOPCc)wz`5{FPMSyUUfb97yv{Z?(sDhE{% z5Gu4&HOhR1t@Smap1rGx$#6ww8q93*{QA?_q_MfyY36|8&phY@nMdd5>}zzTld(sm zcyMk=V@Qu1sAEZu=?y$_XRrYscPu@~I%GS-^ICAGx!zHjDgA*(TUn=2qY$WQ1ZY4~ zA~o^XrrmMWeN~)uy66k&%c`WMBhp(m($S2j{?fCDnGLJ}r%qzRp!m{u!S=-3I5e~| z>U$rg^#CC7R?~@WTd1ANVPXHq!hE|a=SFlTEZ5FSkV3gjT&HNlHFHA92b}uh2@S9U zbkclW9(wwXM7lKe3lfq0$@ifgfKSazPukI}X6^#rE>IjPTce7~zA>vVmjh3A(^T|l> zu)j9P7DUuu^|1fbxl@Pau5+pS#~?b~3VG*WdCrodpYp>1o4jRm(0AR~@`@}~Ek1s^ z-@GuP93=XUO}=K8n0P;oS{BKBMMt#rN^FzdL$<6;K# z*vp4<@n7_ufv7Vsl*Q`LjuQ&}pXR2+>g;h@QH0Fw6JAbH%872wz(cMH5%~OAe0EhI zD__b~es-9cgw&?HxDFJfFW>Ya0*^ty0SL2sfSXwu84@=~=!qi1sa&e+i0KS#{z8tR z59}+-bd;I}xgr-W48J}_>!vyoB4UQSKC${#rTk9vORHI=^p4QQYH~a8%$gC}u@Y=} z`Zt#Q8y_+bjKxc@J@_+|%e2S|Sn0#XEEriD=T$wQR~_uRLC1Fs>e-2KTU}GgPRU6G zQ}W*Zh`zVs-5C+(H`@~W8=gAsTLR|A?Q98;s4PF>ag^N>k5HMkw{_ zuK52@8yO5Ba1@ofKGd1D%Vk^^lGm>X{4Qt;U?5aTxz{t4g6H5YPWdWMXre_;ZdC*x7ymqivi8to8JgKd~p~zp9J%B$=B=nK&8048<`}$J_E}-k&ms7!9)a zb*P3=1{DGkKZ6g}XapJdGM0yh>dPR-Ms%w_g&0)eV%RZBrewGslSt_~EyOkUdx)lL ziU3(D7T)Nh2pP@fl>fC|Dc}{tYUwS&Zl+-~wcg-)V}6HBvL!ApQ!XlZOjYg2{1{c+ zCfk!Ap9+*%b>_fU7_w-eHrPi@k!dVNDYi#d+pFu*b_~?(#3%}JGu#El4tuTyB-Ejw z3OEF+_){O$8lPhP^>N;*1q77LQb8~7rLDewI0-b2vJ}cCg1gd`Zd9uDcOv(rB%ld% zFk06^0A2Bx0u&M=aBr35>vo3iq`8~7y9%c=+njSVZj7T+PRGOoXB}eTY)L2^e1dxHM_-{F2x-{W(md_UFXoJ!@~EvUbBs+L!7D3ZElGgyyOr zN7biI-#eR_He4$pI~6g8X;teNmp=b1EjnJERv}vEPN)f9Lj&8+WAr&0&s|NW_Ip9tD6|{h!J=r^kYqq&T@7@QE*>(-#6#Wga^q8Z6ABe((H#U+c=q(JHOP73&S{!0T2v%K>rg7RG`FQrF zfS03h^|=C>F&O>hoPj_{1Tiv0pfVTsw-33>c3dYQt(NW~Jagh^`ZHJDTi@t9V*#*v1AVgP+Iql?N+DW(}e^2?H4`~wG7SOT# zfdfQV^dOd`iT{GvUx-%@AJMR(Bnq!*cIpO(4vBosr9gke>G6FOpg`eD4XHZp6yhcN zu0yfZA76&<>KFUxVc;&BtkYKU$ho;EcbaBgfn|eQ0C^B)pry-}@6J@dTUCb|C=X%e zR%WwaJ%1P`rcUkdWW~F+UtmB8759NW`F22JG8K-OzMW%eq zi}J&B=?9)8E#HB0R^kK^8{2re1qWc#q2dd%LQ_UXitON>n}Wd7TIk&H+z zXAlLW(x|W-_3ot(lIulqtIyv;rOcDvmHbv{e^Y5AQhovK(RUR=1E(=>oaqUSi`l#S zpUwG*V*mCixX;!CJqfX7&6Yn%-<>w_7?H*shjb7~C(#4l+7jak8^!WELzSjrVElD+ zRIo;pc?(g;C*DabZJ8;$BR|~@s_Ede@!_YsnzHi=@@?(&sucTSDr6y|AQsGE`1k?! zbR^pLyd2A%?KYgzn?f-jM#9?Rq=_baAo3<~;3`pH99W|F2Gp3EtO!6b4L{KwsVkG{ z$X3GU>FKvu4foQ;VrkMWW}O+g^}mqb8iu^gJdZa4&LQ2xtR))_i^7Uz zHvnGv8_1Km^LpO_jIgFjyloSdCrfaz!lQoOVBp0d`ZPjLnYw0W_vXL*Xvbi4i%5K((I8q7 z>0TkspM`6jGb1jyG@e5RyoM@UC7x;Os$Vo_(9&bu*(qru9HkV%MtGD9VJjgWVf>cU zpsS&MUO7{-Dy8q^sz7L+&JF1kO4}ytC*|L?b43-O*_8R-*)jRKBOf;*$#Fq&Q zntFd&^_&}^&o3U~4T5G9y|>k1mYwaE_7+t$`Ng%5-HLIBsxydDoFJPtZd%afS0Ug~ zaCGN7&?)?8ZnW(hYT%oZFb56PhIHoaY2`}>a^@E-cln)^-B}p!o7&Hv+GeJdHvhc( zo+jS9Bcd)M^12YvIB0@IlTKhM=TLzxWR)#2LCyBVxvakpWODWCi;X1Gf1h046t2~W z;ap-%udY#s z8G`80s^T7IsF|8cUdI#!-9lRWl9knClst_%+~CjHvz)2;{R=1I`ozp12a2DKQ^Rlf zBQ~D%iC_#eBKZAwTZSh!vHLn!!hJE^Zwg&qi98$ zr+JeHDs_1VT{Ve$Y&TMAzCx^h`#?$=bHJ7<%s;6o55FFCabWFJ!xd5*m+5C*WF%uu zFRgN|00t?Js)PlN^S6+*p1}*d#`m!=8r+9Bm<`HK72~nP1R8MZxaQ&_1Rf-iaZMT7)2t*~X!-c`ok%3J>_h0dym*0(LxdB1;np&zK z9^w!IHs4&?Xc(o%`pCZ+-`%3Fd%0^sMKo4iLN)(aw)C#4;oPP$$X6&p_bdS@12 zJf-lFox;N|gkj2VH3{tEmL8vUChg!_B+#+O1CahE-MHzo6d2Sv?J@q*!qHPY&|9q)g@8ubG z)ORXgbb-c@@G!Y|-ms8_`GXBGZr>9-#2+^_bjEL|b>^0SI6~z*eeTcci1s{XM@k%^ z{QN7tl%nnKU@K_^fB`lT9c`OV0*ZPI)(?%itLII_jG9zFhpA|?PJS3656pM%yvWD( z7g+78Ckix`$4^PAg zfiU)^TX|YBwoZI3p!*tHvUYoq`0G@Hx__-;?p8ra{NTXH_4b{JL;@$<2u|H9q*w;< zt$`$T`J%xGPvJIz@d;SAr7W)vC#T!1p1R$GN+3%ZJzmp*td&bRg9-O;exr-$$@bYn zRKSqwzbe=rQDFJw|C7eo5M%&?E>)*Fu_`Km?CQwIM4tY;rnkY!pt73h^$-|9xKqa%#E z#^ESmNr;;`;^9g3%0Sdub*8Cj$|?^Nd^&)%3P(ubw-dRV4f{|s0&ORC(^eVynPQzC zMCbZT*W{>l#J}~Tm&pNJSOebVca}B3+g7}X7=9r#vD%28_0?2KbK}Nen+01`ECvm? zJxnQc{~$7;)GV-n>CI?sJHeFgvFvYRruu7?%Lz>rYG{SRu*WqgpD|a&xR5P3cP5bn zUJQ{7Pr2IOX$FBz#5-=R!-tf%IEP+5zs`8%-HN^}=^m@D)^F$;-1O`yh#0`k7@;LT z6W}>ErWK$@w^}i({9*+ry|gq-Y6+pA{o1Kvt>xa-gp&?Vs2|I2s2+;_QY2N&>H*`v zV;`3}g|f&)mF!qwN=L#PkW@I`nV}6Hz**dVlm9@7*|Y zBp%`THuFV)8fmE)qXOK3`RzfN2J}J_%049JwDx62vftziIn82F70Kk^B|5T(GMZ#k zYgLH|dD|wJm?XqkSjvZ;Oe(st6Dc^!3O>w|u4s}RVoWBmjwa@NKtU=x#*#^{DfwtL zoS4;sr0mP12c8s-xT0w_FBn`oC*dAm1!-@@cby%T&%@$r{P$*kex6L&i^$z55BUDTnM>6&_ONd(|_ zY%vHhO;l5?U>b_~m&9s$7QBSrpIEEXlZqpdRb0nKZqVKe8wwMmK|=*t#xRdXaX7Hi zrS6ARaYjkB%BCql!NpC!DLG^MHo-(&tpPhR|LSeth+dGpdp9%s^- z-;V9AXF5#aXLYD!?FWm2P*7u$<+$VIMjZ>8I?*sv@>?+Ouh>!&Ul}s~?NzmO@Ax)Z zBws7OIy--??+vsFgi8R5EIf)_!Q(+_tFljh3!=jm-z@3aQlAAn2H^hlKZ3XO)j~b_ zbx=+=4G(p~R@k_KIjt!!w5$^y`E*b+T56ugwsLBu41SvB(x2_hr_^5?w!WlVoY4-4 z=@Dxw$nSIK=c-&AIclG~YuSUraLgjbX zWy8t5M-?ymqo5;Mx^}=E)U1&qtdjPsky0!UT-daf3(N7@B#8b~UjrhgCBL(Vv~8IQ z-D0Pa3#(v4#o`*=i{&B6Q1yq(AXHc$8`26tRESW@`aDY$?@QT8Wg)j-ZdsYdjfZN$ z{0>xCXfv1cFu4Q`_ao8%CJu0%RoZCf;?p&WRMhK84(7Qg*$V3%ljLf6(&V%JYltl*~#RCa&bDpyeP4!m{x~VC?eoD2F=jteGcWtN?G_dA7y2g*HzQa-32OgAL3HRPn zjqz0G_w6KtW=28LD-LG1Q^hz0s((*(+i{YfcQNhyOay@JuvQRd@P41eY=7TJ=a z!w!eCh?tmx97P**$;~emg=1Gkk?9H-ni9Wg0R!(Ps);-4V(*`+=P&gvu%*^t(`&jn zD|OzZL0CR-@P~tw3}IW|2%p^QVoGD$*VW1l@S2;=8;<@1tImYd3Ebn0=64?-|4_}C zIrYC?hrj#~Q$~1EL{5YUeKqyRln>t<1Fq{@y1*ck3GnqTcG#UO_-sUeS&s^<AVUw05xB{&8qnjsE28ncU#>33|fZC%A%FEmebM z)PAj7n~$`3P!e@#63@nM#d>(0`cGD>HWae{uM)hz=q&zSK;yh$`vtI(~^k(<3)Gnk+QC=kvD5m%iV_t7YU zCP+ESl{^N;e7ND;K2p4ymlZM*K-qzE^6|yYH0b{mn=UOKf7)K9TWZRTsoa(6gy7ii zw_y&Pmq0@oi)S@!4>+{6ERH|`F`5+>S^ur_^AI@CuZkf5Ivg}K)2%|r)|vUBiiS6# z{AzqQG+*8r!oWo6aA1qm67&4vy)ChUHK8o;$EE%X5p}hd5=~ul+bxrv-Wb=vAAFKQ zc8op(jH$WZ%DE{&u>vL2WD{D1ce-1!LQZ-Q+ftQouXs(}=d!bp1nDac6qJlW6_>c1 z#Bgawyr^tOPA~f@kJ|l}kMGshdTHwbZNG;F%zFIm$&!DBXxfnGSmSk+{slWe?3wcc zEL%yboY5JRAww$V9gu)Z>1&6tDrAq@^IY8&Pk!o?Y4f$QtQHxq}yV zQEArxHTZOh11bgcBlgY|@LQVG#~XPF?tRvhtHp;rBdHXs{fMjRr~3yBXXa5yQ4&Px z`ca7mRHKYp?A%ldG|~fKXq%Ndxr85IpBi}9>m5yiJ+>B#!bquL*FRlJRFfij^igPVFt}Dz+@g#NawN?AJJNb2nl}-vm4xK|NtOxI0;~jL^ z??C~vUmrYlmTrPm2*~&FV4Z^r8kmh~7qqOOn{G7nGq0VquK}sl871%{{PTmQJl&6er7Lxnketz$hi+M?DAq#x1)^%B zZuCZ8c~r;nZ24%gp%IAS&~b)AQMsvqO;$zKXf!{xKt6Ga7Bb?U%Ebe>Dk+v2ID-wV zxXIX5suGm{oev-w29sus=rU^a(Y!jKTBk0O6;%FFl@B?z)WFgG*Low!)Qua*-Lfa; zjwh8{v7ySLEKK`IBvQj#sa4dum*{4AGW@Sg958E&4eD zy$~6L$AzZz>EDI5vX*%Uwmp4m%EHF#FKm$4XLe#TR=EIrR18iwTxif}Wp8X)G1$-n*Kn1b*fJ&LztB%* z=;=*6>TN7ig}3UvqxNR^;^SE1V$2n<0*9pc=S?sK;@)Ii(-ZBj{RgPD;%OSIxDT!F z=3UG*zx(R}L(iYE3{l%U28uK-ubb7e?i;-qrATzXir~EITPBUo za@^xgNh5pF+Etp%FPH@~{DJ&B_ytO{J`=Iv6VAf~Of(KcdO#wrP`@A1qHiMT=pzhTfF37@YNJGEY8y@WUKh&wJp<4mjHbu6 z9Z)M&j?qAO*dp&b#blB94#tEs70Lq0lwehX^ZmyP?*wQB(Rxl;v0OotT6>46tlpr} z3LyMWn4@=b_%a{58*BPMKK~HQW4C>`G0{yK*u#B_mSNNSgTxLfh$kFU+ty6&dyIib zqDTl|*VlFHjsfQJM=Y3qjbL`+iIi?G{5)gTq9X_UuY+{NX}PG4BX&=h1y!Y$zaX=? ze#{@=xCuX;yo~(26i9qNVjq_eCWdVP|#E%IExO?Xq!qpbEM-V5|KP8X{QS@h0W70 zz=S)J;l{F1{N0}IooUa4bfR>;oFg$Z5t;kCo?I!-p`cZ8(A0LxF?~|jtzga)-ny8T zpYi-p0s9wgDHVg(FWMOCeSw3I7nKu>13csmDFOf4qZIzxqtxFkQoyB1+Th{ve)dr8 z6fe(|7VH4fv19>h?FTG+P&bODJlCI~=zy}+`1nxW*}!LQ=s_BLz@3pwmpcehctJ~v zU7G>m4;Jq#pUq32vHa9YstASgq2T~AKq=det6q+9e{8HDdrN+uq|ehS1$rSUgfoz- zbR+|uf{Bh@7a_2LB!&jbYmMnk3QYy zx6#DqEpEXNd%}P1`^q+dP*)JQrO}dP>~=YEV^36^sqIfzoxASauPoxGoK#N{qY)_+ z1_#47xB?sBc?VVTX3ov&ypRwJ63;JWrBMmy0AN?D#;$zkNXTw1e13v8svj<@Uo|R$ zh`B>(Z?CnOHa5M6XZ?3?zvl`x0MH;F#otQO$bshT1_&f^|6s6MJ~Tmo=n3j zE9lt@XN5E+(+KnOOLfx^Dmd+-J;g%F1N$b9dNIq;Rxsx}I=0h*TO`Vi^l`q=QC%0? z0SVB!Rtg9CjGuNI)J*7d`Yh}I^wJlR%=P{xtq#IU!N{+}LJT2}?b}IsRqvSNe@Vsx zI#L$T$?*ou^3)l~ILYYhW}gGb*4?h1$lDob#Yd+9&1R`fb_{+PAR$yh zbO$KyUR_pyq<3ijP}Al)&DCbAWZp{dMU#R0#!JEK!v1yeFP_F_ke?<9=N~5G<2oAm zji!(qmJ>Qc_B zz=092;Mq?MdZC~@V_zK}X#sIrmZEwqluAa8#j?8Zs!*Y$FkY{k$i#9PN8j`l1cK0s za3qOC@}0kq09YPQ z(A&|6S{hHye8n|Z#bjaA5m)g1`-En(7 zfhzr;DtZ<^ChaTqD$f*NMkGy>b^!2iDGRk6cV@##5igy=Z+}xZ$1YsL#LGB8i(i{$ ze^(Lcdh)R% z^8B^`!)v{&3K2$LF8;T~IKXg-yp*;`1=BuGU=wmt6@fVbv zySUH@<}UV4F7oKa?@_WT`qy;#XVKhGjOjVc`=&&LPoG8ltaJ!#HPKr@tmH#SN*ukhh4mEi9 zRIF%m8gI8~+--3UjU;4x+w99Shp*m-8^x2id*jwepi>G?N;_oa^{N9+SGnhs%Z=Bt zvK98sdO$>ks)8Uov!c(l&aN&@+P^!W70kLbHWBvA&W!k&BAym@{qd2Cz{{vp!uwt?&83FGY z10#DCN}Q}6kREAp3*g+bXq^S%o}$!*WS%TB7OiVvZvmtNf&*j?n#2GNnr)ofgTDK{ z?XwIbhuR)M(NGH;AWR#Wq zZ>BS%8bx;SUo1>Q%f(ylsf7BHQ7INv-;%_OnSdeB#{ojGL*CJa@p+mSEe!gFyO zWbUZ9=_8(>df1R-fvfUbR-bZ?v~@YWpkJ_~FM1mQD(zkO$>(~6|OAwBeaRS!zq1$vGD7D2vLLz5`96gdu~ z3K|YopBPP5DU#TRJYNxQ9xopdWy-PTiyRQcc_R5>B1 zB_v5Ii#K+uBK5DKW2GvbJkbU@jjRf#JGJzXUjH_waiR7{52fs+;&xS1Y&x}9PKNh| z&>w{CJyzQc7yU1^5r9$v`zRDVDtqEPln9{w6$8&%Td09&ak{I{p@QlMAT64;j#1tj zQ+#>QC)xS~n6$srW|2j`80(@+@A<)+zxca{9G;IGo7g8Ar{HQi2OwzCNKya zu7AXdiQDKWe+D;5U9#Vd-I}|nYbvRTY>hL0 zBF1Y`angy>!Zu8O=ooT$6=8AKyR3LAIyLHlf8qq*6PgbdB=o!gvfV!x&lwBr@I;aa zKLPK6$H1FM462~?L{hnY!>(`+iAwdDK(*;Q83+B60JDJFd%O)b`z=b^xuRQ=RU~gB zShts~AcfVaH*htXD%^1HZ@{VfF`iQHgsjxOfT4S5g@Svb9hGJy@WSsPFTR>YjU0KAhz#!$q6(XiI&o- zN5HE%WQGym1iZzjDKQrJG|s zqxvN@rlo~;S5_844$lIk{~?E@P2PETj4~>RfAyG7edd4u2kB(0dzqmO^p+J^Ind4@ z{8d*`^P$YWm=Z$se6Cwtu2-INqDpHsJC}sK&rhL=(}?d$W%N4xHPRa z?XUmIhYBiKr5`kt!-f5L-^0|ktfSt`R<3JKFvqYr6#=&o6H;-Y}55_ zY|X@HMQ1rumB}H1`nEGgkD23wCXuGtjA?0ovx(%6nqt3%=>|{HBiWcsu{PDeR2TT^ z(~O9GZ2??9v}8O0U^IlGvYn@4L}y$IyhHAmf2&)7Z7$X)E#dmy(4jE{xg>x4PZzGg)KH(+!D!8eXpk((K5el-w4~=OeuEXw}vgs8bC(* z6pMx(}TY};&X+eTwFwr#Vq?KHL_YN-;l6&F1kU}~&} z>;1AcH3Z=(O^>$Kr8orWp9#iadW+K1%c*cLc8v}2S#AEiS(SXWe6*=hSbY{EB3E`c zIek&+l@pYeb&XQet)rm-rX?;$z@2UI$lMNVLcyURIQ3!`e68^N2B492fgigJh0fHx zC&$Z@GgF0HRb`#PfQI9fr-6M|)DB90?Vy!JTNuy;pmlIV+9UZwjSW!@`-PUlWyUTQ z)x{?_7s9u+>5*2V)?Da2FI<8lsOBrLYwLYE2_*sh%RCJI18B6*zBVIBi1VNS*;$AG zA3JN3nH~V!fPxl=Tn1npZmU_gW>*H|PQ^bplv1Dp2CRH$dQD_7cm^|D4$8(@Md`Cv zqFejs#VavY`cp&^1)y)Urj?!q*XPCI+)!c;?%A9afzm9t1ay}NoUHa=P@3VFnW4(F z&~W?CgrE-#d{{Uj>-5R@Q!U5GuWh&PEW8~hy7vIFkXaHCO-gXI^pX;TW!g6-p#mc2 zl6*W|OJkjyyhknl*>W=LVskk7zd|1cToM_p=GF~YDpHvA?VL|RxzgO0M$#EadKJP` z)bXv~q;<<%m@EZ>hfBpxS?_&q6=7h8rgP7=0mU>RmGkt@W(g9yhcgkBwDcaBm=~}!eF4Cq(qIhr26gM`}K=nGTmfD zQCIAvT=XAw|82Sr2=Xc~8AUW$z=zXjppAp_fU7CVLEzL~`tle4{U@fr*Z2byP|}mC zLL>JYC)NmG-jIv#q6sdOg^if*>Sx2D~zHCpy;A#SUm#x=dec{Jk zC_2hYYmL%U668uNWfmm+kS4g#->Wb(f#1Won1;)QD69wUi|Z7>NGrh%kyzi0c2 z{(>Xt&Y<@f)mGNdhEmS)w0Gwq&Rr^6iF&dLXO6GvK=xOq!?|^rE=&ty|1{&1j#DXph64h{*AzDeRg#v&0JzGFO+s4Bs{`gwJ__UdBbM&v2`aHD9lo z-2*J#%?x0zl^fnaQ7|c(_!F6f=?9mfbj$$H;J(E}|V1h0JR3>$oMRU%WHBY#+m1a-yiTwutTLxq} zsKbU~h(Soh04Qu-Y_WpA0a5N0-C>F253k+|!mtp7RrdsB${bcp>TPiXb z&@|*7o0JOjrwQJ^i)0$S=lPYAs0H1k04y3fC{N1!Jt=dJji}{dh{^Z!cm8O0i7Mnm z&))Zt3mGZPZ-|miT;Ng?iALvg1q(QIAU3#;C^dB!@;mtat{2R`Z6EJeLNm468fWfz z9;iHijbwZkuSA5Z&M3$=1ff6CBdnVKq7R;2 znf~42UyCA)KU(x;Qt1FQ4sJgTZhr`Sv3CYfR(=9^2=*lJa?}BVurcr0JU>HHiA?Z( z)|Z9a?B6m-^JNQ}x*LpUwBtGV*;4XuKEzIaM_A)IALC!m{JveluwW&|#xnLJ4l_EH zQ=81AAa#RGVpZV(|7!z&r)K(-BINsaKAk|z%o0p^ zMGb?-!Wr_UaK%f40VJ06ro6o{)VTEMEWf-SM{XJyj(H%Z!l7K8unhe}Ufr~E zOG0`8#==uD4(|e8WCJSwd^cPRA2HJo8v(waQv+YUK3V7Rg9)&36?3A}FeZ^Kg!<2R zpjd*?x-n<@Auw1M{L}3&5=#E$X{o|p1)Y=4W9+*DLx_JUweg@_C*h4_DaBus{QNv* zOrVXd%}P=40V#QF%FD};Z*yc zF~d%5oDXiy710TJ-8>1amhKmSY2wugUPV&=o`E8fTS+NB3+$hMU`qE%#$^D8^J0hu z)(YiPC69EG=y}wS5pD|?VHV@@Ne2`*&0Z#Fz=Ikx%mkDlm-!V7syj)AnE)VW-hXFj z-qK2&&F*iMvf-xYr19DD7WXULb+Qzh3FLKb2jJ%L7~QRA++&sv`N4(2dA0D?u?!wniKAi3>Q5z!qHI{PS$xAm-kbiS$*3ys}UwfW1qaK)B8&pm-u58>AB_6R% zm7R;(e7Q=he9^7<)qH?VSjG?p+YEW9re_M}lhcBwm7N}Eb%!oHD7 zAIEXXLm^rV_qaU|DlH{{@7L0z$GoM$Dbe>0n$m9J_m)%jBGQhB zI;dAk#cpDdge%imc6$+Ts9G8FO50LzSVIwvr|mT~au{?pr3vpH2{&0+*-IwC*RezW zaTY3pIvu7syEbw*Z-9-iWBHA@9X2!3oAD-AU+1N3*%5BW+I(D(C~A zbfBACq^)i>c0caJXbcIx;q@Ih9C34Nd^$Nz?F9W{JO=8n9A(zC}0Ggx`9Do#18 zm!owy|cSjLB00RzI$^!F2;E6;~IE2J<3BTX_+G?rR>yEki@ZjsBZWnE2Sns4p@| zw@t7q6(kT;D`(6Wi7o{W8}-CH>0NCP58I#KN*tCukqiERf-dgSam(f#Q*(K-p2GvR zo!=n_PbRw0S7u0}W$B%&6LGo9Kxr|GOa0N zzZnGcRukkYJsElMKZgu;ra5!`8zs1T!wGzD5|$cLw%3IeYVWklk$1LgIi3c4(n2Ry7i$vdzNtJ6j@G6nj<%T zJs-xZD;Vyjr%;uBW|VVa1l*1=x}R>x6XF+#T2tVm1a;qzYTa)XE~h($69Q)AN)<7` z*M)~@Xt5>JdlP`ZIEf|-I<6qzMu^4yC0(@P6P09188pg=K$b60F!k|^bsng#jXQ!o zZb#^0(YNf(ClAbF{Rkc)F?N88G}j8Y@&J_t74j#$FUy%yr>h**>yNbiS>zo6ynoiw zltnda18Q5)FnM}HfYIJxN<&fL_MJQS+?c^7%U_K0G@|B{vRC};`mT9p+54pq*y*-a z=gQcN)DRz%i!j9Ib>4b%FnBD-4;=z8wc6hbNBCGQi$E8>6tv|v{B`B~#_G25qhFYJ zYmA5M7U@qa=-46;w^LI}+SE-Czyg|PN%#&v=TV_O`b1m-@59S-z zy)sYNpaJewU;bXm!3(d3)BB`c5&qXFB{L`7r=71)C#Gj5_x&t_;i~Ztr|K~mzchsQ zPK}Mu^AyyIy2EoNSMqkIFa;ul88rDffcol)&0eznP>-ox5&bn>x_JZ(C$c^j&l?0$}7Futl?ThP{zllpl^PDO&aZIZ#Uh%FD`0TY9=(KUQzUz6~V&G(h0ChoBWM48mOFxmC3zJ zh1v8ADQ1BV&zxmegYCuo2TN@)nH1bX--TNX)$4K~h3*7T2XQWVbn(mME!Td4mV1 zy{_U3-vHz`(Ccx(huZX2V#u9joIV0<%72m?fgzr8O$4QT=S*Ra<@4FAjMBm}vc?KUn6! z9*@~1UTKON4+ugX0Ts`0-b&Am2bIVYJ{YS+t^{}F{(#^3XK?*r>XFL;V=kJ8l5fq4 z>HVFK!@4I|>vYluxt^AIYd^V_RUxRP43sd++HtY>Or6sNBCzI*x=z5Bit%J(xK~aV zL(TcdpR(NFcm@esk&+yU&Eyww&whh#w%Na68~ExjsCqI^oQUo%@tV>TWBw z?uk~u+7)pd0Fp04Fvts_My!ZZZ|1#{l%a%KOn?^b?01;dS5Ep%vlA%MaR%9+0Hs%! zAhqgk3{-*lNNwX-K!nw42Areq> z%QE%FFe>BQruAXM)FEw)+~Mhua!e6dF8BaaB{~G*&&tNh_hnwey!qwD(_`v(y~=rq zS-UOh`z^Bto0^NXU%P~5mT^anBLymkM`lXa^*DOL$cMFrIYq+gP`Jpugd70?C>`#? zw1SaWWPdrbk~X8L)=dqNg9fQaDZMGSBqrxm)>isx&Li#9dN5gjqbeB{%`%=Vjmt92 z>D@t3I&gzG0Qjpi23+s_3k+-ClRKNJFGN6Q zd_&FZZwDEq?p)tNe4l`Glw4x`y561M@xgbs(kwMrgIe5s{G*H&zNp+Z0U%h zWt;Q6NGl^0m4A5OQznZUlv^})23KHH-Q+cgB3L$Wn z_N!8NrPwIdOS!o2I_<>;wE)e0Vmj~d*~MeW{q=GkIzvf-LuNMHHKxXam0q1pOkO+S z9C4UU&!MqU#H`82UJg%FnJi*R_x3EPChoEA&`62Xrf>NLj+iDC8Xs}9Ha@wSthTgy zWIXkRNlCPO(R93%&mc>u=IMEb@s3sD(%$t+yz_(=p5wWE&FAg99B$d;b~_`>w~SvD zlS9Aw)_sA>hh2zk3F=nVm6Jas!;_Dn(b=O5^*(Paftw~ zAdCOw?eydIy#Meh^`mpvCG1@~1d#>7erW(1Vnmd)ONQ~4{`~z-+tN#2b|D>hrh#n>?5G^Elk8VS%+WU7x^2sr_oI(SnwrPS zqIYS5v*zvgelvRwh;#a}{n_m{@u9Pj*SOeD{S&H}<;3^64e+zJn&e+j@r0qj* zV+s}?b#wCeBKKg^m;4)u|KJKb>fTv=6d9B6I|u$D$|MmAQ)uBI^)|OUb9{j8Aj0)r z2UGDn{oAUTZTDt`{KNdpQ;`(~ zzQq=0W5xdr5Fp?^iBVCd(g;XaP1xqKfl|Ihu+@JnnxKnW>P}81r*6!e7udfj7D2A7 zyJ3(^@^xs;x{)CBsQ;R_*>7clsu4$7Asmfg@_i3Cx?~iVw%7;3T9>ZmRtU7xw|BEa z^po90bjg@Fagy=nVaEW{(~hnpk~PTH!2r*(y`f}30m9XyODwfwFckoYfS1?@gz!A0 zU8@5A5)^g>j(C3xby_}26eChgdS>JNhgLs9OKX8uW;tbG4(%+2O$0^<@(Jq9n#b+C z%JJB}{P+0bIh>?NQo`Z}jl+BLl(nBCfm~pOyTcg{lujsFT9o*$$dyT00OfT&LXTWW zcsF?Y^NTU|PaxGoVf8c15acJ0HOSAVg%Ue+$Mu=2$-C`%u$iB19Q{?lPr}$AidPoA z3y+`Mp?v2DvBEV3-glyUr09&)ux5?}sGByrd+?;r*`RPr=!PYs;EWQow7{tnA>eVq z73p6Pj6JuQ@@eB;jq~8S!+uV~eJ?22%p?Z3S$Hc*dHdD_FhQkaYCu(3^FCwVj(ow9 zO}|Df2ASPW4JFVVARF#iS2?X4qMJrL2C|L$Y7|`Ef59|;Z{pEvwDHWSnYr9ovg>e6 z+XnH=O1tiTyooXw0Ld=VclFGy`m=2yyn>#1vf@H)uQ31Je)lY|e=OF%yY<=>t^L$r)~5d6koM~2gjN}O-!=sN``LQ`+#v?99d}@U z%hj$ydyXuhmUpu6(ed=e>&u#y&0or=Ya=Vb;%-1=^M!?wOObE*hBXqQn37M4h=1Ie zW&|n+2GH&G7Cr2fob>If#0UYWpHYVyJFL`eKg58AI3qR^Dn*tADEdK1>K!=`2M!eV zg1@y-nnX<0r9OvZKnWl_!hfRl+&C+C;NgU3%PkZ6B8EWi0XBZBq#h&QU~c2q(3+ddvHg9` z26aYRtTS=bkTltJL7tC!y#4(s*Yw@^ae#|(wMU~GjyQ8TPsFL}vjv&MVd_Lr6uN~m z4pVOTn+bR)_Ygc9x3rb+!uw zIU_V*`w7{kq6}Jje|j)dwdwJ_Q;3`VeNs|dlv&FOMzR9~A5DUHOr%f?PtYR`Bl`{( z3W=NnC#YqWqBSE(6_T`iIp*VM?osovueoyl*GzlwIUx39467ySQy3r&KxazgA+us8 z?atZmJ)LQWc5+lR*}`8M}`={IK@reo5RJ%zyQ zY&O|Hn2wILbP4bDe`S#KI2~5ZfaT>M(kgeMZN*A97q6KxvW-kl{qknTwvJitlc?PY z#EqM|l-$m74M7$CgYVaj zdk5y6+*nVAUb| z2k^AA7V|^@NvW+d2C0fh|KF|l@nw;%aVW7uBa5_7NmBzy)!tGpn}?U>@Bm7Zyy_lD zy2x*khAR~~Z(o1`p_Gg)W*FcNI@r75^=0FGt_P(IpmLP|1JcXv^1NLGBb}5`IAWiU zkg#Q0oaxU(dzi?h!h=CVEVKk8Gl#077kIH?OUXLC3D0$HHd4nC2%RFMPLW1{5dL03 zgiag`*{1WLz`PQM&43A9AT==eeT!#qq@8{dzE;hfEKs|_gU~q5kGS+*QTEqT#Et`k z6IJ|tT_Xxs;1~Pr_$9$YN%ciYZwgpV{voT_xN;eHyt`AnJaTQ7+E*=tZ4-eKrgvA~ zw%N0E(-?T2OFAP`&&}VeIQ@|-$Z=18cDaig>XwyKqQ4MREsOS35gO1&QitQfZO~ky zKswnvjqh?cw}|mhV$lju9;D{R|fzl*B4?^epg5y(jc@oh~y z&-X_E{qN+ZrD2>c67|3a#19-nc{U6V$Zl2t#}g-`@uLKyFU?5c86}&7 z507q*53B#xn}3M8FCP#R?l3*XtM(?+2`xpRMGz|LAy??&(iLODm0xvF-;V{2DuD8V9^AkQWRML} zk}1(cM9N@H9c+J=-&diZ{RPLOx@OGYb!Gi+)lEaXf8qCX^<5{c5^y5Y+= zjTx!U*K7#vKh%G}bl-ose143bbNBr2_lOosg77p!iu@h-CrpVYkghs$wlIzohc$G? zi3bkS($=Z{y%~WU+E^XfnTuRNNWPvYS}j&2AP`SX8+ z|13N}@E_Izq`N(4H^Teyn_X(;LSOHC+yZx}jTcC@Rui|?k{>-{cSHkft6*tlzot>d zuWv2N)EG~~*e(utl#5uowx_dHWTi(@2cPXq4^oo1i{TlMB93mMq=O~BGC$AU`3m+n z^jZEAj8h1aC^Jhukj}c^&SlxO6Y%*E@V! zxE045hwW$MkSq~+F>HWAoBz8bpw$8r_uCKBcxe8|A@@S8UZ;w!HKS7XF zxPk3f0a9V+$=g4ii_uC^|9lNL=3O44IRP8U);r|`FQfQ1>5-5N)7Y)1+dF}#`OKg$ zkIkdPM`Zm`qbfgs9{hHla$;59VAbT2kB06QRedsBbO&jqV{t5PN5F72`9pT~Sjq-l zLeg|K%}LC#jK=P7hnuhikU5x)RJ0OV?@&X*L0r6H&N+TC5oqK*ZkK6@6l#o5q#OOe+7)c5C*N5X~(ti!o89ESJQZ z>X`uRhVN!1lt5XX>%H(5L>sBg@JAlQfaDtB#RDWSu2_<6h!_QvsA!gW>t46eobLVC zO$MU!i1$soCBAA+(vzsFhCJ((e?-D@*!lNVmqk0R-hF38%MR(}dlv+KING1=ul*n5 zjH7F(9gTihh82a$N}le8LD7Y8Y!W-i37^0;B?Xubl7QMIJrycwF_%Y8|mPyoCM4PEdAZwo9oSNZS z%tCD28lOc@UAxE5vfG?62g9h?=?1nJd?E1bP#tv#wI5}mdGP4Ca5Ma}HX&d%(imK3 z^I;b$?e|oN!)aERGuf!>GplwhsnzJ$9s3dx&;fL798#|%4JL-@)=^&BR@lsdZ+cjV z{|M3Cqs(RFU_z^D%`AFf!(;9r?w{`YyRbAOopzCeq%{&l zp@Dr6ER1gnFd2W4K^MP#;xz}lrP_0 z)1v*eyZY`^oeDdwMZ92a#1eo zFOh$5yk37Ga{kSn{qVv6d8ma1zbex!1^D@}`WxQRLy2_3oE%@7k`Xeiby~ zVy7ghfEwIe&clj@4vcI`Ec#vRBI};hxAUlDkssGM0Yp@p`}=Hr4`5vp!Tc>%v_@gdTmDm#kOhkQC5b2u9WFj94BT*#3s;OX7Zns%I-m~*A0i@#pKhhr4k zNQ+-!gl8VBn9LU_LzP+wJP!+Wpa#Pf#ZD-JstdrbDR{}kUq;8$Dp#E=ae3$b!NvN| z$w;Qt&rll_yFtdvDPBq=Bwy-GAEdo&j*voD&VVbM&7ooV9*{u=BpZYX5Wx#9zAbV0 zd?QzU2+TZ#MluuFG|(geJAeDXbms`+>VxN<;e)v*k5CWe7ei1$FV?POC&5dX>AgX0 znQOK0!cTcJf5_LwH7FTXpgG3M)WkwS6+n&}TE8Vip>ep&HNTc80(VXI^4PESBJ7qsQ)_2hK-&IhGz_|4j{D8cwbTCSDh`H#0H;2n+}@i6UA ztJ@eRxHls*HpPtGFaJ$~FmccTD}ctr2)SRmTo9_4a?+kpPHuVs#<8dAANo*$*&Oce zFnE(FlErAP5YnD1lfi8ggLaf^8N-&cTZQ2f)u#0Z_8x^FU#STM-m_HD`;L4vb6;9$ z^&nI%BFYpl(ra+R6c{_O;7m}wk8mJ5GgYygVxA4iA)C19Zxzr1#zFS6H;nq zW0>%8dl(QNIxA)>fscrEwBDbBfxueRUzUrZ+^JiMYnTQC_n*dV3d`poXu=krPF>KEu~RCLTun9Ka(~*Nt~(4Pp#2WW93w#AODV4 zOPC?u`gh{bSjFGZpRhYX#JWtxj&Y=bOXc`T${|M$B1a9I;Zlo5r9rVhbs1{}s#4sk z_!R86QN+$dn6UXnDi)$Z;x`&6iY!p#&SKO~h91xr$R9xp~`nk8sYDo%I& zifyblv41Qx8DROu3{{`ih}C!A3FWU?b&QuaY zd~hfJ^&Ilc6gkpKrv)Y3npZ4;$~_4aIIfE$3=7Np(D+1>px&ogwafqILpd5n0zp>= zGhvv)L~DI>heXC=p?J;&fz1Z*Km(d%l;(BXx^V3Q*qLG z%g?zE%M307vZuel`MpH9=W;|kJ`np&o%e5SFI7M-3bLIuF@H3vnyF1qhOXW8lGTd6 zum?teZ)GpqoS*#rCfoM%xNz2-g*}$8tgBTJpLvzjrx8I^*mKIP5o=!@p;x*m&F;BgvXWl@A!!y#vQwQ_T&XYe1DQFe`})(?nB z4TLsfg*FU`vgOlCABN^n!|i{xPiC1XMfX13Ftg~p7SgL1%y~3;`)wXY@udpe1)oM+EYPR5qC&>aR*9PbPgVD?Kh-_l8lSeesNg=ZOqh9EGe z?LWdiNPYk|9zu%qAjZ|G8I8pg!fFh??SJ-u8T1c@Um^0b`TZETYvK3z{Ypn0keMQj z|D$WSPAvc!YrFhR(KZiIiAi7rY#)y2^`nnDGSD!6gX7CRNNz}-4yGOJy#-2@c&6+n z#{KW`xHeAqZn~uLN^jfCUm(zFSo>N!bBPwfLaAhM$%r;9f&Ik|C zR@SwNA_Mblm)Z$JA82e4+3Pbg;$0ovkde{3x*%Cjsu@+*h@-H_f{>m3Tqu<{y;QOr zr@45Vzag_Ag)%z%!%6MVd$8(`IcdbjrSk=8awj~wtyL8QRz3tv_P=;ghC?tg zEbKvyKL~b!e(LWiqF06h(~r|C_IDa2HG$=nH_tjf`U;-0G;4lwa~F4>ik!;H@Vt;Q zLfq$-#FCJ{xl=RamLcraF*A1*OcnFuk%kEaMMPhSjw8wxibZbfnLK&ekhpzDRWp$v zrL?%HWe6w%84QIQ}t*%>IK6AjK+Z z$MqKBmH_eEnxH(&9P1M@>6K3#L4-sSuy2_2ll%Uh)F?oXvBA-Rer)C3NN4do)IoytDMZm zj#(qbYLx6pu978&!RPg7LCTx`areR0yJG$h&!)_6A*)ll-#4MYPf3k=n~T;55ia_v z0XYT8Zq)uH8#B!FX@@bb0^D-56=vtBRrqY0@zQ7>n&dpV0sE)DYIqy;UI4ZJ0sYf| zR~(6U)kdEtD`C_}4t&kaLE@t8$GQzAyJ0337?R#E4XFF|6alp`L!(Cc`(?I0#G=-j z81d=0W>bG2yi#vetfI*N3)7aT^A~tpiHYR$XMG5lr31vswba(GYv@CP81z&w?l~Os zh65A~eVUxaDM;X4f~H{-sFC7(uWLtsb8C2EAJJFC+E_JWU_%od&Ca$GqCfpdLah?? zZx1)AbsrT(A)z#@VA|bGcP24!t8YR(*0T!U_WP>+0F7lB!Pl1v$o<$PQh+ zB!1>qT&(I~(fY$O{#kGdHb6zp>_c<3tOm3#C5$|Mr+nFK9`oA`MmG$*JE7()*<%5k zW7&U@H54TPHe)~k($q3#iIOHEa~@6YNHvC3thGHdF#5gk(xa`&`OBGN4+uH4Nnjrr z{V(hz`#hMQa5WiycV(yG;WUKa+J1NCq=ewVZ6I05o4K$MtzJ0@C;jP~FrcXcQ5QCW z#YZ?h3wsG*^G};V7C^osB{%CrqxDJGNX31Me9`a7Fe1OfN=fw~|BtIvVRXvUo?EcR z^W|DqSZ}IRRHhJ&L(0NVQELxa33b7jy@=TZclLlE!Boe{OI^sdi)|P7r!FK0c@_V5 z+|iICZ!M*oH!I|a@VIX|WYYiiCz1r&tIaT3F~c zHj^BJGk$&Fj+yc^GWMnx{IUAN^_>*ZaByYaIk74a2__~+eAlqC^;Plto5)VTRh|-Y z^Y}9+2y(b6>^xM1CB3AU@Ryt~ylEWPS2PWy+@zQEsr>y^HKTvt3RwFOmKRsYs!W6U zkE@CL{KgNYp0@sYQ}u8EIWOqPJlZq(d#>w$#Pfb`EX0z}aa}YHcE1`Zch?rmAb3Ub z*OVX@(3DM${G)G-Pp|y3J{G2?AglaStAg(wuJcSw)y<(uk@f~PW(s}WDLrGyVkI)w z-C?M%@Uq8H(rF4nxRp$77Q@t+A#yS;&U1?1BR@RIjtQ5sCMroUblj8dRGOr5jlwu3 z7#{4||JYG_&ko0`C?o_kmyDOx2-&IUAP=Ahu?zZdN9+FF+Cc1WU?L(HgpQ394@_EX zLm7$Ndc*d5qekwRiVHkKjLDpcPF-XYDv{7P-II zL>C==DTI{k?8tv6F3;^ofYCtlG2F%8>gQgC?QfBF2+JX7C5gxYxmHl(Hdeb+<1ZA? zHEkf&M-(o6j44Cgmz=cIi*@9ns^mR|cp8SkMVA*~!3f47MAL;*zDLt*)fJyKWDh^u;YsZZkP9V}VG5USCp= z?X7Mk0YMyd3X{g~dc0?euRo1|7l5LHgZIDZrH{w8(CHb556>dfhcalDydOD9ZyuC! zn`Nx4CNb4+f>ZWihlP!8#TAO zrp=J;&;Ul`w)&JbODZEO8Aj@rZ9VAkb;xoW8uGgmZ4(AUC}4Y-pyb06-gg880(dK+sV+B$}G@O4mcKr6AF zgw^~}CJ;MTvT$z_-};NO4affx@-NJx^$};Xh7G8M=KtBmwXUpD_yTp9=5qI_LwZCn@>TfCu zpm8bvJGR5?4_U`6=hP8a=}E#1q;jvK_^xyM+gHWg`$@m_jmIe<_o7hS)r*rUT%BFU z$qU=W0{Ao9QRD%OGR9yuuJvIg%A45Z{^P=R0iR{&VB)l)(?#%01&NV>A~CmQ60)Q4 z__+SJ-|a2{$0AYMCud{|oMouGpO6Xhl4jEiO{Mb*hgH;<)Uc?&Hac;XQ{M18QC-ZF ziI7=V(IURe1^Rt)O9VdRGHUxl@xuN@RX0sQ(6Wn7dzL%HX3)q^+NW&%Syr@opCcEL z;o!Q=P;mZZoC)|2>Tc-yteMggGBy`FIaO_mEgjjp{(f`4YVmLovqZk0b2$dSMV#c+~u|TOT4$8{18d(!JVLj)n<8*HX3&5AWba! zj^cNXtmsNsK7UhF%GN9VjM>kLS*KO#`-WUaS2PqF9^{Sz^ug|(nNkA3%q`o?5xYRJ z)C_#fHEfQoU-R539HPA8F*+uN5(*cNOIP&qN5SNwkpt4X50Xll0c7al<)BPJ2Z%AS z(M){#zHAdjxX2evmykFxL56TtgLM{wf{@km>I5|At{eBk@STY}gU zYY)KXOA1(>xyKZS%<314?dqSF{g@6;PBkW5yD3wpjiw@Y<6gJreDtQwCf>oVPs8@> zeJ477hD<4#i9!&}bq>U=$95a7S#4{He{Cc4t7NNB+QsDKOg{ouNJ6V)6% z6V6u3xsUu_WNiDPgOngKyr;UdDasvllJbc{ACY)MBd3-EuvruG&f1jEmsACvnA)hE z|5H~5nnPvgpwzchC>%M*-wTX@Ht3-q$&n5=e{XX=R5j{c;4>=5U2HF{`uC8a> z+wJc08W%2y{(m%`Q(R_WxW}srlWk76?IumOZQE|*WWU+ACrq}D$+kV!RA`Qbau-ECYx<*}QcqLn~ivWbm6xtPCnytdzmMkVVAOk0cFTb&U;PZqba z0Nez2>>-n+!_yY$UzOF%5jjo?2d&t=$*Lfrw{q7aYvhf~8NwN2{6u&8vtXxCrhobA zv3I@Zm)qNzf@TG$aJ7A3%wUVg*FOgQ)9;=PN!Vx4q+t5vhWNE;Y?f)hGdj>x4=(wl z6a184jlJm6(A$gn`EPbHMw#FcLI`2^8*#A6Q4Rysb)q3ddupCpmiD>JNkc|mC1n-B zrRXOtrjXSDv!! zu6WQs+Ys&`6@K$Evh-c?^IgkMBElS2|6Vx_&=K0j7`~fqTel|V>eR#PF4k46Y>#b! zJ>Hux!x|+Wzgb}QA4Oou9+;;YE}oc7OLVNmu-{V92}yMluCZdyoU z5UG~JJ(9-xkhw6B;-4d%@|ASg6a$^xCMGSgBo$Rfh$<)rnXSM#4RJhtZTM$DQ6Gk5 z{|p9^t>qYgv?7!<&3_HZbOHz_NY@#)8wz4Vm9HwByAn__s!GiRBNBp0LmROJ^A#&A z9N0p~lI(woqAR(2rM~_l!sU7NOn`< zQ8{Q*v|nwn_vte$!x5MN&SU%=ojgO0ldhqgfn^k(ii8f6Xnq?ySw__LJD+2aUAE3ocL&5yqi%iQVF=66vTM(TPLQPi zdIus#3u_u_m29ma35hxBnqBAc_1B;hAN=H00i{tc#zA9!NB z3%}4QOr03wOnf0TM8f4X9xRNH6SVY!OdAUABr9TPp#O$5Uz{^dF9>*WZnEhZ>a#Y* zfY}Nrm~4|xoOXD7KWT;V#EeWj^jWcQ@Kk*G7v)e2?Ul5Wr59p1(~*p_~eJw3O!c3yEB6P>;wc))Ex%NnW-H|${*!5D|UFENgg9tGUcQ7W)s zaxWd`!V*ypweRmCOij+~AGPw#Cjp_znmG6$vOz~5_&L#c3)OA}Cigjykvaaa`ZFev z9YjUrWk1;?&^0^0It)?|&I{mc0f5QSMRygx!95trjlPIcRAWwb8d}z|0-=8DkEpK*-@!O*7S8^Bl$8?u zM*FLoV-R0P3ci-j)&$#iK>w;?w<=xjyTUzR6@_hPIGJ!g{XwN_%4gR1rwSeBjKxP) zrRGwrrFA{TTANujo-5nYlEXxmUzP3ON35;tbEc2A?Ef7uS=<_Is2P_*ZREF}Y?{Bx(w=Wl!cEyI4m>I4Cp8+i=BQUk7ET_}P{UBX|x zSFW+l-5A(Zu3s#J*+OI)Y}`EI#>Y>}t8hN?)Oc4+o1aO5e1c;?C4H3wLrHB@T@nIAwAhMi`W5}93u;e(KK z`=`yi)Pnwnw*QVjjOLBb{x%La$Bqw%WK1e|d82&U?7w(p!#3iQX4h%bm0gTfrlRW_ zhfl@#1XSAu64(UXz(DzM@C(T$xNOkv>uQ>*8v>Y*BF`@4X0DyBeyhUlP!95Ubv!>U zaY^@Z1kpK<1b{~IrJ0__n7lw>)M4EXcb`JD`~hoWz6t{*vBoBtRb=qsml7ZAW{Vuq zvQB#9e+vp7w%qQlZiSy*?S^+jB2CEJS^cDT#|gkI(JG@llp=LJzZJt7w?&%nZWSIn z3D1m?mfj@~9ppMgLnnI={MQB`PGO{biTw#FEGj&`Zsy9AuVZRR+%VCl66ro90t1U& z^F+}QJ?VW+!VqX2hxp}f|9%X?!dlfDhC0Y$tEoFLI6#P{WWtP4cCh9kl$GqL^7e?( z$z7R?ky#xB&2tY>i$7+fY<|x(9Gf)|%rW=IQH0jtJ%3C0A)*owD%{vUJzD2e3f z0FhX5WVEGz^mnY%kzbW5Su)OoUpF2qM_5< z&;KphZ2Ems!ckbhbS9eTxf|1>;1X_-tY9o0fZ01^kc$6i#Y#`?KZGEYcpld4{9phB zIw*Z`;}P%I=r8iUYc$%{|2UjiP*2S?x1Gr989p}A5<F9Y^t`NU? zmmc>B`^Y;yoiSy2?GmwQ*m^BJ*=gI7Z^oNSJHD|iQSJeIh{FSvuL)#?^}S8lj;2+x z&Pw_?nXe~_AC;1Mq^$%Ji3{Co8>(_Vm^2_e?6-igy#Y}$*A4cNxda1Q>BbfS4Rw&By7qAh7M~vy!aQk1+fXJ1ct80qrsLOA)Nc%Z^xEe^0F>D zePE_n*qjE9gKtJ#*>Q=Tva$rQ)0+?nzD)sLQB{?cAltlf|wsFKw?)iH|Q+Ipy8->AS?J?JvsgLYbL+I zgTzQ3T30mn&UjeL&_(0g4tjby7fuEsW7Wwq5pn<0q}MngJURO}SXF5DQ_~bVF!Ij) zqZY!EoULCe7YvqoCNm&!D$!$FmZ_D7Fb1HiU9>(|W{{Tijoh=Usxc}GW1CRM`x4j}29-CTN z3Tm>h^KZk;a>fuK4%Ds`kr>*Rocm8GguE!knm_G*4fgL4OGYSkj;lx%a}X@4GEOh4 z`x7?KS|KL;UmG|zUG$EC*@Fkg9zaQkdhCe8fTwa>iM#Kn#Yk#A=T;!t2G)crBQLEL zz^`oP!IQpO?Ot$~sx`dO1e83;)xr(CcFtDkSbd!P$h`W%OeABr<|Nhy{6h%8ytKPI z8j$n2`?eqG{cE5HfvI>H$M)h27zL63P?DsFxKA{=&-rZBISld{of&vK}*+%sMxqnu7VeoInLln4>v|in0?}6lSGUzm;Bk($mK*&LGQ1`f~W3J#tFg{}ta>Bbk+VuqbjV}N*C;CCv0JH@Kl6q6eY&~U?%ew+8{ZD*Ex&(>8jf0&96fah; zf_(_n2gY(?L;qJmoge?aT)UXn@byLK{<+*0Z&GX$@9JvL#P<@@sI8(acKiH~EW)R}id{Vak^UG1_a1(KOh0L4gPt^UwjMsm-D=Rnth{!@-wBBi%I zhm{w<#B{r6PSH0<3z*&wGoU&T>X6k36ysblg~0u1AcF1){6-IB=-Q!njY3H8h30G{J zaWc8IaVBZAcmv1jj}MQ4@AQckqLh#*BnL~LCJ=lkBaXD_DG~evT7ZWJ?M}FPioT{C z6(=53$M}n2;tV6%HVbS*=4H~M^$omxu9 zV`Lv+7({9(OoEW#=`*!=6J2={Cl!G%frDo>{r6nOD3evKFIIfgzMzBov@(}rHepgZzDamtPYXGwc2Zzrq8>ZHuC$6+kpLMMwz7se6gqpTD!^L`+0LCQ3a6J{8u z%3$^80LmY`1>a{Vt0)e`G!c!B8|(WMRpbyI@yyiKc4#t<AdmL<|HJ68Br&mMCIr)DFxe%&S=m)a(Q4b`l1IB@=euQ2s{Z;9Ab$V zuyh@;4BH2Xf`n{G={D%zAXsRb8Ix)P*uQ?An4o;>hB|k)+D)c+w(_I{_uEA*phf{& z)WFg1b!J|y6MoBx=B8_}+$?9yp3OJU!0m?M^4y?Ohhgb+$x-REUu*TDMkCIrx4IG6kS6(zex+k~Cdxyepm14QVS@DM9* zokHl&;!9wjxhheO(a7)ky@NthT}mQ!Y;=ZtD#R9;7pso?hLP$9LGm=mAnxfjj5>r+ z42zm`iEm*!Bg!vZquy#~rDB~q)1}asGk@)W4FyTQbutj;gtQDdtq7WqZ8qHDQ}*a? zVM>Dl?nt3?K&8qIr_LyD5UI?ii-Vx|UDmOj)HF+Nq+`V{sQ$E>W7JJ_v0*#9!P2pC5Vh8 z%2~-=a|YZ2ivg%wLAooeHa1=F{U>vIl{1ITa$=e@7wY&GR69ZL#1u%{+?Y*)f2L7` zlSy0PCiI4?2bW41e5^eYuf_%W)~M56z)?Y?QI#}7jLG}uzy=-3i#QLez`~;~N6qfn zz4ovRBv3pMN%lr5TC@k8FCOhovbs`Zydij=dgCSDIzJqux1pMQ4QQn{KnTh za9z1c4rjU??z7Y+QXfMNFt9iJOEYz|WPfLe{ZnJBURe$*GA|sX5JW+5luk(-Vv)we z+2m=?2u)DJN5a@Va5}hV=2mMEpfro5)l-GiU6MlYl8r_gic&{1N*QPMWmQf7gsVLv zJ)fpw=DfcYN02fk3%!rDd+Lp}j(<``Bi&3lQ=~DZYdS(}5I+I9L*iK7CKUPv)3vy5 zvU;dVp1mrXeGp#cGi&O)W_UVum&}7-8fV>oJ{5Y}(aoxS?R?$XAx`PwaFHC{zi_|v z!C=BMTmVEK7j<=vK}p;LG3sj~WTHku;e z^pD$B#>(msDx<5dpAT`f`j>F+xX0|f7O9_k+lQsKt&irleQEtxptbWIf-WS8Vxs4B zg|Q_W3khw*fZ+7@6~%b1T#=iX*5aZ#zvz6|1fjf=+a~B{ey#JW3^oV0;4LE(Oy65v zE7P3o*|nT$;&jQcsH}dVthZMlj+Gb8q?5OEE$fU;bpcAN>A5weFG>6*X;N7y-=k;1 zy0$*0*f}=QJh4B>vq12!0vG~)v-gCx7BshcoyrA=>(F%M{g>?Oka zjU*gERzyQD0r^%{Q?1V2iLiOpuWRaS8ZG^VV@CC05%y07U=f^f3+8}aYfq|D)F2Z4 z`a#`7KJm?!X=xMHf{N_M%PFpqz!Ue!JIxouQv5Z?+PHfJc0S1zHnuqF>&NrQpI-4i zE#fJkCV~x$luI<#GZguhZJ;zE{@PEV^&2=vEiyxlkHen{@hFV+WXXy{H)`OU#4WpnT-AKcNk${ACj!6SBr|_X zha}k+z5o2@q5cLTszk+{L;;FEe2%#X#G-gmXvA#(l$-nF(blyWPL_*cj@e+L9wF#^h3I%XbiS}FjNV#P%SXMU# z?wP2z{St2P&1{4|KA6N*Q7>UxR`cgCUYJ3&%I=S}>(-j~ft)bI1;hhR4|HiEX^f$m z*_h>id6P8FCq@j}A-^ zhv#+*3ZWK45E(@R0x?yN7x6pAz|ZV554j=+MST`Gk~FG@n1wx26b3caU8=>wBitn9 zJ1WS?nsk-9IkVcoc_lUOY8LV{z8ypKE*XbxpsWqUTISj*QX{KS%~?#B9hG3t`aXppW`-c&YG9n13;lZ)o! zNaKnY&+IdYWDoLRW|8Gqf>Q#XQ9)cuOx{&bi*dMgs_2sBC(Hf6|M(sP1X!QpqE z+kLXg_w~rwNoX1trVx83?SF(=nOgH?q~%JrruR>HpOJdth?y-hkU5$*!E)E)i%hZ- zSacKk=-JiPu&jN`RIK}8e!x={MvRt-g&VKKhsZZH$hGDYh@F`+AMti7_#lI_cDtR3 z%)z?;_SlPmNa=ZA({B335Z0H1jnoQ47WYnWU`x;AOVwpCVt4vUt+fU|B;L8d-qv)V zVaTo*r#{K7m%g`=yYri3IK?-6a)bp5dtr6kHbmiqFZqd(Qq?BDs~+wBv}4t%SS=D_ zQ5jZ#_t7WMbU#C(xc+|pYA+rSGh%!0V18?#+F=jQlnt4GIf}P>j^#(RK*3LiwWqG!0w|j6HoD6zZf>373q1NHa_$q4nGrC4KP3vZK5M_2M zrV4>2!OYEF<3vLk9_Cgf@ba$*atjSR*?iX|p*-}bPE7j5L0uH5&eVW3a>TGjs zT*76@Cqki~04@!sSI)-{Gp)<<#SiiU{gdijOVXQOw3l>6DFkiMP`lfm7+ezyEO+0w0p#env}*TccV!DM<# z8~3CSi}Ue*W2aDU!i7V{&ZlFg?-z_21M?4$y4`c^%gRS{3r{j{#IAX+HQAmzgJ42% z4a9U%+UXK$+4Pfan(@CgexcDxie<9_@*cZaF&K*clj?7Wv+-IP^t&y*9RCEi;U*ja zd^tQZl@OVgt{6L_VMc2N3txpvRzT%UMxXz;rB-!_i!hJ|1J91TGqVnwmJ~HctUH+D06t)saY0vA#H57swjg~ z|Jn*i3SO$34;~7-f|)HiqCUN>RXf{n>><^Drc2V&%{cer=~3F&n{uFYMhIMy@wcCY zisiwp;A#wzrk1EGIlouWJ>feT1)mWQka~_#y*N1|eC<=w8TRi{{MMZo0D3B52F(TP z0s@xwxCuWw(+N(r5fE~{RnzuUf4Ye3E&HoyQ$AXAUloOmCP>bjcRj(8OF6!PyeQrq z1j%C}8)07rB_dR#UAL|NO4SOBsH{=}Z$6N0g7UlNO?bsa5K*0xqhPWtWpLb7r1(vY;2EkwOiW7y&5nbJsg5R4APZ4lC#WAL|Oi)bP5OHSGp{OS3qz_pJgRP>!gjT9~ooE*Z+i zy+h8I1R3OM6^V2PND_Rijzk# z!`-l^2e~DcLJpK}9Au5`3PK6T25w%JSMk4K#6p+qlD<~WJ;aX81MtJH%lL2sW2!`z z-{4iUb}7@t6$NJIStUO5!pv_M8D?b*e{ZJ}sZqhYqF2mEN>i23T-GYh$ULWPg_9Si z!HU~nx6S)yJ0ZiQ*ltI`8dx#JK`H6;S^Oz3RsC=azZ!?Mxmx=Rv8z40^go`Davr9l z!BMPLh)HH&0$1+6l^m?wegEbgU~8kMt?!Cd#kWWnJ-Etg5&xDIWB|!L`66wY&I?dL z_IOzx^LEZt5sgeSn`bN@@5kn>2fTySXC zrj%Wq-@~K5b?C4-IM^h;nE(dbG_^<1pR{2 zN1N+cKgSptCe|m_0Xl!q_ESvlyx_FV+y}SxKle+D&=#JG^hqx8RFWbq3&e`F3a0r& zgzE#JjTjWxwt{b1SzeTmpzI4$0>I&ojg1lNApdoXE4XoNyLZo6{j}Fjdy)`(vuRJ0 zQ@^Na+U7BPb|N1lzY}vaq@fp$IGBP+A`=PWs(IAVDvAba#sMBip4M>_y*bZ3yh-B!xxXvRY zP^{ycYo8@VQp#opIcnYz>K%Ia)+0BB)7bwZZV6{g%)woi^h+r--^*iv#;QF<%d!XUKpQA z-nc=!o7ZOCC6juRoNd+CGqzw7C5h2em+~}*+5HjS+JrnMX83_&TZ4r1m`h(naFN*U z^G0|8&i$d0!9opj1qbYfT`qTubXFLM)^XCF#VM8bg@YqTN0IW8RxqVv#?{Ngc_4HWPho zoO~UODWP~ax;F}W=Cp|7zzq%VZkL~jeWk<`#&+?R#j~X}p!T(Z_?{Hm`7jNe4Q}^? z&yQ&3c~AGlrUiQaZ-6e!>_m&|G1Xjz7+toS5@=nUs_tX2MYLSp;2?6x%rb2VP1?MU zByMxzZL#tewXk9aL1rk7+8}%J=q~STo;G7?>gYki>Qtper>DyOXr{8mCOhjyAQ>Ls zxQkj|AKn!9m^5%IQWm_1uvLv88U%QNkqqV5Z8hc>B35?~YIN>ckqk3k1Hi069HI?T zha@hHp>ExBdfD9Y@ln%1Q`cHTvDm`=p9yoLt!0`S&cwx0_P45q=&F_3)V+(kpd8cL zpzWKimy5aa0xgvyr<%T|66YtPKEYUN5RXuB3XnB5nl`-1S5a#SqX0xK8MQCbm&mYb z6BQq_HHkK#nqdzh9TF?8I=yXAVYFFNuIZ81wmMudQwVpyq@ao7eZ3(BAXq{C(Cc!t zf(4OKBG$r+rsaN@`FyrJ=iUww6BEpR6LtCNRt9HCEoIbcP;9~y{Rm}TybrYkC=9f* zcd4g`*3u=$6Nf~FRyb-~1b*z3!TB?8tdn)gBZzTHPQixbx9I6RW}n*Xcv%nX1Lqo) zX(ZnUWhjk$N&gUi@r64Z0JgG_UgFoN@@snO_Csbe-a_6AVOJ~~lzA{?M+qd`<-3B? z--_yhPW?D55SfV4Cw2%nF&K9luN;wGo8*hzf*Y3o`s zIgypWmm`OGUb2Zh-Vn&a(@u3872&Z8#%{#NQyGo*cr6KOL>?dfmGz;U>pq(?)8vA( z&n+#Q*Fw76=ZE#-SJNe5DKO9UqjNe8I_N4wb8U@ zGN$W-YBzXiOjc+Bl^m2(?ue}k2XBl5ha9Yka^N4+fglo&q0x=~vxokxh-QefA?j*N zYd_i8MV)HcsAY;#_Z7ymO=#3ge}%8MrOU!m)%pxv|4IDDH&@}^az|zvqsNfPhzt{m8tCJ6naQ{QM&^+9{m{d1YYoeS83q4 zc*MSF{T;Jau)IbfY~+b9<*9{5zgH@y4Teeu3jUVbv4ur829iS=x(J$F9JGq`w_8QJ zm*uq&_O%c7b*}wim+2!#OOxi|tTz3Xd&T`C5}iv6U9Ll^>2TM|UGR&B>f8YC>BnDp zy*(-P8&l;=4kIMZkJvpEFog)Q230Hd)p+{2!Z6PYY1>3r!JrWAx{&fOZ#jhp7yrGm zbgQw1xD7sz12Ag8YvU3?tApxfP{+Iy- zV4nN4dZnwZ@_ErDKAv}|z%Q7OfHYd%iUyLg5ECL`qin9*9qz5plToPZC^ZF{04L&@ zm7j*(anZ0{w>N#KGcw}+`GgpYODw}!auqS5xK0c6OYHB4GMqb0tz`aCv$9G~F}|Ov zpU2v9{^4bq^g@{l;>`3GC$sb>`_|g$43>0QtD2um-IMvV82Z1L;7Zb^t5cAEM23|+u6qPldHwCCL}$M zTL%|Zs%|UUX!?vvdxX$qu=yC30wRz6B4NVQ4r{wdkch5|5azA^Qq zx5{DnnfD@UeFsxb*c`Tf)KY}2Fd>J9KA`&i-KnIWx~H z{ofDwnfCw<8Nah{><5$X&ObF7eEY0Shh?s^;$ugK!+y>e3(mI?&JFq~9a%|yQaUZo zZN3w~G^p8Mh8vAqhxxoIe1BqAmR004igsi=FacZ?yVnV2$a3%ttIMkgY<7)(qGnqn z`B)11(j%H8<@RZZ<6D=z2YVQgwtEH;Va>1IHd>$^!^_}`Vs-{r&G@?1>7K_R zybt5wtk6NeO{hcXT^ng~S6lR84aG21UBexZ{sT52pNmstjuMalbTF?E*(jw$!TNZ8 z4`S^Dw+ew08^l@~(mR*3M%JCN*Y9@o0obX=dLaJDXpm%^Rny7YSu#Q$v&9Q>&iwDh zy0hH%qu$ZC+*2BBLsNJiv>z^`7al~>jPtr;)LGhg!_EZ`S zt0mqbF(0%Hko~ zI9JM7fBRD=b6fHo4<}4m&cEWc{e`!!!_P%9ovC!Wl8c$Zv;KXar?!E|*b5(%B|ylw zuJOTEZIYoJw1JEh|M5Dy4lk5@nkNzmXH%=o>8jp1KYp%RpL@Ml(mKy2DT<2ztp)pGH-8bjrcN=6 z^eY40S? zjHJkA7J!kbzLNL^mhc!o9*J3D+T(cR$c7>oV?su~2lm;1_}Xb7$MWs{9TR`WAb7&< zKke8t0~_yPJB^uc-cU(DT@=||?-uA6qi)KV2*?YquKmy~V{X7mo9okl$DlXL_hmhS z_zP@;yWlFP4=m_q1+?UkMh|vhywR|x18{|L)W2B>r;#4jA($N|4W^RG%i7q40AE8DpO6@Wp?Iy{}ak2)XbNSk|Q^ag2?K7n5zP?LRS=t*Xo*)ROftgeCxn$&ey30>$n z-7?|ynMNYCS^YkytZVv7W}vwy)Qp-bP6=j?mSGV?e-L9SwIs^fBBUJ&p7$gW&s7mA zM)4I5FmNJ5?19!N?C-k$m2Zf^Ywy-hBUx$8nVy@y%eauOB!$AhRu9O-HBr#X?VQ-U zT#D@Kzo^V2bLOC3n`-6Hts8&6-3z?1usVs9ql7}QBl+(A>u zS4&ham(JmGA^E6SFydl&3i{$UrsTQ@9@s^D1ucnjQG<(w;2{wiSQVtWJk-qKF5dG5 zCu?8YO5sh6rv_mys367%_UVH&szeRD{cxD@fV}#I#=uoyq$o2bPG~*0>kR1gXz^#j}oue)!hxlO( zT1Tog4AdHX!E&y5KlY*>kE}ix<;;u6AwbNi33~Wz3Um*?PJBO(J5r)Ahg`lYC9nR> zFAeZ+Y3~=Iz12Mp_)JF#g@=jhTWk1CVrFy_(ZB z*x~>(xhJu^vL@l-f}*E)3(snPI zY&~xP`%?NS0!SE{y>$B(;lCLzQvaX72&B3JIhKxWY->V3Gi@@{Bht>xXtG1jus~t_ z)4qs&@U(+zF-;_W<(B{7KOg>nPdc~rThq-&FNtgN8d**H@Cf5{%%rtF@m@03J{v}a z93<9&#r~~cA&$4p$N?f``tvbm+4I=dv=CVfpCDRVP_fuXus&fj` zC7o}!)Q9$0!r6orJ{AjazdnlTRPF~rm zz|nK1$#BWmDtdDjX-8f1+nD{_0v6Te105ZevC;1oqyf`NGbUWC9j`6ta?Nj>7a1tUib*fWZTeOE&Rg6e2gPzby8`aDif&7`SfU%G!xIPMqMCl386kU@}2G-a6 z<3g#mTVUJ*KpNDv;cZP$(o#-)NcERuj4a3{ZkCd{Lp$UW8c$2xGa`>xF(XTA_^_}S zL6~b{LI@#QIy`19&ZIjx0jg+t@K4_;#KNgUdlC$APvtcn4+TjAYfQ|GMR>_(S(10x zmtxI#Cr&l{eKJsTUaxb|u=ru})?L8Je>VRsq`Xzu{oG%T2)=<3*vASMIRaJ&{&mP{ z%w8*>c+TDqtiTW$xCGo^%Z{K@NJt3Fo8oq624u^*+kxelXt)Ggd2fYU-7@uFV68P> zIs!&=Wy(dy@}fl6wMj=lmu98PtzFk!Ke@rU#^Hm+kUJZ9yHBIACL%*W`6UvC9Ox;9 zbLPcvMPNYT`7^{J&v>6jl{8;LPs{xJ0w(->u^Hj%R0REcsI{pK4|N;_xSvG2+DoS` zid=ZwvSmq<;(GfpZrb10qVn`vihp?dii#$b0{sw9UL*$Tlmt4K&6=(On8C6f|+U@&z^Fs^QI(YxRzhCFfWb2%or@>ac4x8Np ze-5kIsj)c0Iuw-N2BKg7_)?%(QWhe=b0w6u{wau^X@g43;w!ag7;jV?GR3q+BsD1v zpsQ1E{g%p|7N~wGf0<6ksp+rV*^9;zoC5xU^CXtam}06-Vd|d>G1FkdpZ!K)Qb$apYP!$ErnMI)8j zqMdIHv(VpfKQviAw{#3fIoq+flBmK%KU}E;JjX8`OPTRQ_qe4}MXiIg}0`Kqxx1)Zi1JB{5QA=;-^Jhj?BG4pl$ajsuiww%Zl+j58nng&r4-Ll$mxk8H zft!^R^7*WhF;h?YJ;;Rl=Js*p^6-e{KPvOGhP3L7W+5NI_MIM^R!c9H!XI-Ik9^S=}e+J=Apm>*jve~<5O<&qR zo7`V)1|b-Ko3}r%5du_)-Bi?^y7T`g!Y9I0R@`A?ncw3MoVVIjJ6vucNn0fB_58Q>$Vf&)`G}shb)iqW=eeBO+!-w+8&#T_$U9yiByWB;mc>iBhj;>Nk0{h&**K?_MyXG8) z6~zgvKc&UqIb20Gc4)U@e^wWCAQAWeV3Zcr$oj!vMqMOl<(`zw!J*nnZmwQt&AOk3 z@(bbzJK(rB zQFo=xrVAg%Ye!dXjTq{SFI~l1a1$Vm5C$4%9p|DcG8)fA>lYcet$Z=66i+vz15Pb) z@r2OD`oDzRIRe_T?Gf)wP?vQ-s+fK@)t__rPmUN@@^v3T>}%Dn$JJVnn5g#EK6%RG@xT%P0@P(C={rs<0GeD)g&qq_cd`sgd& z4-|C%fM_?>f`dmJaIRe+m&84w3L1dhy575kcy(jxmI5_KsM~2|=6h>~{vi_g)nl$- zO1Z3yiZs&_)-`2ENgdAif5WmkbEAU1y3qW~-??67$BaLBPDy-rNbKQ857!q&aukw+ zyanM`$~D>MPB+(Y?R?J&7wnac^&$|2RAMN*68Ym3{STO?`ZyCO}dMnpBm=lEnYrwSC8){2UD zXQ$+)|BcTy7%=ZM$n3;*t=TDA=>fDVY8fSMdU4!w<#qd%GE7q_4h)A#yA*6uR^r@> z_L?qvMu)8|g~RcahttVlTDLCEnjaC+wRO(5lc?is4y?$xcgCERhnF}>rj(F8)Q+6u zNl0yWQx8%<;(wA0apfW;=uV4|K7Y53h>JzDa*)lDlT0B1G0P;z!9o1O(FCfsI+8K^ zj&l-Uj97Cw1wt3(FrA#u-swjw?u7+@uIGp0p1*^eruCZFmS*CVXa2T9D!AGp&`@wF zsl>!3UAd&PI7^`#BUxN#2IgU|{`Ft3U15ibP}+jcz?6kUXI&^=Y!0U1R|Kyh5_M^Z z8Ml&C027DwSbJ|WrMvO^31TYN0D?*`0p$X9mhWT; zNN2%~y1lH)845Y-y>WBOY>?uhjAlMQcF8rs&&R05qdh*)758}G>8V^_TPnmicb+xf z;_49$*a>v_TNVC>5UEb=-z&gY&@7r}FTDs)%ZDAU)lVL&STcpPGxIRnUi^M71?%)a zCZArn@XffnFBm9jzvL0-kcMsj0bkB!pBlerJ%bI4#wOkdUDTA@q~*e|673 zny{LYRxjb97qxmWT5is1kb)nHps#*v6<8sw-o(FscJ<@?n;+(@-Oy~-WP0&-(Io&U zITQqU%H=40@yG6#`$l?AIUxb?!63nIyDc1!_+=$zl)Nz z-4$}m@q|;*tCLDXDfxZ&#r-7S^-?;0(bYUdya>1}WI(^ZE6hJH-kaY%Du49Qn-d7; z%?uN|ierVs97_*j(EorxvELt85+Ps1uLqZ_AAJ1dkJ??0U zX~%tk)_=!+Srwz8*4a^Q&W0Q%D!L4)s+Ie+n3x&?PO4`m@(^EV`w3Jw3D zTxf+}2!%Ue;}a8E&*hAwUj;e+54=0;?Sq8{%YF=Iq0Rg{!AcmYsCmA5+6?-Z2=U44 z|Ek8y-ryt&|4eeUtm|yUf%=2~qys!D83=Drs`iQ3gX`#H&QIO1*$(f)UB4nymh>*` z!pFdM5CF?|;Cn+OC&am|-sH)U)o)q<3_11G7XSF;WUAn7%(Q(dQiWPB7$4&e|129c zd&G85D{1ZpnfQ_->N(ctw8X&Q9SSTa`Y68%Em=$$WiKgpk@D!Y!*<5PP%yK zQb%PQyLDB+iCz-jJbSv>=xCgzKZ@nF>GFDN4oYG=_3^ zR;AY>eIOe! z+LR18`g>U#yfq>FX$t+??wF06NEyScGl#}djv_WBinHQ6s2AFfy5ZD(|c;@ZB2?)~Ixt^u)P%BjXKrsog$X`AD&@xG74&TWS z{{@*kTc<_1PSY$0S%K7!oIWqC(H+>x)HMV%jKjUqinDGV>~UgRAY(o3v81DJD@J*E zvMHk>teY+l)a$~JQD6cp`^!mZeDHy`EqAIPPpy37Ua(58R7%pxO2IRewZvsB|99!pYT*Z=*$!-^xFY?<>(Qe4z zlvHmq;ucxn*|JS!o^l&s2h2EkI25c$8`t|G8JiI5aO8~azq{!TXY_Dqh-zr?GT-oY z3?8eY{@1lUr~H!z985W(>f=GVtPw8UL}{I7jPfbP%(n?e3>{;E?V1tHp?`y94A{?R zy=5DA{vMjTk%><(hFL>PIlxdh14jFLU3>86eW959=c7D-xphB(k9F{W~T3K^br%g))KRPZ|ko_mRBcGu3V_1Re-gZEV`AgztT5zEjli!RYLq3tLn zRF+M%&sJ8D)SL1?Ib7d1_poR*9GGpQ9MJ6@XweEIOzk8ODmFuf< zITCVc^F=_;`^c_QX#bpmP~NftA;nF#sRgJrZoMo=@Tx@9=Otl$23dnFge0OrwM%X_{4B7L_QCPSF_74|uA|7p`&V(wmQ|ZVh<~5Z4Uw{;m{RfWL9+?iAFoQ+y&PGPv^E#qJw3zzN%f@I$Yba$kj z3GA3ZiB&IBpxu5|_cNal1?)zSExtki^ZR5ZFPxxqkprZ>Y2;6hkop^3smdm*;31HH zuy_(#c>I!0yO?Vt$@M0-s*H65EE5a3h$3o3&GgeO8t*T`;GS!VdgG89vGU`lYn%UK z+F9n;scV`)6o8zd`YdI~ji+dy(b7lufUUdBF{Z&}0Y*4wQUr%zDAppXvx7+qSWa0SSJG$^otsW0Axr+a%FUHI!Uxj7D+KsPg)r!c)RDWWZti~X0!j4t zE(D|lEC_kn>?|ydK%tW9g<^xE^t=E#kX?<9S?zCKzkD8ORHfAq85|3<*Icj0%P~(I zc6eO!L#Ykwf}$G)A*KOP@lqdMy6R#WI!$xrZ!Z@vT*kN`B5A0oRe#S+E0`aJR7{IU z+JsdO{7Tm&V!v4hjqNB~x=Be7Adgp^YEBQr9^fx}59i%EZiA7?w8{ z#!T8TYZSRAGC{$loy&JxkkC}?59oB+fY-lOlv(J(`y})AOy&#6I>b*SHNz$-F zlKNQkfy`wA;v*x~E%S}3S4BgkF<=y-e-vS1S4vERwg43mjZ-5UhOWRe5^KW2SBq$} zvkT=9+SyL7em~cR_%M227aHg>&0GGto%oT%Oo04cv=gWH^*V88Kq|tad5BaW7qYZ- zlaNSbV4Y|z`>2QSE%2WOZz`_(VHrt*8TVB9xM|++_iG$i;vt{bt!N%)EI?qDZIArN zyrjFgf%TIDO;i_x+Hq7k^iH2F!3aw0C1DH*>x8LHU?p}q(7T{>1lt9rcU5Z(Ag2mY zi)5+z?N>aEcKVY4_}tQ2R^g7>0?WB=AbboPaTOllv77CXeNYS0#Z(ypRDvgKH!cmz z4nWkCOl;I;w{D{)Pk$GQrW9>ypFzQVkzF(77e^v*oDf&Qytj1?^;NOb=3#MO0U%4$ znn&HlJx@iY%fSzc*IRzVknAFky^QI$`618lq1%0q*8R8df(-Xb(mq+6!2g7kc2@WG zaEIUA%36U(o_^i0D%3Xab0ED=AKZJ8Uoh}LDq#UVr0^Fjx$EhQ zrAJ#T{fSyNNo(sPj&f(JA^GNhp!{`wI8aZ^ydL4H$@5q37$CfhT4cjWuXs?Hf>!Po z0=yy&FV2|nXbHgrJW;=3mpd($(b03!g{hzWd&b7#WCyMKBmiGYO3qXT@Zv(|+L_s4 zr{1Vv)RgGU-GzHdTr;+E;<~b%{Qm5BL>zw;M~>aJro23bT*o{7Yhwx1znxoqa$cTy z2`tw;rabGR>m&ql#vE^>6v}Sm4Dg;ji-{%I#V|y0@1N+Ajdeyd4 zS^2etvi-U<;RD`JdD`?r(#c;s&k!ZN8jb@PZiv6HmW>_x%p|)U zC#;Pa7klTFFwgT-9*PGdM+@!p(T9=E3+ZT9lhGM`4gHJz6Br>3-e(`}uaY)T2XeZ# z_W{#j-H0l+fI-@1H%O_4m&a6jb>B_76H6Cy+}M&FDIZ-vxv(@F^M4uTb@W|ouajXCy>oD_d{H6n>>M&Iar4L*6dHlyP5PG}%DKcT=g<$Mn-UeFma(OUEuh-C0Kxef z^dsOgJ2=>3OClAXxMlvlN9vv+?lfZ>HWH1(=J4Qc6LF{fvZwgP{nITCM%DoKF2*50 z#+sJ)n49#%UGr=4(MZ=IqEfE!eE0H~MN}wh%~w*)3BmSt>b0f#8C0`4 zm}5%yBK<(`fg)T1-hUvJ_~N0H;B*7*Ec-OM7w{=sJ+FdsV zTc;;D;oiWrs(P!f{%|Y&h9qeA^lKPqnQ+k2;8qz7ja~P?zTVi)2q~^=2UzOCjxT;^ zb@O91A|8{?`?~JaJgoU~=>o^YWryy1c68vwzuRda63TInMDR9e3hT@UPh$wx51vl~ ze|d}WzKOJII6aEP=ilgD!&{lJFU|^IY5w31vHlgWbqecNa`s=Z=}m!}$Aap(4Um&>1@4axoHVYae0zN&R5)1BvRr02Jv-V-gW>75oGJpu9kYX-ze9F z0VwP(X@rIoMC6341ey%HM=PeTe6(Fu^}gAaKiO{I+s7{xQoUY>L$!0Bwmq}^EBFqq z)sCTI?bV?aY2>1QhFXV_*7fGv$G&hV4h^wnNlIi)HmsK}EpcQ)x8)f)N@jKDDlD8? zGS^gNF%x{ftA**F-T;DLu17g336{EVc}c6RBY3u!;_hWcQLXGW%Prdw`{hmwybY1m z8esgy^|}*G06p_W((RkK- zi8D+}OW_{*{Ku(Ox_}yKHMeLfiB`EgBwe}U^QR=pNHRBpwQ!xRB zZU&)3B?t%$J0r@QN3-a`ZQ(^f*x4EZD;Jg6qp03^7xzr{(~B^Sq)-}02r-RIzS26% zu-r0V2AA4fr1y|=S}n7?t+~f^XKRgo^Zk8 zv=hYq=I227VtwIEg#8O+DYzk^+r4$ABRcoK^YD?Qtqc z7r2CAIY|_^Y?wOMwLKRGOe&E7g6-P)J2NLL-DdDbyL{&%*K>MLC=T>cPg- z;3IK?S`a=;uq%SW0YRA#L2UO69opo5xMZOQ1q?Oo|GwWV-yy)2k6XKCCmYK%$u4)B zpIWM&LQNRql%%4m5z7d8ZPM)0EV#=+S14FygrX?o?HlN1g3umpW; z?X0OjIhIT4^dGggAfS_&48!3bKsyDM5B1zFn62@A9FimlXk@}roc%_FrF^h_l8ACW zIMk^vbG+Kl zE7|KX|NPUd|Cl=8r~Yli6_er{1S>%HL0l>#2PMYT>e)8u9gyDcu$?b72lA{#K%jtA~S~cWt}c`ir_%X!2Hnp zVF4Mv1nIdy7#G-29LL#q{c@nwbJiNurFbZZBbZ(ACDuJ1i^CIrTI(<+N|lZt^_v9N zKMddnL{4B*%YOy5n7UiA2CebiJp3#cUKx2vNh(<}&}o%uVPU|a6O}e0 zyc)JvStd6D{0L=?%E~j@uhoNW%-8hZX+%-;@0pDtS}bzbxL=zQEPh#U>>+iOCJ)cf zqG`Ujn9O`Mb0&80t|v2UaVvO}=g(0s zHWo^@Bu1t*`>F38aD}!Nn<%!oq}bbD#oe*YEBqAF@Dl{~F_MA?I+whxR<~JBo|v&% z3HE%+e&yVfSKpJc|J`9h*y;iHk(-;c)C5uq;|+XwzyJ|Z0YAUk@a{Q3;T%z?wFEqP zqoD@L2qU()FK5YNu#b<=m>q>@h}OW?WyDxOxC#*uroejQDw9du(V&#K%U{`B>4MNF z{K>B#odKpWIiA^IqMryFtT3^NwmoIm5+eCKb}-F3Bv1lCruS{Z><)#?lIg)7{?8U- zR}e3~@KwBke8l@(krkx)P@}p57MU6rxIsPY7a-^5WcC=LwU*+R3$ z$$Ln&MlJ^>>U=tC^*l8q^u{S$iQ#=Y*G57Iy)NQ-3@}=kfFBoe?J2r-OrCj)zj5Mk zwqh;e6F-VB?M89-o&Qp|j-KIWUiJ3KPPRWlBZ_L{0$`Hm4Qmv6}eO(N*FS!UV+l*U03}V0y#lLO=dtv9W#FIo~y2@ zA>qp1tf=N-GopY7a6@Bk zLk>;yo+jFmfdajs;HgtE@*g>#&@wbd0pxP_mW42aCZt@VD%O3@KhgG~R`kTN(D405KwitfSJwyw?HAs~MXvqcm z9ee3zQ3ww=g81abK#U1xrI?%w5+(!3l=;W(62FSB8kZVP37>i`@noFj8!fJq)jzTB3K1$g*4VXvH@rmSZjg%@5*G@;eJ*Vg*}rQ>t(}W~+9J zSJj{Ens%$cPNDGoIu07KM`()$QotH`SaDL=4&reN0p$9moJ;! zA2xFa$454EU}r1Q#*5ZTCFz!GPD&~|WgtlVM$m4#kM4i~FF;wleY>L{-W+^Xma{o{ zaTO~QPg7;WN+aFAan=P({zQ?u6&K^B7xbaKWE@k!A}cU2&_K_{Ug~8pr*Ze9nBW3e zI|m)Bxpz-a( zu7Z1GvGc`$@3xA1s^{^Tn0V$Xwm{@LBSo7;;gXZ`kH5J|@Kd--u^ywwSsJX`vgyUj zD6iXkas!Ja^xt+7SQXP(VY z(B~7@AM<%F@sG~V?6>7du^6-X4l3W}&wVV>EbUDR_J7aas$>=-gz63BGO}nJj$?8C zs>rNoxivQ&)qsW1&$OP=r+^-nE}nmB`TSL)NePWql#!SG`*)up3|=Q#&)|1@MSlZ1 zdK+%BvZC4ic*~;1Om3iSwVJb0hN2Y&TZ$M z-W_9(w7CRpgQcEc%5$3U)UtP7JT)AcOTq+8-jw5D z2FVQ5cmgIh-Rl^t#fY3q?t1(L` zOB}@CP@gWX=Dy@SBKu_|4P=@4X`yM z%<9BCCSZz>JRR!y3+2>k9fo17DGr_YjSR_D}jXQUO^Uj=#6xQ)QX12&>#%>dH z!s6|Jv3M`p%-KD?Ysh+vFq@VsU@0>p!T%*_D`2QgBq)V`1+I+(&j`C73OP0ul^J;( zf$knS2WXT`DO?03#JGeG3}E+)kcS_h^R%xGp^B|rsx8Ggz1h5+R@jesy$!Y^W-+QKw27%B|-Av zcPiNGC63;@ku>&iQMHLk^(K`l9LN;8oP*FVipORdRyK9VwCwPPV)-EEpq~qY5*9qB zRW(TYZF;Bzv$|an69=`#YBY3!bChmzk4*T=quFu;@I=WeymAzxp`+hfO+prA&t*4u za8!Bp>%Ow2BbEvM>?R~j=)<((q?Pzm`J(volrt$2oLRxkMe)0w&B)nqJkAHDCz`(E zAkgsH^($1|(G*)tQgFi?QJ;VZEu&JU0cOtHsH_G`*Z%w2L}^=9Z!ECct7v()zHqH% zIN%&{;FuvAQ8i?e&Ys8O_yOzr!SeTQjHwj9%{O(f#y_cm)EG)wUeP>4AB)WTfN*aQ zcZI4M^ULFddN%q-=zq~lP}3g<(saYrzlci+u!@>4od6!{Bt%<@^R>rl^1?uw?y{l= zqPs@V$HZPftjcY)N+;E*3yqfJrB`8lbN3<7SZ%oc%}86f4TIdfJOS?fB!iqSUwnKW zyci$|^~C4QnkKMUG$Hx+i3qmgQd5pN(Ycc@Mlg#Vpx_NRjmBlyhd&uIm$y}xj(;L0 zl+BlJp*9#4ohI)WE|;F+$E(Iu@KxI50b=|7Cy6(TGLUMYfKYr4 z*nkFqFPW>Nj%OnEUPO3UADISTXNokGY$`vEglPz(R+aHTFcdqV z1sRwY&-U{iUvq$m;&s1u7RdW*FfgG=C$(&5Op*9oQR0`u*s2Z_u=U$x;HKv)A1g-9 z{7PHD?NfcAj=c~Cn^1M=ie5FV?J`V++zijY+CBvo5t!?KcqTcnW8D$mW2^qyx!vXO zn2swDF|=P3xRZ7~^Eb^3n~!veP4h|HZl*fq$ekfg9CuKoB3Sdl`FHr)ivG{FCT0I_ z-cA1xz~0Ol<0L>cXQkoVIP`P}mVT6LZG~cvcJIZaQ}eg~oT~&hOP5eJCoH!HT0y2^ z;dG6{&MQi51%>yo~rJ!mF+PpE(Ygr1V^7GfcJbdSpcYf92{AhM0j>bC; zBfv0pY*zkamu_^ry`I(Z8huPRP(+}LN z;ZNT@%9`>xey6OSk+nSQ1-ty{CAGu-5+WUq8gDdEoc`c^adj&Gmc7I`{qu5sYHDsQ zs_1v*w}y<)IZx%zE+|&^L|0Zmic-&8tT5iH?RjuS#qGA^R5fb$Kg`Obi{Baq3BvUz zOVSL_l5a;4$0f53j4=47zn2OiY!BnW+`!EfdtIC|(AOwL3t~ncAbKGa}0u+};Z7g?iHe+56E&;%93PPliB4GxaO|h-AO4>BaQp)j7w~(~sWS?yt%-GYowG zWfU+oK^mV%K8>&p z*UH>)w6jak@!oOCAgZZ8;;{taqAYsCn(yd=xH!UXT!BXY<*=Uvk2LQ2rM@S&g(aV6 zir1{3x2d#lJKDFzR7TSXe5*20LC(~5u@^I2DBrb{O|VtLH$$%HFGs5&mLl7=#O>o1 zplk!D2zbDYi;U4Eq;|Ck^bQuczGyCBO$eNzU~|90#b3s(jybU2BAKZrY<$AzHx$_y zC2Q}yP<=kWHNM1DhRTCTZMF_NecVy%+tm3|3F`OmH6Pu`m#A$YUAZ^ms881XU-PC_ zOVhpnFjJgK&@hXfF(_`B|A9|&V`3h?9aVW9u1`jua+Y`e*0I!1-1#{)a8Y{mr>|BY zxp861Ag7q*&3oAuMJ-qzDkw?xaP1jTgj1lArN0eq$v{1Tw#yc(X~tY5-K^E9F1M=h zb!x~;#nL#0HjwUu_6!Z0aP72`;$3iP`{jSucjH)m_k~gm&p}s<)-{@SD~>v>j#nOW z92k%?LNNaobHo2{qXU$>nZxlup4!|y7iXDI4N zPn;H(!AGencKq53+l?<~z5&c9OEsE{EQH0Zv|87w$JDL3MRu1!WIOW5r5jFpgR<)> zFGP<7>93mG?nW{}j?PC-VBUIVkGR|l-FJ$SRWZbF*v6E2d0u{oq~ES{yV79N>cd9h zmnurRZ165EBPq|Ubg4H=yY#?TFl)RZ{QO1au zBxMylK%pu6<0@=5|a_rEDz{Ex%aN{-9#`E6zz0eEeAdae^RIyajfs6@xBp4b+)-<-4 z6=7);empRBtuqc6I0#L>nPRf*V8k!Yw+?_@VJ~Gw-Ecl`#8T+y%(=7!Ckqh~g>j4D z${e)XeOIW#PNE4e0mfhNb@N&IlmoG?`Qi%I5jp(47TZge{A_ZI1xdqGFpPk}}TFB9Ma*m^!~dSBzPJ;mY7|yKu|d$?t&ng*@+Zy=M1k-62{w;jQit06={YH%Yd^vPrh-TFCR=_ZY7g`$d{P zlrjib^ZO2B4)9#6g|`jPx=oi54jV|Xw7nZ9&g)W}N~qAZAF&=uHE-w1RRbpGTF2lmq5hiZV)ddZPdfDtU9NXlD*+9CSf0ZOy+% zR?-BNs=a8&N*dgwzYvzxRMM-L^Jljz7ctJ!KHNBpyn_M3y>)m|0e8gW%S1x#&`SMk+&{6M?{CzC>hfMKPxGVz!auuw!ZkRdsuv@%4OXNd_nC*cVTmI{UA;T`psBQgD zP8a5XjZ>L7+`B9RRDTcmpFj>hV^P>wO1xmX{u2Xb*Q}>|dZdfM{yrxl{#*6!dz?iI zAmX&B(?Lz(o*wbTP@n7)vH6HjFfNKSlP z^ZlxM`nWXJTsV&Z%~2{^pS><5f0sY029xVPfTX-=)A^y-pz$lhEX8Th-fgCvP*J*i zp#$S*j(rIkz@9<p+7su(evC$u zcqi%OzTDG(c>YM30|kz`G2?esc*`&f~j4~!rOVH z?e4^LPw1|5lfaLn!_4vZvI2J6&#Pmh7aZfBRJ;K*WS|loe`wtN#;0A% zCq`MbV$2>}60~mXyKlxjhZER%4a`C7Wg6y9HNc=uT}PUbYnHsB4EP}6;K+g4KZ?*Vt+qABoR+UlH{?j;zFDR?}Sc4!nKd3qi`7<7FY0hrV^ zJi39fvK`L?Y85EOA2i8g-Qmf@dbVt(6OCT~C{Jqk9DX++K-Mu_VsoY^?}g5UqMB+> zVp-MmA^dL;PMe8EaFQ@Zc6OAlV-?dg({tZIj*%xj3^x;F(Nqu=Ou=qPCQ3*07D)*yZUHS)0a| z7b#&xL*-4R8x(PYoC>UL>Ri7>5dTWpC<=zAN)SKngQ^y1%RmnHgDQo#bDQKy-L)Qm zV0?7AzxdPEi0I9w_!}lGWwYh(#?}i|;3{LuBTrv3$`j_1(o(}p-48o{{wE3JuO_Y{Fvt|o<;~W3a9(Z+=`=@nf z%^d6o@!7QEFMP9&W;*kzgkUBV*AC3TTcv=grPAmw=J)BLqBxZUPVQx4rH%9m)rAY| zL0yn=H_%c8q#kc?UcP*Xf5`~4g!BV9Tg;bsF$C`b&l06L8)N|}?T9Ko=Gzk^&#aeQi8xZOZbu<;4ig-j!%8OB)D04|K<&;r?x{(|5t!Zm8C4t=r|mW&ORG-jO}$-Pl=-_#39m`{PAR zCaDh9z%wPmySwN-7C`*7_~bTj-bHdS$kDr?d`|DU(x?G7mt$wh%U;j~Xmg}L4bfXL^9!y}c?%O)wTWFo1|7KAf%=2G z)Xu8u$SnX;Q!p{di?P^{GKne~`)7Tze^7e)3>YRQBqcl4vm|G=^=vE+7j~>i8j@m& zTN_D}AU7=6q}*(rXZeVB7G$MN_!x!@QZ{uQ#|G^SO~T3^sS6pf^ZwwVd;!7ZRsYHg zc_bYv)ool9znDC_OH6PZUlKhkh3O6@TY66%2@TA@Fx-zxf~FV}XgyeI1I{IV$P%U; z{iP$>p7MiCs2bNv(UoIs=e5iBeHbDF=RxcjiSH=PD%#r>Hr1;lHKRvpDfg0)ze&BY z02`3h*jYo7QF96ij5(lG*nB>vz=lU+Ycj9k=E5-R)xP4#S2h6->qXz^r&M_v4fGGj zBxf$}ND4gwPU1TlWMR?e;G-Hpc-8GQzd2YA6e6TmrW^PTD~Wo4@0zZSdjELoajmMS zOBj(@OU&`7;66BtYeogs8uWhuunq|Nn8n{;I(V0HM>eV(PB3Pg`|N1k$_mBA|M4rV z)X(<&6Ab))=yN2ByvTn2Tb9t$oHIgK)>_1R=TA@acpsgk2au<73gu)=7EC*;r%lq4 zo|*ZNP3GGF(&ThNnq23{H#1f*6gr-wnDBtF(7`K7NfeiN-P{XfmCNU0bke->%-RV) zex^5dq+00urVyc%3alC;O-jOr5B}svqH#S+CpT#Ulbqc$4lUVL#VHXh`AD;J*Rym! z;Oq5lj+m)(kaWVD$<}1j8FqV+7=X>_(1S;>X*-skyTa`_=|LR$fpDIhmcz!4X!WWE zym~R1uu`WV9a@%g2~tcM=X;0un2_qyh4+xEzI>oRVVBHXw~WbqjI zWCz%nQcC%{i(bUVPJP_hsh8}mq{cRN|1i$+vZS+j-A0>8m(OidChz-MzP{W|(ns%y z=x3gosk-Mocq>ms4a>n;6?=ck7{>6y9;V%vG9)>I!sn~3)BXZ5JQe6dga5YVG<> zGDYPz#heT4=DwtXmTx)9YJDeR+=`Opbv%Cy_8Z~U)kR@7`_Yo;^3l(tDuJCw{j-VE zM9Rp@(y`Zj>MNTK-9uq}XO<4RdII-RveeT9fI>4xIq=b4)8aDvK=%ASz2?nVbIww~ zzxx=DOXqCNTqe~VSYoM!$x@lZVcEsopwyOx< zw+9>BN~y5)smnG9fgI_*^m&E+tKr;~h90Pi45%2_)gE1w6i_0R?|%#{3M2k9XR)ooVf_yJCl^fLQd?q zh-a9HC&}7U+W-m z7|YZmjJGRT^o=i()jLNmVQj5!@f#BL8=k>kuGWA%Qu|NrIM!+psWHodgS&ev2H=) zFCI^yeK>xZX?~`tDzUSqUpMrAR-?T)m3yPn7{^^*5zMA~rRhw-I`(^t_p@@bON?e? zAIfQkARXeiAbr{NjZRT`COgFC(1pDJCX>_`5VX&K;Py*VTCCge(+wxdY!G=tTf8EA z-zw*$HIJ<7U8FiU1q?Xm*|O+>Y(TfnKb;!VqN^tC!!z{*3jD0l;wx@$P6tw6;J8{j zKk3N0QfHmaWvt&u7@J!F+OJRe>mp-RW`-oY-}86g6e+(%g!z^+U}Fnx!fT50@lj8& zTaShLh6Wv;Y z{redD$FKeBstCRm;PqBVk0$xW4Xh!j^DjA0$&2v6d#5Dxmk&&dW!E}25{Q=QxyE5J z-PQxyLTL`!PM7`?3q{o6-}s83PWJLZqK%d{fBJ}X_;rKXh~n)YgTiXR%s*y4yTDp6 z21@?VpC7rS-q6s&tHBn|9!8UmYrz7gv>{VgtcYhphY;bl@6Bga{Vy3%$W&UUmR4Cm zAT_aY>GBMa;RJC~fl44RO!=IJH;*lwpmO90w8%b8ee4H6PqqFodNz7DB-vbd6c-EJ zbQ0N9QD?zCn#KU$Rqd44fkJE>w$2;@Xw45j?w*;iB|go%Rh@WiBazQng+jD*#`7um zXP~4?WxxIvn~$i)Ma(Xa;N*689)QuL{Vj85BPo(YQ_92DCh8JL+yMKWj&Gqz<}C1c zHR1j>&we`X*pu^3OW5;vWeV?k@W{)>NN97)+#faps6cp`q+}m?POKbrcp}8nZyF`pocVk0J#@M`dT{M-qR3QLh2UbMQTm2V7O3~I=cHHp zTj(n@T$r#r?c6?3=@9_Mn_rW7SjqNH3n41fM8|$DY}@Zi%jY?q+01)T445wC+~QOY zTA*kFxv$v0f;uL7bXHambNRl4#^}JffmR`A2PlT{8 zP1g!M2@MauL&tcri$&-5VImrJZsaW4>h+4LH3i7sTWa-0FmEe{?@}=k9KbsL^f*U= zxi)}_^vzLZe0cV|i`FSR|3sLTq%!Uq2tGk-lTdM7pc* z0}D?y*e8jdEo0ex5PhmRxE6rYc0_s`D5Ls86&yD<~?95L2H9tu_L^iTN zmoX^_@~67t_|MI-iC9ccYqJzp?{B7BuN`t7;78iPi=Dh2VOc4yC|}i-o^$lBiJJ~o z^Y!um&a_=CZog;kZO>@q)$t-EL^1F%t^llo9vh!V!7jbv4H_ar8p|{szet!?1ez5q zQ}avm8|lM4u3_3kh?OSmZ(QYC;u^!8AOYs1DS&#ya2G#EwMAy)L&*NMs12mA92A?b zCQ0{hW2or|;bX2RMkCu*m-X=u7^(~t(HO=hbjxvz(Uf(E$+llc%5}%JhM>?1NFn}& za3?>gUR;ICoN9+y{W2eDV#sC#Hi*1^ht^LL!vue3eY>;9FS;y8N}08Rn&kFeNXb zX~8~l?4lWsdzLo-Y85oaIgaDd;3*czVIH~Xz%#mRB^=vD88r-;%t=m*p9T)OTs@Dp z)q#Vu|IRpBNDGTT_TgD#TKi=5A)xusggP?+RXkjrFGRqXu4VVXbHzwd`3RN{WdYlz;0uH93uKF6BgiP)=Un(OrVaw(i| z;~>RVIC)h#A;)OnoetPVN}Q^9hEsi-GaymZB^TOM4MQ@A(a=W@U5VcF1{=Z0YADt1 z4i|`G>^i>G=G~hDJ4^#?Onq5;&}O#e;I>bB^{&rB@NvXQi}N^Il~MM$8tnUG@WDSr zukF(@*yvoprp3|Af`sN+N~~b?Ik_`7H$0Jk6}}SemG<6EqM7sk;DGj2!*Db8R7zki z8dqd+)ZQ&#Co12ls3bP3KF1}&M!+JQKk#3WcbfaJm(Ofbzt^NBJz#S{)6nlc9>h9S zkSI0(jnea((u<|c{zztYiTYCtnzSzIX<87#B8Pu0-6K4UH2b17VG8nF-@_u__Z#-J zZ_`BFhxwH5&%U`LpkofMU9&u|!F*wQtSY@}r9gq|WGutbDgsAI`|AH)+uMj_SaC?w z*^$b_-%8!CZyrzm`;v9Iat7SXpA{bS9#u*vwiAU;l|kJX&hCZ?&a(G@4#pW2H~Aei z!a_<;Iu2TMP=aWTv-cE?t{X9>T9k!ADryVl8pf+=r+)>$WYul%SJoNnQ^)ng+ut>? zstAO+QZP0tSvopjIO#L6E9zO5^=-Iya9cYMM-Tr+)bs{VZ z2jQlH@%Gggw+EVZ(uRMg5)CN}nb0U;gk!`Wj;Hs)4#T)DY&yiT#JnN`-2om=M<$Wp=R_f*Xbuq?MraOBto@EA@d zK;xJ^`(KcAhCqG$uh6S#Li zL-ptw3u=>^@C~KCIBB5jiaTO9YA$RP_!3aLtk}P+XXgY3GcUHxMgC2&9RJx(5~9d% zkzAII<8TlCe3)|ise6}}RvN77&*fyRlvj$4kJ}WFU>7TFIrk&M!!;(e@UM^{Oh9?;m z=NRAY7aaYDUv(kAPalN^QNU>cv#+p|C_tDdUT3lx{7+B89;0!3WVnhKc%!H$nf^2u z`>nC!$eq@cAKXV`;;E6PkRIc!2XLGf4 zsB)s7Q5`o+`b67W>4LhBdvi=(*-2=)+yq<42=am#Pg)!28ddoU6gO4v#TgP6Uza74 zfD}&D$gN6NVOn=Y={|MqaRRTHf!|aC_ikoecbaB$UqI@Yn)hBdN~aWqk>&4uMeQg8 z==z!ZwjN=bJ4T5yfx{!c^e&Cebb-Kwj!k7I4O-%#3+Q>{E%9-m4Nwqfo}3bRU-Rjr zAm=3{z?<6EPUh7uETjDk9xQI8Fu>jVVG)qRgY#U>keV|xUNsBZ&Et)ra% z>Q{SOhT0mb&59H(l(m2ikN#*uQ%Eyw8y=7-JE<7k^RYLD@@3TY@t)OJu#`36XAeIr zQ`AtH_}NP+_tx^l#Wp#vBNc+g;anqvFFl%P5%ft!({)>2>*)AwV1kn=-1Hloi^167 z2wUj^a|>OJt^-vP=rj1ZhuyQEZDbjo85?_!&g@weSChD45b1DfUnL<|lVGRaJhlj4 z<$gNycg^|QwFSIv&$U@}7yT7GP#G$Y?GKq7*?SjmWSDUomITW+U2ZAkN6?5xiFAs| z*@r~b0u)O?)XZ5eXDWH~8<>mL3-8_Sm~p^U(F{);Rw%8CRyv#p(@dMJZK9ID0tx{N zhNk^xM)L$vEzuR128w1LL03tV>s1gSdRwRF0WYJCTA{V@02xDRr91=td9sUegnWvR$C3pw@nNKR_HZ9hnFB{M zv0l{zka)GSfwFsmPkr?q*E9VKl0vdy8hP{!91crNPLTr1uMk*>$Ma+`VyT};uC7st z&w*FKS}$7b?E)CN={F0D#l)?Nab{Ego}5axm_%>?i9PSP(v?dCU9uHPRxWBb2U8fn zEj4ng4#pp)F)gM>Toc}mqF{-RNpdzI>0 zrEQV^y5Fzn6q1>aaN>Y0y5L|K=jeJ?3nu3U7x#^@8e#Ro`dLzg(_Ij=p(j?S&Ob<7 zuvqO0h|PiSGT`Y(mqw>aaP`-GofGCTb5-qPA=^>{!TydY;Db5W6k)%y3y9{+DsjPGD$#y&cTrj^>;k%@cEs1 zf|Z*0@NW=p{;ghJWurVimwbobWD+f3?JUFq8pg~N)dnO2;B*rhg*S3kaR1uS5*Y;x zck<`-<kf9P<6+!|@U^OGlMn`V}WJ50s2Nepu8sHxk_}RDFxv6rQsUM)yuHHXLF&W2{ zjH~;NboyB^vh}W6;^@|fCxKJQ#SD3lH!v%Su7wnw0kK8P4KdGo>^x$_0Mo>b?h6Zz zR;XOp0#I+`7_vx@UwR*v^z=bxbpr!hzOA;{I)`d9uAbMgA1yDz$~50+1?IjnRxdWRw`a*+Sc80I<s z<3c`<(y_IB>-&<9t~@aFVd26qZtY#z_p^~rFZOvr%rDyY{4!G5?K4gdZ<|I}Xp<~g z=X)|Js|cH9*yq)lr*{QNkCSQE9T}Bk9n<~)b5F<`WL}u*HkUz zkm|%R|GO{cY*de-@iw@PNUS^|@;`K)V|QL{)UF$|jn&w;ZQHifIBAT=wr$%+W7~Eb zr?LC4Jnz_J><@eYgCzHzwXSQ<^E{3Qf-sC27Y)ArH9Y}20Xb_i!<{hLrC&<0V8oM z$9j}BC7bv9S`Q`=tBIzn9O=0I#nJwA#$)7U2GZgkaTwa-?E!(f8uT+}tYxFzUi5K> z!A1GrbA(%AJ@Sr$Ii208dW%*3X*i8o>&Ru2+{|(cyZ_Cx-LC0ulh-h}rB9T&R+&Wd z-^jO|)c?!@&WT=F<2&^{YdiJBS;6nk^^9>m@wesKANZzx2F%YEI2z`@0|Erdt?ymN zLizgC!mB4yoJ^3VMK1gEnPPv`GfkTd-yH;K(`Y=RsFSH`KYOWGLvXW9m53(V?CnwU&j&V;gw#*H=Oeh}3HX04^A zzX(HiyoRm(rsl%yT=(C71ZAOSEMgL{@-S!kmRRHGAFP-S>7f$3_|%p6_s+$$)~+PH zgO#%Jh6Gew$~U@fFde)wsHo|Hoq>qj%oR#GT0Z{-I2J?#mpFrl02;^hdBEe+Hhwq$*b zad586yY<5-)!~Hk6JAp%;4j;W)qY}TtwhDU%}qKmwGdoA@9Dh{rBgA`y@i%w-q5iI=*`6;n>QB0ntqtZh9 zE9THmWoNogu`EBon8TjXo*w5kknKbCtW-5&;^~?o^stP809!}3%#AFMpPoP*)ScRh z=1OVnq!x`LZ>Xev_Wfn-7CE_pP=)2c0CMqnK$TGT*{1xkM7zIle&PBWUeYPC5^<2l+#zy15i{&M&jRvwY|^Qanj$Qw2X0Wei~=)Q^bG&@f_AHFW@n z73dc7TH9x$fUe8pcIfUthPYNR2k^`;qT2IVd^wcIu$A2<4|XToxI_;}*T6^WMld!_l&cYZmCEvz+1V(t+{sq-NmOjA%dPy|cAF z%?%Y>c`~NoDc>Muv#$=S{QLYi((?2U3LOke!YYxO(LYLBAIxDPikKmr3s(t^*yH-w zOms0LdCSkZqkht&`8~meuN~I~yN_&*2|V^PQK$ng(M>CQO?(~B5ISeLRFWtF5et1W zc^XB31yVz$BYhtHX=wu=|6xMKCeB;vfwcj>7Wsp^AJqCb<1-KG@4mZaKPsPVdohy5 zxH*3E36TwX>Hy`po&8@V9wmN?kJrLaVPkhTqyl|PXB0K>(yEkwRmDQS^mthgk$_wn zKPO*ROjxdH4ULiIxgv*dI7_VRT(NMi0r{{lR|8hD{e?gY01zskY&n*5tU9(M#RI+5 z*e$!x7|1_6#^excM!F@Wvp==Itsj1Rd`Zi7w?Z?lQ?_k`wZmUeoPHVb=b;%qvpta_ zvedc)0uAtwLfwqTyJ~l1?lye<@@F1`ION&RH#J=y3uYnVUl%?E&qeLT8%P^V3dLsj zatiJa!g{RS@0&Ph%EoVRrD)0uY1yHfG8@NflYQqk^_dkBZLuPWaQHh(QW}U!hkr|D zC4-8df#Y{4Dth1H@!#tXK@=5BBrdo*I*=#M=vy_8@xpz~no0>Q8evLzg5%IWE-;0TMOkOXXn2>4*`Iu!fiA&W0|s1K)L>4o!u<=_QfP-{(EfC zR)QQnznH}uEyMA?n;H?9&HbT$kd0JV_ctM9{fmlCLwwe>RBbYpTMG-CsCaK&y05|3UZuZjuJF&O zT|0z}R9{NK-5F)24u$Y7Ti7p_i?yi+y;KInB;+yErDh+~S3R_D-m@^5B?H}~C-nrg z2StGmspaA2Rz#tpo!_TTzGm+9_7N+y?^~`(bQ>M#ZpQ(|*s=pMMJGkparL24FB59g zb}E`JMiL=qeWlA!!_B_yon0z`S!aldh9<2ntzzBre0oa`6=n97OZ_3*{Hq*n8s0{< z#qZzQsygrRY^IoQX5l1Q+(;HzUU_p1Y!{4Qus2I0$7KRs2Y#6d&08nuE&avz%|_9J z0&=q9UX9;|{$wvbALA#yOrE;j9G!XHsNgK93VQYy3|H*mP)E#=skDwpN^AD{WB$w; zohD(^CT7m1sGpbs_djr9N|UXQA2apxwl`Ei12}MxeF6hDL~m%nxOLQ>xWo}M!dyy{ zTNbU43~gFTCce6;rFP8%WDy&=d&%44~Zk}K&barqZ9^B!?tEMOK#5$*ok z{4BJ~5-qTAlXlKi*LD#V9v%(Zt<#c(##(Nlu!^cX;yH5`fKRzzXjO>z)V#ti3T%KBu6F9467)74oc-HwenYV0idKw$+oW z%c+D9JDpi4P(%X|5(NJWS`$a~HiM48dC5WfT@dN+w$AZF*Op*!>>`>f(~Ke`(Q4kL zKs!T3@z47FCN`y<(7X8;De9&{bG-qz8>E03_s5VhS%{k;rsV9RY_}mO0paW=Mtlul z5z<#xs?Q45U%N_7fVo-!PCEJN3_Z*T2FP`xJl`1s)J{<)Kye0?vDVRnG8T$A!>H>; ze5wI#;Z77m`Mqzpvl0hG-A0dzf49!`sNCUHHjK18U^w%d>+Hy}7^V&=Z@DeZeh@A89-&qp@x#6ZrXTxFa2B zMC-@_=`&;qqpWUC5{66!Y&axtJRXTEFU|Km=5al1wt4SVI`e*4qoHIT%N5`@C{bzn zGa2#VBaOsI#s1115#p-23ve)#EDrnzXRE*Stz;yyvr3jU3jNhXR~a`BGU@&Mk#8n1 zU5ZJ3(dr_k8AwijgHu8RWU;G)gv~N|==_psj%5q2+qGwDKmUdm$e(}NofYawzAZH=nvXQUMYQ3@zlu#mj&y8^A42n+0yWy_vpR zLvr6Wr$oR!dV)GK`f&PY!|7O|V){$6rjoLt5j%vK6LaQL*B?yLRlIlvxWBmoCSsGB zt)+yD+zFW;TQA?0Ikm z!Lm=P!5q?%i##O+xhDWJgWa9;!1eLAoL2rF93>BZm8+eZnab_W58|3}(W(o(o^pPc z!WlMP0NmSgifb0{J)!k(W`cif*6=8hcmSrTgfKArKzjEQ`}QJekF#nQGxPLcXY>=|{pu!PocFvj6hC%k<$4E`dyLZDiD3$n z5c>?zDDJe%aMEM7EJm7%Qwt;_;|oWj5+nmb!1#&I*n^3dASy{c{&$uD{N{$?(OSWk=>Z}}TgpTV@7PYhD@pVcaE$8z3k|PadNiLVFbO54uWC z#_{c)10MHC6B6!5)!kVero7gWoctu@*AYR9E1Pbsc!w&x?Mgic@8NvMCN7y$%#e-- zUex;JwfO$!&D59!opj z?jY(|Z0Q`~B-cLWbnl7avH|ub5%&|yz-5Uq_HEgCCf}R{$})2*r7rP!jm*^QH4)dZ zRB6Nm-(2eFfX&8Y$tl0`+zk}^L{p7@h%`Od`MFU6A6P&9a|^!NN`G@_$4vB}#7fr{ zAj^3V_RsKi-k6HHuaiJLCxVdH=8EixQSBy$dbMnUpeUvIB5X0VL&qG_i@`t@k z;e(IkbjY+N0s&*>2(VXZAQ&&ICk4OD0`lsnsD4|)Ff#1c221Zm9KNx+Xrf7J03)ro zQV0&T5|RCXE@S((i&y6#_w(rPe#;q|aWM<{GhvjLX;q@Cza06?`^y6Q*`cGOELJLT z81~Vv;bB++56WW$O6ILRY=GUXw@vXVD~(?K&v5m_JB+l_L30`NE5iG|@a|ZW(^V+e zwJrJq=Q(R8XNe9*KMHh^yLLQZ$!p#??d8&-iO0OuXb^(=w^|ZCN2+>wVO*g@5*et7 zUJoyxa|yvB#TFyLmy16CUs8|D+tvN*z?N5AmLAB`;!amKUO9!>EChZT-@(GNxt`dU zOX%(nv;==U{*-JYhh3oAlRC-vM`2%hE>zMs6#j#{s`;@;SXnI1x zSq{Evv=PbjF-yTyRa>{HaP(;mkNCW9FBO5AmvGf;W^5#ZG z7W|=0)`1pJ(;smZJP*l4X&@LG8xqSTmM_FE1W+mAEPugz7yR3m^yHwTq8EdSBou6X zzy;{$HnVOyMQ!(7{FE*^%Vtwmxg`9uMO?eEM-Pto_y?3m2y|5 z3wP%`Tkw`m3-&)_p?9{~K!lOh*Aa zbrgDdA$@S;o2u3r1DY`!qWun<>3(=jU5Ejc#D$qcRN#wW^{w90e~@{Ag2@v6KGCMJq5 z)r*|2ynApUGnoSHKnvU$Y#&jlQwEKKQ86IQRicAlCfaTgQKy-JgQ@~w?=+|Z;v!;Ng2V`c}30(7B^nn+n_QncT4+p!k#aC!TaqU4RQtJk0uy#xD;B<+i z_DQkiJhJ=|Lo6$r7#A(IXmC6U%l`^oEaZqzo z)R58|g-rNpPs|3?)Ic^(v&n#SIpN6-QBdHtOa5P4u49;3lH!cEnL+7lUhP85+^6Om zUCYprD9J5Il%dh%*OM1tlRxwFDdt5e9IyZspFrLin^JH#SPk0WaSefNJ{OfIy|4BP ziBNgtEWjRY_T2S0n%v(>TgLOVpm5bS(jkIKy`ozhMQB+JqAuT^pY~-YQ2B;ydR6hP zo`ZE_!o3Qh9M$#bWnB!vZC3CMRjuj!I$OFEIl=y^H7UB7#6VQOu8EzULgS0UzS8=S z91goiP8@I1n+|+VWrvXPEv~fN^5x^AP2pGu274TX|JK-th-bhVzEG$Af~b?})3kV| zAU2x$-=^Ych5(b}F!(%M5;;&3xt}O)iS?2p6jo3>ch!`|;$eB+5x0w;pP{4l&|beIlczw`p`K@%)`3z;rx<}e*s|a1zEcQEm(Xx;Hb3-5I?ki6uOF8#y#^?Z5N2Ak%7=aTwYnvyGb%#MPI*dg_@L&`oxp$y8o!H+5f>QI$DbzcS5;qt_BJLd8_$h((EQNqhquCvCV)yNrFAY|kCdZ0v&0RRv7b#>b!}Od0Xq`_c=qnVo76W z1_8)ibH+BvTsE8|KIxag-7lxA3gUzKkjH_YusQw+7)Jm)!|~s~N(8ME^S+4Vg@_To zz;9SnxFCEOg&?QoXM?JfnnfB3fyJ(J_L5k;&%P%azD-D7JHj?=mb|OQ-g~Z<{WEI> zm-Z!ASP`Y4ib(%{axH<76TP-#L1Zuc7W8M5%VM1o?%s%#BG5o%7M3_%P2(UR?Ku6J z=JppgGE+)zVDKw6Nk72805IsE2x>28vdD-j@e5O+Mfsk z1>b?<-T>aX(vL-JAVU z$$*A{gCml{TS@M=2!V?;hgLrUa?P)Ky zW#b@Z6c!hElVuo8y8YpwQj7D4wJt7}kfJ_N>o@UapC%eJq9+Z625Mi|2b@&Mq$2^j z6)_b6&Qt`jzZ;9q4+Te_rM;I8HKr&YR3)xm+%zN&Jwb=7Et_wA0%uqZ_%SYI?{&_7 z)>&#~Kn?11mbF7FO5u#4I?2To;S$xMjhO~@e$^{x}0C^UY=Tv=>Vlc<Gk zk};x+mWIO)Xu9G1)_~<{>eCWJ4{#v&37>;sul;P0bcG^`X-ngMwf(bRorAT7=s6*V zUL5F*qZ{X#)Q|iC3#@Df6xX096`U3Fs><)ZF;Cs-z22QacR&+T*>h&59gnzaS6Lae(iokxEmNN%*MfFMr{(Wa4nm|>-v zNFcf9^0Xn7D%{UG{AlH06~?@22hR|`RX#rWI)1rT4uM9n`kGQawG#~74VS%m6_t2= zs!3hkC#d0IOLqxwGX1|gd?(6FXdR|48o7PN6JkrbcNupkkxX=Kgq=$5hMSDpwp2LIrV0ByEE7SR zI2G8o>}aI7*a?#BXiW9`kiSQk5ET8lxDkgitSly=a=j%9F#78ovGjJC5}ty2L(OzY zF>WBpq>HEO5e~re;u7NZ!swtFzlPxX6-j8N(fu2GtahDi?*}^jVJOmkd@;!}IkwJa zlL|mda5w#&i5wZL;QzwNUyiOC$+nYUt1nw}8Tu6$zvgm6Cf^@RUYNT{^<5J{1%XKO z8ftE{i@zrN$DN=XhEoMC{1cp~C6boTsN(!4^n+3gJ}=4b(##T=S9n~0k5#s!@!uT- zGF{IO}#$@@H*a0S3dqq(_dR9bxc91`vbA1nmJy_H08k|ZOzXK z>S^bazyB^LMnuv_Z_6K04ooJl+l24WoZ#Or0DsJhWpc-rQ8J>Ez$!| z1K4}BAU;5&a;qm1gJtZ?(#^~!{zym>MznQMyNtpd>3y!kmpH+`R;%bBuS*(egJ7{$T=<*4GxU;@t&i^(S$Pp3Gx+?`(sh~iOg%dZJ(2> z7Hf|bTE|-ldMm_M;CV&Ot&wWlZ?L<3}SbE5)%x)8q2dYKZY4oUbCx*?xyb+(?{0sGm?O%&@3UL)rI3Nyg@?6Rs zx!!$P;pr?hAl>@J-syPB8X4fA;g3wuwg4WB4P0An&3_bZx_qsvQ>L$a-PlE06tg_( zozDNcJ@Yi9*tHtM z_*_H^6hbCUM>9kH0inrr3HO*%%~eKpT~;|wK%1C1|3X9y+zptZ^Qg}Jn)gopJ90cr{Wph`FWz0yxZ&aAsshpH#< zk0N%-iAa&prBE%cmBfQP+59fvJC#^wrR*XQ@)7M0FPlCx zZ*P)CxVg=uM|EpI32$?CG=DJwqk?U&2%z&0c8qh;CO-XgX z2jd7tt{A5dYwtwH(wuD{0g&v2dJ}U;t?TeD6fN4KR)aQzy3y=|%?lBPUDW?y$(UxE z>vE|3Do)KIHL&jld?EQKht4el#V#xV(YvD;5TDpeCm3lz-D>*Agd z_S-2a7F^|-9-{6e=vg}gw2%8wd8^5j1zt_6Z_)|_5eLmaRIs) z9qWcji>#KGI->=w)xWqrhA!V0U(_B>B6L2-RouWsryvb@eY2x z7&o(KL$AB)R}K=!g$kW<7sx?OdrkBpY~(gdRv2{vT`P*i0lv$QykYO%+4Aub_p&_W z^MC_VO_9|wIno!2cE88EOef?1`GkGq=HI5ajfT&1v#sv#wdT;a@9t#%P$I6BXt zkTPSWUVUsH-4}??`cd)Zn^*>925k6A7$I=c+ zrlTws)!tWvn>=?3(RGR>yrmAsw~ZMH&aqs6uORTm2b#CJBkG3tSewckJkM{J{rrv5 z9{OoohictqE^GfJIE;0Yg@}x>1IJ9L0FBxH-e0mE;xRjrG!Ra}m2Ag3Cm(pi)25@N zFRxYBq)=P;kOfT1%8?p0(rD6?G;JD7Cnqusq9fev*s{lGdf&X;%8xK+S`U#K*WaJm z6%`+f+S}5Vf+5%vrWY5T+4>z~6(tzw>fsS!8EFxM+vi`8X26mXC6#}SMxcasFi|xe z8GleqkHO17P*4hUco)Xk{~{dHBe18m(wd2{pXfCfN zx4`Gh4-bXf6X@&S5FD_i`wPG=2S8=|wHRKpuJxWG&iguB|Mh1Yg6k^!D6UL7g zLhYaTGJk~VWflIZt?_rTWJMST*EP={@WiK>x$gwHS6m}qm8wX$m)KjMEq1g(2QS3b zobA-3QJDCzW*Uan#IV{}kRy&0mT|>Z`Oar)GLsS_4Frlc6kisjI)Q-6jmNeOd#nET zCNVPHMaE|=G^bSQU`{Dq$LA`8hec(aUX{LO>%@T(C^O9mL3J~RiL3(Am+m*)KU`J! zVTwXJF9n9HVS6u=q3KDDs8CY5Zb7XkbXhZ+Ch2IkI26ABsn)a0Eqf2mjYxSnQL_a( z)mWIuHBbI{N>BnB?t(afi5%-fQ{atMH4T)lgQn`UcO-`VEc7ov(SWLmW?|NcvqaiG zb_+*mb>!%slKNMJ1v2L?qb6Z3@-Jv%U#AEs#{tHqmp{VWo<@|0joem=&^e55P$T!C z``F2VcU)56(G_0S8r_mjBL0R?H zAB(})e%Tj^u&}+Owi5qc~U zOsf=98C_2R`kEemJr6Acwd!B`QpCajUW_EK{(>sA-d0%<^2d?%0^0IovDVjy@3m=O z?VVZ^6{|_|%|WNh15>aKcmn$;n@2hwAkX#{nq`Mcz$R@g)G&y$ypZs(a-5WQ56QN+ z;eA=Ne^_ZG=POnHgcG2Z`XO9x+(1%L8~OEf*I%=A+K>)3y6$-A{+(R_QOND4o@ZJQ zn}ke@j01;=-w&9~SyTw(%0-kk!n@CjL8f;&0a4d1igiIPt#9pf`d7sThyQEl>i9qp z@XlO_7%mTz$JHTOYCpw2>Y_NUo7JtEL$uL7tF5EG{4&N@JQ|*ZGh1N^Lea5L&b>d3 zs^Fb=aurc4)>g&RwxVCv7Ocypwo||tY?zWstr47Fc`ZnYb=XKYzWOPAH1WoJHMN12 z`GFR=L{(cU`(>c%n1}t6GmR7i%uhA`wO4mMu5kOCm_=~)h|mw&Z@Q{yuS=eW2!&^K zj*e$!fbm{*H1R8sm?&6`dlTyyPY#}M7qmUHO`Fd2LS*aOz(F)EvG{jUu(CIi=~OC1 zC(rUWJnJ5Zd3+I@#(2Si2?ss1x=MW{45YM#j94`07U%3Wu%~txy+xvXR7qTM>Bu}O zxpC3D)V{WTse0)KN%w&i!ztSgLgQ5H^Lr^0;-8xIKQIh@jUYH)h%lh$1g0dT?=Ld) zhYuKk4voP7QdqF*L8c|bWw(dR{Ppig{$4=VIa@UVFBwPr@E;_A2U5#n`WpH^?qx(H z8}9glKbsnm#6YV3guW92yvtt-?q#cp*b)$h@w-;UXLf7;7Qm>$o&Eo(bfzWcel)I>!d{qQbwZ>a_Wamr=Y z;=kjciv3Q+T3`;&ZKzQoNav=uwzuKs8-n(lRXN(`PjTL>qCcha4bCWc<6U(qlx{7U z{!@qeY`9S@yon)(2)w{(nS4}0qqWp(t&b5QW7vtD%`Tm z7f6Z7aQ}&AlDo(I)GpPlb)4+@xS?1)2WXO@^uw0hZ1^dJRZJMOaIO7sKH8_D3WG~H z8Mon~$_#<3eVU`X*Xqa%BS7@-DNYkqpL1+4Kdl*kZ|}|t0&#T3^S1GvQReDe-`ph( z1I?O?>E1MZD!5XW(eg=iJo9x1T3wpfo7|)(eMib!_sb_)P%P=jG%>E&P;hPd2eQ|G%3Mpt!fyzXFr++?l&P8eOd$8iUcV*~f zT^}eI$W~;>v}HQ;rng*KmD5t>m$mJrQE`6(p&up?ETYLtxLubQ@M7Q6aP)bgO1vAm zI|~eEX)M6kyX=Xbmj5jF)W0IbnBA7Nr|ZilC&mH9nxlWd_q9wj<)NBszXb`q$A1cM zmOcN|&mvyDoPwL4Qg$#Bu>Sj?Ksmwg1>J~kzBoAVqg`6`jc^`;uYn+Z9BLGfAd)@aC9f?Krsi*$)^8*d-<1?V7;l0n4!=IrhjUMrAOWBH`W;2oblF-QFuczm zVOn1xp=*h2_@E&Cm;Pki-1swvJCf);yb6g$5C6}-Tt@e|Wz(yh=7xJ~)k#{-nN0+e zof&7c0a>D*L7@z3s34gy%Oan|I*rBfZ^9VV zTr07<0SC(%;AjoqqZX3YL+e$SR2%?N$ww#$b3NxT>FWA+ zqfX*slvUz}f>o?X0=eLDq#a14{gOE@`sLKKp=UbT;?4$ua=eG)MG|XS^%I4Zp zSV;#x5ZuSZcI$2$7_Z)VSpZ zZ6@8@H&NV$3<$Uu-J1 z#CPPj9`QXCq0zaGdp~M4pr?$WU?IGa}QNd@AqJ{dYzkP56HX3WnT z^vQUwlZjAF9Au@P+X^lo#?d?zU(${;^3vJwLq@8=OhAdQ^|Fq17%sUo12Nno$Mf>9 z{}T<=WLMHkze7v%XQM^R^gldezk7UvJ62@k0fuUCh^{?#g>c<$eRIIldug@2ngD`7 zV}qpUY`k-TK|%Wx=17pKFTkW<66C^j(-6nd2(>_V!i666`=nT1cYQRI>-f!;RT(|e zNt|_a)6X#c$SO5cJSa zQ;Q$Fz8o{GdOv;yw+(9T7QS|K|vT?MXTwa}~5{nS6EWnv?9a7JgTp1po ztO_7&HkWx8&)-d&h;GSh(=w~j^~w1l2IE0jak529_Lm0)zC4(y(!slzNOL&jC+vOy zKt7hqq7Xb#tk-e)vHzEmJabgVEzh*bl*~X-iHfnE6#FvLkB;6n@Y-tzzD`ef%eG2l zPO1R>Q5y1B#bES?$68gQkYzzD9Zf<)DIL*IJ+`@vv|LL`O{JvNR-h; z4|sr8#={3)P-m@&2gNEN`_d1$zg4aZmY8MNoN?CDV^TZ0Da8h@8kkn^EO^VvRB#TM z=`mfD%^i_8B%$J?Kx>!<6?99bjR8!CZMgD!%vL70yC^@p2-Xr?N6YB$n9#an48B9W6a@NrN$`YPL7x!yN3Pm)ru$h9_RQ#qLn z%#~NO)wYHvQHvT)FTofRI=6o76jj%GjcNd4-CDO^Qkd`4)7K{OB+nFdk@Mi4(!6aR z^ONu)0i+NTV zwaGcfznB|xP9)e+GXZp+IPbFJ@x{aZH5nKW5pz(n-gYh^45GY&#*u(Q6GD1TjeY1w zXF$yg3~b6Sc4S$N@dCQ5Y?EZh1@0CUuHs!+#Cb0!dIa{!ZP@$&CQ!Leb!NL`2Vi5f z+4mQ?PoNNIo#RGC#eFPr9r-70{TTE(614D>HE**_6;#eWTBozg3;H#N9izrXSNLO- z%ow1YoAB|D*&dYU+NhKPeCL#A;ivN%sij=%z?R<+e;E#UAN`omL&_yB_U*NFI0vg#jPIj4 zV>hNpeX-{mW|k)I#Sw?>AXByBbQ)Hk)IDlM@EdI8JFBo`@?=|g(h^wz`OF99w5Flh zIdTke<%f<8E?@2WF+9CatLpdlmSEV^5^9P@IBR%A+tsn0waaiEIB|?=e-gZs$(Wtb zVb!=rSuPnW9YXM-^2m(G+-0Iq;!`O0z#iR-nb#-KXg{$?Sc=daD;b$6c8<|qqhM50 zI>+CorgXno)C)mt1o!CZSBu7{+8?OJLW5 ziHW1lh~;5K-EIThb+!_0WY@^*D?fS%^k==BtF3NqK398Rj}ci*^otwT!@7%99h<)^ zUbRgj05JR*J<`%hD#Y(NsOXEHD~fG8QF3;ZyV)Fgd<9#RB2+GY%CO$GI}^cwkgf}F zh3*j3`Z};e*>UCFL8NCg=&;kEU|}uIpO_%)c{W!-T3(x?Qi^Su+B9@{$pG?o+9Dgc zV$AhG#M+EOO14xQac2m6>MscQBlq6A(zp?8M?g}KzV5DTnWQ=FXK=zc(^TykB8m!~ zXPVg&$u{L(Qk2aolEY^ZOtBq=*{C^D=L6Y@_L}ffCV7)rZoX^0jsTMA)11zuazEBz z8XKxGqUiS<^jDA;+wjXEti-xv=9!&PIf@@h;c+C!h8nC1wf=$PK1h7}!LOqp=HG^b z*`v*p?Gv5!5trJW_`4pZyI%!FbDJX98|-ZYYr9IKe7-=uGw5!T@yk@-hx|+u5EVW< zvGzgZbK^#tca94mB4<0(`(q3bkvn}ZtX@uWRsv00SYO8(X zld%SZKV1{53Uk%DkX~1mrSglu#RnWA$jY)RbwBwkm)-Xe7cVsD$}KxEs?+rbzch4J zl;JW_=U`Nz%@*t@X<%iekk&XN3_~WVuItI2gLi-J3>Pb25*hmt0M&~dY;?{srUzJL zd-ff~(6N%nlb=Su!)8JqvftA(CP-B`CYWwthVe#xq988(0vjzt_Xax7hXf1tW zQ-QeofRFBkT|59HY+C&U5&l@+JV98@%}v)zCn??m^(XN`@=|Rl?@RneN+U!hMyd&k z5YJ2^n!Le=!j=UH>d*y2;y<98efc}(ab*l8~ zoW6JNK1Hyx@>c$smv1jxpkYcM7hHKHPlMUeR{9)$Jah_ftw6`=^HgU+m&gK}D ziz}!&@}-Zkz(WNe1!6|vIu-ZzcA#r7m3Je@)#hz(foX}q6FtBKKGztfx!o%oC2Oi zme-3au%#A)MeI3(dK`L!r*Mxnsg~d`PL1skSV<3J8sLFtxT?4!lu`X(IhLvwN208KT``E zZtf$X6<#rJ@Mkj{*O->;5yt*G5k#Y{18~fFU}}{Rg0&U`7kK9KmnV#z(=<1}A&_Zoh5(?&kgBbt4r<)F3Yev)w zKRKro9avMLTrcCfY-Kc)8{nj{YCy#z5y4EEac>|s5AX-&j`*JrwL{1L;ho9wFwV@m zbO_NVk!U16YFdBe^Vs2xxM>M!r{EVqg+9wcInUkTTZd+w0p*3TZDBZY!%jkjtlKF% zGsH|mwu8f_s-E})VL}mGB`yh%?=UxD@yRsyoixo#y4eS+u;nGpvQDU9g4{^!^=d#U zp*8b9On?Y-Y+<-~TxBDPYGf;ryVLqJfX^2-{y(B9acbA=*xgwm(rsG1MWc#H^< zyg+-)N2CEZdzdMcff;Zd3*$j`D=70`(-JX7CTyOLG_m2G+rEa2ifL4af<}5s3d8>; zh2+s#4epsq_hJ%Ot^dx1yF&yh*S_O_(E~Ns!p#RIo};K-@Ytpao!H0$u}VbwgNmJo zRZld2?p2p=?MM-Eb_RY_(0!4t!EjF78`|;(+n=(D-Z?})@aJxFoh8rON~1c*j@h>T z$|~TxNf0YqmGw!RNI|J_pFYUV_$^7epPeGGb#i5IL9kF{)7g+)7wbq?R29ijpmde= zdT4pd#T*p@P_!x3e>0gF?6UPiZ>y?t4Eg9O23LbE*@JqogSoppK^sH4y8yR~@4;Vo#4>2Gez{z9F#zo#>dKKeadW(4m5SiYkU)jssIO)@EEhz|7a8qOivz zpTomZ2<4Pmz9uweYAc#W2bA|}(AV2lnW&nk0q8#iFR4MLo3zTb|JZSAIg0^%1DnBRW`>z#uv=YMjO=8xo2=lTm7IPOX0K)yPJw&IGjf@PIJrWB{x0|bc`qIa_ zGF_i__U&UIBcj!wXs@p>@T1O=UJ6;&*rHwr4Kz7-K$>l@kB;(0o#Tk0EQ*!!ci+9P zV{y|_p*kyix~nCybf|#dCjz(8Y4+T{rDM!vX!5;Nn52xDJ15I26+=f&PeB?22yYx_ zt;H92m#cEi`WsMa{?&ujgmR*X(4{=y8y_akm#pakGZMiY z)+{=VqnZB3_S!ohw3jML5-p}|^QFGJ{m!5^gT4~`iN>LmLjgO(|6pGpaKx1^ztO!t z8OzRUnF`$kkh zcacH`0a+PyJm?4`t)W+$tDyH?@za-Co`cZ=jEjp0^3ihOslk72?g07)WrGIrS@_=< zYUUrVg<3=@{#l!92z)+}s!&V(A>W*m*cv{df z@Zs1+OhB)a2F4>vfUK>(`%W<6uCS!*|Bs;6hN!omQ=8j*I;u)tipFCqe}SKHcV>r% z<&=UoeFMziMDNC`OcK}YlCUCZ8$R)(noM?MPip~jwOCeFM+rO+aJst;5~Y%OuNx| z=*0Uz9lTGyl#hwF%Cq>Uw#PoV| zGk7pGfr&{fLDM1GlgF$m0}Mz%R-%d-pO*)K zME%Fps*U+8W6J2 zp-^5|qbX{wvS`n(O%8hKOCOS1u^W+jG!W0lXonx||=OW<((F5oHut8Z>5#;HmMtYYJ zb^7p4rcDavjH>5r`M#xdrVC`r+D`oq3$1v3F?_L9fYnhc=?UihGpiWo!6vu)t)tzW zM47hMGW`+*<8qe)g(08o((^b_GgDkR>!fwL3LwdUdZ4tqfo+0i#3RJE*g-MJ_S!0b5p+Q&8_<9@~Ww- zK0YWFO)mnj4tYnbiB_xGo$S{4WCis^4@T>OPwZ1QeZ-)32GSXtM+o}27CU=j41BuA zW6N?06e3w4#briSgFRaMmDs&wn2MFkI%0cW%VT?qKA_DoIDK;e@5`LmNu{EzLcwfBqkdp%Fs^4GC-l>W?YbkMc3bz?>;`AmQ38%AS>AhL1f+JJMGV=ct7 zu+a@fU*ufBH3_IOiZ1vI?H?I9XWcl~_R&JIm}{F7hD#|ULBby%u{z2ng8iw6KL3d| z`WOwN87+F3pE6Dj$0`k6XFw=9rPjb;#2r5=t1JT~z2WK7y$)*BFVQRMw6y^+7eFso zgi{I)#Tc@qLRkFcnu43>4ADob@fmMI*eC=Tni>7HntTsPZ^BBOfbD#1l$5xbZp_04 z1u{;c7Mu1;{fn;HibCaQ(=m*;>qB7U4s*q|Gy=@5kC`drK6Jar4r@ko0?Gj*wcJAYE6 z!r=be+Tju1i@Bc`$4-=N6KI~Ve~G-~BuMgVRv?(QHkLR!XH!}dv$0G~vno4$FW=dG ze|!+pDlJ?aiT*x(V2BFp9v2%s0eFNYnTm1|#O(&`YcF(q5eW|;SN z$aA1C>{KM%n30W6+1h;n%~+pLn8gWgYP3zE3K<92jpSMB7Z{w80}O>JFSn{dISBgV z_cyOr1wXu#7-M67ZqQvY@B>o8pe6ArdHG8Q$Xv5n1z5_N?m20T0fr{&;=V673Y_DI)} zUze&AN@NcLab)pLAlF=2GdaH^7YnRbP(@0{;?@ZwF;xqI5UqxBMI)=&=m2iA(q?BLc`hee?XL2sDTL1`i)x5<1AS22m?w^3M zH|$Eu7{0Py>3YioB%bm#VCv_6SgX8Yf`CL0t}M29jfT(#zA`IMS0~dl{sccq{Z6&f zSoe>Jfvvs#$xhzoRh!q1M&_yIy#$&HUS&*8Eiqi$5$N5rLM z7+8yx5inBg22AiU_cFu8gN}x2L&1NuwPyeVvw-4|NrJZz29v(uyA8sk{2|e4L1&!TPe6id?%Rp*X;)VcZrX2M2b0VbS41uY=b zudth22UM}f%~!qAwt3!~PJL*?Zr_5R%!0@RnqIoh?Glr-0pa35cqpnr*Gxx0U_PWW zOem1SD5twN%$2ki+eb!8OQv}$7{QmW6yo@HYB%y)*8lA3$);OAl=tE)_-M)5Z0#IX zn%Pq{#^(qigPIn9yL+ysS#uG+7g@cEqoh2yK8~BXs*W?FCla9>&S3q3?ZRdWD(`Aq z)Q6})sw>!44UmT-tdrR<9x@;}PVdpZkPsWV2q66DGrPF)SgmB5Cz%1tOr;a%bViZ> z2*DHtAbx?uiOx38IRE3c*FRlKLB*hoAYGJSg@`=#ld(!yT*@y@t|;F^e;YMa&z*I& zKbF|X2dA$CJqguRPmra;j#}}!?cWPOwqWW6cY@DAx#KO!-LnU&91FhHDAEfiFSI?E z_UVj8Clu$3FBImR*eX`vUKqyfT2}(FfG)0t9XnsZaijL*U|X>_+y8DCUvwT#@(b_v zN~(&L?$VzsP+beG(UYUsAEvm2^)Z>?Cn|ldXSGd$e&|5kKk$4$9t_oUf^`QZCM6(+ zYhOE7#?;P*Md;M~(OQyc2;6;-X444~hv~0!b!Jx2oiTNK5J>3rC<=d5T9ho2qZ9x~ zB+gH7<)&aJcu^`T#phQ+YsLnqc_aM`!FQw-14nesm62~OqdC?qnXWA>%f&5=r?Pc` z>p&O`VVpm7l0KVHH0XZBKBF3#h_RCbN%BSi(a&^Q;-`;{QJ5(0^bh|r8$E3bt1>{0 znF3iyanasVMZ37I(+n^F+r4Y^*H%dLEw`mq0vQiz8Yn)8kAkV?`fwUfp}F4gq~7sy zM9z;(-18Up9V<%&p?T(&N?!8jx3CH9&WSVjUI&a~bngiOqt*4(%NkKyoccV9fp$Cr zq_9V*dBjF2TJz$uAhCd04((O|y-D_<8Ovx48I5ZtEv3AmVpOkB><_P{6635Oqyp4a z=Nyxg<7>8`MPb~+i5LBZq^~E4bzsHN|R2Ld6j35c*}h3#p1%g3WLT>EXE@fjvG zeaUe^2i$(JO?wi`7s>Mo8sxs{qS18H00N6HD)~Mwki#ZR2pJ^s5pf3uy2{6T@SK+4 z!n$~TgJ7uy8T}4%vgV~%f1xFn*G_(lu}Fu{I^9|ZC?;# z6|}al=0NNy4A+=m&8UolMo*SzxFX}UmEM4^DOgmb}_lDKDJb0dKBF-D}d;wekmBz`UPI zYiy8AuPKsB|JWj4bGoJNtz|)TkYd9O*gOR1=3Y*0etzFF#tr_dV+a?#wYkATnV|>Z zlWsUxQx9+=($Hy;VF)K?*eB7H2lfgZH0VENRx5=8OWNZry8WD1{Qux`(r#pF=b@rE zC-t8tU>4rC7&;3)l0T2qvHjRZX8Lh?#2HT^w<*Hu_-{DDis?hN=RSKPD(77_#6egx zP4?(qLFQt2<88NM;}G=ilZiCo4KjRX#t*3$Q2ECu(Rl$CAB49I!?pk$n~fLg+u@aE z89u^2pO3NvOb+JMXIvw^94XFSFFGsxkImgD1%S*$-zNcgx(@-veY*d`5JWrK*f5*%>2k#quLQ255#=R zLTah)=dW9b5n~XZ)n%L&$+dwqfw9DL-RPSN`}b?D)cyNAn~1`1JY?6@0F!Ou_`IjL zMPj7-C=+Xz({Byk?ek3Nvg~MKamU}zO5mIw*0 z0>24H@fpK99NkQ=6y<^p{K+4r&a+utN!7P1?p? z1!nukq=8;IV2#Uxur?258nHDkT8Tyg4^bX^XzkwxUe%}1o_l`}=E)0)swYnukJ9=jwAf*vE051nymRjF zHj#!LlKr)uHP^EJ)6^Xl-0~?ZO?3kPr5aNI&k4At{0~c=KpM`Tpb)RvR$qdHPR9! zHq^=Z`(8OcN!5bjGWL+m#0ocP3*%1F~K>+&iy_QoW3 z26VM_jG1?7Q6mAY=ox2w7A4mJ2uUEz={=EYC@U6W0S*+rpfSi`b^>ai(ehyGxx+)W zUVJ3fM{C+zlh*N>WET?v7)0ul<^w)njgzT^l7_10oPxVnZ?o&k^z?^e8lc=*AUJiC z6&K8e{M1M*7bkQkGooxb+9#r@{VAs$kx_OH>kSCmYe3>?2+NXjwgFd_z(?dAclq!C z@}Oesp1u4pI13v&st_%cf5&)!p^M1`sr<9dDnk|N_o>kp7j&~0#CbxI-OA2yJWH*l zxQs?F<&svx;oLd@;9bpG#h1o$A}IgayllC^pQ5#Bu|ihN&0c>~^E$Kqfz(dSf+x5~ z%Wn@xX54B>9CELQ;3lSpKBHujzYNVF0-qSiVAP)YKNNJ z8b5`k6{0b;Ls!Y#O`dcuArkv2Ircc>+xP2Qp$&8XusgZ5S z!qI!dq{?oJ9z6^RnE*3FndPU5rSmjf!CvJO2^O5{`%Z6=%@vo|@bj&e7&3@j1_g(Y zFaz7j+K&BOA)Z5?IZFY<ppwGBhm0%7RfeTtvSA zo3_>3X{GjLa~1C;rdZV?9_Du?W_QO5mV@lupfVZ9E0KJ9$4*1tYdiUlfw-ZfvKTBU zO2_`INe4MHik7UH2m7I-p=C-wz`Jzxx`gmF<>rdE7!DH{)6qYLQf2hI8L0xhowZJ( zEfV2U-eKk|5dhA~81Eb0frE_ok8;l~?1f*3-phw)+s;&Ag78>Kimj<9uf`NTM}$UF zsboBFRx2ZK0K;y6<4MYYem>YA#Vg={zc*@okyGue#eApZ=IJ5@mEimwKv3sYbaa<{ z5E>@ro`I_y+i%~cDW)6-e3 zJ6auw__!?oO<$zk{F~||xG4Ogwqpp^XqF^KfU8C+m4LB;*PzBaz6~Bl_RefsP@p;9VlSE#I&+^u*+~2gQ!CUE`V2&4Ji~vegKnuy(W21vnEml^dL-2<4%et?h zg|uJtFyA1YZ;tXZn2D*D6b;hNf7Fo@-g^{?zRO0#G|=H(2*N^|*VF-)F@6My|3fyBYVJ#OT?bO<6mCsh-?&S@Zk+eYoL30 z@IgG#QjjuoU1549#hLHk&g5{$LN;QaEQG+#6Ep&y#quf*l#M3RR~9~xgtAuYpMJnL zu4Av%@qI-eEi9=htprNHxDH|;9slo&&JI}(vjJGqd3itoPiD;021sXT;=0&>N#bV} z!%yA<3BNw#{8k^AyV%s3)T)xZOO=^807`q%cinZ$hT>|d4hVREZ5x^Hr^rOdm{yU> z8}64i)nMdi^Z>@qtRZoGpc6~Ix`75~;==$YnAYuN$;z{sOIvg(RX_h;$gB@4nT(UB z3*xq@lvdfHZvoKv*`;uFe+qxj5LqlRT*i-s z`%;6xEM$+CN=&CTX!@^i8DeyI;2~|)6FH}mihjm_)qYA!@VTK<$5$tg<@&v{wu@^< z^(mH#4O|=xovVkYBN5Vijv^LAi+|X^?gg2N1qgHTNqsM zKM)jhp^T-dlTnHyNQ%w;y@46Z62+rUTU2* zzcg%2h4QEH{I%HEs2A#ZA2o2O%qaJAjf^l$%Lin}gjPWm5unFCQj3C(l&)s1Lq!3u zLqmtAbeZ(RaDZko1D@xv$WSO*{#`le%N?gZ)Y?# zc@R(F<`gU{>$c2^fuxA#)Ket^s{*fJgYz1BM;a!T-+oqY=qNFEjkE9 zsYU;>?T==AmvoZ{0($HXk8yEx*7T+oNaGmObtofI@uPLc4 z)^sFX_A-ee+ZipI2>8#6}0-kw~<(f=GI{Cb*ff!cCk%Sw;5%-5Lw5z7wgS~)%Ag97x zC=te1TSWji#d}UQbCTbszmfKh@U*Ppy|S_)usb12WpylB;v4VxKDYBCE-1?{O_ zI9hWU$7kf--E6=mV~h=WPVKpW#-oH0{fTG>cMJ3*k1iy)HrXTML%ZQGOErxGvk^>Y zPs3EYz$ym5?E!J}P&$ACP46S}*6jy4TTk=P@=rR@H+5M8iml~$hH-&~=bHc63bUCI^!+|}gP6oZG^#18^zZEK4d?+pjye(C zWV#u5P`h#hK4C6ZX1tSR zV^6dDoj;Ifek-jFr=!lUynnd4sZUQXAx8=Un zNn%^dj}e%x8_C?!bOFI?CTU9sP&x77=4|WYh}J=CZgpUjsCCU?l@l@o+-} z?~6?ge6=JrI1A{1^3DNsCm z_Q|kkv~%w-ZJdPCEfpgGfQyn0uQ5~uY|^gFv?|W=;_UMqNV!|<*l#_~oM+}=I@#*_ z`<~hAYxrbP{3n4j^!V%34|Fh$U&nWq;eIR0`lgT=XAO$880wsJJ<3KV_(Fa-%(v)~ zhJX~=+w!{m!;XL!k{r!oh7gNM2&#GCfdA=bWchjMM-k-eSAlj=lKetLFG)#V#FEsg zM%{GHk(g7*1c<#mm)&pL{%y3P<-)`w;Q9yi zEm-OgMgwT*5{?JSDQ#n5jo-*AcoSnznAe2GN2JyI^KK~t-{CcB0ZTHZ+rwAGu{_*} zWOgk%vqCXj*L@mxu>`?K>aP^ncCM9~Nh?$h{FdnILPJU3-|&&{4pq&?VzFG>rHgQ3{roj^QNAnDPM5i^XRZ@;#Ae z2H+`-{aBJMkm+T0=v4k1v->jcIxEB7W7IYRs+^Ug)^ReTHz!IUH8iCVZK5VLB=~8B zRLYNC6q)(T31&5W7I5Ph+tXxp8R64PzbZZ7*;vVYX*i7XIoiE8R2Oun;ZQA);8a&a zMFbYKhQ$GGfSg~V{$&G$s^GCq#It9L8lMWuT7W9cZp;{*Fn>Bh;G?%&Mar^HTgwLA zl%&J@J}!?k1via*5{dgNMMU4@-d5y1l-vDC3GeqaJZzJ>sOShE@M z%mgYG+{|L02FlZ9?Odz%xbCrRBlr}HI~eq1xzR) zQO;GMVM$jBeR(GwTFoq{zHglKmU2})2jJ!o+H21oT_!=Y!g7e!bfZi^3KPe>C(`3N z3CZPe@V+el9!n8HkoeoespP1Kc#rTm5J0gF=I974tvTnx%eem+fK>hJBXFPD#rEJe zd}V!&m@&apn#X%?6@_ij=P#`uKzD=)Lm@MunWc&)(3P-9OM{N{(GalTj2`!HZyEi4 zxO=@h$y?vsVZr0NKE9IF%5F+HYhB&KP1dOXpnc9s;oM%wesluw3FEBtIUw@Yj1!mm zE=c6#Km9?Tlh&An$f}WQIc9CmT9WGG=K0R=1+g;)P3qVj-_Ybr<&&A3X6CWE(KYuv z{zprI&OpWfIWxvpj18veTJMz!zZCA3>FL7uE0g-%LJDywkw8rZ&R{9TPEMRV20nGS z${r7+L|NITg@>ZZ>w}nojxb^vU6*XQsWQiUur5`syP*T~GQ22(^`w!t=Tm8UVw7cOuYnyAMyN2pkWD?$= z*4Il^>WVmPCNIz-euhA3OQ?-44%^$7IbYzWvB6@#k$oxjJu(c+j3Cumfez3pdrfY7Nx&thmXhk|7Pl4;w!rGDLiHQn+6h7gvtENSJ@7EVnK7_vjKuhkWer*Kl3Vl=xRF@~0ElGtwnoD%r4}B~$J@=1Mu6-;7G}VEBNd&q_V9l+ zf2&Q>^y%A6E(*dJ^segum*@dPwp7?3ozoff6jn-Mmm0$OIHzSP+6dB*15e9wdwX6PK(2Tr*X1gS(0x^hFZ*5=dbHQ=ztA z(PS8>4`GAyeWjR7ZLwDf0}YBprt{xSBs<%e*aQBXAC};~L_2$-%T(0PQ+a&!u6PH_ zS-#{myI6!j?2{NW9G^YORKG!-v%NY+KB4)I-04+z%Mzd3CPVhyLo^GYxkmFJhfV3^ zec;ulwpCFhBa-xU%~~xYfQThBn02unuCmKnRrs(3vL9Re{(|f3)X*^52~C<=Nu$ak z$!jKhdlLSiN~2(Ya#W%VJCFL)@KtO@P_)OWH(~hh^{nd0$Z2AN-t(GS(>H+SaiC9l zPIX+gyMc>`=RB@ao63HHem{>Z`N%RPY)G9C3kkqon&Al4ECmXbo@Z%dEIhW<7~fuK zyA#RPH3pHkI*Y)Qz)HA$wVl~g<+rKi>gHd<6z_Vq%s)P9C5Sl>A+JD!T>dk|AboV$ zm%OHQ<_s))C-oU}Dh5MgnQ(c1Ob$h73W|T>CKoMT&jPBt=6n}>UOw`(pW|gBWlSCJ z4H~D~nOB%|MQIyqCLutqnxwGS_awYsJ?2ZX2rA-@BD+T+*Lbn-eqXQbR&fF!C|Sub zDY;zhR6^H7W-qDqOM$)!F!VH#YtwRw|MRDne7sCf!=J9Jmf0_e+B?fNo8BgquX&nt@dM9uNSeT38NPa;;4o(>xVR_@9TDM8g9s zI0I>>XkJ~14)?R+X`@u?4!wuC+V3;pF4Aya_qpGS*)?0j0d}%qjX2mYjqrR;O$6dc z1CxuZO86xIyvQUcn7X2G474Z6>gZ+? zYxvdk&H2p;(a{g;eGL`r2~DdX(Lc(naHvR%S5mJbU96@akVc^a?8i=89o2tzn1udE zPARm~=UPz?Z96-&(SPF#E0o>iAmY^zBcL-sgF*DgJ)L3_z#{m|=Stc1uRi`#HFx8{ zgJy5Ni2I4ui&ad`l0_ zBXa|pXH3?Sezsl~N4LZn^MCIgP9L#Q5Pb{66=VuI(y0>~X@wr+N^??I0P|V+sv#B* zaqX^=NuAD^Y_7Kc1~kZPuZBeEMDw-otkyY&mU9;E*L6(lq|69b zz=Si1?b-(4WKhYHai>_lGr|`Q;PBUJ@ffKAGS83?)*KpY43+evO|` z@>54#bHi~!7|lLLWx zv7+C@J$%j*yu=55+gft0hXGjiyM})D9klGTvWv;9vV`)LsUrtXLGWK(xd^hen=d4u z=tQGtH;UPUII|&fZSLQQq?t|jQ@G6{601lR@uKvkIY;RFP5x=-ZP-{n2g0+W40-u< zKJ6N1H*+AVV_&O}Q?QCjmkpyk$PxzRE(vLIqJY7N$1OZ(oQ7isz%>EKjwA2X>w1;d zSe`>q-etC=<;EWB_o4=A=@@-c=_`3o&zoBgy{FIgzb=i{fu?MJAidAH4sSAKnCJ6Y z*X6~i3>{?SR8d)YHLLT50DoXo*|!G=VkDEU*k&owUy|8ZPD;_NDHiPh+oCw; z@Hjw37W{L_N_vgq<=q{aAD2%WVMMftw+8QKO*k_KDH*12Oglnqt5bpX3PiILe z4UM5J&Ita^&KathJ&GEZW?~C$$X;ZqW2O|0Kodw+m=G2AQqAiVz=^)4Lt1$W4>MQS zW0_jKD@QIGo!z5u3{C#%US!XdsV3r*S;aQXDYaXY6*(xh`RL+wLKdH_COv=n+VXZi z+;XUqPDKEk%Pb_XhGnPelQHq2zEu3XwY@3=&y9Ytn482X>F&EZ3Qc>ZXpG+oH#M?% zJet!1*9!GirpGt&PLY>Kgm&Qgpm!$y8|0QY9bqYJjY=7HL{?{#hQ5~!G=!*_WVf@N z5T0?5!-e;K5oTTiL}^hK(}BP)mL0N7>(?9luPGLhqwkD~PwAA`=Bb0ZlY2IzD8`tg z1j4Rx$Q6h+!ty9T4x+}}Ck|gH_VBMY^Pf`5l`Nl(RXG7M!JTK|(}X^#?KEwRKo#(Tence_XlHX(it_F`7`W}8jyfGxbx!#l@ctQS2X>c!Kk+V9e+blp5*BwS%E1m0hp(3zj~IL2N~4gLWehA?1}j*L!^zB-)+)=71TTf~5z)A|$}u#(bK{p%{~mXtmf!9|MWncjUr? zYQ7TzrV63JA{~sf4yo= zB*v@rXC4z0u489go}x1I=cQa|D1i9EkIA%QwnoK&-+md}zg#mhZn-0~G43HHbYqw} zE7b@SEP^2dy`2dLPJO>$rIyy%-A3NxslgDYe|X^T1mRKhLCV#JMsKy!^Kb49L})-P z3?W(kWUL(5tCsW9ryVhUK09L#?eVUTXuh;CX5R1`v>DjHc6L=ia;qlNEgOg%KYFpa z5f=PQSYZ-(CR~9C5{TmcoLKtz(Z}hLOl*kEub>l@VD&sc3k zn?i_L#F1=|+=IO44J1iG`}mN6%)ung)SB9r%V4nkpErW{{$23+YI?hfDG!mb>6CYr z6?6)@^e+u^LM?dPrJoth$L)uo_7!uXVMSQ;#Sj|Myw0;I*MudTzw?q9>X+Z}rwkI0 z9>}+|k;c{L?|Urd>xJWxsR*fjoC(f()A5BVTo$syzcKzXn4L<#&p)4Qnl3)_ho* z0Gx~? z*eTdvEj;v333Gix-*2ei=fYo|P?3_wI+Ugkc3b#TBgQZ(Lz0Q!40J~aRHt~e7ke(Z zX0KIF1A;R4`~Lec6K55Z%|6%}<(lzuo z1RnG5ZW(=E?Y(}gdaBn7PXgD@GW8~44E#(_K^tw66b#lQFb& zo_klY3($~wDJpuV=X?|U+ON8juk9Jt5fZZmbHYy!5b0NXsfcTdp0wZbO9C-eCC`Ay zHV9AeI=q3sjJv0Af4NCsvt?yCEI4_x1O?WGzAs$iXu^+8A%g{#2qCz8f<(sIZ2F)9 zdV;dxwX*u?k+*aE!&QDshxF-&rV+%P2FZ_n$pBl3L1mY~UQk>z-iM|t`maEcCHhRs z@$n>Uej_m$L z1}DQQJDNxdiD>0+Oh3Mn0>A=d&7HUMmgcD~HEPOkyI;5v1}aP2(-svW zH?lbBFQchLkcwVEHx+m-^7kTa8)d=ob<5JK6t$sEJ&ELcTP)Axf_phPck%HchULf= zf#>u7ExlDv4L;G~+r*l;QnpJsjeZvgl%tJT9eKrfIitOKZKv|JQS1AuCZ=`MVgkkO zQ^xL9o_J7!&AHBpn^u7EV=R}hS={|Dspvq7*5{THg&@SR+1IDAqpB&iC@mD`mR;6E zwhkq-6VJa_>~*I?&mAaYGVeMK3F%2Ledu=Bv79dtw6H)?&M`sM>#d^37Ug}Yl?l5b z789!R>=z|=JNf3J9zzFlZR4ydFpkST1m6-(PZlw7nSowfJ)M_cxj9k=Yn!@8i)>Q# z<^H2t1kI0ryR-^8UYB!<&4T3-iW>~{Pq`?{!2hH&S%!>L9!m1>^G*5SV( z9(!}Yg!%<$k?DO>by3h~Qzv_y(%heH-43M`n75H1+MTG!-xEroVmwgAHNLTtuo*QH zSD8VIJf2iC_dW}cFMGrAIxig7{-n{R7{K}krMG?f5*!Fs&7*i3OPCE<@`GUyU$moj zS&kj=zEfMyfjQqkjOZHAcxLmK<+wJnjiS2Utu3C)rnn?x5T!{xE6hhx{a9Gx`=q-X zfBW5ud0d5Bp_Z+Q+JbJ5f6BFkJ@Khtvh{A36#}XNMlnc|jVh{cbIn>zV7N-p$pvu(B@jSs z?DF2UtB?HOoRmAHRm16U>Obd=RyP~QokM=aXrJC{nA;t^=xiR|_=Ou_v$oWq2EI;V ze!^`(k*DXCzG4f>y)_$YE2zunY0LBepv7{(Y;M}{4qx^(xh6e|e4G%3$Z&-)wOiWr z^m1NWb&eX|(cS%XG>w+|I&tY{LL=p~z2^Z8(N~Zt!H2bBNo8zJxeEoM(W%GDJFk^3 zG}RY*oAC8Uw9cL0XE`t87Ki)uAJAc;p}FBFt+zJ8G&2fpU(1(8nGtpBONV*&IU7C4 zQ8iposC#4-oxDq1rIfW9G=;EtV8r7P4%SWS*bu}mkiU{5vGV~}uD~(kPTd?^MJXZQ z^?Qtao1T(%Em7(LX`p=aU+7=in=hB{%H(-V@DmC+nhu$_g(WzBhb3*n$jfJKZN9jR z5E5-`9sBcyYg<_H{Ix>8g@3ZPGJyx6>L7dJvc%OhWSqvOK+GFIMnkkk^jZrSYiotG zJWKOYV>YKA-EcVy)ae7$7?|vLF$gZX8>FJ6{UseXb%@i<01lbcqg%;XhWgX)x(pU> zkIg%FvelQtO!?Zq7$nUmE@#$$7^1MU)lznt_RA8W?GiZUPC+!i^z0EuQ&on+1+S=X ziz5B(JvHEO_m|I*F*}h%FG@_u+BKjokIzp{qWI{rF35Pt;wy;W zH{dP5Edv6VMHiQIkah{*(NF9io}Qw2C0V){{bHR=ilnNhM|k*mU4elHF#Ov+UR7?~?+A@jlhPjSP#MrP06I-_{oMwlHZPldOL=??0dC z$iT(=Zsdos@bqh18&yQI|1bt7L&l$+SLvE|ep8+97W4+SFByoYT)F9Noa2>&o-{%ES%LCa%AdW*5n*JW335nHJ` z5qdtYtg8#for{BBREF-hQngZ=k@>FPKcS9*G?vJP6jg>#E8wh5?y8wI+zeL9*sy15 zAWWa&WM4o|ej8}=6`TZ8si|YQ-O$J}ycc#m9_ug}6l^AeY!HJA;iCBDaC%)@A}otM z5xx9OcY2+oVo__VI1Nc$-s|rw;U2f01e4Ji_4sO+kf@CLM~qd@V?QLv#Y}|MOrmvl z5^wPqs~dIVUHV|!&)fjH8BuUxx;L%=#BjZ6y6Z;ct~`Gb72fa-l=`MQ7pG~N@oT-( zkS>t7giY15n;DUf4k_yrcq)ENyYe-(N{mS##%?74vV6=~2>FJEphYY8$tWM12-xzm z5yt*1nbiIGQ(U=3^6OLzoHgF$t>y2tG~S z`Q>Srg_*e_N|ucX;u6*Nq)(=pwXb4sNn-f8R2IE8KDc%oxZ1X!LRO3fwYF9f!d4L@ ze(kI;op2+I&z{xJTpuY%7B^GSv6sx_s;!-D50&KAV{@1_eG?@3Scf&DcN@Bb(it%l z%zor%Y-^_U2DrDLdrC!O8I`kNLMLE7d$htAKChqet;lD-72nS6!ODJH)6*Jc9q)r5 z@6&VWjFoXzPt9?J+DXct%G2Wv-obfEufm+Pm=@MJ%P+kTpR-b1i!k$7#^r;-LKB}D zB%sA_NI=rWA>|=5+!Aa*EsjnupswkAN`tH&-iDG;Gz`=kb58OSM&@~rd>P22^`uQYtXvDNM> zg@i>u9C%UD)0LGDA8iDtoSyI#UgGo ztzU7rlhVwdlue$H`U0TYDwJmEgc}$7B;@Shgwy;$gnNSWAAn4)x+h=Bc z=1*&j=jnV**`q)*R>#I=#_u3~l)iNR?tJ0WT!}$uuGegn1!3x$Q;AW*_g}n-guV|K zw0%u&G}jJgpMq%u$)pHcD&m94=)v6RP`iKl#|M%D?wYDev+j#?asKV7&0q6ivaist ziubM<0@pu|g{wZGnf!5pJ1!S{eI`s&PKXmwl~)alnchtKJ)CwBqhwogn>ubOuhueo zM0q@Rb0g7~M0s_?-A_q!){k}2jh4^l(B2q-W*zuUM#CEAj3!v3l#nY_fd%v|kp-T)+VQGHxsciXMXqYZ;|Ankh zYPJE2zkbGRke4W538vYUVC#JAp8iiYE1!V8xm&!i$LODaD;W>hbdpb1P(jD+w~G+l zfn>K$6i&?_d2JyH3W7E^EYDBg1w6GY$KFZc5JldcZ??`t8`W6p{Y&Jk2wEc!+PIZ8 zhZ#=F^BmK>Hor)6|58&1GbZB)wy{(79QYFPrV6xac6lD7&7|_M7q^`_mxT~E_-}>2 zAz9R0%WQ6c(N;rZlT|agcGdfi7IV1)6d%a~kYS9K$LXuB?+Yq${^SoA(h3n8_uz*C zOf_r=(v2iI?k`}oAn8twvux?Q_RGk!fAu=V zR4x`YofTApT5QzPKh`vIv?0bEE7PVV6Gx(sVDLt^A+F>})WNjtWi^g2Ao@k2nFTy* z0au#2VZ=Jy=0}JYa7O#zV+RS%?L$`9TAz^YaL=5ir1BBf&NY@?DzQgt; zOuq~@!E|O2BdOX4#i-B*jRz*i>Ave@w5$m)Vn7ci}-}KnD z?_f_mG_5@(vVQ zx&7CbNY$7G^VRvDbv3W-r)MRL zcEx6JvwKsi)%e5H09Y$ghx$r}%3LaoLqSm^Q48+o`U%f6Z={u&O*aqY>3uAKdyM!~ zdtlF+{R41Nc+V0H*f!!IY-zhgwgsMBn~I*$fd`pz$z?IQd-$M)7fOUhfWJM4%Z!mo z`{z|jc>H-Qzeg`KH5kQ*zO*2fq&X+Z??>0Ev*Zn3cBW>)nir_L*{EUNwnEI%WiNw* zt>4~5UNxoix$7;Yr`v=dA(%4I(AJdPc)ff!b@`TtEWAQ{gRO9}c3u_bct1U+G`cE) zTxr_TV^W9IV*i`)FrekK;zbI1{V|&v`TR$4i-Re1!*k&G9-MQnX1f%5(sG)<Sfl|)HPYgMO?UMz)^%FWzCTjG! zI`TV#-$^KFuLC6AdOl2SXzGjdh}r`lHP5QkU5iNAdnxD>O5Vil(!Xwy|Hnh;g=7)3oZjiN%s6}62u5U#rVJB_aToSRRx48B z@e0$y0iGfrj}Rv4E5r?8HsD}b5S&O)P#=$r!j_gZK3G=?7rLddV5LehloAmPN_?#og!Mp{YH6)!%kF z?yfJGFI_dnHIxS-X{kTzM3$lxzP_^{aJ$ z@?m>T%jj-)q-%T)kcJp({r``pvkZ&kal0@fNFyN)BHgjHGy+OVcgND*4N6J(lG5GX zjdXXnw1C9Y@eaTL`)R+RE0@N!zh*l!gbd&mC3E_c!$hEZF(+gEEOy_ z`%HY|ULQ4}wXW$RJ?^uu&ml$|Rai#tztHELo_%;k-xjjb3!&S{B zTDsKsZ&VeO9B*+5K(IO9^{Sa;Pxkq#HV&UxP!IHK?6=j6@mD<%NLdqpP!>6hMekYX z0Six<@-h0Yc%+fblk4=?FrxM9jB1w6C(aayv#If(%&`gwr#nMAnS>XVXRE#fRVNkD z4`UyhQ94bQQesqeGt7D*u;Jkq^#g?89HSM#i~B{{2fo*w{oYiJYA7VfAa)H_sfIgOW~5 zf2Zyxh($B*HPLwB0$QXQ$~AKE-!pr9B<3gnG|oCJnL7&QAssjW5dw;A{DJi7HQT|fAvwC#XwTwt{npN)0H1O-7_BnZ8ZbE(nT zLTtYI$w^n9e#9sv^4ZJtEQ7!}Q0`C{I}XQdTKt#auXV2BnByXa8X@4s0iiAIw>%ULc_>A&~N{LyM!1TXo`GzZfX zutj$q=`*PJx^XgPlq4#96%%aoEg>*(Oe@f|GTJQ)P*#E`J2uN?Z#O+z9% zu?M>scgiTaP%^fo09%%gE){3dv{;bC4Ar=M`R~SOqLhibvGm2u?huW%J*`gLYE0!P zgwgryY19c;9EW~{j?&M&7O~o~JeU(L?)72d;+Y%;@T#&CIeYk*g;*lgo^cpq8erFE zOHb3PvU-wBv2fu%U3@w0$-u89bNNUnms1Sm(WV`yw)5mc=ebm! z&^EHVCp&Bw1;%8*M{%;k@?YvOK6uQ_)WrNuivYwPO`+q9KN{E>Z2yeluH1{60(%7$=k${r z85S_huZCgyFZ4_woTny2mJE3E{V6BAG$d5r3wlVzUD(ssqdUxZF21Oahh`5d0N;P{ zfR6ZSfGKkD?nd&@4m9FPK=;W-du}&E+}ZcJ@4(GQ=+_u(F1E>&_7B;SBvO}s#3F(I z9GFYwP>%c^U+by5JGS!h0{J(hl~e;X+CNETEMeG2zaKELit|x8U;@^ZV#jjH#8F1W zecgOTm8(y#!EpO%15EjCRlkt8HVo?~QX&o)bMyNI8v2^7PpELGE~`da2^s3M2t(yo z+FEChA>i2t7@2Rfk|Uu$nlI3W@A-KB7wj8|tk~#!rZcSJp6iR)nVutOsO8uZNklQ^ zPTwCd>3R}mo(kepYQ}b^Siw)~q02-$zgde+G+%PMbe5DqZ{C$RFSrq&J`YC>VNiWa zrCv_B^qB=l_A=6pL?Oih9nA|1B3HvZ+>G7h1hhomSNH|iF$S>G12fVG@@s-$v1I9af8a)66TF}5 zK>@5&)sED{i4$L*WM9myhekyqjV&Q>K~sO5o1>P^6nPVRB3a}AWmt?8=g+NgP|+|TUi&`%hn55uX}+}snAFO@p$9)Taz;eP$y zz%e&D<+9m#^4b5GX4)1Ju`M32Q6Wgq*fX*v+3%(CXyy)K@UP>?UmmOUj&odUq z4+iR<({Ist4IfV}%3jJLG_4mZW2WH)X5c=yl^&#(9<~+79J!@*Wc5|H*aCWz0Vl+W z1VCk0S~d)A?CJl8$izut(b)w=WzEl@JErpe%tpkL)V$G0giU9J89_e*(Tb(wY`%6* ze_Ro*dBoaXKFdcF=KKE0-ZrHq`*7U}W1D>@b+HZAi;5zenFQtySRU87LlUo~iGc4C z{l60zRytv0g$oZmO83>OUExhGHm;PRfw4&(@N(*75g=CnVsv zdDR2iPipMV!pG3Y({{OUgyD4M!4du@(}D+w`2~OG;Q=A`h~mdP%PO*FhRJWM1lSWv zW9?Ynq)T!Lp%@Ueh^5JHI3ujecF7;e-loJh3UbYXlx%2QdA}xs`$z71c_54jTAeYj zZqp@|Tm)44wM1fH#EFLby-7haS|y7nM*zIw{!0gGsIvcG|Dwej#>l>8b)MXf5>HLR zNTG$@-h(f__MfDAlkd|g)zXD() zF2@lS@mG%3pPzS*7RIJnut>cjW~xQcPS29zl>y-waxseoa^%e|CvvHSBo{KVnk*V$ zM@iv?evd_aTN;acZP8jcZK*jJyWD*1-)~KfFXo8hL|@lXr049z)$&x@|RKUM9kuuq}KWn_oOX>KV<%YzP+0iYsB1>5P5EO)vnI-PbD9Ir&Kh&eSu!ff4vM+8H~K|h<9SUv5iY3fR*GRPkok! zU29IOz2Jx{mJ+4X*b++~IfFwcsl3`hY`^AwgMhHUf~F%XgUoZg>aEC#6IByrqvWop z$Dyn3op$g|;58EQDnxiwP5uCH06Fn7&S55!6@hGo4zfa{f)NdV3~N_1z(NmW>f;SD zE*kJQJzV6?wY&(X1x)D~bu#;w!a-lXS<}acG}O{kwIuu7jeck#dh8vxNF)B>*Pehn&lvpha zbfIT87JR4Swyw{9Ro-+sZv%E)my(6iLZjU8U`-`cqr8H58cd4YVgHKL8G10Vb9~MX zl;Vvk>L;aU%3V=KR|h`PE7y-MJ%txltgWkXPRJniy*b3rZ=_jt-;4k%i+C&V$V0G`qy6gF5^=KYt9U1x!r%{Mp zv7=MiWBD0t5;%B!R>8yC+`z}Kpq?d~p<}1{j5dqM%Gl)X{isiXQ)-7XB$UDdT|y$G z=eq{UO-&?`@?8CYwa#%zZs65pOc&4gWajx_=2!k55$jPy`#}2!ONq1bcUQxyEM1~< zXN@h%s78q7+YL*C6P@xe!t06Z6@6*@8-5%zI!BJ*SknRl%>+MM>o^-RR5 zL`af#_K0B%C3Bk+)j@9!Z)+LLlhSu{3vjcRPu0A%Qd|i9`;0I@8>w{qpsUe?${S;n zhW`UBO}&B^@Oq}Bj%(X7LDOsBq>7sCIY<1Vv(M#bAj)fMg)}|KlZ7<+Y6YRRlJaTz z5+fPA4vkfEFyG6`?3!)u{KKl@M7XUWx209I;JufqCSo1m%Y{a4GdJMsR+o^CESs&c z7dqMusv2JJtKqnJSlbGktWMiBhTnPr(Nt0(9hc4Lo~>54#UZ|Wr=bm29@-*cV9fmW zacS{Nck4*n$#i=~!oRw8Lm~^gb$)sHH~#U%R1m;dO|^a_R=Jg~hCu>laZ0^P4G^G)X@z5k`p6gG^QeFQ*o7E>>yWx48K2+@O-n`AH4FB1=EiF zpEi}+J1taADw-M-Fxx>7Sg5 zmQ$)RU13kVzRe7*W|h401vwAla3TXi;&o+>nRQi4G#4L-Lm zv|x&yP93H_c@r%(vM3>D+oQvimY$F+WJ=L*qXtP+-9toYcHgw?2|n+5w71XOGI?5Y zd!{D;wKh$Xy;2KmqlG3v{=%e;{Xl=d=aldCwvJaG?a!gm2t9^X}41Ym3Oh2X1 z{=nl=+0t_N@!oX@M)6J)$`l)=ri)9l1XK6sYuGx^|JMjNURKsxHlk-oOA@x()V%s+ z;!rL|8U5NYwSc7}Z@8FQ3xjmQ|fsr6vb3m{Ja{L}IATN;s5seZQ~TeesQ56h@Q>L{|x zNWzjFx;ky~otdD1k`7KmeHdTNPx0ns7NNc0Ki(OH5YAk!SV#Oz#`v0Qx<}^S+LMDV zAx_O;>(J-49J(cgJ!wI!_mvkeoZ$zOEcdoi1~E3tAD469Aezak3tPoXqS5LH%d4sk z{f$1xn!1gBjMgHGaIk^0c-lhS#^LOOvRUXS@yqKYQ^C@a){>S+=L{D=u6wBmhh21x z&gdLQ<;{mdiH~YU*0Gx7EWs4Ez@_#2PTU8IRGBHn82{S$LpS~4X0B=4Mp|lufM--qm z|Ffz|O8d+UgmodccM_sEZnx~jl`RwVIzh>(Kx7wdOenMkXEf$9C4(RU}%iCc4T z3BK-!Yi4yFimjnXQ;61zDa+RRLA>a_bF?7AdoQ#zlJ_EvQ<0l%aqoW1j9 z*;d@aBKt8Pa6_FXBVva~;pnWLDTX0Z2CsLMD!-2;rXyYXZcvuJR@cB*IF0-p;@&`e zcp^#liiQemTBcy8(0k=JHic$^qCP}}-gHL;|`n-n(E9gNGciNyCE5NkF ztIB@ry)wn9-C4WdfmhLOOYM9~4?o(0)qLm&XLPeCq{*KMf8YT9;dF%0F+#22&%<3W znpzRRdlUoir^UimIL`Pl@Tp4{C4zWIyzFr}Y^~1T-?K~fAxrdCN7eYRCNr8h#ElyF z7Fjd|QPQzOBArTTb7PYLg0XE~wN~{}N8q&f>aGC+^AU)$Zyu zI#pH4HcIN2FjS6zALHf=wuNRczx=xn(9}HP{xlRP(?8Cei*51ay;>`_%eKHA9?+)~IYJS(h;OL3)oDk3zuNozrLH{vuh+ zH>bAHL6%i>KnMDdRlWrMQ(4I!D7juzqbX*1`Bxya2_jd}rgA#zkbrShE!SLuDZKkL zF}j~WF7Dc|c#y2})v)|Iq^`fgqT!Ie7>%kkmrO>knX^ykMURWL24b!8swhDoSs8DAo;v4mx$kDj5h2e!1-^*+T<6g%FGgAJkes5$whlX}T&4~cSe3@N#d|~C{bF){I%37$e zX16{r*$D}U>YL97xUkt(Xsr9dmnH}^SCp`1$k-L8_ECq?$di-?Gbf(h)C#+v*_ z*FRr=o8bB7c~4`0k{r)Cjup6Craib?NzLVmVFXJR*&hbA9cZOpBCdZC zY78=mOG_;*ii`jH8bD&6H1B?sg;l}zhJR(WZ>Fib*Cg)7reiWQMNR3rO%9Li9-_!* ztRE?`t{S4%N*GmwG#4sqXyw_z(RwQ(PTrLOU_H6sY-(q)@(m)PLBwIo^B0#1J6OnC z!}t<#0}8$l{kO!hM5z=bXN}OO&!us~tS{Dc13yA;wJTkKrz^!MXpSNmy`Hn>sA_w} zYQ^7U^5386Id37CXz{_Np)EmC?jjz35BSCh*Eqh@$m;#Bs|8DR1vnamN7uUo_Y;DR z-I4bsU-3q*V1jW}2@Hk-SYg3%K7H8h$xf5t1gcQ(d^JD(9buy5jRr|&yNLyjP7iLM z3ETkINdz(_x?pV3Y>$pc;^l|bl!a5*%*~GKc}74iN6<>q6k)7A<4CBUVj%4r6w;X( zhMufhhw(&th7pXUcnBXy74>^B|piTr0dg&Y0Kp-X6`mup&#wjf>;D# zyI=}2!1+%?PH1y#r?%R4ZwHHR`~LwdpGPrs;LIC3BaVP6qLd-_l{lOR>M!bgWGr+8 z>+BhSMzI<|V+n!q^hNGyd;2ChcWUCPIk{m)stU*?!*-qZKs_oj5v{=IZgWMqTfVFL zENL{nLhKj~5+Hffn{V%y_2K{lx!83aQ#mqpmwk?=Ij3H*zUInk=xh|qtVahw+ zBP45P7-~3}`)eX0eo=^0j(k6rvicRB?o-Vy*;zqpRhy|BNiFo#>oeh$S+m9+W+<9C z|K75M34^$2T~GHAbDH)di#rhA4n-$;wG4@IOKX3;V(RT!i>Iv~ET&gCi>72{{-|Sj zIW&>(NtblE96^tCgTL^wmTK3YoPn-Ki{4-ixW>~WNWES}2Y#j01@4cqm=A~Ly#wlx zf8VIDl7@#6Gch@lYqH!B;;AV#*%I>+0)M|^9{ghc-I~NG+(o8va#PLU_K;e%+xTQvz zp!_NSo});jdd-9p`D6)p!AdztD|5MLt7e9Mb)cpo(d6b*8D9#c%T3f^03*l^;Pgv| z+_rSN-wC^pOpn_XSOv;FW6Hv=3ayvwSe4WPHs7 zMYVS4KVbuxnjonMyBv2aCvoA&_V(PiL<$z*dC2Ih{&p8!mX{p^VVoh`?0xDCVieqY zcZ0}MOzH#ohDpY7V}l*9+8u!cabT6}one7+X7yf4=L86TP#MSA2-AoA)3*8c!O_AFzNk?W2|% zSMi0=%?8sM#-tsJ4Q&lEO{}*5Esv_3HLum_`i}c`wN|q)S&>VtHy#-%HO^xDwsJvL zj*Sc%H4+Df8xEEE>)Cu@%u(7~e$GNE*c2)IxjVkK(vr@C}?^9{vi_2C-L(?tk}qnxtWziONk1NB_W>AF>br<@-5*QTK7Cb z^-j7rUpbXy?zfG52%K#3JY^(D2hAj6rNg1f=0eb8?7aw)YXVo~5kOv^wGv`3A`I~#A6O-u&dy9rDrrWN!v{vpKrer6Jt!=yM zg>nxOIxC9kyuK~6KxcrL;H7!zC>MeoqFxxcXb)5E*J+MmnyCw_>Qh+$DM=}oJp0vt z7Fjq6&MbLBo4slUC4MVH!|(pD^n=VVfL2Cju(agt=-cZmqjq z-v~slKIK>D)P?W0ju)ZiXFD@Yt${;-Q=r3vM{Bm2`?4c_0-n3o`K=4)c-_-0DLFmQ zDPLdX1!wxnbh#+Y%wFziVl%?@_}SR6j;(Qnx#qD+d-xxLpF92_K#MeKY1tU54LY+xJ|aGA|KbHlLajqQpj1%q&llru z9vFNssRX>$rJ!HbUco)WdA@bxNN?Zo{MI={15Cufr_G6f+crvH`M;01ZaX1WCLyfx z<0-EfvEvz{pzWQ$XJkdYxH!IQN!qm}PTD&>xJ+2oiCDt3-0bj^GWdK!8sqxRyVlsW zSbZ=NVb%X8XgN;GYU+hkgIt#3uq9FnEZvQj>hp0+1Pyrf$0hv`BUl@-ravaOQQc3| z65%?=6eWvsKdj6X@J5<`+bV&JVEQe1ky(miQzW9};gPbi<+q5Eh%9jUlp`Ix0|g(b z*`Me_W};u+M`}yLd}^hk90Ue8?Zms1aPE*d4AJkKHx>nIzXxD(B&d910tqaZ7mOq0 zqRFQSo3YpRv@~)<@;_luDk86Is0~ss5uC{i??;$B_I<>d!Hr_mreqczO8w8(3jka_ z9#&OojVG|LhJVa-tDnYzv-rmJctWnzURmdF?W^2j(1%mw@N*Ag#_uPAPfG%1PgiDA&UsiTuqwP9O>|}an=RRA zZJ>pI)&VwfSVovdUsP&_xL?@-q5t{H=6L>&k#TH3kY$iQhkt#0M&I`k*w`T*w2W@m zvMH90by&*AwM73#J*nx%GPU@_n@ht)tO%?H2)A6}n}`F3@KxH*nHd8Muta8I{e}i?|S|8Jn1W@;I#1f{A1rgXd;# zJ^uln(-FIuJ+!8u4L0~UNBjhVTM*B;=C5148O)0P@4126up*&KFO;LpS#f7d4uSBK zNR&nz*nIp-ynQMMvIMEbz#U$fB%t>n=!KiBY!%^I!ekr7tGu6nP1)rrnGVN+l&h^r zEOQm~2Ns2Dl%|PK7r`liLL_wMpMr0OT;djWzZ(pUi48rB^$9UjlfvT_xG+o!7j#aK zE(_zqn_EYZZ!eoUx&Ba&eQ%Fe4|#Y)^I<;^wG2qG#Qld8^R{VBR2jf0|9+(A_9dJ& zJSEG;U3HMvx9{5|7^cDQaG)dwQuK$516Q9FqgH@TRq}!CL(KV)0$TJh8#YdPt*Up2 zd%?ES!6CWw?IbDfauL$LP&?#9>{2w{{XJ?vyg~N5-&A4A!9(a}Qx3x{dd-zgTZ?ow z)f`HuW&V_9f8rtu*Zh7jzA3tp-k=;kJuH(yKCYAr(5RQF2-CFUn+t}gAqcaT{VBti z(!-9MGy#F<`u4MVG_nb>U;3c`*)I_l!zxzK|%joGtH*XuAI5Gd~M{OUM7jx_+iqi^xmd8 zA@wR73E?rco5iXh6t+bR=TC<}1`a9ovvXg!uBXjY}eM}44*Ild_!ruYhiBnnkRlAlZG$?DrC zf{5Y>ZzO>Is!u0r2y?V0H#euQc5TSHf^}y7fHhdwbB|0un zHF7CiThGs}d^*m#fbupfTWuxgBxkOMy$~&CYwV5r#YH|=)LAj;Ms(thnm(SmkEQ`( zL$6%SrKNP@P9m2H7Z}p@{mtbZpyE5B9-VEVO#YijrnkAz@|j(T993OJ z{($uj8{E2Pt`6p+bD66LSH;V5*W+VT2ZL@S2~Ve>hx(G8vg5dtFwv8qAa*Ugd3Gk& zwTZo4GX0&gr=JjqI$3e%s5jkV3cb^|Q<6m7VouVGTrda3$ZGN2w??e%I{{`UMt(%< zJ_leWNpyTFo;dRDJl?rlch-%9AO`MS70?VNLmMa0JE07cmav$+iE#uC( z#qROqEL6_5tvV^Z^tmtb{mpMePt7B3!Fb~g`{er>ELmbXfp1df?Iy5voqB{d zvi9D$2xBqei0S3ix^)P5xLa zQqphe6a-{FJNW3b)ccYMs)0!n77EioTDA9((zG8qzZ??>glfh*eChDMQF-_?P$c^D z%q434JW-XTey^1owVOfFD0_QsCq-jc)10MNFdiuWAjoB*lbf$h3g*P~CWQ~5F zTT+2?JN3hBT+rns&{)N++Smx-Z>yet?Lo$iDroGu0ZS=3d~YI#H87?PXqMpL8X2s% z!)8QC5!WUrm~}XI<_TH4+<_H0;t4>>+T_TMB1VFv6P5M=Vv(o_3H5z%lk)=ou4}t7 zW(#lfbtPrw=P1ClUlH!p?i(ZG2N9;4a_=qcSn_cE(#vYVYfK?`c4#@Q3D_(fo6W4W&K;EK2{cIF z_nfl^6qxFg!slaS4u}*3p=I`e1Swd?lC}x(|81NpPh&w{7hnGM*RFktlqL3Ql-nAN z$6RzL1p2I*;&#uaz* z5K^+%+cDidG>HT1eHLukw@P6S(FTqqY7(aNhJ-nfb1F$oJ~5@14a>V%t%yN}=ctr$ z1i_MQv|{b1#cKXS)7bPR-#tK|ikq>L3K(jdSSm*DM+!o%ojWti3l_qcau8NNq%vD| z4w0%U>W)HOk}c|7lGTZ!9wHS?OZD-GRnnT*)Gwr)H^M~e%Sg8m08)1!%>(m@XNBU4twf7aRJzl#eT$7)+T2rwkg+ePHKSic2p&XR| zW2a5IPSYI=RUst#On=9zR^=cGQHn^Y>5q@5&zoNkq`{Qxr^s$iSON5DFsoMci*c@u zzP!Fh9@5^FTDi|bP^RI0Y&MkxKLyOF*Vy2c(G^M_G9IA|#Qaaz?;X z#ofi&U-p2s$Edo>p>NUSDGujX$^$Tp6YK*$8q=pWQ(1xGN8JqCyoUL?fjB>BBJXGK z1BK4RiDL$M92*-n0z|sMx{vbV8P}{~1eySG{@jzr$!HptHl2l+Mm^aT zfdo;X8aCE2a`l{{3%$1^a$5rFNVb83@eY3V9iw1(aw>iJY&@_b)^>NL? z!@*sbj82ty4(nErSRKqMzmSa{W1X}Isy?Y!DrCHG$|syZkb6$aO~l=eJ>51I#Spf9 z4O#gy&+pc`Md}$^uu9~$<3g@cVCK)SF_Y=Ay}t$>oJ%|QZ;HSvelQ_*T=+)$>9d;2 zln;v;N6~C0knAVM=>DKosGV=uK1PbDIERa>B7=usoWEMUpstlC%&B{QeH7fl$MdNo zWlX^-08gn%sOp*7(CK=2E)v7sltbR%hvyBOFC=eytV>P?vOF0LpW4}Waj9c6?g8Rp zp_vN(5`E2@qOo_x^Z#i0@{GGZ0isGRn$CQe+M^kWIKpN!OloC$>qQ6?%I7w&^WQC_s+GLSU9M{z8=fz@CfyqJv} zR3rD)ogo6pKiPv@NHSN-Uk!tqUv0xs!_k7Ird9LQQqT7Z3w|l(@e&Zeoq&7`#JAWD zzZX9(Aq@i#r^3^PrX7~pLC4Vb!wOJ(6j1GdTxz~~FHanK&oDrmE5H0|77Gpn=zLPk z<4mbq@6gA=ZaL9Q=G3N3?WXC4qo#;u9)fKhg;0)5zYVeN2z>g>8a}DiE-Z+Uv9V-S z)4@v`jBdwr*~D2p<;_!H0&9w(6IsK481hZ3978Q`R96BavLyO8P%9LEd=u1-{YzDA zVl846uli)(_{mW?5)Ek_zAZHtWO0Ju+S`afmbb=z1odw)dBwh#DMJxOY7dhn1ns0x zgxZHXS?fI6U_Amo$6;yq|LdSgs{OBn;^gr0Ylug9+CcFHgdGx_dmB&+7tR;Wuk>mq z**JBs(X@BYpm85~+8rli{w8RZ4HU(rjZi8mbGnC>ES9e-r_wc<)@&~p-?JwvPc?Q2 zv2%K;y+MrV=dfJ}cbx0Nv8Z&yWt|0gS)|yUiR{Z=3WL%3rAbc)bs(67(YTiD}!gWW{&kj z5=|d(Z5`;wi1ev+_)mpt$o?{gs!e*qEmuC4>Fq<~n^efyyO;WoIkWL;Q{lYBx{qBk z9QoF3FpvLi289Msn9j0Qv_Krqu6F>3M-eSI7~vX?{yLmjvK(o z@ObK8)Ke&hmXX`btULn>vc9OLU|XE{kF+%j+|X1~5o(Gu_-i#c8_8qR(|=*ZIrK7k zay}nsq6G_Hn%mk_;taz)%<;gZcBW(qM3PVr0Aq|i5+;J1sN`9YWTzO)CzLQXBiUGv zs}>L*AD8+tmKS(A+c+FK12Ja*njRGY`gZ+aMM|0Vl;4@hlKMbAx*pFE25Z_KQkc{s zQxOvY?>icvLTj8yi^4Q1>3|tdG{s>Et3DCEG?_ies6RNK?PQ^`m&#HuJRgNJN7ayw zM{CAZh-H!?A_cnm_rB)`I)MvcGnTuTOKry7uCD5ub})5oCy{Ph$pCg(Zj>T|YQq;6 z6c7qHeB9Bs!@A<;?>nakJlSOQ&EK5hRAg;ZY7t})m(U?9ms9K!5b~E8Jf)rV3-Ie1 zjV;6@VrwZ3`u~~>uE{>vUiAf2lC03}kAZiK5uD%ejJ|CC0vx5fM}IeS4XJlYK&3#F zCxKxsPgNbTh&WTv`A>d+$~8f>UjY3uJPLK^1fIN5srn#jXfvmZE>D>vC8hNjPgR6a z0-|G2o1$+mtE`SA(6-|pnxkA$FmlNo@Q4eYFH=`*s-zo_2rjd&+}WfrIezYdI3 zAM%48+A^<8j=)gP7Fc==pRFX4Jz)bOye#r`{O>6eZJ=JJ*w&4%uxfHi6CN=juYkAQ zw`|TMZJwR`c#_oITZm7(>&Gk+Uldv~F*a*s5LfCaWBx>{q!WEVOwBHFbl zhTLSr`lUpu$AZVJvMo}39P%`rC<`bqt)lJUDR)8%tot#;ThcdzCDPZ> z<>jxl?98on4y~&H=}!C)Uc)!JbiOL~r0@)xI`^`?{I{7Z60QjEvR~hPtucA~FZ8Qa zmrQ}zCN=y~qpxJH0ilq){CL?PdXk^J|LArt6UF^Q^U;H|vq$u)UG4;vxAb&3u-xO{ z;yS!7@1=$F9hpRy;#5vC0Rq#|cc+F%sfzK8fXE>cE8#N5Y4K6HOuOg7r$;4%E=EGP zT>VwDQUcX8HEal?@eo7Ra>-(@m0As@fSHc`1iEuy;wohw)OYbJQ5a$qtl9 zh0kr5en=+JH9g$GH8;y30^mUVbF9YIGUf6Pci7~%ri$yyQ6+UvNSLsS7aB5M2%*T_Vy+CSkFwadstGmf|kiQaI zFT{A{VFnfVUM~;?C z&x~ifGa0JF@oE!1+Bi)T8B>JODEF060UR=y7$!q|^6iV%580bV#14SLB4f2sQ?BWz zZsjY-=-ns1i7N$!IoSS6@c*cEONDN9P%pxBy=+%_J69&-s+a)Zctn=ZO8S47ZlH#q zx~!&F50ZvYT-D-l2ktY)2?+UrJ{OZOUE*rfMKt;h;YQ`=Z&Ul%ScM79&HGOY*7r5q z0C}w4tCqz04RnqyEv7bNrmTxOkDeI{mR0lpc!)`)atAA zh*mhZ3F-?q%Rt@>I6!ceNkFQ}>E5m%Cv^wNX#o``T`1utRq2;rwpYh;r5#{|8W?w* zD^9U#>FFB)tENf9Svpmn9If)q<`9}0&|+(fn;)lijy0Vfz9Y)aQsZAa8kw64M1jwh zG?bt;WM)b@ddcEGIe!<~;QJW0mGAafchh zL*x)jHhhRuf6sr}2Fom=+?%?5BT~t3k4l)(JFYXZK<_aN)oo!E{wNj|kEee}EOE?x zP1{bm;Z)HmG;9^Spg)(|tA-ec98J_jTT?l)g}*>PHm!f7IpU_9{7&Wi|EQoiD*gmp z6evLe7l%-meFMEPoM|~yrmPl9EA7AzZ-4qJS;@R)?7KPL4R0Pnp?D&K`)i_(OC@uL z`)71P5$H)>M$^y%iE{g0aR0}`?^jA5TNvrRPP{Q9zjHrF&-jW^GJjSwv3P3HSd}e} zl)B4Ki@SQOe@xS?1qc9AD(HP6jZUBIWizFmAPN`0LUl~wd(e#8GrH}4(k!m=SwgPqQ1xA^48NxOWf7;=IUW3+%H3wluv40fBegT6x(M8%1={->}b5l0{qRN7t^9h zy@%FFnt_<|`qjPR|0-l!^G4fT-{l2i+mlPKx1(jo_r?CN5}>`*w7>1846HIPndx<` zQnk%b8Fq%IE%x}x;MOEgh#|9*6fu7d=A0pGJ-^Y~d=EO;a1m|t#EHH?JZO)~E$K|p z#ro#rjedq)%PO*V$F=H-o5gww{j>aqd^rrtV{y+Vg&O~hW{4W~v;``KqS?hhtCUh3 z7iTQGD~w$j!wjDT&?6f@hD9_ClU>G+#!)wz24E7JbfJeUGSx zJhUZ}6Gg||5&1e}=Mas?T{TR+alLB*NS0i^IvB^sxzvptxK@IcOjG$0YE3DCpZ|Yi zVbqF)vXDIFe8t>L`G}RIp7&^JTSesH?&;KW!go`DFZCxsN3+NZd6)cqdW(R-8pFyr zi{!!^8esQu`q;dEDT*y5*=dfF3Zq*PY)#uNanFfp<>X_*5@s1xhbzn?81CPRwq4ws zHl6#{dLwh7>--pdf)a`QgQP6r%&|l78@j>f$c(rf9Z%1$1QJ^-+6qB4=0!boYURFm zr}xpBg{7Ugr7h`e3Z{E^__;SOeC;k6W(0Er0!=idZQe^*?!Gp*LQ0uQ{^P*LqOCqJ z`tk!kSm}}42}YOo=01+ZUaW#fP})tpc{}*)#hkW}n(<;FR-@yU6PPyCSpz~_5yS=# zrpNtcw_R`Tk0B+h+KziUkS9GX7SdO$5xzR2#CgnKM++_-fbCiQeBMsUFBOf2QlZ zwNnXEodQw9xgW`yfQO7>JvXK~aVb=1wN4Yro3VvSr)id4fwU5zEpmDF!SjC&oE$ah zXI^qgfi$E~>T@wXyql9)WIjLv7GG7O+3a(z9xD5@$Dh|f2OPKF88tN3!&T-b(L9vZ zF?XZMvZTy)rJEwZO)9Y;zXJS!_;WuWl)kt{Of(WeSr#Hf-MP#VbJ%!5&u||7?3xE% zr)_OZ#;&La52pa#hLx*pzmdwtLVtoO*??pH?!%HT3a-8dX$fklMemjoJt?WHS{aH) zX{G@i1^ATmEZS#DGqC0hs`3WH%nz&QBrBK8#&&5(m;W)Ng_HC%{eNH*t)A&~MCICq zF`jW$3-rAFIaD1zSm%Majoz70-R#mBdEo;gQf6j#da{$$C6(}WS^Ed>aJB1pJ%<+EdgOlT>SM@nwVH>P4<~Law8eCT%3c5IrBI{hk?ZVQ1nZgpUQ~_ zplEbP0Xaa$o2&b{=zwY>cEt>@4LppJY{io0vZb!Q5)tN0nSSblu@;hVn_(=DW=a9l z>kSbWgGB>Y0`Pjyy8mcy%{UF1BHo^gtCfz0iu%MkCUws>;i^!3_3=aWxYiF5zKoUl z>OubAG<>MGjM(zl2GAL%IFTgna;3WRe@K*AwJFc7444BG}6!mnCRftCI zdww%^JXpW|d*VisxGa|{i@55tct^aO%TtlO1 z_nI7ccZ}-cIuKcP2-k5f)`sDAta+%ZQj&X$WN^Pc%Y1Tb}! z3G7E${`cjcy9%vES?CSH$4b$ZjgbM*nHOAM#(*_k^9Zd=Q0>@>udaEN+_-7Bo+YGt zThQDhBQ0P13k>C@h3HOA;Q|x0oYqp;_uIKsTWAwGp6_dDGNw?B*uJ@N^0({FpT6z; zW6&o8O%d~>xy?~<6c;ZJ;@1L-5K21P_n~qcKogK5md99@Mm;fNy&f|OKlkO(qoy;)k9y@1eSoMG6akAq2{>hod;Dp)kv^j+ab~q20SO1m8%ge83b>o`~ zMBGPks^?NF0lF`JqCnr^fs-cHfl@YMK{UqX?PNGHoA+g+rW#jQGLmXZ32{I{r1(o* zWTccGOhZ%Nb9m9s&;2!{>Sfu9)$;pTxiBd@YN`Z^9gcEf`v_G}!ym|bioo*iXd`m# zhEH`ApURyvSEl@0Qf5t8r)lxTqAYKI-u!e7-MZmD}54cwYrG(Z^3#NFI zf2S(ab3YVK3`blXuEJq~7WSg@XWb#lj#K97x z4sQVzo^GSeCv)n_a^(IwyZyVnf{+kQSG%1FhJM!$hCl(fn*(w&F3HcPw(HZyJ_JBJ zSg3F#VZ(1}?R;D~amLXpPipGT!?*d;;W=MWiSGK>pSucL#&TA2x-@uE1pN=SnOtCbEy$J-O9<()ny zRW7EDzZV++)4>CVU+Ji_L^6zaONzMw1Am6hiXz!LE@IRJ0Qy1NN9mh=VGc&`(E-(y z6By%q)A~q|)f@6|K6SlEU@nM3ewt@o*}|FQfM|lWT0;~)`x~UqqD4I(a7-1hgk7u@ zulV_x7CYOuqJ7&KD+|nvKqL!(&rhgt7(Pi;@N@vavYQL^V2-dKr^geBZTD8RE&O@y z4|0v4av)z>??k8siYsY|BP!u=D7FT=OP#M>5~;WgcRFlyfZk`i4^`6ND9DL`D^K$Q zA*gyOs@kgGJwp;|v;?Bq`k5HwCc_&NC%ZRInIH?$c66-KV>W75(ok*c(?Xsr zBZZCrP+L$L6oAwvg6JWi+QQUAI_;bfVeuqRT4I}@E8)X0UR8&BnlU^5rmF2ai)puW z!Dh>8v-773C~iHYW0j@j(yC{=Zv3h=~l=V21zn>cW5 z=-=Tw$5-c|MHmjgIXG9+LP`sbvz>Sn%t|J3eX$g%nx;=D# z71`+){J6Ij4P@Z?o47oM)h-1Oiga_h+^Dgw{=(L(7FMAzuNXz8e!0l;haZYTa+`}U zFqT9l4|T9amwRq0969#g(tY7N*=hWDA-6DrnWx?Q^cH$S^J6#-Y1H*imQo9bI4IFL z82)gM!I3w(=CU^@k2~PUAOG~lI4dn0Np)h>7eh~ukdAUUQdI1)&r80|{Es;XUCB0l z?BS-O&x?nP3k!H8F=vkHA>Ljt^%~_0Gdp~kd~Nh^$nK%EQ9S&A*XrB&Uff8<>bcdm4Ev=4N;t{|_dS~pC7%DH@oAU)pi)M0W7(^iYCt-XeeI-8B7!tZ-? z)R~knc;DixU)9XEev-o}(fJ);Ard_qlXvzU2Yhyc!5o|EJ8Fky5auD(OF!VqE2TnU z&y6Y3xkDeL+sT4icog97_5LG+En4Us++8nEfgcSEmcP6nH8q(C8)tt&*u_y=lKvex zOFE&voUk>d(i0F|E!dLMs_z+EIXr_uDI$o2@yc|3+zxI;3i3Q&D!j$t*v8>Vu&TM(>`zNszHAGS zXqZFH<)lqi`N|tkPDgXAE@$*q+_S1Lz|{8fX}sX|sFZADrj!DoX}tS&1@N1t1zY*P zAH3>w2bV_Wj;)Lq1-LwYPQr`dross}9Jh&vYw0C5+t7+d*;IbBV5ECZh2SBw-m?F1 zccITAiX^aL{*_%D>0o~qIEpzi8VjN648{6J4Q-kZnk~umKVrQvQ!ufCwW_uHl&meb zcd;@zw0g7wmI*y-Fo^1Gda7EA~{n^paDf5O_Q}t@%e8y*lbm^Ng3atEQ#T5kEN-f}js+R9;StM}T!8fTdTh4f<}Y1F^Y*W0w&<7s{M2|4!%z=SWi7|HaJ z3%}WLAElu5d;pS{CO<$y@MP|9^Ab7Mny5DbtaV5LwpBxyQ%5n1CbCLNG)wX%wp4l)aR#?~^Vyl4e+dM7sY3atTWR?@*f;@Zp@DjnPa= z)rs$0Wr`t)r8!9o#PG1U+n5on92fo}h}v)(OI=m^0v(eM6i=9lR6f1{1*AuBhC%!0 zypO(r*sFCUh=MXeP~+_QjA~Zh^Mo6nmgZ*jhx3a(Qp85~+23f+#vb!BRh1qD=P|B} z;ck+TPdam5hnfm|aXNFf{JOM#v&HFsL6Trb4M|Ep0Q3M7WNx;}R_5{Si;Ex`(#*Qa z=qPFCAlUz9?|~Ahz|Y%P2#6IdE0VuiAz)41`9uE=L94$&DnkH=@6Az(;p@R&^A8E3 zx5c8=xuI9y5xh#pPdEX2@_TBZcsLg>pFwWvl3KariF9N6;L%sCo75m9@|;UuENbbg z>r~kELP^&#Xj!Lt&%;y3x>e*1YvLFwdzNF3r#`C2PA3W#T7J#InnrmiZq%4P!J?cv z=W^wFAZ*S4U|q;q@dT6?)7jQd+enN9YxwzBv33V7k>tK}eeMw8+_rnL@sS((GZ6kx zmajI%j>@uXp!L+x6P3)%B3=bNMe0mCxo^L&bi>rPD#U$cGa~?Ns;PRCZI7i&)Hg^8 zMuhV2j~)k~CaQ*HzENbjS`1$#=`BZoftW?|offC9)er37D*!y|F8sx~+{7jQFpOL8 zFv>aJj|!h?&u77ZJ(a7^e;=Q3C;4|7#_eILx+8psB?JL`0dY6`+X>644LI2cDv~>R z>*k{U^&LZX0UZDkPS1#Bdt=)@N$9IwONYgmm%kjbTBYN|FiRE0#cp%k@3`{1Q|D*O1d}$hr8)f$+B5MtcDMF}v#IS5y0&lNVhKTg!l1*WW2otP^D`MKWJ7 zWLGM}vo9VVb+2Z$&1M5VyRrW2u~Y|<3q@+`PX5m}k?7mN$}TJ1(R>S)7UPz1;lZrH z?~yum)E~ekdVdY;V_klM3G#i;qHNReuL9Dvm8e{OOt1zCHRJ3o= zj&5Pi%;;6abDMBd=g|YYr}i=Rhc(^Lwgy(In4D`h=oz>qh*V2V1Fe9ilM|+e1>&1` zGREMp@5JkbdRgb5$`esTPHv>Vfr8rU&ZFUJsG7|m_X#w$vz>wTUK*GH2%ZFJiJy%j z)y_5mrr}k|{4?T;4;J#ttGzPia+e;2c@j|1wb2FrNs_p_M%H#aSBdYdT%nRM{gS@% zhkjYnT_EUZ@QE3#<^jW414VmZRV%lX9;&A2+tJ(D`h0<`;zWAZYs zxrkvhn>|m>1x*A0yFH2OZF%EcP;>k-0;3@1XT%n>$FW{)A=;4)%n0x~_W)u91x*Wf zCM?|y5{g((D=huWqGEVeU{5;yA8^?u%)e7Nw5pnJ#-^+GC=H_Gt6Qi}Kj?c3V=eMK z0yBmd0B^*a6h~ndDr^Vblulkkx?D+>gI4aQ|EAjbq%b18W`LGPOg_EB6tauMW3b-PpUQG!mp&RHTGvf&K z&_P=NvCsAuYB*VSLy|6(!L0K?l98ExlMC6R0Segl!T zp6gPD*JVg0+pY{g!l_UPV}y`|P>d>Y{K~{!(^jM31<(oLu$9E5r#4|7AXhQdw&bGq zO%4zdY zRE_N!p93Bm1JA7n5Ephc$L`#fR^q^6<-@eNAyQ1z~~>Q5@r__Jih;s&N9wD7lk*`Z^6h z9zYivaBXM%2XRwbN4_H$-T)QmfTpKSqK7iI_;ge4G_XDq=lHZGyk`8VRBuxec_m72o3O18 zy#`Zbikx!D%Wr|Nmd1b*O4l-L=dd#N!cVEIWeo2$zM_F|Ha4w^#yUw63dyP`t~HE- z(y#5x)N&p@NHtfP{(;AU7s2>E*LRn4*91%YR|lwaFF!mns#k^)LLa+pmcF-1YA`DK zcL2u7j@)|CxLA-5t}3Xz>Wt%KfOkX=?8%ytlxPIHa{>EjDbn(E^nS!;6yrdCkKE&1 zDMZN=+E~G>mn?4t@di2;YQsIo1^PgC7Gu3!4;o(S9(lD38Kb<4nWHicMa#mBXAlt0 z483GHV#Q?8hk3O8zZtdBzF{KGF#?LlzGk6-_{;@o&r&_tj~JwZG8Um ziIhtT{#ZvtRM9r46>m@j8Ut+Y>MA~MLH8~E2u-)qLxi|=2aQWQgx7jBi)CUw51iBi6%0f7XKAA|J|pW8hg z^EaZIHgB!11&X6jN*hP`aXOaDAZ=Q7H5j?D-Cuc6NtinIv4yn;sUX^Fn#sq|A@!bmZSA6Z*J!-~O}0U#zIA{f%!O|XwN<;2!D#F!RT3j5XS;Es`T7aoFsS{*l*;q^g5 zcaEB5oqILC<^ufaEPYa<^l96yD15?iGz~9f)33{z{~1LqN*<$67Y#JN!}laN{B`A$ zg4Y1Ks7{pJ`E}DGsftGq+rm8#n!yZR&@xL{h63oDCw0VsF;?`30yQ=tE34d_(r*Dm z{e0AdNtd14QMZ-jTS-D3p$JDgBjqb1xGe}7-`ou(hUCv8ZF+y2`|Kn)mGr?H_crZ$3XS#9L=H7hVxT>ya z6u4Vr`x?82hPIB1axdLk#{bOIb~jBCk3`L!m5UhpkQcG4p?)NQn>~}ysrvtF8^M6*dI7DDZx*AKnJJh z&Q|%5%gFvr1QW#m*<#J>2$C>bLl2n|H+s9eC{Zkk+I%|>!djY&S}~i7IQan!mC^YJ z{7`kud?KE<(L6UtgnsRIM8dap5A>&Mg0Weh-s4aCt?E0|h#>pY-qG_+W-sSW05yPk zM`SJ?^^hCc5RCR>@<=CdD=-34G27`H0ESPk8FCAFuT0pvT**-Y_y2D*yz;lfLx^1N zKL6UCujg6Vc&3+wjFJtogYAJEUZTEXSVO@8p$eSMlRSE4l(j3Y=B}kct^k4VX~IzD ztR9sy%3Ai+gw{=~g)`jxx22QL5~PX!i$lqiigl$Zst86F+Lqs^2n}3W6mth$Sy?Ao z2Rqx<VH@$zMmZA@T> z&0q31S}XGuItKw$5A83(p)wbFYWF9^{9fi*2#MZnl>ISTFua;9@%jYk&}R@TD8V zWzfMDF^@>ZNQ!c4bRBX828r-mQU2Z9UJ?eMw+(W(^{^biuwLm9r6$a?$7cWxiE&1G zdtyji+&1RQ7d$ua>-vVr8Vr?xADnmpe1DeJegnt8iMSGcswP360Q5r+w)#z5Z|mwt z{EYwUUG{9d)xskK=DkzFGs?7WztSVdH9SW?X{rc#+P2Y*>9MThsscDilhJj|Bocm&V#P2UQe)T2) zc>&DZx&^F~ltFuDWA>p}`_6R6RrnVphu7J`T&qY62H0Ij_$dIQ45`R73FqA+;SOMw zxAg_%T7?nl`S1VX{anypH=c{y>F*ewNP>7^OCxz{zufM+F7J+4eeA0U{HMTHys7us z+{GqA&Na30WMG@{Dlv1VmnD);a6cqU5A$@NLLHt!vb_8Q(5RDC6Sih?^ZNLzuD*C8 z9{L+I72N|$JJX9Bs$6Od&I!(PxK6?Zc+*0Pz65+>`q}&devm({jnLuC&{|NS+?2dt zhhX^VaCgU;_x#<_S-170ZlW%A*j?}!-QLfmd@Zbl4uYmIt0Ldhkk8xqq-E zkV|cZ^q@(j7i|f9Z{i@20$x5;a6t(`Z3wD^itc~9vEksLTRO(lGjXqRa{WAARCZNt zO2Gy_q-2-Tu(YS8bTlDh6AGv$$8IqbA58LQof1f9MjedJKR(U)<^dJ-D}zq5t6H!2 zwaKiXQ^$PKjrApuEGV8+mD}(Tn&p#Ef01(Z4M0}S9G{H|y80!;m@+o3wfph(~G3V4? z&NFKbn0h{!Pn~VA6if(T?#W%SMclbzt_eE$Wlm!lIM9y@Gf3tZIRxvVIB|w#LD-2V z#Ig3?dw(#Htv!L0GI-c-s+BVy%!NY=iC7*-)B0ngM$9FJ93DyE#E{7HD}aIBYaU2T z%H`Kn)j!(qpnd85mTvs%lE^!s%;nILE}PU62}Bw}xYCKjAl z+J0Ytxv{JI))^nuT1|W`u9FzO97hZr@jCuAtXVXFw!;n%ZsS-6ek%=T?$DK?k4Ev> zrY1-b=`0X|9ivrnQAa4bV3%8qRU-m_<|Qtiusc?QKMpB3N_lspOS0UkQQI4{@dsSqGD&FHR@b*P@TI-^Ar_NPjboVT+>X)MxEGe~{)=&&{l<$$<1*JO)*y5} zHTdLTo=(?;(!%Wgbr;P8uY7C=(}DBL)zTmsH9n=Dvb`F>a@QD1@fV=C?FZ;#nHZk_ zPrCICQUF#6_wSa$Fryw5{@Qkp#{*PQP(rLp+cXK@;RcC{nE~}rptz+#fyI=TEe{4bgTI(1C9#c3g|8< znwJ*5^~BeC80t~KIavhQbO<3!_2q(bzsg^`l&fHk+{+025f*8L2!d_7@ z*S$=B=S|rankaUI0c*V@y@|88%>R7`;L*k%ovay8QO3$Um!+IC;-j_WPHvnC&o2Hl z7GgH3j+#K}@FkLZvX}C|CuCU!O!S7P&>4iSm==z=yUCdKON5O6fuwq7i33z|gA|#4 z@OvZ^YsTKkuzD3yDKMZ_2Z$G`&MAc#1!+ngZ|U34?QeQfCY-L^oD4l4m~`rC7*dPY zd+Fu4qiCn^3(;=e?k&mL@D^wYfgK_hS}eLP zPfbPx-ZB6*+}@j(8pA;5EtmP@Wl`Sgv&<&mglC~e#81~Z)?DqcL7x-{y=W*X(Ji)O z=rJ9jingLy3gjg<-brEua~3X&K*|__q0&<1QhQr91mc07$@+)XX)K-|9Jfe=b~Y!u z&VOz2`uqxK$a}Mvt(Z74>7Ualz5)7_tMZ9<>Pt82%IhW*AH!p3=+5T$4PbSqL=<>x z2aTJ(A9?IbwMcEM^q04r(1#v7XcTrnPWL@}>qr4PM!Kug%);b_ znfK|rOQ&LL%a;@EfwHafrYLA#jzpJcCe}(GrN?+tGr?B2_LUHwEh*<`!Lj2vN+6vq zpD@rAVm+ z!+e}jGnYaR09_cK@-VU#2Ys4Idv~aJquSl6QbrxuXq8|sl!{+lkt|Rc?G25!nT0IN zgFh2QvZDj;k3F`lzCoTN7#uV}Wf#9T@VkSV+N&-Hg_ok>JRAj@HyHrosZy18^ED+2 ze6D8=&3FR6{d=p1Ya+udJHQP#lY3^;99F>x&rN{ zIhojsD<#cS8etnjpHv%|=hVQ%Ly2;k*8kDzZe}d5nMeOn8VTrI5xW){rb-MnvhAbw zpevevYWX~Aj*@qi%>&sd^7RXh4HO8F#^GfmG{}wOQe$ZPVr{m8UKoh>VcD_j17j?JOQA&SJKNslG zrnO}Yhv=$2Kyb`(pZFCa2DA;dHjZea#qacF0NQ3jFSGAmiCFb<2+CkJ7MEf{#U*E? z>M9pcNe0HY%Dr?9rp)hvCBnPjFg%Mn6$4Z}z_M$JeKoLCjGTHS8dR|aU16++8;oX- z%1Iy8xcL{r{%O0)4y8V#z`m)}jfWi{i~9(L*z+=Heyu@Z=a-jq?(XD~Q8E?GyOzW1 zuk^|_A8&KoW3Lj9J{adIMYDn#ns!M6y`$^q)q#ZH4<&aE4Q~H4h)6mjk%Ba+CcB|X z+EOTaa36sv{G%LHnWMhcpTxVxDG8c|6C<>AxCP1rfB8TW)uL}Avr*)sPW1I*bjfaLA=g)ip#~M27 zH2QEbS>GOi+UMB3)XNNgquuD?TnH`zRi{Y7VN^HO;>G<7L5Tm>rd!l2l3Ha44GE;A zQl#F=gBr9$>CmipbY-djxENmM z#v34C;r}dp;Xzqhl#ygf zpJ9G_NMJPzMKCn0)ob>MtlY)u0Qf)T-e!rxKCNp;&d-0Y0$#prOtpoVo?v9%eVcOe z&U|854+loKy**@5wh6#cQmL*#r$ComZ@JvevgbzAaxx) z)Lg|)q8qoQ`2;;Q{*Ap#|7KfWm?EQsrr)~8_nOXTwvLvkfy3^sv{eS|!BY79SB7hm zL>0gCQhnvBqX9yX1H+qvQ!+}sds@BB+Yzx`7MIV0T(urU5c^KhesZ3!!G{X+&c(oH zET7w5uO|}NoXLJ7c`mY$)iAfN<|T+Y7Te;AxXLb50lp3;snZNbY3x2>F<~VeToOy# zEP)SN0noBOXc;xeI~6aKZtfCI=(_QN4VF^B4Hx`gzHfoV27ey3OZ!N(-*9C4YR_F! z`s}G1KKRrT1dv9c{&I;52y?|XtSk>}cT!k1a23MIsPpK!4TNQ*F?N8t3$EN=)0$G{?z7p~A=8Ar`7B1)4xg4BhkxDYFHnnMWBf z&|>oa?VKSJB0^q>TQP%{KN+{zBT@tauxyyAL9M`zD`99GF}#sLI=KvCG;Qtx^`6-o z&^vT-Fc(cWWlNfwJbY`f++5i{v}a`#I=O@vz+s8>r+Tw8)LKA>wOZiAxipPLl?KW*NGB8l ztW>|EB9QBa`Y>m;65Fir558#9aU`|}_0h?HKwm18o!YTA8*A6saliSvSsrr}VC~X5 zqSAtGP0qtG+fGUDl7TlmN#bYHOn+J|mN9Kga^nZ5nz+h4oX)$J{7+dlFmI_}bS^#{ zSn;Qdw(7=K;!v3xORyP3LOry#`7EG7oDpx(*Q#IW&UnFyD#M71OT1pP;E>8@(^}Fh zBgEEnC&HwxA<)V`R}T1oMQ$Fr(?k!3l=-!>gHl25m7pEp?fR+jWWc3>+7@Q_MF=ja zuJ1Kbit^w3j>atOqvNx0G;R!lfMv%!*IblVshb_5{QrW})3okqk;p2Ktkf;km@o{CSqqa|MA1{Zx;cA^AeE-st z*m@44x|RLE;NkvXAQRMj-EAI#lYTzQ;@fg`SN7UK>by}zss;f|O6jKP4=>A|`0=M% zf`=ERSHDXgYu}Vx#dKxcdQ~?>Ld@SIZ|$#o%ZWt$gbuwt{z7LYkxd4N07<$7d+b#b z*Y?d+mgIzmr(cDUX9I@j5%{17(kgBahuSYkzq2d?5$l$be<$lc-%Z)LvJP^;j!B!O zezu&w9U!s6HS1kJK^EH0Mlx}tGk7gixxK zq1M%A7h#ah+_a#DwiHKR4kSlHrU#AXfxw96__GbcB)}xw^ zH@NGndfx5H&}C;qvungvMp}LJWV|5UHXfDiYTWp`?2=Lf*e;R8J;31?-n)Lk1ie&P zWP)(6&y%HI0lXAnA!L0K6n*0AVf)>=c~&vhyO@BFxtpf$F)PXj8}iKNI~Zh^Ic&sUw(o z3Dc=r6n6@iW3e=>jw4Pd@j24`p2qOa)vZGE6xu}*&eFwO@B~uTn-%GLN-bvp>jD2t z61_3&*+_VO3^MA~O;l9} za3%k)>oK(Z5rUt6oZ}>5v|Q**+&o6fqf+3(RW)I9*nUaG#(%hEeq7@n^eOBqHBmvYUKNBtqvxi; zX;qQOnCA8E9jF*Bqn1fFr9D%{6czO*}v+Z6OYfr zRc%ML6UedJO=yEk!W9rAQZyZY-pK)f9X))L91Klf5c!{W&`7`1UQr9G;2k3U&+OMF zP(QPN(*ySPA2gnT*x|a*uMv-n_C%t>YdGV>dz#n$S73xaQz5I>%HlA9hNT`fDduQo2Qx&ejI zG-Lc?gBe3WdkDwjOJ1~O+z$e0Pp`OCY*b)PbOr(&`p*%&9m_r;pE8H{`qlZ9TTBZl z8d|R$*CLG7%pM~*rN6hd3Rac)@klZxe?2n%Y^iYS-*~07+2$tr)_2`zFuvf`*6jpT zrq5**E<}KT)%$!v*&$*`#^T{jktE+RX9O|^9D5&q)8l!m6{&!bILhBES0lFlX3&Kv zG*$t?i}{m8M(@hQe>Lynahq~5t!_UDlF2Q003IVtTFT;&5?Z0RU}b?iebOougF+Z+x9ClV`fa*lE+;j`5mlOmOnkcTsE2N(4+oAgC8vg!=Bn!92~# z|DseUCEzFsAyCmzQhNgm`_?STw0IR%MbdD)fbpA2Kh$A0GGJ*FJupTR&V(QGmEWXt zhd;VMM2V;8qQ#Rx)G4vUs*X!8gzh z5S$YD9aN(|fa4dS{LkC$8yj+mXakPV@!mD-%gM8?nF3_Rzf)3&Q%RX7BUfrVNaNe` z;-?KsBA}4=wnWwt)6(iSzKDMAqT6U3z;H-zXg+`7WT-tq`|!=>0i;W4S4`n$q|xOg z{=z%9y)fWs4{1^6f~A`%3lFPe@7T;bK-3E8K;YXhZ{cDc6ddalWEsKkLBd<58!tp8 zq&S$5&YPt(A49L_tNVLz{0MPUh!-`Bj{SYFR=I!6UQ2;@9u>TB-5t)d}4n*Weebao{(??*{mM_ma$Xiqo>H%6? zAicuEQgBoMjE4t5>yj8;l{{Ukj9P?RZ;9Zfztj zP4K}-WNF5%QPD{K1=SFoI8pRl(91m2Bxh^ zO#u;K&#d{OEE73JwSa;2TiNyPnJAQM{uAJJ*S8=}40| z`c^&#&dvO+OHdazaIAN_k z<~^;pLBB2_0>+9IxCWPy3rl_DJ6(=PTEu6l(J^BNQy94dF49d-9w0|P^%!)i^;cy3 z{8Kf21NS@CJqsb4Nu-`FHvP3Lku5_7XT*cjhObY-)H&Ux6J%B~A-xS($K#Z(^lhBk z3^>Ni>jbmzaC0Pn1RMp3j8kXcz~d-iMoXiEr%|ZW<+gAlCoL3c3aBo=0?n9a+y4i> zACS@wee+k@ggF7;V@ahggEMB71soYKb*h!H{T$I?(=HCN&xD>C^4;`*Jyd-!;O%@3 z4;RP2V8Gaj#|G;iVVrnt&2dD)?qZ%9afL)5+wbH&O*EaNrcTa2Nf#Hu+nOr%B}rM^ zFJC~=w_@<5CjS0Fk4Yff1copw!;A4RXXuN9|Fc{43l#;O=FM;1P6B59QrkMjR1=0= z@Wp6QDP7sb-w+^^+^X#celvmj3cT#0Z;nkIKi;R@fgh*BO_@&In)^t~xlN-SmhMmw z3WZaN*@fOnPoe;dFR`gK(aqSdLGuXQ6Hpy$W`q=SaD37v7|(o)4DmQSdPB9kLATMw znlUj7^(DsRh&e9Bbf&P0BK7(1E1v9NZ{?Kb6Z6|*JHXl0P6`o?hL+=a zI60PP1@B;o^P9eVlGxV!4>kNH)IxKI^V|MBy3HFbI(N3@q%BU(@EVPlMWN1m#sDoj zS&->fH2&fZeE2DkkrN6Idb|EVo&lG==ZE-&^AR9-LdAmr0Sw#12?L{@sGs>sI)?@$ zNUmK4M3iWU!i|h!KZ?14=P!Jbc~g(H-hT`+Fg85T)Ds8%gaviXjCa%Px^Nx(1oaiwLxaKw^H9!WoUnv6J)1VS)}hcmHwx^lr=_ z2J4sT(-7e9t6d;WaZ|D&B#~eO<4|eHB#1NrV>xNm>D}dTt>lVJSFI3uWUZAN=P+5b z9uq63Re|SR>L(4(t`6b;9TRhu7|quPb#N_i_Vak7P5udp_5ftP$AXvDiDw$s+f=2E zi$oQYAO8TpE87vO1&lin<<)`(UggKC9CU9*K3jl2&Tit#@iF6LW$f{Ovl>hDggs2y z3;^6lvlhaY5v-;Q?twZMVlQ?E_HaS z`-N8p(paVJVGtuKY+!-f_nQ*Q0__n}0kDim5qG-9CkU$h=c_ z`Cp7x`W7Y$zC#lS3TJZ_aXJc!>E*fFd!Tj=Du2z@dK{*KDP3|r1a|8 zXk)Q@wvB%wf?h}Li0e(54;66}(rSu2I@`3T{$5s>pGw+WB%>X@%C!4egtT+y!5BU^ z2WutOiyQIq8UC$^W3{ys%nr=;mR23H(PE)0Z?3J}QqUh>*`x>Z>doOSXtD3Px7Zrb zzs?z!B6f4i*z!D(udmWN_bqa4^zzae+B5xTE}!YI2G-l}BUuvezL`M-Kl}Wu^~pYi zq-IoBiE9ox%-0WRsO^D!dSWO{*I>ooIm{4)pu5QPhj_(Cvl@_f68VrYqA%4;0f~Qg z`%U2SqPoKgn#>CbC}C^)mSNp6z$-5B6TY-{wb5F~DVQl};qT@DBpqY;2an&n$NKuzw*)KC;>SB=~$<#T&<%*2L68+Y*8<& z#;2aAk}AeMgADG0%mI~rZF=Aj$U?A=;mDsnnZk}lN{8SPYFxVZXx45k8CbOM0)Yzt zPX7LF5HiODKn94wy>9-(qmlRZL?ft+k-5J5&DlX`-0Es<>O0RHZ&q8JN}_dKLX-$; z=EP$fQiMx2pjgN9%Q(R09z=q^4ggpz>O+41brX#jbVw8%qflaYkUP z&`MoDg$eBM^S#w@2LE;;RDk%dX7JX8zI1<{>OwLo5`dTIFZ}9k%8%&~oPoyznlqz- zLy(H3FP);8OT&s{V#x`#!cS%#L-h7*$k_i#)SZ$N7RJ%2WrR{G?cl^`v~KnA+l3qP#y1uaUi6=GL(k zTv9Rye-POpate&{4C6_t;mbuA{nWd<9gAZS`a-#$keYIgim+Lkjb%%-@+uRHInhf6VGFEm>nscOf{ZyX8#Ln$hfweSSQ>x>l;WOItcHA>2wX|K<06d+Af z{8D9KRuVYPuH3Kd7&YnQsKr&lZ@?=sH( zCEb4k>A*5r_O#1Tj&BJ_{Kn^BgV;p?@)+V#bGbq0ewRG6Q`MXKd_CTG;nYuu(}yPU zO$OV*^PeFV3qMh!fkcsy@EaQ`wx#d5P5yd1YNaWX+yGbY+kJkf`c-26XP{OE(8w%8 zOv%tS0%=!2*(0!`%L2V$Sa#nfORjYk%Y;zNFza909jp^5ekG2=%lw9xb<}04gu%yI z#uyO4m7aE%EzN6X0hl5wNx-aUi?}#Z2F2yDiFOQFqp0g|z6{hV z&ovCtt7 zk3w+^M`px&If~pC5pD!vVMw(vtDBV;QMLR5Go5I*_BCJ|=snant6Z}2hWrpv6h%21 zTU`#i&2NfGuP(leNjsgRxqWA;|GYgh_uQNrAu70hn)@&@P)pmF6)1vhstIxclR$g? z*pW8j=Yn)J99hGffHG2l^ctltO zC_}^)v9yLSq&;UwPy9X^vOha*N;1wUTjMA0?4~>5V*5nEB8|D95Y?L+ks@r$!`Ho` z=TnH_@@)-srg_SO~WnF)s1Ov99+mSeybgvCsUAqyOiEN#%(SvBBu+S7C>T^ zGgyY-Gaw}*4<{uyE8#~rGi?I5(Y3Gs$M^(IeF;CgM_HLEa-xwv{-&7Ip^1kxprDRd zKDT}GTAP%cz&PVAJGYn_DHG^)1)j97UY*?h2gFP%`^3Scq|S31hcYsB~%r_bcUyyIyyTN_w1^|NKmPNeVPEnJBhW+gHXr!9R z!y1nRe4i%7O@A{cCB|xENCN0_gW0NT*>K7(A8Y~Cok)4(+>1wJTeq@|SLKLex6y)F zZ4L(-d>g!n4wFPT{p)|`QWAeRy1Ty3Xbas}bot-JnEVg#AvEMB{AF}O+;+Nglm z>^3FJ@zqz)6J$t3NE&g3ZA)i{Qf%ow*@l0`k>?QXqyw^e1*zW^0-^dZNxz2}Xtc^~ z!A(?A+|L}xECEOvlXmwxzc|!+h=?Zl7DNL~?gVZo>VuFnT1+j7$&VgiB|$BQ&1fkk z)b)joF+8p92FZOV2(bQ)*UDM3-QUZkYVl|S5rzSd*h8VgFb;R&!mTRp^Oh{Z-qkx; zHN%$1BQk=9qCXi0c6wznujIQYlWSO<8lUCpkhn}!kR9VqthoG zcO!D)-_4qY_e(^=kB7}=#XS}W^c+{AdKgQC&flG1C7sKdl&Z+++X8(c#qvo^%TVTG zcds5uxZp@SdBvc|pa}wUiHG_YLs{OzAQ#5}h(170*x&G(%S;5V=mlr@m1Vkrpm@aS$D|sQN$q z;}ThhVnfgh#n-Otk9hm-vamXo`6Yp#XC7fub1IX`u5Z7ldON!>zZssbZO-0_{#Doz z{&pIk(|u^s(tHrM$kRfFq-YDf=wW?&^Uu|CC}us3>}9doFH^|v>$o&y2EXdEcA&8b zXbnp0S6NaNAFhcn0%WJ*m# ztVAol6=fsD3>?+com|`V*Pbq#>TLbUNCO4mbi;B<|8{N>GOAeh&^Hu9G=J(N{H+O* z*N$zp2i+FWI938eplX4&az{TR@~yVp4-OhG!z#qo>mHJ=EV+BMXVN_X+tEGyc{-4& z(>B$2SDsuzD4HJ2B8{HI%ZFT)a3C;i{cmA`7C|*Z`y2Js7j63|xGF;Rgg%zJ*pPNt zwP-wQ`+MLP??9k{OY{1Bp?Tu+&xLF|7$ZHF9*$7kNI^>YsP1h=n>-bUbV(>rVPE8R30__?3Im^%XToMoXXhb4B?mF7G4wIrmv6IQT~Mn z*d=tofo(z=qL$;=ozbDUDI;5?MQcbP%TnUJhO^BHVrvWYer|niP6W!`Q`Hb-?H1#S zSge*z>02$=CQO1xxwW`YCEP7%k$m+ebSy zJst*W2Xb&Rp@X5?#uYLsQG5pnGQRK&KjqGH3;fOTi)ykY&3JOLNTmiGf+gPNLy0bo zMk&R4BeG8<1a5>QzfoaGlaoGS=XW>fT|!M!CT@g|Z^0$zWyS|Y9q^Xa7^p&vZ?e{x9fzFF;RTJ|< z=6zx`2VkopL4WAP6`0QV%jPz0e*M>tQVJ!C7nUxyoa3s)HM`Q8`Pun&J#OM9O7m0~ zUl_}IgkPorL)u=jH^7V>;n#9+3CwnZhUJ1*hy@y=IrO~XO834by1;x$f;k-Cfht~r z@bqo@%KJq(VLx_$IJg0*U3>oCEThwBE+&L`4zvn;sLKMLA@;RgWF>+I+3Z?b{(AjO zx{EP_DF)=i0jQ~MxCY7P^n}}CDMVl?G z?tJM&Qcj?_wF8aT=jg+-m}4oi-yTn4j($%Gf1n`{HTI}ttM}6#b&d-UD$Gni>3bv^ zl-wVT{}qC%!)=Ejk&E@WbBB;prA(NHp{(bm5AKRgS8-_n@5>bQ{@>0K*J=aSN!ahZ zZ<+$JudSuVFCv?;&wh`lt@xeurz5pNfGxP|WqCVJeLdua&&J8!K|Z>58`jzC&m1#& z7ap`jn~+0egKRzMF^U)!hpohWorMURRE;TcqucApctV@AP*BdlZS4W6IFz`F*rjZqp4w3 zq&HZ<-M%Z^D&YB^W-jm|G+GuERuJ`c^mlT(Y3MV?B?s zkm-d;D1_z@o3Pg26{SvhE)1EkXJ#X8o?|m7?4s19%WNa0Cx5d?MAC!g=YsN4MV))xAULZ9d-o zT(9oB{6}MQazf9`EM2HxQ&GSEAN@$v0QocD?6CZkTNqc0*K(0B@(3sm0R=Yy(!?e4 zqac7soI3Uk-+6BF|EZPi5ST zLR*qUocH=ab3=B*mvgTE@4t`yp&5p5>#Jt`F{*v};HLxHMY}NKNp+1Lv_ja~x_tkn zOvN$4O{R5LuAS|XS)I06k0{VI>(#_JUf?>bC9JQ;u9P-NwzRwVg8xsI_!QCxDpZxcZ?jD0j9-t^r?Y-9b&3Uflm5KGW=BqKD zbhMIY)~Yzu51Q_K&82E0O~PPNT43PDwtY^SG0MCC$X)}WJoTQD4Lua{@7xMq$EIQS zso{qd(K3qBJfn$w^j>tr7IYnSqES#q9Td}6ID-E9M(upxXO9u=LDFjs7oK~CwcBUv z-NVd7_a$krIe^e0N1ZU2a0MmBw|PV8eE*=mshzpZ)(?oA==MUGkFew>D2DtIv+JY`(t=gMziG^EtMHWworV8`jF!*oWs6X_oOs&4cvm8u7gF%qdo%vvSFko zx}jH{zkxi!phV#pawF?`~7Mdc4wZF#2V)_c+mO`S=fNlC5#IvE+^)h&P zF!Et`l%u6EX7aL#`J`z*$>R;y4v1j*>kBg6(Xl^oZ2h!Zk;uY#9d$N3$b6HWLK4o( z44|Z|$C9fndGVlAxWW3@5ISlxGM1`A_)sT%ZB{lb<9w$X>pfyG&NhJgb92Oaa+GM+ z6uX|v?oxbp7cbSpCjs6S1^lB-)O@rT#w;1#nZZuQ%+_n5Ky(V7n7Ph)qMt5$p zFQnS1a-XI)>9uK>%$)tiqf1tAPOZMm=1u)S1lgCFZO&iM!2R@YM&Z-IUt`YK=IWK5`=Vvj zT0e#OdW{wcWL?ar*)V92#KtMNy6@=TO!cSF z`bO^NDMGm4CZx6T11Htc0+8N?2oycaB&^{D#E9(i9I-J_?{;`>kX?UURns^4Z8>z% z*TbdY#g{);EI+y;n@AlCc+_vWLrQ35ipOH(ZwG*Z4>r@KkCMDog@q%TKug#Va}m!V z(pIHqW&aM_T$o;-zc;r|&4kwW#mB|7y~AI_OOsff;db~Ov4w|_bw(W^>Bdaoe1JGcbabb!i+vksz_&@eEeBx$MSK}mwP%v1C66=p##g<*tUetXK;RCMaXDgj)hb01HiYoeJ_>=l zC*+r}HGiC1Wa)FhD`liz5cqGhR5eyZD+u$ml%zxpH{%VElQg^erK_4S!8P?y0(heG zz_X!l`wacsRB_?Xj6L?t2pjg?Q-MAO7dai@D#0Xc5IuvHBB7R334rLy#Ez$+zHGiK zm*`e6cs24O7l-X&h-a5>3_En+N~6i}Kf_mPasVi-?DDtElB6gvqv2%6zyXiT63+Rg z+(xM1QYHf93vFP&&s$d#IsiFn9W0Yn0rdV1;NXhwS6Cr~eC|~8SA8RFUiRBAsSiZE zm072+Y>VNsDggwU3AXX-HL&Y17;kF&oEUa4YYEUDKB1e5(ym3>Lrz|nFC*4M4r=n=Y8UDd4}_x9V_+?}qE?aue}>h437m8Apnnj5>WYMn*01 z+JWXvo-Z4glwn8WFp{=j`KxZl*w)1)%wn{b4WWqu6cKlU}*6mq#x%^m*Er^-r^1HX}Ua@l(()Ck? z@6iUv2V`AB&~*B<{6T2{`}S8{V>I58OxcJ4a)y)!xo2}K>MO*}8#~*EiX;G&qnOzo zhOwI?L=FjzDL<2-gkE)&7cRJw?;AP3Vqe*_i3*x_c!AK8ojNl9HYK0$zBU;+gdjvU zkOP8OU{Pmj{9t&!>u}^^Bk_`Z<`72Pscl6;uT@*JSpn+jLOg4H2!1OQRO;_DcKSvQ zKo%BPY~WvuJ0B7V{=V=|88GzD{qkzHPZUbZW0BHGSjhVMbz9*3H0${$LyC!+=x3P( zDZlnK7XJ4cvyJ2wEs_kY^YMBq+ygwn%3(XDuWnr>*J?MZ+AXP zJqp)J8+Fxbd(OW(AakQh^Q{G^Tnr@7YH`GVIg}KGJ)H%%SqLJNOvc{Lp+ z$IYs*du8&j7nSMKBe0?~e7i@CoemE`1dnyobm|ZD5%%W3YA!A6Pd~AU?TsZw2hC=X zu)7|ZI#*KpfPX#Na?D$Sl1MSrV-mC3Rk9pY*9wf~p~EI9Wap5Zm_%9i%Rb=pi+y?D zpu1n?Ci|cfKnJ{VGWuV7Miu`M&a4=uwB9^wY~-Q4dWS8YeI()Z@=LzI4a6;Sz*R}R z1Wq^wKKI+wMkMEI-@_`#gPv>pm1~I|IznevPtP9Ohf8rs)ch>i58E~B1v@OR4I6b* z^~ViNZdOW$aMT|&$jk^3zoIO4hcQmoUroszHS2cRN3cmT`&!2c7=CEhB9GIcb+$y} zmWLJ^DNUH3DwlTPMibeB7NVdQG2jOH;61lULkIj2DzA{X{@_ZFW=a85%)~!++NY_G z#n_)PpKn)V*{X(Me?ldZ%AEARwbRRff4nK;6id+$`cl)qF;u(UF-%Q6(4e9y+CmF@ zm3QyU?S-zOz2n2g(7rPo{N|9omOn z#_^8mJF;7=^qB`kW;#Wm16(57j%rmL-T$W9AgzUG;FHj!Ss8rtU<2SJ*y`!K_Y6!Z zpW#=s+_unr?CC#WTJ&nVwGZ4<^T^1;XAYv{csQ_LLPP=~Bnr1i&Ms@JM%^pxjViy; zQIfNV&fywdTRgv7V*R;6;BhI%TS5}Mxwto#9FCq8MWB47FS=Hce?nswY(h85!7x(~ z4&8>P^-hbunj|k??x&uqfFs|^a%`C=I9C;bjdQ^!U3NuwD{t>_zl#L7jx{d1X*S6SIb`w^9 zXE$}%D!n6h*ARu}O~dGmP#f~kIA`Pc@1GbqE>iQl@c+U>$B#3>odN8ZN+<8r1Bcw; zox$zHGq?WSYb<3Nb#d(A9aFt1mCgrZmJvLn2-_+Ct<8s-}y%T$@ z1uW~(yh5`>m`L?VME>b_2|khGRqW?pNHn}z7pTCIXq$fzNVyQl33}%T&6ds=bre~A z+pwReFz=P44+D>=TMy?5jojJW-oC{fE4SU^y4#Q0_R>yJ>tcm zeJ#=yNyCBEO!Yi=R^Lc3O^htA)%A46AAZF`bUL&*B3e42{AR~N3wVz029e$n6kQOmn@$wPWF^*d;#fheMS0eqUo&ab^_hJY_sQ;`@UBcXQt#rCz0A`e5 zj)zq$IItZZvxgfxKrnn|CX_ZDxPoi$nTQ~pkXlIDRP(&`cxQxf%?%hj08ogk7KThI zMI>iVziJ_;^YuLyIET9Rgm(A2AN6!1{-oL|3Ln#ium8!G9QryxTktX#*t$No@vrhN zWt~Mp+J}f0l7agc`{^V1(Z!O zjK6hK?<_Q@?Lh~=u!6T<^uq19?LgMNS+7OseN5i*6Iu#$S@El_dy{B)viUqywAUsc zO8)pC_cOOa>czQ$*pEj#Zkl7))|$UxY6Z$LOop?EPQhlxlf*iNh2E#HU2iuNRv{UF z3@yuHgkLN~_{9mE^?mcv?|d=dzXQ-Wii7!~98Bi10iZp%SH1VVz8USmqL2pL&IBi# ze~Z*s{+Q(8&JLR<2_%52X(K<}#@+%~fzsuCXV!1e&weh7sli{egvMY0K_6G6399_V zTN(NkXW*v#`l+2^{+ADCdc|o5CO|+W{s2@9KWz{q&RlRktf44**L0;|HXA2FBZ618KED zQj837B}o%Jac&q=2#!7XN!=$eaqQHp&7;nS`Y4el@LGQv=|FC({DCV}Glfp%_Y?p6 zad6UUn4_ftxnml$Ew4lHPzFP-Tb5i0>z&3Fqbe}$pM10#GKG;Q1x82!L!w3?|6y2l zYEm#C9Cgn%n|d2;rp9w}?#u(xcP!Sx$Ror0fNGXX4m5*gcSBvJ#@NN909-zemU<5? zluq04Gt_iFEbCLNVqIunh$i(}$V+G4>H6;I(_dv~z`DItCoB3DCrk=a<3m3~$4suSVI;h zl6pj{JVd{)FK^4!A(DkVitemeO&wrN1)QUEAt4E(8s zMz>BFX=XF=V!wRdXCdQ2`rF)73~90TrGQotg9Y{LXOULKe|5-gDiLA`TEX*phZYwX zqOZ$UM{P7l9xI>RMp>I+85C+9r?<1K(XwnoGNzT)*V3>+`vNrSYm05^#SXOEvLW<-}5lQcXvlN zJ3n$LfIlil<^>&goKR?w_n)wIU4dA#QJ%7KGKwlW&`=@hK!ry6; z>RjU@aTdzXcysV@D$96ta|l+FB&3)1>iFhpi<#_OB3dO^lK{+6&7}Eb5Q?AU1F$ha zk14aE;Pp_&{&aRx21k{IU`x%>yv>t$vr^<%(+DGQCxoQGB zw$}M_e*=gaZB^6Rn!aEEMPh3QMhE4eEypZ<#Xr^|1C>|;eYcdXr__Bf1#Ud`9u~|M zs@ty_e3+FeR8KC^RH<}*5m;rs;svpy=f~6(+aCid04xDlFwiQ_vyz^-iYZVJ+l_+_ zV1C?=qhK8_)BcX-mps31aXk4k?8_Gd8qOp(aacM0ONjB`V)c+WbT5Cf72~>JzPBy?b z6On?-tA2q1>Fqg@;Ux9O;v}`Y7Rr~u0W_yR#EqZ%u0F&?Y-95LAj-_@>|44q?y@9e zDEWlLJB;b|G4oA&G10(Chf9kk)%0BCRoDb7u5k1ENWto|2)?)U8i2M`wtw(Br?Tv# ztM#it$Gw?*={`zl3XC9s<=h)~w%+8$^GL$s7Q#m_q0~$SP8yZxQf)>#7`^+kj{s9+ z=Y&4oQmjNHE*71KlM~$7s(*;;ujhijO4s(auafg;w(04l zmV=$ z{)&XC@QLMHD|2wee@tdu-+Il8($>f8P@8RdxX<1I^X1e_5pPeO83nWP{<^ZKD=V$I z-DLL~VE09zbl=(BrH98VrbGh52qUB8upj>{g^c&($)1_`UZUbSp(rt@Ff^>wPG#$V z4F|^gA>=x0`c)T}wRGD$fq zPlOGu%R!o`4Q4F|XJG$aTq9qH$h#rBN$S-yQ>K0S=Lw4H!NMCl`(m}@Ccp2-V!cfr zUJim9HSw`QF>iuXkOoCYrVIy;(@Yy+jw1jY)$-`o+wCbMfe;cT;#kZ6ZekqtB{9vc zY}J`R1sVR4$q#dTx2r5_W?i5#2l7Cnla zazv!%)Et;o{pCKX^PY{a8CK-avm7~C#!4nNa`+p=>)M0|CEwR9SWH-;en7Eq$e<}8 zUuiH3tbtXYfRklA+*IR7GXiI}g=L0Oc;rnbw97Q8;C4QA2u|Fhc7bWu`x4pu6oDZO zGja$wGTH*_rV2k@dSvbh(q%&^F7N(zFn042)w~Gzhu^V2g&FRuc zR*R5~3TPDOl$9-TKa0pzvc3uT_E|wVf4tZ~yw7Xh+ydwzW%~<17jj0MI3{C1_@c-` z!r>)AKSTL3ig4VD1V(H zX21W9DXdPt2}07Q5)vxTtS$mM?G=`r00wO*Mm=J)g=f4Wm1&8j&EpiLx7RDd%ymt=N1-FwBx@)z#j+amojFhWcQY2ZLl(E;cVtiG z0B8uJEq(QrNz0;H{m`+ft@YcO&9k|f+TZN*VueLa#ezXu6xCe(b&ND&Z3tUn8?y-K zI@;LJWB8#{iu{Ka#7IViIQtk}?sgD`uHdSYn7k<@9LAIfd#+*v+dwP;GA}M-{-iuL zg^N^M{Z$51t58lO9iMj!4@Cya#T%`2hW?+Lj=)`CD3+~=b$%QouAPBuNY>DVo0w);S!xa1 z9e31(#^4hs6lR{y*c!pA^$#l~1y+1ogB@64R|AC!_F%H_Q-4ISVg8M1eHLZ&XI{EB zFL0|DW#8ZPsviVxlvDne~$LKzR>bCV}GCP_1*EKkfb$R2c^R|O=H_P z=JscN!uZw<1VQ7dA#xccyU;#9KGU6fj~wSC8`~7nHoWv=xv_XFAwCdiCnezsz4DCD z@~Tj~Gr~zJyU#2)P69L0Nv>O!8ksW_Mld+zI5uQuT6RmT4VizSw(F8D=C8|z)y zsW&nGK)q|21yrPQO!wED@H)CJx|hkED?U}-F!U5}_&jQs-L1ECiD!?)tH16G#)Bn^ z@$9Dk^_WE{g^Y<`$&p`-lXYXp-uYc>j3WYE(e!$_UW7Qg0SI^+gXYPAeq|)d-EZgH z_~3E_`AC+rgCAGRIfdfHUK+ywhSQY zt5%FOH7Sd0>AgpMO~OTaqIvlDJ^~7ov>VgCd4bW&Jr*G7y-$bYdf@I*j_VdP4}(14 zm*e)wsYsaz)6#IVA{Q~4oUUY-5hJk?nDWP6XH|a2O4%NR8NX8c4xbKZK+e^UouWZY ze9v!P4jo4AMM)tD%h@J<`6}SS%R>ir7^&S!s#5SHsh1@YfcIPJ13-JCd)2kW8GmJd z)>x`8-}u^TcL5x8HTHi*m8TzZ$=vX&_ zwIIo)U^y3-3BH{Rd8#h3vu5E{2P*#AfP^G=632KL!|S&bC8G6##z07iew6s1b@cgk z8NC4(6;lDpcblBVsv2f~<1kVMRnD#3-!MnN>q~X0jW{?%&8qlaxrf%F3F>Ol@n*3# z4QkQK;QG+MTCDm-^8!SJnD^>fM3i;^Okds?rsAQI{{^tt0MIgDR$UAVD`RFPFVBR;3D%k4fUuwy=LceaXo`hFHYvBIZO{#^Scq#9UA(?HO~5&{aaZ2 z45B788rCCoP?GJ{duJO=e>df3%${Lp;g0;P$>y)D6x0wsCP;wQIZKyPmNk-hepr`M z$%#8bI$)U*)2fb0C>}5VwkgV&34*HVm0pj>{<3s=3L}rocsKdnbtO{_HK`T zIQ>Y^1&P<7J5TiQo@@02W?s%exZ{|4Qclu8dH)`o? zHXvBULHflyTnIMm?>8T1!fbsfgXaw{T0Utig+T%JJ2~@IUO&N_{sCo!UTX_X#bX6D z4vZ>QBbJuj<$a~@&`0LpI^5>ggRiVHZg1n3Jiam&) z)>fW~5lEQuc&)?%AN}IVbk@_ya+JL2ylyzuSdJc34@+^SZ&#+_3YYZv z8sDDuEEqkjkg936VjVZP6Pc*NrvEo_pJLcBYeRhz%Bj9B`$;>uzUR7G!_4Ahs)Wk7 zwxGKU1U5W5x|QO-dGkMgNF1`L-Q$zwyqL%IgWVSaaqETu8wdpU7A2J%P`Uj}PdhCXGYubaT4UB^FGGFZhJp}+dLHQJiwjY|D zJK7sPbUGOe(Ep}&j*Sg;0`BkJRWfXt;trCUg~@SFoS^t{M-7uRs~r<7gN!Tc*U@z= zD*1+EfL?8N)ieEhWz~Ca8YQr_67rOm+M&IKo08zJW_!rn?aKYZCrW;Aul!{wa*Yu&YHslHml|1%b0B7Qwr8q6{e^>~0_@IQPeOUN^3K zs%!7I3Gpvdt~S(4Xd;PF#8G_TRC8HUyW*S5#5Kz*Vy}i572svt#m#{6a^@978DY|& zW6uwTEP%@EAO3mri~kF$H_XkhhTgmCe9LvVLgDerxT@hGsO<;PFFajs-OIt+oxoq# z$Fg(i=(VRSa5`CRr*JYtBsuzp0fqWwNfc0J0(79na(g}l7X|x&?Hm4I8LFLr7M4|) zdj^mrnDI3ks02z6y}V6m7;yvF2<0)z_FC;K$L;Rs{S5-ogHfSs3R?EA;kGJvvKmgt zJFV#(3!ltcDytlplR|vDc5<)qhq?MC($5eP|KS=A=!HIE#p& z>3&nGG9m7rKZE$_07UGfa(8qf4X|sLpfjv-lUxk1H}IE&!KGB{8MebSy^a|SjF>{| zrXY)v0@i8NeJgFbm?&?z1@^pXgQc(1?izPR*#mkfx4V$rpnr2?(4jvz*%1ehchjonwA#f)$s{3|$fI#z2^hig+=SLI( zNSqW88q)9$03qtz`*b8;iFjbHV~=WC5hF?zL>>Iy3dXYJ_aGKY(F}iEAAvR^IP{ z-nUTy>{6*2(QgLrhfFOEDD@S?t!eK{_oS0VWBZt8g0jxY9O+KWI()>KwZ;Q!z{#_^ z;~6Ya^0S_~w-lIu%~Fg}<+z$y3YYNHJnr(PJA59j^uCgXD_=-U7yr*h_DinZ=;arl z8n3bFSqw_}r(aC2;W8nuQVgnZ>{_Ys$C~XQC}*$jsRG^B3)9_QkCxM9<$94B5us*kW9`kdO=)wywM;aOmb_ z-^d-FS;9L}*U2xf1g5BjmerInbV32*E!Ba_BE4k`V1@5bY;eT4tRVak=D`~c^}$dW zbaFiPY?zMf-Ck#|P&^YYX00bUhV@;Zx_}5pTE1CArBbDXAbP=KkR2^ZD^XJx4G#@V z+hF|XvC~E)?wc+?KTN|xd*?8XRmD%GU8bVN$CFw{-`3o5-0I`)x*UZGEzmjK+XxmS zD!4dpr(@1TrdXM$ly~jECe4;oB*)P$&7@;uyw)Spu}%7XGQt6Rb}!~~2%G2|exeb$ z!lwr)&H{IE5nlmbm2+3*C3z5>eUfav{SL4d|4Bgb)Bj zj|BYE6r(clQ<%?=nAGQ{~!OD-aB^5u&moQ>i)gCXJQFaJ1B%vPz=cABM05<24R74j!N z`~?0z6YX-N$c@xmCrf+F$Is_erX2e6{WY6Cxv_o>xF`M0yFqS*_H`PYzPwuxjK--H zre;3nv@f`@qs-ZzAgB7=BkW!VMI@P-j<=7Ahe>K!#%>;lKdfQ&#~wXs(hn(iqyQHd zd#1N*2_6#E3?48-Y~p*}hHQTc7~KP0KyjCPK{mgWXGh)wwwZqEgp62<(Hb% znA}5%nn^Gi8{;6LR;|XH^D<`DC7+bdB)AZ5imx(ptR|sl?+B#YTz~w0rr2%u>+Kqp zl0b6ycs?y(op+LI3+GU1ovM6A8|PNdC)pI0-~wPpTwixq4^@N;+P>cD-8LF_cBkeN z_|D4KA1HhH`mCjT8h!v%)1_YJP;k;=LtyQ8TCq}~rA(M6(*P>i7oSU`1&wXDs%

#C%~yKT?{pj+Wg`SDwW8@I45q69Czj(VmIPU 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ý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%0A4*Yl)cT7664i|Z3u{o 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%0Ayn2%7&NEkBK(yAi#} z)kAN~@2vMMY}Ijp_97x{KKgekek9d5duqKeESG1dHd{oW0aK!D?sTHsZ@b^KR$^;> z{I?vE7IQkppmQ7jU#^Z*IkL&4)bwE^VW)QitSjn;6;n1A&~QHcKm7cvKQg|#u=t-n z+DTL7diL2Th3;26Oym^l0Tpd25pz9tb;EfV>eB zj}MySW`Tj2b!NP)@d?KI2Ib}1LEG&K+Nq=%3m9B<0|(EJkeL$HRb=UbGCPpMKK6#= zD@HQUeu;0R>5uy62>`>}U;!Zw{a>jR7rxxwx02h-t&e9rGRa^1-S4Sohg&C-d^4?h z`h$XtO7N(b*o0*fRs$JD_MCzO1Sh{+erI0M?(i;GDPz2Hwd)Agddv+T!Qe$&5uBt{ zm)2p8Mfu~{4t^H#i-HXr|9=!7FKPuq;Vnd)4*IBzODF39Vxq37+>Gw91l{I*rtAzl z+eU!GHUIOc$#n&vMbna$P|R4XWI83+DcouSo&1EVak5W0JSHUp>3^BAB{SFG>-0JQ zGGl!&??%k{-}u)1$L%56^gL!d_p;g_6C3o*0i$UD2Y%u*JmkLzJSG0y*hc{~8hbJD zOli8(}Yn=iY^&EUc1UGVn)YBm*@BcqJRxJ!hHJS$YNvo?xxUv z`q)Zo_oxW!+`rsAR6XFiagrmAN6Ws)(&C3s%r>VZhDX*C^#Rb~<6 zbwBeb_OFp9v&(vgmUXgCtlR_1g-(iqWa z?3yg${ox8lCVCx}Y4NXXk(}AjGwu25>0&x_8 zUC>Q05lUb*9dRu4cIDH#719E7VTOniCx-T~fMuw$8Khjqq zVkYDn(QD`w@1bNFIo+Xyjx02>pDyoGp?pwf4VEmzrh>jWXuEun0WJ@}KU#EM1&y8D zin>3NkjzL@G5T4dB(9A4*KyJ};^h6#rf)UwUKN;7fpVc)GNF z@3tNpB1KbH+Xh3iZ~->_MZOMt@%T=?l!#HlN`a}X4NmLZ-4oTOhn~flYL@md$(>g2 zma{XQBbH0B+ZN4{Qn+d{wVJHjFpwOtaTrYKzfKuL2&>c=xuu0!Ah7|^lyDzkHO;lf zHyN&PYLs!NP>5ueRInZX`GhjF9YFH7c$_v#X#(|kI#35?Zq4T78sr-)9v>A(qAeJ~ zHf1L(xz`^a!s+z58=E?u6Mzz-@O=B`_?u)`4$wOf7uslQe5@HADEmkd>eZD>(}RLb z=Dc*hYpuM%hME{}rOQyO70_fT%LM1gGhSe^>>ciO(~sD&=Im%$|NQV0p8Y1EieM~< zz>Z}r7bVoCUs16Wv-HyZF{ocP^>6?(DcSCz_agQj#i@M{t$07*^W{R4fxz9dvJUt)?ciy-E)IjIDTi`B!WOsM5Tgef&9^ zJ9qKBR6Q*@IDf?rVeYPMBFWk8o4lCH`cgJ}bS`>7RFJGLXSs&zJF1-{tNX?+5+va& z98b@f4YbUsvg{64A9TWR;GH#I^BvZAhm(ed_J zb*niY4mc^*4bNvl3$Jdh->;NN+mf3j>$bEF_Ss*7!Lc@g4p0O8#RZS0%#FTv0Z>AW$xOT}sr!-Y z<8H?TX8m*-ARi(6d)b5`j=H`z?ofeCNRjr2E%x64h&v?0GguHG(;22c7GQWAZU;Xt z7`>UE%lGIxBt-)(1B6sK*_s-itMJk!{35$l+B>Q3XB_t8;FqeWMaX=Hb(UOgFt@^8 zL}OG-G&#~~sv1RI{SElN!}j(wk=RvDUcS7G8-!ghH6t_!Ygm_xAn25EE07t

qdCjpe8j9 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 D)(JDG literal 814280 zcmV*jKuo_MiwFqkVzXNS17u-zVJ=~AZ*F;QX?kU3E^2dcZUF3ETa(*1vVK3mf~A-9 zu(nKG2$Fi5iygbp$s{h%WL>+dl!}r#5_c$amZChFr2O9x0P4a^149U$NxV5#DI_5@ zP^%m4uWxAlKAJ~myv&Qo(d6gRRh<3z#<@)Ma+PGu(J!w?^KDVY*__Xg-u?7xBpz(a zd>t3l+oaf((=1xYVs5cW;>PSYO&gQWPuU_a9`bxq|JX7XPx)uA&cA#L^FFg;ml?QNwM8w#oG_LLhAx!lCimD`To zK62wf*VhV8k~Fa7t{?c{?Zvh%;zwt_P0M7Sr+IM{+wNC1#kPCc5u1Ge^_Lxger|8< z2ETqeEL!GebXc0OaTpwV3C_u9M{(o*BTmY{xAFA&){B|Pd+}qXZr~(rH*!D3I~BW( z^W=Us`F$k0T0BmZO+KCH3#n<}^ADu?Ty7chnN<9XpfP`^(}?q)xMTG7)u@P<`~!Qg zUPeigJMZ%^agpUkB;SB}&MD3KR^5N-{FeWqNX+mb(D=*I*RTKedjm#3bA@~&kX%K@ zqY6jFoO8i7cKirp$an7`6v3_nMY<~~A>?`sLkK%U$eI&(Hj_*0;p1`@t?xPao%5m; zZ}rE=f`5F$X(*CdgC5=uMiVcbxEMwc7b6XNSSX@4!8$dBumtU+8tQC?nj)eBf3d{y ze2R!OWh#j>QbYi&TZ-syoF!{#QE-yECYq(u{LWd3XI5IM4IaVCGHY!rtosdB6p_+V7z~bGZkQnIp<upd%T{p@$gLH7`!GC6d0&yLtWx`#5Q;_-s1B*#?ow7J}NIPzTTovUP# zCCgRmTySUOsDE~}H}%i%VMqVS=WV305S5Xefe8s%Z>YdN#&WO{m(YlzR$_vvfh8uP z!kOoha5SV>_@)IKCkU+p8uh*0;FSV2kXS>78iz@H*jQHjR0kVBT|=<(8lhl}_kIQi z{fsoZ&5Nu;i8gxtz&XBh&beCc`WfHn8|OS*#{8E*E10}ZqD&dal9LX%hO>nspkM`{ zKx^4R%0f_hHs7tPN0pC7vgUucDdpFjL5delTu%WhA<;mJf4Udaq*v#IVB+@06aEIu zp{t<${tgJ=>uOUrBvVO{xqfOgxuu^za2Rn`F@GTz&W4LSN(H_|1>cEfepFIEgyVz+$`PZ@-8=?to=zNU3e-29s2fA|$Sal>MYV zq%3w?Rfj3>FF;Ij$7qKr9vXXJ0oZuAEpq;)9aQMVKdT4l^Ev;i`99P#TzcbkJX3&z zQEH>JjD1?;K`d#K(oiXX6yCUGLIb|XA?5GW5HXGN_fA(O1_=y=FvGnw7}%3TSB-f6 z)d-em52Q#WN2Zb@6GZ~?xur-xCm9Dq=U-fZ#DFI8AWh;aG>Hd!6xe+cVR=4+(oOZZ zv?ed+A|eMM_T=`DJ-K6r;@`a8%C(1`0%gmQs#=FnV~wGogn` zG|Hn0j)eokC`RO91s;6I`-

nXwgBaXiiK8G>bR*JOj7`gkJNy& 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

x`SAVj&J3t%T0 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%0D%pyKIeBi}io?JHD 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%0A)BZHZ0sDV3WJ36$ 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 PyCDBg-@kfgJ{bQ4_h05^ diff --git a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/field_mappings.ts b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/field_mappings.ts index 5fecf8699bec8..c29df2c88fd74 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/field_mappings.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/field_mappings.ts @@ -173,4 +173,11 @@ export const fieldMappings = { city_name: { type: 'keyword' }, }, }, + event: { + properties: { + dataset: { + type: 'keyword', + }, + }, + }, }; diff --git a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts index b2392742c0197..f680329045625 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts @@ -296,7 +296,7 @@ export const getSavedObjects = (): SavedObject[] => [ title: 'kibana_sample_data_ecommerce', timeFieldName: 'order_date', fields: - '[{"name":"_id","type":"string","esTypes":["_id"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_index","type":"string","esTypes":["_index"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_score","type":"number","count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_source","type":"_source","esTypes":["_source"],"count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_type","type":"string","esTypes":["_type"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"category","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"category.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "category"}}},{"name":"currency","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_birth_date","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_first_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_first_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "customer_first_name"}}},{"name":"customer_full_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_full_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "customer_full_name"}}},{"name":"customer_gender","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_id","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_last_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_last_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "customer_last_name"}}},{"name":"customer_phone","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"day_of_week","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"day_of_week_i","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"email","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.city_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.continent_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.country_iso_code","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.location","type":"geo_point","esTypes":["geo_point"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.region_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"manufacturer","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"manufacturer.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "manufacturer"}}},{"name":"order_date","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"order_id","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products._id","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products._id.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "products._id"}}},{"name":"products.base_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.base_unit_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.category","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.category.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "products.category"}}},{"name":"products.created_on","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.discount_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.discount_percentage","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.manufacturer","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.manufacturer.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "products.manufacturer"}}},{"name":"products.min_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.product_id","type":"number","esTypes":["long"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.product_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.product_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "products.product_name"}}},{"name":"products.quantity","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.sku","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.tax_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.taxful_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.taxless_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.unit_discount_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"sku","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"taxful_total_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"taxless_total_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"total_quantity","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"total_unique_products","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"type","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"user","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true}]', + '[{"name":"_id","type":"string","esTypes":["_id"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_index","type":"string","esTypes":["_index"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_score","type":"number","count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_source","type":"_source","esTypes":["_source"],"count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_type","type":"string","esTypes":["_type"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"category","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"category.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"category"}}},{"name":"currency","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_birth_date","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_first_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_first_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"customer_first_name"}}},{"name":"customer_full_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_full_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"customer_full_name"}}},{"name":"customer_gender","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_id","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_last_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_last_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"customer_last_name"}}},{"name":"customer_phone","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"day_of_week","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"day_of_week_i","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"email","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"event.dataset","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.city_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.continent_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.country_iso_code","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.location","type":"geo_point","esTypes":["geo_point"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.region_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"manufacturer","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"manufacturer.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"manufacturer"}}},{"name":"order_date","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"order_id","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products._id","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products._id.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"products._id"}}},{"name":"products.base_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.base_unit_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.category","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.category.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"products.category"}}},{"name":"products.created_on","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.discount_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.discount_percentage","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.manufacturer","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.manufacturer.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"products.manufacturer"}}},{"name":"products.min_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.product_id","type":"number","esTypes":["long"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.product_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.product_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"products.product_name"}}},{"name":"products.quantity","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.sku","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.tax_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.taxful_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.taxless_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.unit_discount_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"sku","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"taxful_total_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"taxless_total_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"total_quantity","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"total_unique_products","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"type","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"user","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true}]', fieldFormatMap: '{"taxful_total_price":{"id":"number","params":{"pattern":"$0,0.[00]"}}}', }, references: [], diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/manifest.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/manifest.json index 4c0186023b458..11d4f8e0b97df 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/manifest.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/manifest.json @@ -7,7 +7,7 @@ "defaultIndexPattern": "kibana_sample_data_ecommerce", "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_ecommerce" } }] + "filter": [{ "term": { "event.dataset": "sample_ecommerce" } }] } }, "jobs": [ diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/datafeed_high_sum_total_sales.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/datafeed_high_sum_total_sales.json index 0a955a766bd53..d61e6ba22ec2f 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/datafeed_high_sum_total_sales.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/datafeed_high_sum_total_sales.json @@ -3,7 +3,7 @@ "indices": ["INDEX_PATTERN_NAME"], "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_ecommerce" } }] + "filter": [{ "term": { "event.dataset": "sample_ecommerce" } }] } } } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/manifest.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/manifest.json index a0b47e7135312..446f56a717e11 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/manifest.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/manifest.json @@ -7,7 +7,7 @@ "defaultIndexPattern": "kibana_sample_data_logs", "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_logs" } }] + "filter": [{ "term": { "event.dataset": "sample_web_logs" } }] } }, "jobs": [ diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_low_request_rate.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_low_request_rate.json index 843a7d1651dc8..a9865183320d5 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_low_request_rate.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_low_request_rate.json @@ -3,7 +3,7 @@ "indices": ["INDEX_PATTERN_NAME"], "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_logs" } }] + "filter": [{ "term": { "event.dataset": "sample_web_logs" } }] } }, "aggregations": { diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_response_code_rates.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_response_code_rates.json index 3a0f67daa392a..9aef3386cb9ef 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_response_code_rates.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_response_code_rates.json @@ -3,7 +3,7 @@ "indices": ["INDEX_PATTERN_NAME"], "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_logs" } }] + "filter": [{ "term": { "event.dataset": "sample_web_logs" } }] } } } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_url_scanning.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_url_scanning.json index 3a0f67daa392a..9aef3386cb9ef 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_url_scanning.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_url_scanning.json @@ -3,7 +3,7 @@ "indices": ["INDEX_PATTERN_NAME"], "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_logs" } }] + "filter": [{ "term": { "event.dataset": "sample_web_logs" } }] } } } From 9208708b53e2012eb65059876d5695ee14762459 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2020 06:14:02 -0400 Subject: [PATCH 35/91] Bump websocket-extensions from 0.1.3 to 0.1.4 (#68414) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Elastic Machine --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9f0d4c297fd25..2efda1cf7a2cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31624,9 +31624,9 @@ websocket-driver@>=0.5.1: websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== wellknown@^0.5.0: version "0.5.0" From 88f252ac506527fe0bd0cbe2c1e924a43e32b580 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 9 Jun 2020 11:20:36 +0100 Subject: [PATCH 36/91] [SIEM] Add create template button (#66613) * add template btn * rename file * unit test * replace connector with useDispatch * comments * add disableTemplate * rename flag * fix types * remove snapshot * fix types * add fix action * move disableTemplate flag into constants * fix types * Fix timelineType * button style * unit test * unit test * fix types * Update x-pack/plugins/siem/public/timelines/components/timeline/properties/create_timeline_btn.tsx Co-authored-by: patrykkopycinski * fix unit test * add unit test * add unit test * fix types * fix tests * fix unit * fix i18n key * remove snapshot * fix crud * fix crud * fix unit * fix tag * fix unit * disable template timeline * Update use_create_timeline.tsx Co-authored-by: Elastic Machine Co-authored-by: Patryk Kopycinski --- .../security_solution/common/constants.ts | 6 + .../__snapshots__/index.test.tsx.snap | 5 - .../matrix_histogram/index.test.tsx | 2 - .../__snapshots__/index.test.tsx.snap | 958 ------------------ .../components/stat_items/index.test.tsx | 7 - .../header_with_close_button/index.test.tsx | 17 + .../components/open_timeline/index.tsx | 7 +- .../components/timeline/index.test.tsx | 2 +- .../timeline/properties/helpers.test.tsx | 84 ++ .../timeline/properties/helpers.tsx | 62 +- .../timeline/properties/index.test.tsx | 48 +- .../components/timeline/properties/index.tsx | 14 +- .../properties/new_template_timeline.test.tsx | 104 ++ .../properties/new_template_timeline.tsx | 42 + .../properties/properties_right.test.tsx | 289 ++++++ .../timeline/properties/properties_right.tsx | 233 +++-- .../timeline/properties/translations.ts | 7 + .../properties/use_create_timeline.test.tsx | 60 ++ .../properties/use_create_timeline.tsx | 66 ++ .../components/timeline/timeline.test.tsx | 3 +- .../containers/all/index.gql_query.ts | 1 + .../public/timelines/containers/api.test.ts | 503 +++++++++ .../public/timelines/containers/api.ts | 8 +- .../timelines/pages/timelines_page.test.tsx | 16 + .../public/timelines/pages/timelines_page.tsx | 59 +- .../timelines/store/timeline/actions.ts | 2 + .../timelines/store/timeline/helpers.ts | 9 +- .../timelines/store/timeline/reducer.test.ts | 3 + .../timelines/store/timeline/reducer.ts | 3 + .../lib/timeline/pick_saved_timeline.ts | 10 +- .../clean_draft_timelines_route.test.ts | 11 + .../routes/clean_draft_timelines_route.ts | 16 +- .../routes/get_draft_timelines_route.test.ts | 13 +- .../routes/get_draft_timelines_route.ts | 10 +- .../timeline/routes/update_timelines_route.ts | 1 + .../server/lib/timeline/saved_object.ts | 13 +- 36 files changed, 1526 insertions(+), 1168 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap delete mode 100644 x-pack/plugins/security_solution/public/common/components/stat_items/__snapshots__/index.test.tsx.snap create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/containers/api.test.ts diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index d04d1f2c91b97..7a2b531346ac3 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -143,3 +143,9 @@ export const showAllOthersBucket: string[] = [ 'destination.ip', 'user.name', ]; + +/** + * CreateTemplateTimelineBtn + * Remove the comment here to enable template timeline + */ +export const disableTemplate = true; diff --git a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap deleted file mode 100644 index c0e0988168384..0000000000000 --- a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap +++ /dev/null @@ -1,5 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Matrix Histogram Component not initial load it renders no MatrixLoader 1`] = `"

"`; - -exports[`Matrix Histogram Component on initial load it renders MatrixLoader 1`] = `"
"`; diff --git a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.test.tsx index b45207ab47c7a..52a97e26550ce 100644 --- a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.test.tsx @@ -82,7 +82,6 @@ describe('Matrix Histogram Component', () => { }); describe('on initial load', () => { test('it renders MatrixLoader', () => { - expect(wrapper.html()).toMatchSnapshot(); expect(wrapper.find('MatrixLoader').exists()).toBe(true); }); }); @@ -117,7 +116,6 @@ describe('Matrix Histogram Component', () => { wrapper.update(); }); test('it renders no MatrixLoader', () => { - expect(wrapper.html()).toMatchSnapshot(); expect(wrapper.find(`MatrixLoader`).exists()).toBe(false); }); diff --git a/x-pack/plugins/security_solution/public/common/components/stat_items/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/stat_items/__snapshots__/index.test.tsx.snap deleted file mode 100644 index 0d006d18cc49b..0000000000000 --- a/x-pack/plugins/security_solution/public/common/components/stat_items/__snapshots__/index.test.tsx.snap +++ /dev/null @@ -1,958 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Stat Items Component disable charts it renders the default widget 1`] = ` - - - - - -
- -
- -
- -
- -
- -
- HOSTS -
-
-
-
- -
- - - - - - - - -
-
-
-
- -
- - -
- -
- - -
- - -

- - - — - - - -

-
-
-
-
-
-
-
-
-
-
-
-
- -
- -
- -
- -
- - - - - -`; - -exports[`Stat Items Component disable charts it renders the default widget 2`] = ` - - - - - -
- -
- -
- -
- -
- -
- HOSTS -
-
-
-
- -
- - - - - - - - -
-
-
-
- -
- - -
- -
- 0 - - -
- - -

- - - — - - - -

-
-
-
-
-
-
-
-
-
-
-
-
- -
- -
- -
- -
- - - - - -`; - -exports[`Stat Items Component rendering kpis with charts it renders the default widget 1`] = ` - - - - -
- -
- -
- -
- -
- -
- UNIQUE_PRIVATE_IPS -
-
-
-
- -
- - - - - - - - -
-
-
-
- -
- - -
- -
- - -
- -
- -
- - - - -
- - -

- 1,714 - - Source -

-
-
-
-
-
-
- -
- - - - -
- -
- - -
- -
- -
- - - - -
- - -

- 2,359 - - Dest. -

-
-
-
-
-
-
- -
- - -
-
- -
-
- -
- - -
- -
- -
- - - - -
- -
- -
- - -
- -
- -
- -
-
-
- - -`; diff --git a/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx index f46697834d0e3..d81d23438bfd2 100644 --- a/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx @@ -91,10 +91,6 @@ describe('Stat Items Component', () => { ), ], ])('disable charts', (wrapper) => { - test('it renders the default widget', () => { - expect(wrapper).toMatchSnapshot(); - }); - test('should render titles', () => { expect(wrapper.find('[data-test-subj="stat-title"]')).toBeTruthy(); }); @@ -180,9 +176,6 @@ describe('Stat Items Component', () => { ); }); - test('it renders the default widget', () => { - expect(wrapper).toMatchSnapshot(); - }); test('should handle multiple titles', () => { expect(wrapper.find('[data-test-subj="stat-title"]')).toHaveLength(2); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx index 9a52e9cf4e538..34a20e7215906 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx @@ -10,6 +10,23 @@ import React from 'react'; import { TestProviders } from '../../../../common/mock'; import { FlyoutHeaderWithCloseButton } from '.'; +jest.mock('../../../../common/lib/kibana', () => { + return { + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }), + useUiSetting$: jest.fn().mockReturnValue([]), + }; +}); + describe('FlyoutHeaderWithCloseButton', () => { test('renders correctly against snapshot', () => { const EmptyComponent = shallow( diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx index 92a8fc9338877..344f10dfdb35e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx @@ -42,6 +42,7 @@ import { } from './types'; import { DEFAULT_SORT_FIELD, DEFAULT_SORT_DIRECTION } from './constants'; import { useTimelineTypes } from './use_timeline_types'; +import { disableTemplate } from '../../../../common/constants'; interface OwnProps { apolloClient: ApolloClient; @@ -52,12 +53,6 @@ interface OwnProps { onOpenTimeline?: (timeline: TimelineModel) => void; } -/** - * CreateTemplateTimelineBtn - * Remove the comment here to enable template timeline - */ -export const disableTemplate = true; - export type OpenTimelineOwnProps = OwnProps & Pick< OpenTimelineProps, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx index 581fa125d21e2..931623d080198 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx @@ -27,13 +27,13 @@ import { StatefulTimeline, Props as StatefulTimelineProps } from './index'; import { Timeline } from './timeline'; jest.mock('../../../common/lib/kibana'); - const mockUseResizeObserver: jest.Mock = useResizeObserver as jest.Mock; jest.mock('use-resize-observer/polyfilled'); mockUseResizeObserver.mockImplementation(() => ({})); const mockUseSignalIndex: jest.Mock = useSignalIndex as jest.Mock; jest.mock('../../../alerts/containers/detection_engine/alerts/use_signal_index'); +jest.mock('../flyout/header_with_close_button'); describe('StatefulTimeline', () => { let props = {} as StatefulTimelineProps; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.test.tsx new file mode 100644 index 0000000000000..fb91bbd5a1124 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.test.tsx @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mount, shallow } from 'enzyme'; +import { NewTimeline, NewTimelineProps } from './helpers'; +import { useCreateTimelineButton } from './use_create_timeline'; + +jest.mock('./use_create_timeline', () => ({ + useCreateTimelineButton: jest.fn(), +})); + +jest.mock('../../../../common/lib/kibana', () => { + return { + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }), + }; +}); + +describe('NewTimeline', () => { + const mockGetButton = jest.fn(); + + const props: NewTimelineProps = { + closeGearMenu: jest.fn(), + timelineId: 'mockTimelineId', + title: 'mockTitle', + }; + + describe('render', () => { + describe('default', () => { + beforeAll(() => { + (useCreateTimelineButton as jest.Mock).mockReturnValue({ getButton: mockGetButton }); + shallow(); + }); + + afterAll(() => { + jest.clearAllMocks(); + }); + + test('it should not render outline', () => { + expect(mockGetButton.mock.calls[0][0].outline).toEqual(false); + }); + + test('it should render title', () => { + expect(mockGetButton.mock.calls[0][0].title).toEqual(props.title); + }); + }); + + describe('show outline', () => { + beforeAll(() => { + (useCreateTimelineButton as jest.Mock).mockReturnValue({ getButton: mockGetButton }); + + const enableOutline = { + ...props, + outline: true, + }; + mount(); + }); + + afterAll(() => { + jest.clearAllMocks(); + }); + + test('it should render outline', () => { + expect(mockGetButton.mock.calls[0][0].outline).toEqual(true); + }); + + test('it should render title', () => { + expect(mockGetButton.mock.calls[0][0].title).toEqual(props.title); + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx index 38a85a7a92631..9e74298f3aca9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx @@ -23,16 +23,25 @@ import styled from 'styled-components'; import { useHistory } from 'react-router-dom'; import { useSelector } from 'react-redux'; -import { TimelineStatus } from '../../../../../common/types/timeline'; +import { + TimelineTypeLiteral, + TimelineStatus, + TimelineType, +} from '../../../../../common/types/timeline'; + +import { SiemPageName } from '../../../../app/types'; +import { timelineSelectors } from '../../../../timelines/store/timeline'; +import { State } from '../../../../common/store'; +import { useKibana } from '../../../../common/lib/kibana'; import { Note } from '../../../../common/lib/note'; + import { Notes } from '../../notes'; import { AssociateNote, UpdateNote } from '../../notes/helpers'; + import { NOTES_PANEL_WIDTH } from './notes_size'; import { ButtonContainer, DescriptionContainer, LabelText, NameField, StyledStar } from './styles'; import * as i18n from './translations'; -import { SiemPageName } from '../../../../app/types'; -import { timelineSelectors } from '../../../../timelines/store/timeline'; -import { State } from '../../../../common/store'; +import { useCreateTimelineButton } from './use_create_timeline'; export const historyToolTip = 'The chronological history of actions related to this timeline'; export const streamLiveToolTip = 'Update the Timeline as new data arrives'; @@ -44,7 +53,15 @@ const NotesCountBadge = (styled(EuiBadge)` NotesCountBadge.displayName = 'NotesCountBadge'; -type CreateTimeline = ({ id, show }: { id: string; show?: boolean }) => void; +type CreateTimeline = ({ + id, + show, + timelineType, +}: { + id: string; + show?: boolean; + timelineType?: TimelineTypeLiteral; +}) => void; type UpdateIsFavorite = ({ id, isFavorite }: { id: string; isFavorite: boolean }) => void; type UpdateTitle = ({ id, title }: { id: string; title: string }) => void; type UpdateDescription = ({ id, description }: { id: string; description: string }) => void; @@ -161,30 +178,27 @@ export const NewCase = React.memo( ); NewCase.displayName = 'NewCase'; -interface NewTimelineProps { - createTimeline: CreateTimeline; - onClosePopover: () => void; +export interface NewTimelineProps { + createTimeline?: CreateTimeline; + closeGearMenu?: () => void; + outline?: boolean; timelineId: string; + title?: string; } export const NewTimeline = React.memo( - ({ createTimeline, onClosePopover, timelineId }) => { - const handleClick = useCallback(() => { - createTimeline({ id: timelineId, show: true }); - onClosePopover(); - }, [createTimeline, timelineId, onClosePopover]); + ({ closeGearMenu, outline = false, timelineId, title = i18n.NEW_TIMELINE }) => { + const uiCapabilities = useKibana().services.application.capabilities; + const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; - return ( - - {i18n.NEW_TIMELINE} - - ); + const { getButton } = useCreateTimelineButton({ + timelineId, + timelineType: TimelineType.default, + closeGearMenu, + }); + const button = getButton({ outline, title }); + + return capabilitiesCanUserCRUD ? button : null; } ); NewTimeline.displayName = 'NewTimeline'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx index 8bdec78ec8da2..952a7c104e19e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx @@ -18,14 +18,27 @@ import { createStore, State } from '../../../../common/store'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Properties, showDescriptionThreshold, showNotesThreshold } from '.'; -jest.mock('../../../../common/lib/kibana'); - -let mockedWidth = 1000; -jest.mock('../../../../common/components/utils'); -(useThrottledResizeObserver as jest.Mock).mockImplementation(() => ({ - width: mockedWidth, +jest.mock('../../../../common/lib/kibana', () => ({ + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }), + useUiSetting$: jest.fn().mockReturnValue([]), })); +jest.mock('../../../../common/components/utils', () => { + return { + useThrottledResizeObserver: jest.fn(), + }; +}); + jest.mock('react-redux', () => { const originalModule = jest.requireActual('react-redux'); @@ -44,16 +57,20 @@ jest.mock('react-router-dom', () => { }; }); +jest.mock('./use_create_timeline', () => ({ + useCreateTimelineButton: jest.fn().mockReturnValue({ getButton: jest.fn() }), +})); + describe('Properties', () => { const usersViewing = ['elastic']; - const state: State = mockGlobalState; + let mockedWidth = 1000; let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { jest.clearAllMocks(); store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); - mockedWidth = 1000; + (useThrottledResizeObserver as jest.Mock).mockReturnValue({ width: mockedWidth }); }); test('renders correctly', () => { @@ -306,7 +323,9 @@ describe('Properties', () => { test('it renders a description on the left when the width is at least as wide as the threshold', () => { const description = 'strange'; - mockedWidth = showDescriptionThreshold; + + (useThrottledResizeObserver as jest.Mock).mockReset(); + (useThrottledResizeObserver as jest.Mock).mockReturnValue({ width: showDescriptionThreshold }); const wrapper = mount( @@ -343,7 +362,11 @@ describe('Properties', () => { test('it does NOT render a description on the left when the width is less than the threshold', () => { const description = 'strange'; - mockedWidth = showDescriptionThreshold - 1; + + (useThrottledResizeObserver as jest.Mock).mockReset(); + (useThrottledResizeObserver as jest.Mock).mockReturnValue({ + width: showDescriptionThreshold - 1, + }); const wrapper = mount( @@ -413,7 +436,10 @@ describe('Properties', () => { }); test('it does NOT render a a notes button on the left when the width is less than the threshold', () => { - mockedWidth = showNotesThreshold - 1; + (useThrottledResizeObserver as jest.Mock).mockReset(); + (useThrottledResizeObserver as jest.Mock).mockReturnValue({ + width: showNotesThreshold - 1, + }); const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx index 1532a64e4083e..d4c43c9929f0e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx @@ -6,17 +6,26 @@ import React, { useState, useCallback, useMemo } from 'react'; -import { TimelineStatus } from '../../../../../common/types/timeline'; +import { TimelineStatus, TimelineTypeLiteral } from '../../../../../common/types/timeline'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Note } from '../../../../common/lib/note'; import { InputsModelId } from '../../../../common/store/inputs/constants'; + import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { TimelineProperties } from './styles'; import { PropertiesRight } from './properties_right'; import { PropertiesLeft } from './properties_left'; -type CreateTimeline = ({ id, show }: { id: string; show?: boolean }) => void; +type CreateTimeline = ({ + id, + show, + timelineType, +}: { + id: string; + show?: boolean; + timelineType?: TimelineTypeLiteral; +}) => void; type UpdateIsFavorite = ({ id, isFavorite }: { id: string; isFavorite: boolean }) => void; type UpdateTitle = ({ id, title }: { id: string; title: string }) => void; type UpdateDescription = ({ id, description }: { id: string; description: string }) => void; @@ -128,7 +137,6 @@ export const Properties = React.memo( /> { + return { + useKibana: jest.fn(), + }; +}); + +describe('NewTemplateTimeline', () => { + const state: State = mockGlobalState; + const store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); + const mockClosePopover = jest.fn(); + const mockTitle = 'NEW_TIMELINE'; + let wrapper: ReactWrapper; + + describe('render if CRUD', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + wrapper = mount( + + + + ); + }); + + test('render with iconType', () => { + expect( + wrapper + .find('[data-test-subj="template-timeline-new-with-border"]') + .first() + .prop('iconType') + ).toEqual('plusInCircle'); + }); + + test('render with onClick', () => { + expect( + wrapper.find('[data-test-subj="template-timeline-new-with-border"]').first().prop('onClick') + ).toBeTruthy(); + }); + }); + + describe('If no CRUD', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: false, + }, + }, + }, + }, + }); + + wrapper = mount( + + + + ); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('no render', () => { + expect( + wrapper.find('[data-test-subj="template-timeline-new-with-border"]').exists() + ).toBeFalsy(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.tsx new file mode 100644 index 0000000000000..45b2ce62fb85b --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { TimelineType } from '../../../../../common/types/timeline'; + +import { useKibana } from '../../../../common/lib/kibana'; +import { useCreateTimelineButton } from './use_create_timeline'; + +interface OwnProps { + closeGearMenu?: () => void; + outline?: boolean; + title?: string; + timelineId?: string; +} + +export const NewTemplateTimelineComponent: React.FC = ({ + closeGearMenu, + outline, + title, + timelineId = 'timeline-1', +}) => { + const uiCapabilities = useKibana().services.application.capabilities; + const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; + + const { getButton } = useCreateTimelineButton({ + timelineId, + timelineType: TimelineType.template, + closeGearMenu, + }); + + const button = getButton({ outline, title }); + + return capabilitiesCanUserCRUD ? button : null; +}; + +export const NewTemplateTimeline = React.memo(NewTemplateTimelineComponent); +NewTemplateTimeline.displayName = 'NewTemplateTimeline'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx new file mode 100644 index 0000000000000..58927e7b236e7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx @@ -0,0 +1,289 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { mount, ReactWrapper } from 'enzyme'; +import React from 'react'; + +import { PropertiesRight } from './properties_right'; +import { useKibana } from '../../../../common/lib/kibana'; +import { TimelineStatus } from '../../../../../common/types/timeline'; +import { disableTemplate } from '../../../../../common/constants'; + +jest.mock('../../../../common/lib/kibana', () => { + return { + useKibana: jest.fn(), + useUiSetting$: jest.fn().mockReturnValue([]), + }; +}); + +jest.mock('./new_template_timeline', () => { + return { + NewTemplateTimeline: jest.fn(() =>
), + }; +}); + +jest.mock('./helpers', () => { + return { + Description: jest.fn().mockReturnValue(
), + NotesButton: jest.fn().mockReturnValue(
), + NewCase: jest.fn().mockReturnValue(
), + NewTimeline: jest.fn().mockReturnValue(
), + }; +}); + +jest.mock('../../../../common/components/inspect', () => { + return { + InspectButton: jest.fn().mockReturnValue(
), + InspectButtonContainer: jest.fn(({ children }) =>
{children}
), + }; +}); + +describe('Properties Right', () => { + let wrapper: ReactWrapper; + const props = { + onButtonClick: jest.fn(), + onClosePopover: jest.fn(), + showActions: true, + createTimeline: jest.fn(), + timelineId: 'timelineId', + isDataInTimeline: false, + showNotes: false, + showNotesFromWidth: false, + showDescription: false, + showUsersView: false, + usersViewing: [], + description: 'desc', + updateDescription: jest.fn(), + associateNote: jest.fn(), + getNotesByIds: jest.fn(), + noteIds: [], + onToggleShowNotes: jest.fn(), + onCloseTimelineModal: jest.fn(), + onOpenTimelineModal: jest.fn(), + status: TimelineStatus.active, + showTimelineModal: false, + title: 'title', + updateNote: jest.fn(), + }; + + describe('with crud', () => { + describe('render', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }); + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders settings-gear', () => { + expect(wrapper.find('[data-test-subj="settings-gear"]').exists()).toBeTruthy(); + }); + + test('it renders create timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-default-btn"]').exists()).toBeTruthy(); + }); + + /* + * CreateTemplateTimelineBtn + * Remove the comment here to enable CreateTemplateTimelineBtn + */ + test('it renders no create template timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-template-btn"]').exists()).toEqual( + !disableTemplate + ); + }); + + test('it renders create attach timeline to a case btn', () => { + expect(wrapper.find('[data-test-subj="NewCase"]').exists()).toBeTruthy(); + }); + + test('it renders no NotesButton', () => { + expect(wrapper.find('[data-test-subj="NotesButton"]').exists()).not.toBeTruthy(); + }); + + test('it renders no Description', () => { + expect(wrapper.find('[data-test-subj="Description"]').exists()).not.toBeTruthy(); + }); + }); + + describe('render with notes button', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }); + const propsWithshowNotes = { + ...props, + showNotesFromWidth: true, + }; + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders NotesButton', () => { + expect(wrapper.find('[data-test-subj="NotesButton"]').exists()).toBeTruthy(); + }); + }); + + describe('render with description', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }); + const propsWithshowDescription = { + ...props, + showDescription: true, + }; + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders Description', () => { + expect(wrapper.find('[data-test-subj="Description"]').exists()).toBeTruthy(); + }); + }); + }); + + describe('with no crud', () => { + describe('render', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: false, + }, + }, + }, + }, + }); + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders settings-gear', () => { + expect(wrapper.find('[data-test-subj="settings-gear"]').exists()).toBeTruthy(); + }); + + test('it renders no create timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-default-btn"]').exists()).not.toBeTruthy(); + }); + + test('it renders create template timelin btn if it is enabled', () => { + expect(wrapper.find('[data-test-subj="create-template-btn"]').exists()).toEqual( + !disableTemplate + ); + }); + + test('it renders create attach timeline to a case btn', () => { + expect(wrapper.find('[data-test-subj="NewCase"]').exists()).toBeTruthy(); + }); + + test('it renders no NotesButton', () => { + expect(wrapper.find('[data-test-subj="NotesButton"]').exists()).not.toBeTruthy(); + }); + + test('it renders no Description', () => { + expect(wrapper.find('[data-test-subj="Description"]').exists()).not.toBeTruthy(); + }); + }); + + describe('render with notes button', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: false, + }, + }, + }, + }, + }); + const propsWithshowNotes = { + ...props, + showNotesFromWidth: true, + }; + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders NotesButton', () => { + expect(wrapper.find('[data-test-subj="NotesButton"]').exists()).toBeTruthy(); + }); + }); + + describe('render with description', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: false, + }, + }, + }, + }, + }); + const propsWithshowDescription = { + ...props, + showDescription: true, + }; + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders Description', () => { + expect(wrapper.find('[data-test-subj="Description"]').exists()).toBeTruthy(); + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx index 963b67838e811..f9ab7fb2e69ae 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx @@ -14,15 +14,21 @@ import { EuiToolTip, EuiAvatar, } from '@elastic/eui'; -import { NewTimeline, Description, NotesButton, NewCase } from './helpers'; + +import { disableTemplate } from '../../../../../common/constants'; +import { TimelineStatus } from '../../../../../common/types/timeline'; + +import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; +import { useKibana } from '../../../../common/lib/kibana'; +import { Note } from '../../../../common/lib/note'; + +import { AssociateNote } from '../../notes/helpers'; import { OpenTimelineModalButton } from '../../open_timeline/open_timeline_modal/open_timeline_modal_button'; import { OpenTimelineModal } from '../../open_timeline/open_timeline_modal'; -import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; import * as i18n from './translations'; -import { AssociateNote } from '../../notes/helpers'; -import { Note } from '../../../../common/lib/note'; -import { TimelineStatus } from '../../../../../common/types/timeline'; +import { Description, NotesButton, NewCase, NewTimeline } from './helpers'; +import { NewTemplateTimeline } from './new_template_timeline'; export const PropertiesRightStyle = styled(EuiFlexGroup)` margin-right: 5px; @@ -55,15 +61,13 @@ const Avatar = styled(EuiAvatar)` Avatar.displayName = 'Avatar'; -type CreateTimeline = ({ id, show }: { id: string; show?: boolean }) => void; type UpdateDescription = ({ id, description }: { id: string; description: string }) => void; export type UpdateNote = (note: Note) => void; -interface Props { +export interface PropertiesRightComponentProps { onButtonClick: () => void; onClosePopover: () => void; showActions: boolean; - createTimeline: CreateTimeline; timelineId: string; isDataInTimeline: boolean; showNotes: boolean; @@ -85,11 +89,10 @@ interface Props { updateNote: UpdateNote; } -const PropertiesRightComponent: React.FC = ({ +const PropertiesRightComponent: React.FC = ({ onButtonClick, showActions, onClosePopover, - createTimeline, timelineId, isDataInTimeline, showNotesFromWidth, @@ -105,111 +108,131 @@ const PropertiesRightComponent: React.FC = ({ onToggleShowNotes, updateNote, showTimelineModal, + status, onCloseTimelineModal, onOpenTimelineModal, title, - status, -}) => ( - - - - - } - id="timelineSettingsPopover" - isOpen={showActions} - closePopover={onClosePopover} - > - - - - - - - - - - - { + const uiCapabilities = useKibana().services.application.capabilities; + const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; + return ( + + + + - - - - - + } + id="timelineSettingsPopover" + isOpen={showActions} + closePopover={onClosePopover} + > + + {capabilitiesCanUserCRUD && ( + + + + )} + + {/* + * CreateTemplateTimelineBtn + * Remove the comment here to enable CreateTemplateTimelineBtn + */} + {!disableTemplate && ( + + + + )} - {showNotesFromWidth ? ( - + + + + - ) : null} - {showDescription ? ( - - - + - ) : null} - - - - - - {showUsersView - ? usersViewing.map((user) => ( - // Hide the hard-coded elastic user avatar as the 7.2 release does not implement - // support for multi-user-collaboration as proposed in elastic/ingest-dev#395 - - - - - - )) - : null} - - {showTimelineModal ? : null} - -); + + {showNotesFromWidth ? ( + + + + ) : null} + + {showDescription ? ( + + + + + + ) : null} + + + + + + {showUsersView + ? usersViewing.map((user) => ( + // Hide the hard-coded elastic user avatar as the 7.2 release does not implement + // support for multi-user-collaboration as proposed in elastic/ingest-dev#395 + + + + + + )) + : null} + + {showTimelineModal ? : null} + + ); +}; export const PropertiesRight = React.memo(PropertiesRightComponent); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts index 88cbd3b1503f6..20569cc044be3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts @@ -109,6 +109,13 @@ export const NEW_TIMELINE = i18n.translate( } ); +export const NEW_TEMPLATE_TIMELINE = i18n.translate( + 'xpack.securitySolution.timeline.properties.newTemplateTimelineButtonLabel', + { + defaultMessage: 'Create template timeline', + } +); + export const ATTACH_TIMELINE_TO_NEW_CASE = i18n.translate( 'xpack.securitySolution.timeline.properties.newCaseButtonLabel', { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.test.tsx new file mode 100644 index 0000000000000..68a3362b721d8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.test.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { renderHook, act } from '@testing-library/react-hooks'; +import { shallow } from 'enzyme'; + +import { TimelineType } from '../../../../../common/types/timeline'; +import { useCreateTimelineButton } from './use_create_timeline'; + +jest.mock('react-redux', () => { + const actual = jest.requireActual('react-redux'); + return { + ...actual, + useDispatch: jest.fn(), + }; +}); + +describe('useCreateTimelineButton', () => { + const mockId = 'mockId'; + const timelineType = TimelineType.default; + + test('return getButton', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useCreateTimelineButton({ timelineId: mockId, timelineType }) + ); + await waitForNextUpdate(); + + expect(result.current.getButton).toBeTruthy(); + }); + }); + + test('getButton renders correct outline - EuiButton', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useCreateTimelineButton({ timelineId: mockId, timelineType }) + ); + await waitForNextUpdate(); + + const button = result.current.getButton({ outline: true, title: 'mock title' }); + const wrapper = shallow(button); + expect(wrapper.find('[data-test-subj="timeline-new-with-border"]').exists()).toBeTruthy(); + }); + }); + + test('getButton renders correct outline - EuiButtonEmpty', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useCreateTimelineButton({ timelineId: mockId, timelineType }) + ); + await waitForNextUpdate(); + + const button = result.current.getButton({ outline: false, title: 'mock title' }); + const wrapper = shallow(button); + expect(wrapper.find('[data-test-subj="timeline-new"]').exists()).toBeTruthy(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.tsx new file mode 100644 index 0000000000000..fb05b056cdf82 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { useCallback } from 'react'; +import { useDispatch } from 'react-redux'; +import { EuiButton, EuiButtonEmpty } from '@elastic/eui'; +import { defaultHeaders } from '../body/column_headers/default_headers'; +import { timelineActions } from '../../../store/timeline'; +import { TimelineTypeLiteral, TimelineType } from '../../../../../common/types/timeline'; + +export const useCreateTimelineButton = ({ + timelineId, + timelineType, + closeGearMenu, +}: { + timelineId?: string; + timelineType: TimelineTypeLiteral; + closeGearMenu?: () => void; +}) => { + const dispatch = useDispatch(); + + const createTimeline = useCallback( + ({ id, show }) => + dispatch( + timelineActions.createTimeline({ + id, + columns: defaultHeaders, + show, + timelineType, + }) + ), + [dispatch, timelineType] + ); + + const handleButtonClick = useCallback(() => { + createTimeline({ id: timelineId, show: true, timelineType }); + if (typeof closeGearMenu === 'function') { + closeGearMenu(); + } + }, [createTimeline, timelineId, timelineType, closeGearMenu]); + + const getButton = useCallback( + ({ outline, title }: { outline?: boolean; title?: string }) => { + const buttonProps = { + iconType: 'plusInCircle', + onClick: handleButtonClick, + }; + const dataTestSubjPrefix = + timelineType === TimelineType.template ? `template-timeline-new` : `timeline-new`; + return outline ? ( + + {title} + + ) : ( + + {title} + + ); + }, + [handleButtonClick, timelineType] + ); + + return { getButton }; +}; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.test.tsx index b07be4a471a70..74659cb17b0e5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.test.tsx @@ -26,9 +26,10 @@ import { mockDataProviders } from './data_providers/mock/mock_data_providers'; import { useMountAppended } from '../../../common/utils/use_mount_appended'; jest.mock('../../../common/lib/kibana'); - +jest.mock('./properties/properties_right'); const mockUseResizeObserver: jest.Mock = useResizeObserver as jest.Mock; jest.mock('use-resize-observer/polyfilled'); + mockUseResizeObserver.mockImplementation(() => ({})); describe('Timeline', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts b/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts index cdbf3e768581b..60d000fe78184 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts @@ -56,6 +56,7 @@ export const allTimelinesQuery = gql` } noteIds pinnedEventIds + status title timelineType templateTimelineId diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts new file mode 100644 index 0000000000000..26373fa1a825d --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts @@ -0,0 +1,503 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import * as api from './api'; +import { KibanaServices } from '../../common/lib/kibana'; +import { TimelineType, TimelineStatus } from '../../../common/types/timeline'; +import { TIMELINE_DRAFT_URL, TIMELINE_URL } from '../../../common/constants'; + +jest.mock('../../common/lib/kibana', () => { + return { + KibanaServices: { get: jest.fn() }, + }; +}); + +describe('persistTimeline', () => { + describe('create draft timeline', () => { + const timelineId = null; + const initialDraftTimeline = { + columns: [ + { + columnHeaderType: 'not-filtered', + id: '@timestamp', + }, + { + columnHeaderType: 'not-filtered', + id: 'message', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.category', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.action', + }, + { + columnHeaderType: 'not-filtered', + id: 'host.name', + }, + { + columnHeaderType: 'not-filtered', + id: 'source.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'destination.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'user.name', + }, + ], + dataProviders: [], + description: 'x', + eventType: 'all', + filters: [], + kqlMode: 'filter', + kqlQuery: { + filterQuery: null, + }, + title: '', + timelineType: TimelineType.default, + templateTimelineVersion: null, + templateTimelineId: null, + dateRange: { + start: 1590998565409, + end: 1591084965409, + }, + savedQueryId: null, + sort: { + columnId: '@timestamp', + sortDirection: 'desc', + }, + status: TimelineStatus.draft, + }; + const mockDraftResponse = { + data: { + persistTimeline: { + timeline: { + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzMzMiwxXQ==', + columns: [ + { columnHeaderType: 'not-filtered', id: '@timestamp' }, + { columnHeaderType: 'not-filtered', id: 'message' }, + { columnHeaderType: 'not-filtered', id: 'event.category' }, + { columnHeaderType: 'not-filtered', id: 'event.action' }, + { columnHeaderType: 'not-filtered', id: 'host.name' }, + { columnHeaderType: 'not-filtered', id: 'source.ip' }, + { columnHeaderType: 'not-filtered', id: 'destination.ip' }, + { columnHeaderType: 'not-filtered', id: 'user.name' }, + ], + dataProviders: [], + description: '', + eventType: 'all', + filters: [], + kqlMode: 'filter', + timelineType: 'default', + kqlQuery: { filterQuery: null }, + title: '', + sort: { columnId: '@timestamp', sortDirection: 'desc' }, + status: 'draft', + created: 1591091394733, + createdBy: 'angela', + updated: 1591091394733, + updatedBy: 'angela', + templateTimelineId: null, + templateTimelineVersion: null, + dateRange: { start: 1590998565409, end: 1591084965409 }, + savedQueryId: null, + favorite: [], + eventIdToNoteIds: [], + noteIds: [], + notes: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + }, + }, + }, + }; + const mockPatchTimelineResponse = { + data: { + persistTimeline: { + code: 200, + message: 'success', + timeline: { + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzM0NSwxXQ==', + columns: [ + { columnHeaderType: 'not-filtered', id: '@timestamp' }, + { columnHeaderType: 'not-filtered', id: 'message' }, + { columnHeaderType: 'not-filtered', id: 'event.category' }, + { columnHeaderType: 'not-filtered', id: 'event.action' }, + { columnHeaderType: 'not-filtered', id: 'host.name' }, + { columnHeaderType: 'not-filtered', id: 'source.ip' }, + { columnHeaderType: 'not-filtered', id: 'destination.ip' }, + { columnHeaderType: 'not-filtered', id: 'user.name' }, + ], + dataProviders: [], + description: 'x', + eventType: 'all', + filters: [], + kqlMode: 'filter', + timelineType: 'default', + kqlQuery: { filterQuery: null }, + title: '', + sort: { columnId: '@timestamp', sortDirection: 'desc' }, + status: 'draft', + created: 1591092702804, + createdBy: 'angela', + updated: 1591092705206, + updatedBy: 'angela', + templateTimelineId: null, + templateTimelineVersion: null, + dateRange: { start: 1590998565409, end: 1591084965409 }, + savedQueryId: null, + favorite: [], + eventIdToNoteIds: [], + noteIds: [], + notes: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + }, + }, + }, + }; + const version = null; + const fetchMock = jest.fn(); + const postMock = jest.fn(); + const patchMock = jest.fn(); + + beforeAll(() => { + jest.resetAllMocks(); + + (KibanaServices.get as jest.Mock).mockReturnValue({ + http: { + fetch: fetchMock, + post: postMock.mockReturnValue(mockDraftResponse), + patch: patchMock.mockReturnValue(mockPatchTimelineResponse), + }, + }); + api.persistTimeline({ timelineId, timeline: initialDraftTimeline, version }); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + test('it should create a draft timeline if given status is draft and timelineId is null', () => { + expect(postMock).toHaveBeenCalledWith(TIMELINE_DRAFT_URL, { + body: JSON.stringify({ + timelineType: initialDraftTimeline.timelineType, + }), + }); + }); + + test('it should update timeline', () => { + expect(patchMock.mock.calls[0][0]).toEqual(TIMELINE_URL); + }); + + test('it should update timeline with patch', () => { + expect(patchMock.mock.calls[0][1].method).toEqual('PATCH'); + }); + + test("it should update timeline from clean draft timeline's response", () => { + expect(JSON.parse(patchMock.mock.calls[0][1].body)).toEqual({ + timelineId: mockDraftResponse.data.persistTimeline.timeline.savedObjectId, + timeline: { + ...initialDraftTimeline, + templateTimelineId: mockDraftResponse.data.persistTimeline.timeline.templateTimelineId, + templateTimelineVersion: + mockDraftResponse.data.persistTimeline.timeline.templateTimelineVersion, + }, + version: mockDraftResponse.data.persistTimeline.timeline.version ?? '', + }); + }); + }); + + describe('create active timeline (import)', () => { + const timelineId = null; + const importTimeline = { + columns: [ + { + columnHeaderType: 'not-filtered', + id: '@timestamp', + }, + { + columnHeaderType: 'not-filtered', + id: 'message', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.category', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.action', + }, + { + columnHeaderType: 'not-filtered', + id: 'host.name', + }, + { + columnHeaderType: 'not-filtered', + id: 'source.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'destination.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'user.name', + }, + ], + dataProviders: [], + description: 'x', + eventType: 'all', + filters: [], + kqlMode: 'filter', + kqlQuery: { + filterQuery: null, + }, + title: '', + timelineType: TimelineType.default, + templateTimelineVersion: null, + templateTimelineId: null, + dateRange: { + start: 1590998565409, + end: 1591084965409, + }, + savedQueryId: null, + sort: { + columnId: '@timestamp', + sortDirection: 'desc', + }, + status: TimelineStatus.active, + }; + const mockPostTimelineResponse = { + data: { + persistTimeline: { + timeline: { + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzMzMiwxXQ==', + columns: [ + { columnHeaderType: 'not-filtered', id: '@timestamp' }, + { columnHeaderType: 'not-filtered', id: 'message' }, + { columnHeaderType: 'not-filtered', id: 'event.category' }, + { columnHeaderType: 'not-filtered', id: 'event.action' }, + { columnHeaderType: 'not-filtered', id: 'host.name' }, + { columnHeaderType: 'not-filtered', id: 'source.ip' }, + { columnHeaderType: 'not-filtered', id: 'destination.ip' }, + { columnHeaderType: 'not-filtered', id: 'user.name' }, + ], + dataProviders: [], + description: '', + eventType: 'all', + filters: [], + kqlMode: 'filter', + timelineType: 'default', + kqlQuery: { filterQuery: null }, + title: '', + sort: { columnId: '@timestamp', sortDirection: 'desc' }, + status: 'draft', + created: 1591091394733, + createdBy: 'angela', + updated: 1591091394733, + updatedBy: 'angela', + templateTimelineId: null, + templateTimelineVersion: null, + dateRange: { start: 1590998565409, end: 1591084965409 }, + savedQueryId: null, + favorite: [], + eventIdToNoteIds: [], + noteIds: [], + notes: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + }, + }, + }, + }; + + const version = null; + const fetchMock = jest.fn(); + const postMock = jest.fn(); + const patchMock = jest.fn(); + + beforeAll(() => { + jest.resetAllMocks(); + + (KibanaServices.get as jest.Mock).mockReturnValue({ + http: { + fetch: fetchMock, + post: postMock.mockReturnValue(mockPostTimelineResponse), + patch: patchMock, + }, + }); + api.persistTimeline({ timelineId, timeline: importTimeline, version }); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + test('it should update timeline', () => { + expect(postMock.mock.calls[0][0]).toEqual(TIMELINE_URL); + }); + + test('it should update timeline with patch', () => { + expect(postMock.mock.calls[0][1].method).toEqual('POST'); + }); + + test('should call create timeline', () => { + expect(JSON.parse(postMock.mock.calls[0][1].body)).toEqual({ timeline: importTimeline }); + }); + }); + + describe('update active timeline', () => { + const timelineId = '9d5693e0-a42a-11ea-b8f4-c5434162742a'; + const inputTimeline = { + columns: [ + { + columnHeaderType: 'not-filtered', + id: '@timestamp', + }, + { + columnHeaderType: 'not-filtered', + id: 'message', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.category', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.action', + }, + { + columnHeaderType: 'not-filtered', + id: 'host.name', + }, + { + columnHeaderType: 'not-filtered', + id: 'source.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'destination.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'user.name', + }, + ], + dataProviders: [], + description: 'x', + eventType: 'all', + filters: [], + kqlMode: 'filter', + kqlQuery: { + filterQuery: null, + }, + title: '', + timelineType: TimelineType.default, + templateTimelineVersion: null, + templateTimelineId: null, + dateRange: { + start: 1590998565409, + end: 1591084965409, + }, + savedQueryId: null, + sort: { + columnId: '@timestamp', + sortDirection: 'desc', + }, + status: TimelineStatus.active, + }; + const mockPatchTimelineResponse = { + data: { + persistTimeline: { + timeline: { + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzMzMiwxXQ==', + columns: [ + { columnHeaderType: 'not-filtered', id: '@timestamp' }, + { columnHeaderType: 'not-filtered', id: 'message' }, + { columnHeaderType: 'not-filtered', id: 'event.category' }, + { columnHeaderType: 'not-filtered', id: 'event.action' }, + { columnHeaderType: 'not-filtered', id: 'host.name' }, + { columnHeaderType: 'not-filtered', id: 'source.ip' }, + { columnHeaderType: 'not-filtered', id: 'destination.ip' }, + { columnHeaderType: 'not-filtered', id: 'user.name' }, + ], + dataProviders: [], + description: '', + eventType: 'all', + filters: [], + kqlMode: 'filter', + timelineType: 'default', + kqlQuery: { filterQuery: null }, + title: '', + sort: { columnId: '@timestamp', sortDirection: 'desc' }, + status: 'draft', + created: 1591091394733, + createdBy: 'angela', + updated: 1591091394733, + updatedBy: 'angela', + templateTimelineId: null, + templateTimelineVersion: null, + dateRange: { start: 1590998565409, end: 1591084965409 }, + savedQueryId: null, + favorite: [], + eventIdToNoteIds: [], + noteIds: [], + notes: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + }, + }, + }, + }; + + const version = 'initial version'; + const fetchMock = jest.fn(); + const postMock = jest.fn(); + const patchMock = jest.fn(); + + beforeAll(() => { + jest.resetAllMocks(); + + (KibanaServices.get as jest.Mock).mockReturnValue({ + http: { + fetch: fetchMock, + post: postMock, + patch: patchMock.mockReturnValue(mockPatchTimelineResponse), + }, + }); + api.persistTimeline({ timelineId, timeline: inputTimeline, version }); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + test('it should update timeline', () => { + expect(patchMock.mock.calls[0][0]).toEqual(TIMELINE_URL); + }); + + test('it should update timeline with patch', () => { + expect(patchMock.mock.calls[0][1].method).toEqual('PATCH'); + }); + + test('should call patch timeline', () => { + expect(JSON.parse(patchMock.mock.calls[0][1].body)).toEqual({ + timeline: inputTimeline, + timelineId, + version, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts index 9f5e65e0fc5af..10893feccfed4 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -77,9 +77,15 @@ export const persistTimeline = async ({ }: RequestPersistTimeline): Promise => { if (timelineId == null && timeline.status === TimelineStatus.draft) { const draftTimeline = await cleanDraftTimeline({ timelineType: timeline.timelineType! }); + return patchTimeline({ timelineId: draftTimeline.data.persistTimeline.timeline.savedObjectId, - timeline, + timeline: { + ...timeline, + templateTimelineId: draftTimeline.data.persistTimeline.timeline.templateTimelineId, + templateTimelineVersion: + draftTimeline.data.persistTimeline.timeline.templateTimelineVersion, + }, version: draftTimeline.data.persistTimeline.timeline.version ?? '', }); } diff --git a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx index 1fc3a33fbca08..e7b66c4e8addb 100644 --- a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx @@ -10,6 +10,7 @@ import React from 'react'; import { useKibana } from '../../common/lib/kibana'; import { TimelinesPageComponent } from './timelines_page'; +import { disableTemplate } from '../../../common/constants'; jest.mock('../../overview/components/events_by_dataset'); @@ -18,6 +19,7 @@ jest.mock('../../common/lib/kibana', () => { useKibana: jest.fn(), }; }); + describe('TimelinesPageComponent', () => { const mockAppollloClient = {} as ApolloClient; let wrapper: ShallowWrapper; @@ -58,6 +60,20 @@ describe('TimelinesPageComponent', () => { wrapper.find('[data-test-subj="stateful-open-timeline"]').prop('importDataModalToggle') ).toEqual(true); }); + + test('it renders create timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-default-btn"]').exists()).toBeTruthy(); + }); + + /* + * CreateTemplateTimelineBtn + * Remove the comment here to enable CreateTemplateTimelineBtn + */ + test('it renders no create template timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-template-btn"]').exists()).toEqual( + !disableTemplate + ); + }); }); describe('If the user is not authorised', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx index fd734d10ecba0..2c692d850cd16 100644 --- a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx +++ b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx @@ -4,15 +4,23 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiButton } from '@elastic/eui'; +import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import ApolloClient from 'apollo-client'; import React, { useCallback, useState } from 'react'; import styled from 'styled-components'; + +import { disableTemplate } from '../../../common/constants'; + import { HeaderPage } from '../../common/components/header_page'; import { WrapperPage } from '../../common/components/wrapper_page'; import { useKibana } from '../../common/lib/kibana'; import { SpyRoute } from '../../common/utils/route/spy_routes'; + import { StatefulOpenTimeline } from '../components/open_timeline'; +import { NEW_TEMPLATE_TIMELINE } from '../components/timeline/properties/translations'; +import { NewTemplateTimeline } from '../components/timeline/properties/new_template_timeline'; +import { NewTimeline } from '../components/timeline/properties/helpers'; + import * as i18n from './translations'; const TimelinesContainer = styled.div` @@ -34,24 +42,47 @@ export const TimelinesPageComponent: React.FC = ({ apolloClient }) => }, [setImportDataModalToggle]); const uiCapabilities = useKibana().services.application.capabilities; - const capabilitiesCanUserCRUD: boolean = - typeof uiCapabilities.securitySolution.crud === 'boolean' - ? uiCapabilities.securitySolution.crud - : false; + const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; return ( <> - {capabilitiesCanUserCRUD && ( - - {i18n.ALL_TIMELINES_IMPORT_TIMELINE_TITLE} - - )} + + + {capabilitiesCanUserCRUD && ( + + {i18n.ALL_TIMELINES_IMPORT_TIMELINE_TITLE} + + )} + + + {capabilitiesCanUserCRUD && ( + + )} + + {/** + * CreateTemplateTimelineBtn + * Remove the comment here to enable CreateTemplateTimelineBtn + */} + {!disableTemplate && ( + + + + )} + diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts index e11d1bcc72e09..e8b5ba68eecdf 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts @@ -16,6 +16,7 @@ import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/t import { EventType, KqlMode, TimelineModel, ColumnHeaderOptions } from './model'; import { TimelineNonEcsData } from '../../../graphql/types'; +import { TimelineTypeLiteral } from '../../../../common/types/timeline'; const actionCreator = actionCreatorFactory('x-pack/security_solution/local/timeline'); @@ -67,6 +68,7 @@ export const createTimeline = actionCreator<{ sort?: Sort; showCheckboxes?: boolean; showRowRenderers?: boolean; + timelineType?: TimelineTypeLiteral; }>('CREATE_TIMELINE'); export const pinEvent = actionCreator<{ id: string; eventId: string }>('PIN_EVENT'); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts index b2472cbe89a50..97ac423cee653 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts @@ -7,6 +7,9 @@ import { getOr, omit, uniq, isEmpty, isEqualWith, union } from 'lodash/fp'; import { Filter } from '../../../../../../../src/plugins/data/public'; + +import { disableTemplate } from '../../../../common/constants'; + import { getColumnWidthFromType } from '../../../timelines/components/timeline/body/column_headers/helpers'; import { Sort } from '../../../timelines/components/timeline/body/sort'; import { @@ -15,11 +18,12 @@ import { QueryMatch, } from '../../../timelines/components/timeline/data_providers/data_provider'; import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/model'; +import { TimelineNonEcsData } from '../../../graphql/types'; +import { TimelineTypeLiteral } from '../../../../common/types/timeline'; import { timelineDefaults } from './defaults'; import { ColumnHeaderOptions, KqlMode, TimelineModel, EventType } from './model'; import { TimelineById, TimelineState } from './types'; -import { TimelineNonEcsData } from '../../../graphql/types'; const EMPTY_TIMELINE_BY_ID: TimelineById = {}; // stable reference @@ -147,6 +151,7 @@ interface AddNewTimelineParams { showCheckboxes?: boolean; showRowRenderers?: boolean; timelineById: TimelineById; + timelineType: TimelineTypeLiteral; } /** Adds a new `Timeline` to the provided collection of `TimelineById` */ @@ -163,6 +168,7 @@ export const addNewTimeline = ({ showCheckboxes = false, showRowRenderers = true, timelineById, + timelineType, }: AddNewTimelineParams): TimelineById => ({ ...timelineById, [id]: { @@ -182,6 +188,7 @@ export const addNewTimeline = ({ isLoading: false, showCheckboxes, showRowRenderers, + timelineType: !disableTemplate ? timelineType : timelineDefaults.timelineType, }, }); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts index d17bc1f20e1e8..3bdb16be79939 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts @@ -139,6 +139,7 @@ describe('Timeline', () => { id: 'bar', columns: defaultHeaders, timelineById: timelineByIdMock, + timelineType: TimelineType.default, }); expect(update).not.toBe(timelineByIdMock); }); @@ -148,6 +149,7 @@ describe('Timeline', () => { id: 'bar', columns: timelineDefaults.columns, timelineById: timelineByIdMock, + timelineType: TimelineType.default, }); expect(update).toEqual({ foo: timelineByIdMock.foo, @@ -163,6 +165,7 @@ describe('Timeline', () => { id: 'bar', columns: defaultHeaders, timelineById: timelineByIdMock, + timelineType: TimelineType.default, }); expect(update).toEqual({ foo: timelineByIdMock.foo, diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts index a8ae39527cdbf..3666968e8ab92 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts @@ -98,6 +98,7 @@ import { } from './helpers'; import { TimelineState, EMPTY_TIMELINE_BY_ID } from './types'; +import { TimelineType } from '../../../../common/types/timeline'; export const initialTimelineState: TimelineState = { timelineById: EMPTY_TIMELINE_BY_ID, @@ -129,6 +130,7 @@ export const timelineReducer = reducerWithInitialState(initialTimelineState) sort, showCheckboxes, showRowRenderers, + timelineType = TimelineType.default, filters, } ) => ({ @@ -146,6 +148,7 @@ export const timelineReducer = reducerWithInitialState(initialTimelineState) showCheckboxes, showRowRenderers, timelineById: state.timelineById, + timelineType, }), }) ) diff --git a/x-pack/plugins/security_solution/server/lib/timeline/pick_saved_timeline.ts b/x-pack/plugins/security_solution/server/lib/timeline/pick_saved_timeline.ts index 40c568ecda741..281726d488abe 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/pick_saved_timeline.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/pick_saved_timeline.ts @@ -39,17 +39,15 @@ export const pickSavedTimeline = ( savedTimeline.templateTimelineVersion = savedTimeline.templateTimelineVersion + 1; } } - } else if (savedTimeline.status === TimelineStatus.draft) { - savedTimeline.status = !isEmpty(savedTimeline.title) - ? TimelineStatus.active - : TimelineStatus.draft; - savedTimeline.templateTimelineId = null; - savedTimeline.templateTimelineVersion = null; } else { savedTimeline.timelineType = savedTimeline.timelineType ?? TimelineType.default; savedTimeline.templateTimelineId = null; savedTimeline.templateTimelineVersion = null; } + if (!isEmpty(savedTimeline.title) && savedTimeline.status === TimelineStatus.draft) { + savedTimeline.status = TimelineStatus.active; + } + return savedTimeline; }; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.test.ts index 9dc957604d4df..0e53cee0bf8ac 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.test.ts @@ -17,6 +17,7 @@ import { cleanDraftTimelinesRequest, createTimelineWithTimelineId, } from './__mocks__/request_responses'; +import { draftTimelineDefaults } from '../default_timeline'; describe('clean draft timelines', () => { let server: ReturnType; @@ -81,7 +82,12 @@ describe('clean draft timelines', () => { }); const response = await server.inject(cleanDraftTimelinesRequest(TimelineType.default), context); + const req = cleanDraftTimelinesRequest(TimelineType.default); expect(mockPersistTimeline).toHaveBeenCalled(); + expect(mockPersistTimeline.mock.calls[0][3]).toEqual({ + ...draftTimelineDefaults, + timelineType: req.body.timelineType, + }); expect(response.status).toEqual(200); expect(response.body).toEqual({ data: { @@ -100,8 +106,13 @@ describe('clean draft timelines', () => { mockGetTimeline.mockResolvedValue({ ...mockGetDraftTimelineValue }); const response = await server.inject(cleanDraftTimelinesRequest(TimelineType.default), context); + const req = cleanDraftTimelinesRequest(TimelineType.default); + expect(mockPersistTimeline).not.toHaveBeenCalled(); expect(mockResetTimeline).toHaveBeenCalled(); + expect(mockResetTimeline.mock.calls[0][1]).toEqual([mockGetDraftTimelineValue.savedObjectId]); + expect(mockResetTimeline.mock.calls[0][2]).toEqual(req.body.timelineType); + expect(mockGetTimeline).toHaveBeenCalled(); expect(response.status).toEqual(200); expect(response.body).toEqual({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.ts index 30225da6b42cc..9ad50b8f2266c 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.ts @@ -40,7 +40,11 @@ export const cleanDraftTimelinesRoute = ( } = await getDraftTimeline(frameworkRequest, request.body.timelineType); if (draftTimeline?.savedObjectId) { - await resetTimeline(frameworkRequest, [draftTimeline.savedObjectId]); + await resetTimeline( + frameworkRequest, + [draftTimeline.savedObjectId], + request.body.timelineType + ); const cleanedDraftTimeline = await getTimeline( frameworkRequest, draftTimeline.savedObjectId @@ -57,12 +61,10 @@ export const cleanDraftTimelinesRoute = ( }); } - const newTimelineResponse = await persistTimeline( - frameworkRequest, - null, - null, - draftTimelineDefaults - ); + const newTimelineResponse = await persistTimeline(frameworkRequest, null, null, { + ...draftTimelineDefaults, + timelineType: request.body.timelineType, + }); if (newTimelineResponse.code === 200) { return response.ok({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.test.ts index e9bceb2c66806..5447da8ef49d2 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.test.ts @@ -17,6 +17,7 @@ import { getDraftTimelinesRequest, createTimelineWithTimelineId, } from './__mocks__/request_responses'; +import { draftTimelineDefaults } from '../default_timeline'; describe('get draft timelines', () => { let server: ReturnType; @@ -80,12 +81,14 @@ describe('get draft timelines', () => { mockGetDraftTimeline.mockResolvedValue({ timeline: [], }); - - const response = await server.inject( - getDraftTimelinesRequest(TimelineType.default), - context - ); + const req = getDraftTimelinesRequest(TimelineType.default); + const response = await server.inject(req, context); expect(mockPersistTimeline).toHaveBeenCalled(); + expect(mockPersistTimeline.mock.calls[0][3]).toEqual({ + ...draftTimelineDefaults, + timelineType: req.query.timelineType, + }); + expect(response.status).toEqual(200); expect(response.body).toEqual({ data: { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.ts index 7b379741fc217..4db434ec816aa 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.ts @@ -51,12 +51,10 @@ export const getDraftTimelinesRoute = ( }); } - const newTimelineResponse = await persistTimeline( - frameworkRequest, - null, - null, - draftTimelineDefaults - ); + const newTimelineResponse = await persistTimeline(frameworkRequest, null, null, { + ...draftTimelineDefaults, + timelineType: request.query.timelineType, + }); if (newTimelineResponse.code === 200) { return response.ok({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/update_timelines_route.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/update_timelines_route.ts index a479c818cb01d..d5ecd408a6ef4 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/update_timelines_route.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/update_timelines_route.ts @@ -52,6 +52,7 @@ export const updateTimelinesRoute = ( templateTimelineId != null ? await getTemplateTimeline(frameworkRequest, templateTimelineId) : null; + const errorObj = checkIsFailureCases( isHandlingTemplateTimeline, version, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object.ts index dfbf273cbdec2..bbb11cd642c4c 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object.ts @@ -7,7 +7,7 @@ import { getOr } from 'lodash/fp'; import { SavedObjectsFindOptions } from '../../../../../../src/core/server'; -import { UNAUTHENTICATED_USER } from '../../../common/constants'; +import { UNAUTHENTICATED_USER, disableTemplate } from '../../../common/constants'; import { NoteSavedObject } from '../../../common/types/timeline/note'; import { PinnedEventSavedObject } from '../../../common/types/timeline/pinned_event'; import { @@ -122,7 +122,6 @@ const getTimelineTypeFilter = ( const draftFilter = includeDraft ? `siem-ui-timeline.attributes.status: ${TimelineStatus.draft}` : `not siem-ui-timeline.attributes.status: ${TimelineStatus.draft}`; - return `${typeFilter} and ${draftFilter}`; }; @@ -147,7 +146,7 @@ export const getAllTimeline = async ( * Remove the comment here to enable template timeline and apply the change below * filter: getTimelineTypeFilter(timelineType, false) */ - filter: getTimelineTypeFilter(TimelineType.default, false), + filter: getTimelineTypeFilter(disableTemplate ? TimelineType.default : timelineType, false), sortField: sort != null ? sort.sortField : undefined, sortOrder: sort != null ? sort.sortOrder : undefined, }; @@ -321,7 +320,11 @@ const updatePartialSavedTimeline = async ( ); }; -export const resetTimeline = async (request: FrameworkRequest, timelineIds: string[]) => { +export const resetTimeline = async ( + request: FrameworkRequest, + timelineIds: string[], + timelineType: TimelineType +) => { if (!timelineIds.length) { return Promise.reject(new Error('timelineIds is empty')); } @@ -337,7 +340,7 @@ export const resetTimeline = async (request: FrameworkRequest, timelineIds: stri const response = await Promise.all( timelineIds.map((timelineId) => - updatePartialSavedTimeline(request, timelineId, draftTimelineDefaults) + updatePartialSavedTimeline(request, timelineId, { ...draftTimelineDefaults, timelineType }) ) ); From 0a738917142edd260b2eb566df4fe925291d35a7 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Tue, 9 Jun 2020 12:21:42 +0200 Subject: [PATCH 37/91] bumping makelogs version to v6.0.0 (#66163) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9423ee31c8bbe..5bf39a57c1ac5 100644 --- a/package.json +++ b/package.json @@ -298,7 +298,7 @@ "@elastic/eslint-config-kibana": "0.15.0", "@elastic/eslint-plugin-eui": "0.0.2", "@elastic/github-checks-reporter": "0.0.20b3", - "@elastic/makelogs": "^5.0.1", + "@elastic/makelogs": "^6.0.0", "@kbn/dev-utils": "1.0.0", "@kbn/es": "1.0.0", "@kbn/eslint-import-resolver-kibana": "2.0.0", diff --git a/yarn.lock b/yarn.lock index 2efda1cf7a2cd..f7b310cca7590 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1389,10 +1389,10 @@ oppsy "2.x.x" pumpify "1.3.x" -"@elastic/makelogs@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@elastic/makelogs/-/makelogs-5.0.1.tgz#f4f9f5edc61299c7c81f5f30629e3a6fe72a50d7" - integrity sha512-I0QOzIHkWlaKVLqQkJMTHMW6F+yYK0Boq84RIVXGFkoeq82Vsn6jww2SBJ5wSjHa8M7HRfa2g4uqH6u+RSKlxA== +"@elastic/makelogs@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@elastic/makelogs/-/makelogs-6.0.0.tgz#d6d74d5d0f020123c54160370d49ca5e0aab1fe1" + integrity sha512-i+BMxM3pKy9CAqcvMvdHLxvM0Dlnx+4JeScWHM9fFn4+2rAHGCqWflm/UGhTgQh3xn+yXKMLoEbfMIi5Aw1ysw== dependencies: async "^1.4.2" commander "^5.0.0" From bebbd6d2c4dc5306e497422aacde87a287130150 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jun 2020 12:24:30 +0100 Subject: [PATCH 38/91] chore(NA): skip apis Endpoint plugin Endpoint policy api (#68638) --- x-pack/test/api_integration/apis/endpoint/policy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/endpoint/policy.ts b/x-pack/test/api_integration/apis/endpoint/policy.ts index 792c8440cdea1..c3e95f2db1bc0 100644 --- a/x-pack/test/api_integration/apis/endpoint/policy.ts +++ b/x-pack/test/api_integration/apis/endpoint/policy.ts @@ -10,7 +10,8 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - describe('Endpoint policy api', () => { + // SKIPPED as it is failing ES PROMOTION: https://github.com/elastic/kibana/issues/68638 + describe.skip('Endpoint policy api', () => { describe('GET /api/endpoint/policy_response', () => { before(async () => await esArchiver.load('endpoint/policy')); From 974dcab91733ff7adeabb760e0373d5bbcbfb1cf Mon Sep 17 00:00:00 2001 From: John Schulz Date: Tue, 9 Jun 2020 08:23:07 -0400 Subject: [PATCH 39/91] [Ingest] OpenAPI spec file (#68323) * All(?) routes Lots have one or more things wrong but it's a start * Some Agent-related models & routes. Plus some examples for request and responses * Ignore rule requring PascalCase interfaces It's not an option to change interface name, afaict lowercase matches the OpenAPI spec/key name * Remove generated specs * Fix misplaced schema Response shape was listed as a request body Co-authored-by: Elastic Machine --- .../common/openapi/spec_oas3.json | 4397 +++++++++++++++++ 1 file changed, 4397 insertions(+) create mode 100644 x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json diff --git a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json new file mode 100644 index 0000000000000..f0ed3ed9a0364 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json @@ -0,0 +1,4397 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Ingest Manager", + "version": "0.2", + "contact": { + "name": "Ingest Team" + }, + "license": { + "name": "Elastic" + } + }, + "servers": [ + { + "url": "http://localhost:5601/api/ingest_manager", + "description": "local" + } + ], + "paths": { + "/agent_configs": { + "get": { + "summary": "Agent Config - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentConfig" + } + }, + "total": { + "type": "number" + }, + "page": { + "type": "number" + }, + "perPage": { + "type": "number" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "items", + "total", + "page", + "perPage", + "success" + ] + }, + "examples": { + "success": { + "value": { + "items": [ + { + "id": "82da1fc0-8fbf-11ea-b2ce-01c4a6127154", + "name": "Default config", + "namespace": "default", + "description": "Default agent configuration created by Kibana", + "status": "active", + "datasources": [ + "8a5679b0-8fbf-11ea-b2ce-01c4a6127154" + ], + "is_default": true, + "monitoring_enabled": [ + "logs", + "metrics" + ], + "revision": 2, + "updated_on": "2020-05-06T17:32:21.905Z", + "updated_by": "system", + "agents": 0 + } + ], + "total": 1, + "page": 1, + "perPage": 50, + "success": true + } + } + } + } + } + } + }, + "operationId": "agent-config-list", + "parameters": [ + { + "$ref": "#/components/parameters/pageSizeParam" + }, + { + "$ref": "#/components/parameters/pageIndexParam" + }, + { + "$ref": "#/components/parameters/kueryParam" + } + ], + "description": "" + }, + "post": { + "summary": "Agent Config - Create", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/AgentConfig" + }, + "success": { + "type": "boolean" + } + } + } + } + } + } + }, + "operationId": "post-agent_configs", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewAgentConfig" + } + } + } + }, + "security": [], + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/agent_configs/{agentConfigId}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentConfigId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Agent Config - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/AgentConfig" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "item", + "success" + ] + }, + "examples": { + "success": { + "value": { + "item": { + "id": "82da1fc0-8fbf-11ea-b2ce-01c4a6127154", + "name": "Default config", + "namespace": "default", + "description": "Default agent configuration created by Kibana", + "status": "active", + "datasources": [ + { + "id": "8a5679b0-8fbf-11ea-b2ce-01c4a6127154", + "name": "system-1", + "namespace": "default", + "package": { + "name": "system", + "title": "System", + "version": "0.0.3" + }, + "enabled": true, + "config_id": "82da1fc0-8fbf-11ea-b2ce-01c4a6127154", + "output_id": "08adc51c-69f3-4294-80e2-24527c6ff73d", + "inputs": [ + { + "type": "logs", + "enabled": true, + "streams": [ + { + "id": "logs-system.auth", + "enabled": true, + "dataset": "system.auth", + "vars": { + "paths": { + "value": [ + "/var/log/auth.log*", + "/var/log/secure*" + ], + "type": "text" + } + }, + "agent_stream": { + "paths": [ + "/var/log/auth.log*", + "/var/log/secure*" + ], + "exclude_files": [ + ".gz$" + ], + "multiline": { + "pattern": "^\\s", + "match": "after" + }, + "processors": [ + { + "add_locale": null + }, + { + "add_fields": { + "target": "", + "fields": { + "ecs.version": "1.5.0" + } + } + } + ] + } + }, + { + "id": "logs-system.syslog", + "enabled": true, + "dataset": "system.syslog", + "vars": { + "paths": { + "value": [ + "/var/log/messages*", + "/var/log/syslog*" + ], + "type": "text" + } + }, + "agent_stream": { + "paths": [ + "/var/log/messages*", + "/var/log/syslog*" + ], + "exclude_files": [ + ".gz$" + ], + "multiline": { + "pattern": "^\\s", + "match": "after" + }, + "processors": [ + { + "add_locale": null + }, + { + "add_fields": { + "target": "", + "fields": { + "ecs.version": "1.5.0" + } + } + } + ] + } + } + ] + }, + { + "type": "system/metrics", + "enabled": true, + "streams": [ + { + "id": "system/metrics-system.core", + "enabled": true, + "dataset": "system.core", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "core" + ], + "core.metrics": "percentages" + } + }, + { + "id": "system/metrics-system.cpu", + "enabled": true, + "dataset": "system.cpu", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "cpu" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.diskio", + "enabled": true, + "dataset": "system.diskio", + "agent_stream": { + "metricsets": [ + "diskio" + ] + } + }, + { + "id": "system/metrics-system.entropy", + "enabled": true, + "dataset": "system.entropy", + "agent_stream": { + "metricsets": [ + "entropy" + ] + } + }, + { + "id": "system/metrics-system.filesystem", + "enabled": true, + "dataset": "system.filesystem", + "vars": { + "period": { + "value": "1m", + "type": "text" + }, + "processors": { + "value": "- drop_event.when.regexp:\n system.filesystem.mount_point: ^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)\n", + "type": "yaml" + } + }, + "agent_stream": { + "metricsets": [ + "filesystem" + ], + "period": "1m", + "processors": [ + { + "drop_event.when.regexp": { + "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" + } + } + ] + } + }, + { + "id": "system/metrics-system.fsstat", + "enabled": true, + "dataset": "system.fsstat", + "vars": { + "period": { + "value": "1m", + "type": "text" + }, + "processors": { + "value": "- drop_event.when.regexp:\n system.filesystem.mount_point: ^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)\n", + "type": "yaml" + } + }, + "agent_stream": { + "metricsets": [ + "fsstat" + ], + "period": "1m", + "processors": [ + { + "drop_event.when.regexp": { + "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" + } + } + ] + } + }, + { + "id": "system/metrics-system.load", + "enabled": true, + "dataset": "system.load", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "load" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.memory", + "enabled": true, + "dataset": "system.memory", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "memory" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.network", + "enabled": true, + "dataset": "system.network", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "network" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.network_summary", + "enabled": true, + "dataset": "system.network_summary", + "agent_stream": { + "metricsets": [ + "network_summary" + ] + } + }, + { + "id": "system/metrics-system.process", + "enabled": true, + "dataset": "system.process", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "process" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.process_summary", + "enabled": true, + "dataset": "system.process_summary", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "process_summary" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.raid", + "enabled": true, + "dataset": "system.raid", + "agent_stream": { + "metricsets": [ + "raid" + ] + } + }, + { + "id": "system/metrics-system.service", + "enabled": true, + "dataset": "system.service", + "agent_stream": { + "metricsets": [ + "service" + ] + } + }, + { + "id": "system/metrics-system.socket", + "enabled": true, + "dataset": "system.socket", + "agent_stream": { + "metricsets": [ + "socket" + ] + } + }, + { + "id": "system/metrics-system.socket_summary", + "enabled": true, + "dataset": "system.socket_summary", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "socket_summary" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.uptime", + "enabled": true, + "dataset": "system.uptime", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "uptime" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "processes": ".*" + } + }, + { + "id": "system/metrics-system.users", + "enabled": true, + "dataset": "system.users", + "agent_stream": { + "metricsets": [ + "users" + ] + } + } + ] + } + ], + "revision": 1 + } + ], + "is_default": true, + "monitoring_enabled": [ + "logs", + "metrics" + ], + "revision": 2, + "updated_on": "2020-05-06T17:32:21.905Z", + "updated_by": "system" + }, + "success": true + } + } + } + } + } + } + }, + "operationId": "agent-config-info", + "description": "Get one agent config", + "parameters": [] + }, + "put": { + "summary": "Agent Config - Update", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/AgentConfig" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "item", + "success" + ] + }, + "examples": { + "example-1": { + "value": { + "item": { + "id": "0b7130d0-5a37-11ea-ac2c-25e9ab4ecb2a", + "name": "UPDATED name", + "description": "UPDATED description", + "namespace": "UPDATED namespace", + "updated_on": "Fri Feb 28 2020 16:22:31 GMT-0500 (Eastern Standard Time)", + "updated_by": "elastic", + "datasources": [] + }, + "success": true + } + } + } + } + } + } + }, + "operationId": "put-agent_configs-agentConfigId", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewAgentConfig" + }, + "examples": { + "example-1": { + "value": { + "name": "UPDATED name", + "description": "UPDATED description", + "namespace": "UPDATED namespace" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/agent_configs/delete": { + "post": { + "summary": "Agent Config - Delete", + "operationId": "post-agent_config-delete", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "id", + "success" + ] + } + }, + "examples": { + "success": { + "value": [ + { + "id": "df7d2540-5a47-11ea-80da-89b5a66da347", + "success": true + } + ] + }, + "fail": { + "value": [ + { + "id": "df7d2540-5a47-11ea-80da-89b5a66da347", + "success": false + } + ] + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "agentConfigIds": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "examples": { + "example-1": { + "value": { + "agentConfigIds": [ + "df7d2540-5a47-11ea-80da-89b5a66da347" + ] + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + }, + "parameters": [] + }, + "/datasources": { + "get": { + "summary": "Datasources - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Datasource" + } + }, + "total": { + "type": "number" + }, + "page": { + "type": "number" + }, + "perPage": { + "type": "number" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "items", + "success" + ] + }, + "examples": { + "example-1": { + "value": { + "items": [ + { + "id": "5d273cf0-5a44-11ea-80da-89b5a66da347", + "use_output": "default", + "inputs": [ + { + "type": "docker/metrics", + "streams": [ + { + "metricset": "status", + "dataset": "docker.status" + } + ] + }, + { + "type": "logs", + "streams": [ + { + "paths": [ + "/var/log/hello1.log", + "/var/log/hello2.log" + ] + } + ] + } + ] + }, + { + "id": "66490980-5a44-11ea-80da-89b5a66da347", + "namespace": "testing", + "use_output": "default", + "inputs": [ + { + "type": "apache/metrics", + "streams": [ + { + "enabled": true, + "metricset": "info" + } + ] + } + ] + }, + { + "id": "df1ccae0-5a49-11ea-94a6-81affd263f47", + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + }, + { + "id": "f96a09d0-5a49-11ea-94a6-81affd263f47", + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + }, + { + "id": "9ca403a0-5a66-11ea-9468-c911a41ab4f5", + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + }, + { + "id": "27925980-5a44-11ea-80da-89b5a66da347", + "enabled": true, + "title": "UPDATED title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "streams": [ + { + "paths": [ + "/var/log/nginx/access.log" + ], + "dataset": "nginx.acccess", + "enabled": true + }, + { + "paths": [ + "/var/log/nginx/error.log" + ], + "dataset": "nginx.error", + "enabled": true + } + ], + "type": "logs" + }, + { + "streams": [ + { + "metricset": "stub_status", + "id": "id string", + "dataset": "nginx.stub_status", + "enabled": true + } + ], + "type": "nginx/metrics" + } + ] + } + ], + "total": 6, + "page": 1, + "perPage": 20, + "success": true + } + } + } + } + } + } + }, + "operationId": "get-datasources", + "security": [], + "parameters": [] + }, + "parameters": [], + "post": { + "summary": "Datasources - Create", + "operationId": "post-datasources", + "responses": { + "200": { + "description": "OK" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewDatasource" + }, + "examples": { + "example-1": { + "value": { + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/datasources/{datasourceId}": { + "get": { + "summary": "Datasources - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/Datasource" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "item", + "success" + ] + } + } + } + } + }, + "operationId": "get-datasources-datasourceId" + }, + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "datasourceId", + "in": "path", + "required": true + } + ], + "put": { + "summary": "Datasources - Update", + "operationId": "put-datasources-datasourceId", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/Datasource" + }, + "sucess": { + "type": "boolean" + } + }, + "required": [ + "item", + "sucess" + ] + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/setup": { + "get": { + "summary": "Fleet setup - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isInitialized": { + "type": "boolean" + } + }, + "required": [ + "isInitialized" + ] + }, + "examples": { + "success": { + "value": { + "isInitialized": true + } + }, + "failure": { + "value": { + "isInitialized": false + } + } + } + } + } + } + }, + "operationId": "get-fleet-setup", + "security": [ + { + "basicAuth": [] + } + ] + }, + "post": { + "summary": "Fleet setup - Create", + "operationId": "post-fleet-setup", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isInitialized": { + "type": "boolean" + } + }, + "required": [ + "isInitialized" + ] + }, + "examples": { + "success": { + "value": { + "isInitialized": true + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "admin_username": { + "type": "string" + }, + "admin_password": { + "type": "string" + } + }, + "required": [ + "admin_username", + "admin_password" + ] + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/epm/packages/{pkgkey}": { + "get": { + "summary": "EPM - Packages - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "properties": { + "response": { + "$ref": "#/components/schemas/PackageInfo" + }, + "success": { + "type": "boolean" + } + } + }, + { + "properties": { + "status": { + "type": "string", + "enum": [ + "installed", + "not_installed" + ] + }, + "savedObject": { + "type": "string" + } + }, + "required": [ + "status", + "savedObject" + ] + } + ] + }, + "examples": { + "example-1": { + "value": { + "response": { + "name": "coredns", + "title": "CoreDNS", + "version": "1.0.1", + "readme": "/package/coredns-1.0.1/docs/README.md", + "description": "CoreDNS logs and metrics integration.\nThe CoreDNS integrations allows to gather logs and metrics from the CoreDNS DNS server to get better insights.\n", + "type": "integration", + "categories": [ + "logs", + "metrics" + ], + "requirement": { + "kibana": { + "versions": ">6.7.0" + } + }, + "icons": [ + { + "src": "/package/coredns-1.0.1/img/icon.png", + "size": "1800x1800" + }, + { + "src": "/package/coredns-1.0.1/img/icon.svg", + "size": "255x144", + "type": "image/svg+xml" + } + ], + "assets": { + "kibana": { + "dashboard": [ + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "dashboard", + "file": "53aa1f70-443e-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/dashboard/53aa1f70-443e-11e9-8548-ab7fbe04f038.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "dashboard", + "file": "Metricbeat-CoreDNS-Dashboard-ecs.json", + "path": "coredns-1.0.1/kibana/dashboard/Metricbeat-CoreDNS-Dashboard-ecs.json" + } + ], + "visualization": [ + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "277fc650-67a9-11e9-a534-715561d0bf42.json", + "path": "coredns-1.0.1/kibana/visualization/277fc650-67a9-11e9-a534-715561d0bf42.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "27da53f0-53d5-11e9-b466-9be470bbd327-ecs.json", + "path": "coredns-1.0.1/kibana/visualization/27da53f0-53d5-11e9-b466-9be470bbd327-ecs.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "36e08510-53c4-11e9-b466-9be470bbd327-ecs.json", + "path": "coredns-1.0.1/kibana/visualization/36e08510-53c4-11e9-b466-9be470bbd327-ecs.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "3ad75810-4429-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/visualization/3ad75810-4429-11e9-8548-ab7fbe04f038.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "4804eaa0-7315-11e9-b0d0-414c3011ddbb.json", + "path": "coredns-1.0.1/kibana/visualization/4804eaa0-7315-11e9-b0d0-414c3011ddbb.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "57c74300-7308-11e9-b0d0-414c3011ddbb.json", + "path": "coredns-1.0.1/kibana/visualization/57c74300-7308-11e9-b0d0-414c3011ddbb.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "75743f70-443c-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/visualization/75743f70-443c-11e9-8548-ab7fbe04f038.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "86177430-728d-11e9-b0d0-414c3011ddbb.json", + "path": "coredns-1.0.1/kibana/visualization/86177430-728d-11e9-b0d0-414c3011ddbb.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "9dc640e0-4432-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/visualization/9dc640e0-4432-11e9-8548-ab7fbe04f038.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "a19df590-53c4-11e9-b466-9be470bbd327-ecs.json", + "path": "coredns-1.0.1/kibana/visualization/a19df590-53c4-11e9-b466-9be470bbd327-ecs.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "a58345f0-7298-11e9-b0d0-414c3011ddbb.json", + "path": "coredns-1.0.1/kibana/visualization/a58345f0-7298-11e9-b0d0-414c3011ddbb.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "cfde7fb0-443d-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/visualization/cfde7fb0-443d-11e9-8548-ab7fbe04f038.json" + } + ] + } + }, + "format_version": "1.0.0", + "datasets": [ + { + "title": "CoreDNS logs", + "name": "log", + "release": "ga", + "type": "logs", + "ingest_pipeline": "pipeline-entry", + "vars": [ + { + "default": [ + "/var/log/coredns.log" + ], + "name": "paths", + "type": "textarea" + }, + { + "default": [ + "coredns" + ], + "name": "tags", + "type": "text" + } + ], + "package": "coredns" + }, + { + "title": "CoreDNS stats metrics", + "name": "stats", + "release": "ga", + "type": "metrics", + "vars": [ + { + "default": [ + "http://localhost:9153" + ], + "description": "CoreDNS hosts", + "name": "hosts", + "required": true + }, + { + "default": "10s", + "description": "Collection period. Valid values: 10s, 5m, 2h", + "name": "period" + }, + { + "name": "username", + "type": "text" + }, + { + "name": "password", + "type": "password" + } + ], + "package": "coredns" + } + ], + "download": "/epr/coredns/coredns-1.0.1.tar.gz", + "path": "/package/coredns-1.0.1", + "status": "installed", + "savedObject": { + "id": "coredns-1.0.1", + "type": "epm-package", + "updated_at": "2020-02-27T16:25:43.652Z", + "version": "WzU2LDFd", + "attributes": { + "installed": [ + { + "id": "53aa1f70-443e-11e9-8548-ab7fbe04f038", + "type": "dashboard" + }, + { + "id": "Metricbeat-CoreDNS-Dashboard-ecs", + "type": "dashboard" + }, + { + "id": "75743f70-443c-11e9-8548-ab7fbe04f038", + "type": "visualization" + }, + { + "id": "36e08510-53c4-11e9-b466-9be470bbd327-ecs", + "type": "visualization" + }, + { + "id": "277fc650-67a9-11e9-a534-715561d0bf42", + "type": "visualization" + }, + { + "id": "cfde7fb0-443d-11e9-8548-ab7fbe04f038", + "type": "visualization" + }, + { + "id": "a19df590-53c4-11e9-b466-9be470bbd327-ecs", + "type": "visualization" + }, + { + "id": "a58345f0-7298-11e9-b0d0-414c3011ddbb", + "type": "visualization" + }, + { + "id": "9dc640e0-4432-11e9-8548-ab7fbe04f038", + "type": "visualization" + }, + { + "id": "3ad75810-4429-11e9-8548-ab7fbe04f038", + "type": "visualization" + }, + { + "id": "57c74300-7308-11e9-b0d0-414c3011ddbb", + "type": "visualization" + }, + { + "id": "27da53f0-53d5-11e9-b466-9be470bbd327-ecs", + "type": "visualization" + }, + { + "id": "86177430-728d-11e9-b0d0-414c3011ddbb", + "type": "visualization" + }, + { + "id": "4804eaa0-7315-11e9-b0d0-414c3011ddbb", + "type": "visualization" + }, + { + "id": "logs-log-1.0.1-pipeline-plaintext", + "type": "ingest-pipeline" + }, + { + "id": "logs-log-1.0.1-pipeline-json", + "type": "ingest-pipeline" + }, + { + "id": "logs-log-1.0.1", + "type": "ingest-pipeline" + }, + { + "id": "logs-log", + "type": "index-template" + }, + { + "id": "metrics-stats", + "type": "index-template" + } + ] + }, + "references": [] + } + }, + "success": true + } + } + } + } + } + } + }, + "operationId": "get-epm-package-pkgkey", + "security": [ + { + "basicAuth": [] + } + ] + }, + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "pkgkey", + "in": "path", + "required": true + } + ], + "post": { + "summary": "EPM - Packages - Install", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "response": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ] + } + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "response", + "success" + ] + } + } + } + } + }, + "operationId": "post-epm-install-pkgkey", + "description": "", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + }, + "delete": { + "summary": "EPM - Packages - Delete", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "response": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ] + } + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "response", + "success" + ] + } + } + } + } + }, + "operationId": "post-epm-delete-pkgkey", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/epm/packages": { + "get": { + "summary": "EPM - Packages - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchResult" + } + }, + "examples": { + "success": { + "value": { + "response": [ + { + "description": "aws Integration", + "download": "/epr/aws/aws-0.0.3.tar.gz", + "icons": [ + { + "src": "/package/aws/0.0.3/img/logo_aws.svg", + "title": "logo aws", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "aws", + "path": "/package/aws/0.0.3", + "title": "aws", + "type": "integration", + "version": "0.0.3", + "status": "not_installed" + }, + { + "description": "This is the Elastic Endpoint package.", + "download": "/epr/endpoint/endpoint-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/endpoint/0.1.0/img/logo-endpoint-64-color.svg", + "size": "16x16", + "type": "image/svg+xml" + } + ], + "name": "endpoint", + "path": "/package/endpoint/0.1.0", + "title": "Elastic Endpoint", + "type": "solution", + "version": "0.1.0", + "status": "installed", + "savedObject": { + "type": "epm-packages", + "id": "endpoint", + "attributes": { + "installed": [ + { + "id": "826759f0-7074-11ea-9bc8-6b38f4d29a16", + "type": "dashboard" + }, + { + "id": "55387750-729c-11ea-9bc8-6b38f4d29a16", + "type": "visualization" + }, + { + "id": "92b1edc0-706a-11ea-9bc8-6b38f4d29a16", + "type": "visualization" + }, + { + "id": "1cfceda0-728b-11ea-9bc8-6b38f4d29a16", + "type": "visualization" + }, + { + "id": "1e525190-7074-11ea-9bc8-6b38f4d29a16", + "type": "visualization" + }, + { + "id": "a3a3bd10-706b-11ea-9bc8-6b38f4d29a16", + "type": "map" + }, + { + "id": "events-endpoint", + "type": "index-template" + }, + { + "id": "metrics-endpoint", + "type": "index-template" + } + ], + "es_index_patterns": { + "events": "events-endpoint-*", + "metadata": "metrics-endpoint-*" + }, + "name": "endpoint", + "version": "0.1.0", + "internal": false, + "removable": false + }, + "references": [], + "updated_at": "2020-05-15T20:08:11.739Z", + "version": "WzEwOCwxXQ==" + } + }, + { + "description": "The log package should be used to create data sources for all type of logs for which an package doesn't exist yet.\n", + "download": "/epr/log/log-0.9.0.tar.gz", + "icons": [ + { + "src": "/package/log/0.9.0/img/icon.svg", + "type": "image/svg+xml" + } + ], + "name": "log", + "path": "/package/log/0.9.0", + "title": "Log Package", + "type": "integration", + "version": "0.9.0", + "status": "not_installed" + }, + { + "description": "This integration contains pretty long documentation.\nIt is used to show the different visualisations inside a documentation to test how we handle it.\nThe integration does not contain any assets except the documentation page.\n", + "download": "/epr/longdocs/longdocs-1.0.4.tar.gz", + "icons": [ + { + "src": "/package/longdocs/1.0.4/img/icon.svg", + "type": "image/svg+xml" + } + ], + "name": "longdocs", + "path": "/package/longdocs/1.0.4", + "title": "Long Docs", + "type": "integration", + "version": "1.0.4", + "status": "not_installed" + }, + { + "description": "This is an integration with only the metrics category.\n", + "download": "/epr/metricsonly/metricsonly-2.0.1.tar.gz", + "icons": [ + { + "src": "/package/metricsonly/2.0.1/img/icon.svg", + "type": "image/svg+xml" + } + ], + "name": "metricsonly", + "path": "/package/metricsonly/2.0.1", + "title": "Metrics Only", + "type": "integration", + "version": "2.0.1", + "status": "not_installed" + }, + { + "description": "Multiple versions of this integration exist.\n", + "download": "/epr/multiversion/multiversion-1.1.0.tar.gz", + "icons": [ + { + "src": "/package/multiversion/1.1.0/img/icon.svg", + "type": "image/svg+xml" + } + ], + "name": "multiversion", + "path": "/package/multiversion/1.1.0", + "title": "Multi Version", + "type": "integration", + "version": "1.1.0", + "status": "not_installed" + }, + { + "description": "MySQL Integration", + "download": "/epr/mysql/mysql-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/mysql/0.1.0/img/logo_mysql.svg", + "title": "logo mysql", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "mysql", + "path": "/package/mysql/0.1.0", + "title": "MySQL", + "type": "integration", + "version": "0.1.0", + "status": "not_installed" + }, + { + "description": "Nginx Integration", + "download": "/epr/nginx/nginx-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/nginx/0.1.0/img/logo_nginx.svg", + "title": "logo nginx", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "nginx", + "path": "/package/nginx/0.1.0", + "title": "Nginx", + "type": "integration", + "version": "0.1.0", + "status": "not_installed" + }, + { + "description": "Redis Integration", + "download": "/epr/redis/redis-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/redis/0.1.0/img/logo_redis.svg", + "title": "logo redis", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "redis", + "path": "/package/redis/0.1.0", + "title": "Redis", + "type": "integration", + "version": "0.1.0", + "status": "not_installed" + }, + { + "description": "This package is used for defining all the properties of a package, the possible assets etc. It serves as a reference on all the config options which are possible.\n", + "download": "/epr/reference/reference-1.0.0.tar.gz", + "icons": [ + { + "src": "/package/reference/1.0.0/img/icon.svg", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "reference", + "path": "/package/reference/1.0.0", + "title": "Reference package", + "type": "integration", + "version": "1.0.0", + "status": "not_installed" + }, + { + "description": "System Integration", + "download": "/epr/system/system-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/system/0.1.0/img/system.svg", + "title": "system", + "size": "1000x1000", + "type": "image/svg+xml" + } + ], + "name": "system", + "path": "/package/system/0.1.0", + "title": "System", + "type": "integration", + "version": "0.1.0", + "status": "installed", + "savedObject": { + "type": "epm-packages", + "id": "system", + "attributes": { + "installed": [ + { + "id": "c431f410-f9ac-11e9-90e8-1fb18e796788", + "type": "dashboard" + }, + { + "id": "Metricbeat-system-overview-ecs", + "type": "dashboard" + }, + { + "id": "277876d0-fa2c-11e6-bbd3-29c986c96e5a-ecs", + "type": "dashboard" + }, + { + "id": "0d3f2380-fa78-11e6-ae9b-81e5311e8cab-ecs", + "type": "dashboard" + }, + { + "id": "CPU-slash-Memory-per-container-ecs", + "type": "dashboard" + }, + { + "id": "79ffd6e0-faa0-11e6-947f-177f697178b8-ecs", + "type": "dashboard" + }, + { + "id": "Filebeat-syslog-dashboard-ecs", + "type": "dashboard" + }, + { + "id": "5517a150-f9ce-11e6-8115-a7c18106d86a-ecs", + "type": "dashboard" + }, + { + "id": "9c69cad0-f9b0-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "855899e0-1b1c-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "a30871f0-f98f-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "e121b140-fa78-11e6-a1df-a78bd7504d38-ecs", + "type": "visualization" + }, + { + "id": "f398d2f0-fa77-11e6-ae9b-81e5311e8cab-ecs", + "type": "visualization" + }, + { + "id": "c5e3cf90-4d60-11e7-9a4c-ed99bbcaa42b-ecs", + "type": "visualization" + }, + { + "id": "d3166e80-1b91-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "346bb290-fa80-11e6-a1df-a78bd7504d38-ecs", + "type": "visualization" + }, + { + "id": "Container-Block-IO-ecs", + "type": "visualization" + }, + { + "id": "590a60f0-5d87-11e7-8884-1bb4c3b890e4-ecs", + "type": "visualization" + }, + { + "id": "341ffe70-f9ce-11e6-8115-a7c18106d86a-ecs", + "type": "visualization" + }, + { + "id": "System-Navigation-ecs", + "type": "visualization" + }, + { + "id": "089b85d0-1b16-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "99381c80-4d60-11e7-9a4c-ed99bbcaa42b-ecs", + "type": "visualization" + }, + { + "id": "c6f2ffd0-4d17-11e7-a196-69b9a7a020a9-ecs", + "type": "visualization" + }, + { + "id": "d56ee420-fa79-11e6-a1df-a78bd7504d38-ecs", + "type": "visualization" + }, + { + "id": "1aae9140-1b93-11e7-8ada-3df93aab833e-ecs", + "type": "visualization" + }, + { + "id": "e0f001c0-1b18-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "dc589770-fa2b-11e6-bbd3-29c986c96e5a-ecs", + "type": "visualization" + }, + { + "id": "96976150-4d5d-11e7-aa29-87a97a796de6-ecs", + "type": "visualization" + }, + { + "id": "8c071e20-f999-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "d3f51850-f9b6-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "5c7af030-fa2a-11e6-bbd3-29c986c96e5a-ecs", + "type": "visualization" + }, + { + "id": "e6e639e0-f992-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "bfa5e400-1b16-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "7cdb1330-4d1a-11e7-a196-69b9a7a020a9-ecs", + "type": "visualization" + }, + { + "id": "78b74f30-f9cd-11e6-8115-a7c18106d86a-ecs", + "type": "visualization" + }, + { + "id": "Syslog-events-by-hostname-ecs", + "type": "visualization" + }, + { + "id": "3d65d450-a9c3-11e7-af20-67db8aecb295-ecs", + "type": "visualization" + }, + { + "id": "ab2d1e90-1b1a-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "825fdb80-4d1d-11e7-b5f2-2b7c1895bf32-ecs", + "type": "visualization" + }, + { + "id": "26732e20-1b91-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "Syslog-hostnames-and-processes-ecs", + "type": "visualization" + }, + { + "id": "522ee670-1b92-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "51164310-fa2b-11e6-bbd3-29c986c96e5a-ecs", + "type": "visualization" + }, + { + "id": "bb3a8720-f991-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "Container-Memory-stats-ecs", + "type": "visualization" + }, + { + "id": "5dd15c00-fa78-11e6-ae9b-81e5311e8cab-ecs", + "type": "visualization" + }, + { + "id": "327417e0-8462-11e7-bab8-bd2f0fb42c54-ecs", + "type": "visualization" + }, + { + "id": "d2e80340-4d5c-11e7-aa29-87a97a796de6-ecs", + "type": "visualization" + }, + { + "id": "19e123b0-4d5a-11e7-aee5-fdc812cc3bec-ecs", + "type": "visualization" + }, + { + "id": "3cec3eb0-f9d3-11e6-8a3e-2b904044ea1d-ecs", + "type": "visualization" + }, + { + "id": "2e224660-1b19-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "12667040-fa80-11e6-a1df-a78bd7504d38-ecs", + "type": "visualization" + }, + { + "id": "d16bb400-f9cc-11e6-8115-a7c18106d86a-ecs", + "type": "visualization" + }, + { + "id": "34f97ee0-1b96-11e7-8ada-3df93aab833e-ecs", + "type": "visualization" + }, + { + "id": "fe064790-1b1f-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "83e12df0-1b91-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "4e4bb1e0-1b1b-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "4b254630-f998-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "6b7b9a40-faa1-11e6-86b1-cd7735ff7e23-ecs", + "type": "visualization" + }, + { + "id": "4d546850-1b15-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "Container-CPU-usage-ecs", + "type": "visualization" + }, + { + "id": "b6f321e0-fa25-11e6-bbd3-29c986c96e5a-ecs", + "type": "search" + }, + { + "id": "62439dc0-f9c9-11e6-a747-6121780e0414-ecs", + "type": "search" + }, + { + "id": "8030c1b0-fa77-11e6-ae9b-81e5311e8cab-ecs", + "type": "search" + }, + { + "id": "Syslog-system-logs-ecs", + "type": "search" + }, + { + "id": "eb0039f0-fa7f-11e6-a1df-a78bd7504d38-ecs", + "type": "search" + }, + { + "id": "logs-system.auth-0.1.0", + "type": "ingest-pipeline" + }, + { + "id": "logs-system.auth-0.1.0", + "type": "ingest-pipeline" + }, + { + "id": "logs-system.syslog-0.1.0", + "type": "ingest-pipeline" + }, + { + "id": "logs-system.syslog-0.1.0", + "type": "ingest-pipeline" + }, + { + "id": "logs-system.auth", + "type": "index-template" + }, + { + "id": "metrics-system.core", + "type": "index-template" + }, + { + "id": "metrics-system.cpu", + "type": "index-template" + }, + { + "id": "metrics-system.diskio", + "type": "index-template" + }, + { + "id": "metrics-system.entropy", + "type": "index-template" + }, + { + "id": "metrics-system.filesystem", + "type": "index-template" + }, + { + "id": "metrics-system.fsstat", + "type": "index-template" + }, + { + "id": "metrics-system.load", + "type": "index-template" + }, + { + "id": "metrics-system.memory", + "type": "index-template" + }, + { + "id": "metrics-system.network", + "type": "index-template" + }, + { + "id": "metrics-system.network_summary", + "type": "index-template" + }, + { + "id": "metrics-system.process", + "type": "index-template" + }, + { + "id": "metrics-system.process_summary", + "type": "index-template" + }, + { + "id": "metrics-system.raid", + "type": "index-template" + }, + { + "id": "metrics-system.service", + "type": "index-template" + }, + { + "id": "metrics-system.socket", + "type": "index-template" + }, + { + "id": "metrics-system.socket_summary", + "type": "index-template" + }, + { + "id": "logs-system.syslog", + "type": "index-template" + }, + { + "id": "metrics-system.uptime", + "type": "index-template" + }, + { + "id": "metrics-system.users", + "type": "index-template" + } + ], + "es_index_patterns": { + "auth": "logs-system.auth-*", + "core": "metrics-system.core-*", + "cpu": "metrics-system.cpu-*", + "diskio": "metrics-system.diskio-*", + "entropy": "metrics-system.entropy-*", + "filesystem": "metrics-system.filesystem-*", + "fsstat": "metrics-system.fsstat-*", + "load": "metrics-system.load-*", + "memory": "metrics-system.memory-*", + "network": "metrics-system.network-*", + "network_summary": "metrics-system.network_summary-*", + "process": "metrics-system.process-*", + "process_summary": "metrics-system.process_summary-*", + "raid": "metrics-system.raid-*", + "service": "metrics-system.service-*", + "socket": "metrics-system.socket-*", + "socket_summary": "metrics-system.socket_summary-*", + "syslog": "logs-system.syslog-*", + "uptime": "metrics-system.uptime-*", + "users": "metrics-system.users-*" + }, + "name": "system", + "version": "0.1.0", + "internal": false, + "removable": false + }, + "references": [], + "updated_at": "2020-05-15T20:08:08.708Z", + "version": "Wzk4LDFd" + } + }, + { + "description": "This package contains a yaml pipeline.\n", + "download": "/epr/yamlpipeline/yamlpipeline-1.0.0.tar.gz", + "name": "yamlpipeline", + "path": "/package/yamlpipeline/1.0.0", + "title": "Yaml Pipeline package", + "type": "integration", + "version": "1.0.0", + "status": "not_installed" + } + ], + "success": true + } + } + } + } + } + } + }, + "operationId": "get-epm-list" + }, + "parameters": [] + }, + "/epm/categories": { + "get": { + "summary": "EPM - Categories", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "count": { + "type": "number" + } + }, + "required": [ + "id", + "title", + "count" + ] + } + } + } + } + } + }, + "operationId": "get-epm-categories" + } + }, + "/fleet/agents": { + "get": { + "summary": "Fleet - Agent - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "type": "object" + } + }, + "success": { + "type": "boolean" + }, + "total": { + "type": "number" + }, + "page": { + "type": "number" + }, + "perPage": { + "type": "number" + } + }, + "required": [ + "list", + "success", + "total", + "page", + "perPage" + ] + }, + "examples": { + "example-1": { + "value": { + "list": [ + { + "id": "205661d0-5e53-11ea-ad31-4f31c06bd9a4", + "active": true, + "config_id": "ae556400-5e39-11ea-8b49-f9747e466f7b", + "type": "PERMANENT", + "enrolled_at": "2020-03-04T20:02:50.605Z", + "user_provided_metadata": { + "dev_agent_version": "0.0.1", + "region": "us-east" + }, + "local_metadata": { + "host": "localhost", + "ip": "127.0.0.1", + "system": "Darwin 18.7.0", + "memory": 34359738368 + }, + "actions": [ + { + "data": "{\"config\":{\"id\":\"ae556400-5e39-11ea-8b49-f9747e466f7b\",\"outputs\":{\"default\":{\"type\":\"elasticsearch\",\"hosts\":[\"http://localhost:9200\"],\"api_key\":\"\",\"api_token\":\"6ckkp3ABz7e_XRqr3LM8:gQuDfUNSRgmY0iziYqP9Hw\"}},\"datasources\":[]}}", + "created_at": "2020-03-04T20:02:56.149Z", + "id": "6a95c00a-d76d-4931-97c3-0bf935272d7d", + "type": "CONFIG_CHANGE" + } + ], + "access_api_key_id": "6Mkkp3ABz7e_XRqrzLNJ", + "default_api_key": "6ckkp3ABz7e_XRqr3LM8:gQuDfUNSRgmY0iziYqP9Hw", + "current_error_events": [], + "last_checkin": "2020-03-04T20:03:05.700Z", + "status": "online" + } + ], + "success": true, + "total": 1, + "page": 1, + "perPage": 20 + } + } + } + } + } + } + }, + "operationId": "get-fleet-agents", + "security": [ + { + "basicAuth": [] + } + ] + } + }, + "/fleet/agents/{agentId}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Agent - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "type": "object" + }, + "success": { + "type": "string" + } + }, + "required": [ + "item", + "success" + ] + } + } + } + } + }, + "operationId": "get-fleet-agents-agentId" + }, + "put": { + "summary": "Fleet - Agent - Update", + "tags": [], + "responses": {}, + "operationId": "put-fleet-agents-agentId", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + }, + "delete": { + "summary": "Fleet - Agent - Delete", + "tags": [], + "responses": {}, + "operationId": "delete-fleet-agents-agentId", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/agents/{agentId}/events": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Agent - Events", + "tags": [], + "responses": {}, + "operationId": "get-fleet-agents-agentId-events" + } + }, + "/fleet/agents/{agentId}/checkin": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Fleet - Agent - Check In", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "checkin" + ] + }, + "success": { + "type": "string" + }, + "actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "agent_id": { + "type": "string" + }, + "data": { + "type": "object" + }, + "id": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "type": { + "type": "string" + } + }, + "required": [ + "agent_id", + "data", + "id", + "created_at", + "type" + ] + } + } + } + }, + "examples": { + "success": { + "value": { + "action": "checkin", + "success": true, + "actions": [ + { + "agent_id": "a6f14bd2-1a2a-481c-9212-9494d064ffdf", + "type": "CONFIG_CHANGE", + "data": { + "config": { + "id": "2fe89350-a5e0-11ea-a587-5f886c8a849f", + "outputs": { + "default": { + "type": "elasticsearch", + "hosts": [ + "http://localhost:9200" + ], + "api_key": "Z-XkgHIBvwtjzIKtSCTh:AejRqdKpQx6z-6dqSI1LHg" + } + }, + "datasources": [ + { + "id": "33d6bd70-a5e0-11ea-a587-5f886c8a849f", + "name": "system-1", + "namespace": "default", + "enabled": true, + "use_output": "default", + "inputs": [ + { + "type": "logs", + "enabled": true, + "streams": [ + { + "id": "logs-system.auth", + "enabled": true, + "dataset": "system.auth", + "paths": [ + "/var/log/auth.log*", + "/var/log/secure*" + ], + "exclude_files": [ + ".gz$" + ], + "multiline": { + "pattern": "^\\s", + "match": "after" + }, + "processors": [ + { + "add_locale": null + }, + { + "add_fields": { + "target": "", + "fields": { + "ecs.version": "1.5.0" + } + } + } + ] + }, + { + "id": "logs-system.syslog", + "enabled": true, + "dataset": "system.syslog", + "paths": [ + "/var/log/messages*", + "/var/log/syslog*" + ], + "exclude_files": [ + ".gz$" + ], + "multiline": { + "pattern": "^\\s", + "match": "after" + }, + "processors": [ + { + "add_locale": null + }, + { + "add_fields": { + "target": "", + "fields": { + "ecs.version": "1.5.0" + } + } + } + ] + } + ] + }, + { + "type": "system/metrics", + "enabled": true, + "streams": [ + { + "id": "system/metrics-system.core", + "enabled": true, + "dataset": "system.core", + "metricsets": [ + "core" + ], + "core.metrics": "percentages" + }, + { + "id": "system/metrics-system.cpu", + "enabled": true, + "dataset": "system.cpu", + "metricsets": [ + "cpu" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.diskio", + "enabled": true, + "dataset": "system.diskio", + "metricsets": [ + "diskio" + ] + }, + { + "id": "system/metrics-system.entropy", + "enabled": true, + "dataset": "system.entropy", + "metricsets": [ + "entropy" + ] + }, + { + "id": "system/metrics-system.filesystem", + "enabled": true, + "dataset": "system.filesystem", + "metricsets": [ + "filesystem" + ], + "period": "1m", + "processors": [ + { + "drop_event.when.regexp": { + "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" + } + } + ] + }, + { + "id": "system/metrics-system.fsstat", + "enabled": true, + "dataset": "system.fsstat", + "metricsets": [ + "fsstat" + ], + "period": "1m", + "processors": [ + { + "drop_event.when.regexp": { + "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" + } + } + ] + }, + { + "id": "system/metrics-system.load", + "enabled": true, + "dataset": "system.load", + "metricsets": [ + "load" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.memory", + "enabled": true, + "dataset": "system.memory", + "metricsets": [ + "memory" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.network", + "enabled": true, + "dataset": "system.network", + "metricsets": [ + "network" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.network_summary", + "enabled": true, + "dataset": "system.network_summary", + "metricsets": [ + "network_summary" + ] + }, + { + "id": "system/metrics-system.process", + "enabled": true, + "dataset": "system.process", + "metricsets": [ + "process" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.process_summary", + "enabled": true, + "dataset": "system.process_summary", + "metricsets": [ + "process_summary" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.raid", + "enabled": true, + "dataset": "system.raid", + "metricsets": [ + "raid" + ] + }, + { + "id": "system/metrics-system.service", + "enabled": true, + "dataset": "system.service", + "metricsets": [ + "service" + ] + }, + { + "id": "system/metrics-system.socket", + "enabled": true, + "dataset": "system.socket", + "metricsets": [ + "socket" + ] + }, + { + "id": "system/metrics-system.socket_summary", + "enabled": true, + "dataset": "system.socket_summary", + "metricsets": [ + "socket_summary" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.uptime", + "enabled": true, + "dataset": "system.uptime", + "metricsets": [ + "uptime" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "processes": ".*" + }, + { + "id": "system/metrics-system.users", + "enabled": true, + "dataset": "system.users", + "metricsets": [ + "users" + ] + } + ] + } + ], + "package": { + "name": "system", + "version": "0.1.0" + } + }, + { + "id": "fdb1fea0-a5f6-11ea-ad52-534e35d3cd6f", + "name": "endpoint-1", + "namespace": "default", + "enabled": true, + "use_output": "default", + "inputs": [], + "package": { + "name": "endpoint", + "version": "0.2.0" + } + }, + { + "id": "2d792280-a5f7-11ea-ad52-534e35d3cd6f", + "name": "endpoint-2", + "namespace": "default", + "enabled": true, + "use_output": "default", + "inputs": [], + "package": { + "name": "endpoint", + "version": "0.2.0" + } + } + ], + "revision": 4, + "settings": { + "monitoring": { + "use_output": "default", + "enabled": true, + "logs": true, + "metrics": true + } + } + } + }, + "id": "51c6ad1e-a9c0-4c70-80da-99a5c51eedaf", + "created_at": "2020-06-04T19:52:24.667Z" + } + ] + } + } + } + } + } + } + }, + "operationId": "post-fleet-agents-agentId-checkin", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ], + "security": [ + { + "Access API Key": [] + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "local_metadata": { + "$ref": "#/components/schemas/AgentMetadata" + }, + "events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NewAgentEvent" + } + } + } + }, + "examples": { + "stoped to starting": { + "value": { + "events": [ + { + "type": "STATE", + "subtype": "STARTING", + "message": "state changed from STOPPED to STARTING", + "timestamp": "2019-10-01T13:42:54.323Z", + "payload": {}, + "agent_id": "bee40627-8cbd-45df-add9-98c390f9db10" + } + ] + } + }, + "running": { + "value": { + "events": [ + { + "type": "STATE", + "subtype": "RUNNING", + "message": "state changed from STOPPED to RUNNING", + "timestamp": "2020-05-26T20:44:57.480Z", + "payload": { + "random": "data", + "state": "RUNNING", + "previous_state": "STOPPED" + }, + "agent_id": "bee40627-8cbd-45df-add9-98c390f9db10" + } + ] + } + } + } + } + } + } + } + }, + "/fleet/agents/{agentId}/acks": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Fleet - Agent - Acks", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "acks" + ] + } + }, + "required": [ + "success", + "action" + ] + }, + "examples": { + "success": { + "value": { + "action": "checkin", + "success": true + } + } + } + } + } + } + }, + "operationId": "post-fleet-agents-agentId-acks", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + }, + "examples": { + "example-1": { + "value": { + "events": [ + { + "type": "ACTION_RESULT", + "subtype": "CONFIG", + "timestamp": "2019-01-04T14:32:03.36764-05:00", + "action_id": "51c6ad1e-a9c0-4c70-80da-99a5c51eedaf", + "agent_id": "a6f14bd2-1a2a-481c-9212-9494d064ffdf", + "message": "acknowledge" + } + ] + } + } + } + } + } + } + } + }, + "/fleet/agents/enroll": { + "post": { + "summary": "Fleet - Agent - Enroll", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "item": { + "$ref": "#/components/schemas/Agent" + } + } + }, + "examples": { + "success": { + "value": { + "action": "created", + "success": true, + "item": { + "id": "8086fb1a-72ca-4a67-8533-09300c1639fa", + "active": true, + "config_id": "2fe89350-a5e0-11ea-a587-5f886c8a849f", + "type": "PERMANENT", + "enrolled_at": "2020-06-04T13:03:57.856Z", + "user_provided_metadata": { + "dev_agent_version": "0.0.1", + "region": "us-east" + }, + "local_metadata": { + "host": "localhost", + "ip": "127.0.0.1", + "system": "Darwin 18.7.0", + "memory": 34359738368 + }, + "current_error_events": [], + "access_api_key": "cU9KdWYzSUJ2d3RqeklLdFdnNF86ZW05ZjFrMThUWW1GRW13OHMwRGZvdw==", + "status": "error" + } + } + } + } + } + } + } + }, + "operationId": "post-fleet-agents-enroll", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "PERMANENT", + "EPHEMERAL", + "TEMPORARY" + ] + }, + "shared_id": { + "type": "string" + }, + "metadata": { + "type": "object", + "required": [ + "local", + "user_provided" + ], + "properties": { + "local": { + "$ref": "#/components/schemas/AgentMetadata" + }, + "user_provided": { + "$ref": "#/components/schemas/AgentMetadata" + } + } + } + }, + "required": [ + "type", + "metadata" + ] + }, + "examples": { + "good": { + "value": { + "type": "PERMANENT", + "metadata": { + "local": { + "host": "localhost", + "ip": "127.0.0.1", + "system": "Darwin 18.7.0", + "memory": 34359738368 + }, + "user_provided": { + "dev_agent_version": "0.0.1", + "region": "us-east" + } + } + } + } + } + } + } + }, + "security": [ + { + "Enrollment API Key": [] + } + ] + } + }, + "/fleet/agents/unenroll": { + "post": { + "summary": "Fleet - Agent - Unenroll", + "tags": [], + "responses": {}, + "operationId": "post-fleet-agents-unenroll", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/config/{configId}/agent-status": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "configId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Agent - Status for config", + "tags": [], + "responses": {}, + "operationId": "get-fleet-config-configId-agent-status" + } + }, + "/fleet/enrollment-api-keys": { + "get": { + "summary": "Enrollment - List", + "tags": [], + "responses": {}, + "operationId": "get-fleet-enrollment-api-keys", + "parameters": [] + }, + "post": { + "summary": "Enrollment - Create", + "tags": [], + "responses": {}, + "operationId": "post-fleet-enrollment-api-keys", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/enrollment-api-keys/{keyId}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "keyId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Enrollment - Info", + "tags": [], + "responses": {}, + "operationId": "get-fleet-enrollment-api-keys-keyId" + }, + "delete": { + "summary": "Enrollment - Delete", + "tags": [], + "responses": {}, + "operationId": "delete-fleet-enrollment-api-keys-keyId", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/setup": { + "post": { + "summary": "Ingest Manager - Setup", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isInitialized": { + "type": "boolean" + } + } + }, + "examples": { + "success": { + "value": { + "isInitialized": true + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "examples": {} + } + } + } + }, + "operationId": "post-setup", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/install/{osType}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "osType", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Get OS install script", + "tags": [], + "responses": {}, + "operationId": "get-fleet-install-osType" + } + } + }, + "components": { + "schemas": { + "AgentConfig": { + "allOf": [ + { + "$ref": "#/components/schemas/NewAgentConfig" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "datasources": { + "oneOf": [ + { + "items": { + "type": "string" + } + }, + { + "items": { + "$ref": "#/components/schemas/Datasource" + } + } + ], + "type": "array" + }, + "updated_on": { + "type": "string", + "format": "date-time" + }, + "updated_by": { + "type": "string" + }, + "revision": { + "type": "number" + }, + "agents": { + "type": "number" + } + }, + "required": [ + "id", + "status" + ] + } + ] + }, + "Datasource": { + "title": "Datasource", + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "revision": { + "type": "number" + }, + "inputs": { + "type": "array", + "items": {} + } + }, + "required": [ + "id", + "revision" + ] + }, + { + "$ref": "#/components/schemas/NewDatasource" + } + ], + "x-examples": { + "example-1": {} + } + }, + "NewAgentConfig": { + "title": "NewAgentConfig", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "NewDatasource": { + "title": "NewDatasource", + "type": "object", + "x-examples": { + "example-1": { + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + } + }, + "description": "", + "properties": { + "enabled": { + "type": "boolean" + }, + "package": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "name", + "version", + "title" + ] + }, + "namespace": { + "type": "string" + }, + "output_id": { + "type": "string" + }, + "inputs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "processors": { + "type": "array", + "items": { + "type": "string" + } + }, + "streams": { + "type": "array", + "items": {} + }, + "config": { + "type": "object" + }, + "vars": { + "type": "object" + } + }, + "required": [ + "type", + "enabled", + "streams" + ] + } + }, + "config_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": [ + "output_id", + "inputs", + "config_id", + "name" + ] + }, + "PackageInfo": { + "title": "PackageInfo", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "title": { + "type": "string" + }, + "version": { + "type": "string" + }, + "readme": { + "type": "string" + }, + "description": { + "type": "string" + }, + "type": { + "type": "string" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + } + }, + "requirement": { + "oneOf": [ + { + "properties": { + "kibana": { + "type": "object", + "properties": { + "versions": { + "type": "string" + } + } + } + } + }, + { + "properties": { + "elasticsearch": { + "type": "object", + "properties": { + "versions": { + "type": "string" + } + } + } + } + } + ], + "type": "object" + }, + "screenshots": { + "type": "array", + "items": { + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "src" + ] + } + }, + "icons": { + "type": "array", + "items": { + "type": "string" + } + }, + "assets": { + "type": "array", + "items": { + "type": "string" + } + }, + "internal": { + "type": "boolean" + }, + "format_version": { + "type": "string" + }, + "datasets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "name": { + "type": "string" + }, + "release": { + "type": "string" + }, + "ingeset_pipeline": { + "type": "string" + }, + "vars": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "default": { + "type": "string" + } + }, + "required": [ + "name", + "default" + ] + } + }, + "type": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "required": [ + "title", + "name", + "release", + "ingeset_pipeline", + "type", + "package" + ] + } + }, + "download": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "name", + "title", + "version", + "description", + "type", + "categories", + "requirement", + "assets", + "format_version", + "download", + "path" + ] + }, + "SearchResult": { + "title": "SearchResult", + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "download": { + "type": "string" + }, + "icons": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "version": { + "type": "string" + }, + "status": { + "type": "string" + }, + "savedObject": { + "type": "object" + } + }, + "required": [ + "description", + "download", + "icons", + "name", + "path", + "title", + "type", + "version", + "status" + ] + }, + "AgentStatus": { + "type": "string", + "title": "AgentStatus", + "enum": [ + "offline", + "error", + "online", + "inactive", + "warning" + ] + }, + "Agent": { + "title": "Agent", + "type": "object", + "properties": { + "type": { + "$ref": "#/components/schemas/AgentType" + }, + "active": { + "type": "boolean" + }, + "enrolled_at": { + "type": "string" + }, + "shared_id": { + "type": "string" + }, + "access_api_key_id": { + "type": "string" + }, + "default_api_key_id": { + "type": "string" + }, + "config_id": { + "type": "string" + }, + "config_revision": { + "type": [ + "number", + "null" + ] + }, + "config_newest_revision": { + "type": "number" + }, + "last_checkin": { + "type": "string" + }, + "user_provided_metadata": { + "$ref": "#/components/schemas/AgentMetadata" + }, + "local_metadata": { + "$ref": "#/components/schemas/AgentMetadata" + }, + "id": { + "type": "string" + }, + "current_error_events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentEvent" + } + }, + "access_api_key": { + "type": "string" + }, + "status": { + "$ref": "#/components/schemas/AgentStatus" + }, + "default_api_key": { + "type": "string" + } + }, + "required": [ + "type", + "active", + "enrolled_at", + "id", + "current_error_events", + "status" + ] + }, + "AgentType": { + "type": "string", + "title": "AgentType", + "enum": [ + "PERMANENT", + "EPHEMERAL", + "TEMPORARY" + ] + }, + "AgentMetadata": { + "title": "AgentMetadata", + "type": "object" + }, + "NewAgentEvent": { + "title": "NewAgentEvent", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "STATE", + "ERROR", + "ACTION_RESULT", + "ACTION" + ] + }, + "subtype": { + "type": "string", + "enum": [ + "RUNNING", + "STARTING", + "IN_PROGRESS", + "CONFIG", + "FAILED", + "STOPPING", + "STOPPED", + "DATA_DUMP", + "ACKNOWLEDGED", + "UNKNOWN" + ] + }, + "timestamp": { + "type": "string" + }, + "message": { + "type": "string" + }, + "payload": { + "type": "string" + }, + "agent_id": { + "type": "string" + }, + "config_id": { + "type": "string" + }, + "stream_id": { + "type": "string" + }, + "action_id": { + "type": "string" + } + }, + "required": [ + "type", + "subtype", + "timestamp", + "message", + "agent_id" + ] + }, + "AgentEvent": { + "title": "AgentEvent", + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "$ref": "#/components/schemas/NewAgentEvent" + } + ] + }, + "AccessApiKey": { + "type": "string", + "title": "AccessApiKey", + "format": "byte" + }, + "EnrollmentApiKey": { + "type": "string", + "title": "EnrollmentApiKey", + "format": "byte" + } + }, + "parameters": { + "pageSizeParam": { + "name": "perPage", + "in": "query", + "description": "The number of items to return", + "required": false, + "schema": { + "type": "integer", + "default": 50 + } + }, + "pageIndexParam": { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 1 + } + }, + "kueryParam": { + "name": "kuery", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + "xsrfHeader": { + "schema": { + "type": "string" + }, + "in": "header", + "name": "kbn-xsrf", + "required": true + } + }, + "securitySchemes": { + "basicAuth": { + "type": "http", + "scheme": "basic" + }, + "Enrollment API Key": { + "name": "Authorization", + "type": "apiKey", + "in": "header", + "description": "e.g. Authorization: ApiKey base64EnrollmentApiKey" + }, + "Access API Key": { + "name": "Authorization", + "type": "apiKey", + "in": "header", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" + } + } + }, + "security": [ + { + "basicAuth": [] + } + ] +} From 994dba102ced0531ca13773947c0ad32e0353165 Mon Sep 17 00:00:00 2001 From: "Devin W. Hurley" Date: Tue, 9 Jun 2020 08:41:37 -0400 Subject: [PATCH 40/91] [SECURITY SOLUTION] [Detections] Add / Update e2e tests to ensure initial rule runs are successful (#68441) * adds/modifies e2e tests to ensure find_status returns succeeded after rules are created, instead of just 'going to run' * add documentation around newly created e2e tests explaining bug and specific regression to be on the lookout for if these start failing --- .../security_and_spaces/tests/create_rules.ts | 45 ++++++++++++++++++- .../tests/create_rules_bulk.ts | 45 ++++++++++++++++++- .../tests/find_statuses.ts | 21 ++++++++- 3 files changed, 108 insertions(+), 3 deletions(-) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts index 449168d73f4ef..8847b0c3250ac 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts @@ -6,7 +6,10 @@ import expect from '@kbn/expect'; -import { DETECTION_ENGINE_RULES_URL } from '../../../../plugins/security_solution/common/constants'; +import { + DETECTION_ENGINE_RULES_URL, + DETECTION_ENGINE_RULES_STATUS_URL, +} from '../../../../plugins/security_solution/common/constants'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { createSignalsIndex, @@ -65,6 +68,46 @@ export default ({ getService }: FtrProviderContext) => { expect(bodyToCompare).to.eql(getSimpleRuleOutput()); }); + /* + This test is to ensure no future regressions introduced by the following scenario + a call to updateApiKey was invalidating the api key used by the + rule while the rule was executing, or even before it executed, + on the first rule run. + this pr https://github.com/elastic/kibana/pull/68184 + fixed this by finding the true source of a bug that required the manual + api key update, and removed the call to that function. + + When the api key is updated before / while the rule is executing, the alert + executor no longer has access to a service to update the rule status + saved object in Elasticsearch. Because of this, we cannot set the rule into + a 'failure' state, so the user ends up seeing 'going to run' as that is the + last status set for the rule before it erupts in an error that cannot be + recorded inside of the executor. + + This adds an e2e test for the backend to catch that in case + this pops up again elsewhere. + */ + it('should create a single rule with a rule_id and validate it ran successfully', async () => { + const simpleRule = getSimpleRule(); + const { body } = await supertest + .post(DETECTION_ENGINE_RULES_URL) + .set('kbn-xsrf', 'true') + .send(simpleRule) + .expect(200); + + // wait for Task Manager to execute the rule and update status + await new Promise((resolve) => setTimeout(resolve, 5000)); + const { body: statusBody } = await supertest + .post(DETECTION_ENGINE_RULES_STATUS_URL) + .set('kbn-xsrf', 'true') + .send({ ids: [body.id] }) + .expect(200); + + const bodyToCompare = removeServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getSimpleRuleOutput()); + expect(statusBody[body.id].current_status.status).to.eql('succeeded'); + }); + it('should create a single rule without an input index', async () => { const { index, ...payload } = getSimpleRule(); const { index: _index, ...expected } = getSimpleRuleOutput(); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts index 6c3b1c45e202e..47b09fd1fe3c7 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts @@ -6,7 +6,10 @@ import expect from '@kbn/expect'; -import { DETECTION_ENGINE_RULES_URL } from '../../../../plugins/security_solution/common/constants'; +import { + DETECTION_ENGINE_RULES_URL, + DETECTION_ENGINE_RULES_STATUS_URL, +} from '../../../../plugins/security_solution/common/constants'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { createSignalsIndex, @@ -68,6 +71,46 @@ export default ({ getService }: FtrProviderContext): void => { expect(bodyToCompare).to.eql(getSimpleRuleOutput()); }); + /* + This test is to ensure no future regressions introduced by the following scenario + a call to updateApiKey was invalidating the api key used by the + rule while the rule was executing, or even before it executed, + on the first rule run. + this pr https://github.com/elastic/kibana/pull/68184 + fixed this by finding the true source of a bug that required the manual + api key update, and removed the call to that function. + + When the api key is updated before / while the rule is executing, the alert + executor no longer has access to a service to update the rule status + saved object in Elasticsearch. Because of this, we cannot set the rule into + a 'failure' state, so the user ends up seeing 'going to run' as that is the + last status set for the rule before it erupts in an error that cannot be + recorded inside of the executor. + + This adds an e2e test for the backend to catch that in case + this pops up again elsewhere. + */ + it('should create a single rule with a rule_id and validate it ran successfully', async () => { + const simpleRule = getSimpleRule(); + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_create`) + .set('kbn-xsrf', 'true') + .send([simpleRule]) + .expect(200); + + // wait for Task Manager to execute the rule and update status + await new Promise((resolve) => setTimeout(resolve, 5000)); + const { body: statusBody } = await supertest + .post(DETECTION_ENGINE_RULES_STATUS_URL) + .set('kbn-xsrf', 'true') + .send({ ids: [body[0].id] }) + .expect(200); + + const bodyToCompare = removeServerGeneratedProperties(body[0]); + expect(bodyToCompare).to.eql(getSimpleRuleOutput()); + expect(statusBody[body[0].id].current_status.status).to.eql('succeeded'); + }); + it('should create a single rule without a rule_id', async () => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_create`) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts index 6ff5a8c552ab7..f659857b89a97 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts @@ -42,6 +42,25 @@ export default ({ getService }: FtrProviderContext): void => { expect(body).to.eql({}); }); + /* + This test is to ensure no future regressions introduced by the following scenario + a call to updateApiKey was invalidating the api key used by the + rule while the rule was executing, or even before it executed, + on the first rule run. + this pr https://github.com/elastic/kibana/pull/68184 + fixed this by finding the true source of a bug that required the manual + api key update, and removed the call to that function. + + When the api key is updated before / while the rule is executing, the alert + executor no longer has access to a service to update the rule status + saved object in Elasticsearch. Because of this, we cannot set the rule into + a 'failure' state, so the user ends up seeing 'going to run' as that is the + last status set for the rule before it erupts in an error that cannot be + recorded inside of the executor. + + This adds an e2e test for the backend to catch that in case + this pops up again elsewhere. + */ it('should return a single rule status when a single rule is loaded from a find status with defaults added', async () => { // add a single rule const { body: resBody } = await supertest @@ -61,7 +80,7 @@ export default ({ getService }: FtrProviderContext): void => { .expect(200); // expected result for status should be 'going to run' or 'succeeded - expect(['succeeded', 'going to run']).to.contain(body[resBody.id].current_status.status); + expect(body[resBody.id].current_status.status).to.eql('succeeded'); }); }); }; From 605b79e8ca5e2d88d11814443530bc7316d76827 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Tue, 9 Jun 2020 06:36:56 -0700 Subject: [PATCH 41/91] Convert Index Templates API routes to snakecase. (#68463) Co-authored-by: Elastic Machine --- .../client_integration/helpers/http_requests.ts | 10 +++++----- .../home/index_templates_tab.test.ts | 4 ++-- .../public/application/services/api.ts | 10 +++++----- .../routes/api/templates/register_create_route.ts | 2 +- .../routes/api/templates/register_delete_route.ts | 2 +- .../server/routes/api/templates/register_get_routes.ts | 4 ++-- .../routes/api/templates/register_update_route.ts | 2 +- .../management/index_management/templates.helpers.js | 10 +++++----- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts index da461609f0b83..75d1b69eb6157 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts @@ -12,7 +12,7 @@ type HttpResponse = Record | any[]; // Register helpers to mock HTTP Requests const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { const setLoadTemplatesResponse = (response: HttpResponse = []) => { - server.respondWith('GET', `${API_BASE_PATH}/index-templates`, [ + server.respondWith('GET', `${API_BASE_PATH}/index_templates`, [ 200, { 'Content-Type': 'application/json' }, JSON.stringify(response), @@ -28,7 +28,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { }; const setDeleteTemplateResponse = (response: HttpResponse = []) => { - server.respondWith('POST', `${API_BASE_PATH}/delete-index-templates`, [ + server.respondWith('POST', `${API_BASE_PATH}/delete_index_templates`, [ 200, { 'Content-Type': 'application/json' }, JSON.stringify(response), @@ -39,7 +39,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { const status = error ? error.status || 400 : 200; const body = error ? error.body : response; - server.respondWith('GET', `${API_BASE_PATH}/index-templates/:id`, [ + server.respondWith('GET', `${API_BASE_PATH}/index_templates/:id`, [ status, { 'Content-Type': 'application/json' }, JSON.stringify(body), @@ -50,7 +50,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { const status = error ? error.body.status || 400 : 200; const body = error ? JSON.stringify(error.body) : JSON.stringify(response); - server.respondWith('POST', `${API_BASE_PATH}/index-templates`, [ + server.respondWith('POST', `${API_BASE_PATH}/index_templates`, [ status, { 'Content-Type': 'application/json' }, body, @@ -61,7 +61,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { const status = error ? error.status || 400 : 200; const body = error ? JSON.stringify(error.body) : JSON.stringify(response); - server.respondWith('PUT', `${API_BASE_PATH}/index-templates/:name`, [ + server.respondWith('PUT', `${API_BASE_PATH}/index_templates/:name`, [ status, { 'Content-Type': 'application/json' }, body, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts index 8f6a8dddeb195..7c79c7e61174e 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts @@ -188,7 +188,7 @@ describe('Index Templates tab', () => { expect(server.requests.length).toBe(totalRequests + 1); expect(server.requests[server.requests.length - 1].url).toBe( - `${API_BASE_PATH}/index-templates` + `${API_BASE_PATH}/index_templates` ); }); @@ -318,7 +318,7 @@ describe('Index Templates tab', () => { const latestRequest = server.requests[server.requests.length - 1]; expect(latestRequest.method).toBe('POST'); - expect(latestRequest.url).toBe(`${API_BASE_PATH}/delete-index-templates`); + expect(latestRequest.url).toBe(`${API_BASE_PATH}/delete_index_templates`); expect(JSON.parse(JSON.parse(latestRequest.requestBody).body)).toEqual({ templates: [{ name: legacyTemplates[0].name, isLegacy }], }); diff --git a/x-pack/plugins/index_management/public/application/services/api.ts b/x-pack/plugins/index_management/public/application/services/api.ts index 3961942b83ea3..d1950ae714550 100644 --- a/x-pack/plugins/index_management/public/application/services/api.ts +++ b/x-pack/plugins/index_management/public/application/services/api.ts @@ -211,14 +211,14 @@ export async function loadIndexData(type: string, indexName: string) { export function useLoadIndexTemplates() { return useRequest<{ templates: TemplateListItem[]; legacyTemplates: TemplateListItem[] }>({ - path: `${API_BASE_PATH}/index-templates`, + path: `${API_BASE_PATH}/index_templates`, method: 'get', }); } export async function deleteTemplates(templates: Array<{ name: string; isLegacy?: boolean }>) { const result = sendRequest({ - path: `${API_BASE_PATH}/delete-index-templates`, + path: `${API_BASE_PATH}/delete_index_templates`, method: 'post', body: { templates }, }); @@ -232,7 +232,7 @@ export async function deleteTemplates(templates: Array<{ name: string; isLegacy? export function useLoadIndexTemplate(name: TemplateDeserialized['name'], isLegacy?: boolean) { return useRequest({ - path: `${API_BASE_PATH}/index-templates/${encodeURIComponent(name)}`, + path: `${API_BASE_PATH}/index_templates/${encodeURIComponent(name)}`, method: 'get', query: { legacy: isLegacy, @@ -242,7 +242,7 @@ export function useLoadIndexTemplate(name: TemplateDeserialized['name'], isLegac export async function saveTemplate(template: TemplateDeserialized, isClone?: boolean) { const result = await sendRequest({ - path: `${API_BASE_PATH}/index-templates`, + path: `${API_BASE_PATH}/index_templates`, method: 'post', body: JSON.stringify(template), }); @@ -257,7 +257,7 @@ export async function saveTemplate(template: TemplateDeserialized, isClone?: boo export async function updateTemplate(template: TemplateDeserialized) { const { name } = template; const result = await sendRequest({ - path: `${API_BASE_PATH}/index-templates/${encodeURIComponent(name)}`, + path: `${API_BASE_PATH}/index_templates/${encodeURIComponent(name)}`, method: 'put', body: JSON.stringify(template), }); diff --git a/x-pack/plugins/index_management/server/routes/api/templates/register_create_route.ts b/x-pack/plugins/index_management/server/routes/api/templates/register_create_route.ts index 26e74847e3e05..e0d92b3800785 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/register_create_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/register_create_route.ts @@ -16,7 +16,7 @@ const bodySchema = templateSchema; export function registerCreateRoute({ router, license, lib }: RouteDependencies) { router.post( - { path: addBasePath('/index-templates'), validate: { body: bodySchema } }, + { path: addBasePath('/index_templates'), validate: { body: bodySchema } }, license.guardApiRoute(async (ctx, req, res) => { const { callAsCurrentUser } = ctx.core.elasticsearch.legacy.client; const template = req.body as TemplateDeserialized; diff --git a/x-pack/plugins/index_management/server/routes/api/templates/register_delete_route.ts b/x-pack/plugins/index_management/server/routes/api/templates/register_delete_route.ts index b5cc00ad6d8cc..1527af12a92a4 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/register_delete_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/register_delete_route.ts @@ -24,7 +24,7 @@ const bodySchema = schema.object({ export function registerDeleteRoute({ router, license }: RouteDependencies) { router.post( { - path: addBasePath('/delete-index-templates'), + path: addBasePath('/delete_index_templates'), validate: { body: bodySchema }, }, license.guardApiRoute(async (ctx, req, res) => { diff --git a/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts b/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts index 12ec005258a62..ae5f7802a8408 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts @@ -16,7 +16,7 @@ import { addBasePath } from '../index'; export function registerGetAllRoute({ router, license }: RouteDependencies) { router.get( - { path: addBasePath('/index-templates'), validate: false }, + { path: addBasePath('/index_templates'), validate: false }, license.guardApiRoute(async (ctx, req, res) => { const { callAsCurrentUser } = ctx.core.elasticsearch.legacy.client; const managedTemplatePrefix = await getManagedTemplatePrefix(callAsCurrentUser); @@ -55,7 +55,7 @@ const querySchema = schema.object({ export function registerGetOneRoute({ router, license, lib }: RouteDependencies) { router.get( { - path: addBasePath('/index-templates/{name}'), + path: addBasePath('/index_templates/{name}'), validate: { params: paramsSchema, query: querySchema }, }, license.guardApiRoute(async (ctx, req, res) => { diff --git a/x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts b/x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts index 5b2a0d8722e46..7e9c3174d0591 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts @@ -19,7 +19,7 @@ const paramsSchema = schema.object({ export function registerUpdateRoute({ router, license, lib }: RouteDependencies) { router.put( { - path: addBasePath('/index-templates/{name}'), + path: addBasePath('/index_templates/{name}'), validate: { body: bodySchema, params: paramsSchema }, }, license.guardApiRoute(async (ctx, req, res) => { diff --git a/x-pack/test/api_integration/apis/management/index_management/templates.helpers.js b/x-pack/test/api_integration/apis/management/index_management/templates.helpers.js index 9f1fab4039397..292aabad85054 100644 --- a/x-pack/test/api_integration/apis/management/index_management/templates.helpers.js +++ b/x-pack/test/api_integration/apis/management/index_management/templates.helpers.js @@ -7,10 +7,10 @@ import { API_BASE_PATH, INDEX_PATTERNS } from './constants'; export const registerHelpers = ({ supertest }) => { - const getAllTemplates = () => supertest.get(`${API_BASE_PATH}/index-templates`); + const getAllTemplates = () => supertest.get(`${API_BASE_PATH}/index_templates`); const getOneTemplate = (name, isLegacy = true) => - supertest.get(`${API_BASE_PATH}/index-templates/${name}?legacy=${isLegacy}`); + supertest.get(`${API_BASE_PATH}/index_templates/${name}?legacy=${isLegacy}`); const getTemplatePayload = (name, isLegacy = true) => ({ name, @@ -50,17 +50,17 @@ export const registerHelpers = ({ supertest }) => { }); const createTemplate = (payload) => - supertest.post(`${API_BASE_PATH}/index-templates`).set('kbn-xsrf', 'xxx').send(payload); + supertest.post(`${API_BASE_PATH}/index_templates`).set('kbn-xsrf', 'xxx').send(payload); const deleteTemplates = (templates) => supertest - .post(`${API_BASE_PATH}/delete-index-templates`) + .post(`${API_BASE_PATH}/delete_index_templates`) .set('kbn-xsrf', 'xxx') .send({ templates }); const updateTemplate = (payload, templateName) => supertest - .put(`${API_BASE_PATH}/index-templates/${templateName}`) + .put(`${API_BASE_PATH}/index_templates/${templateName}`) .set('kbn-xsrf', 'xxx') .send(payload); From 41af3962595a184dc5b0d16383f65a6df107b196 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Tue, 9 Jun 2020 06:38:32 -0700 Subject: [PATCH 42/91] Enable Watcher by default to fix bug in which Watcher doesn't render in the side nav (#68602) --- x-pack/plugins/watcher/public/plugin.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/watcher/public/plugin.ts b/x-pack/plugins/watcher/public/plugin.ts index 80f8503af67ce..3d907ac0dff3a 100644 --- a/x-pack/plugins/watcher/public/plugin.ts +++ b/x-pack/plugins/watcher/public/plugin.ts @@ -64,8 +64,6 @@ export class WatcherUIPlugin implements Plugin { }, }); - watcherESApp.disable(); - // TODO: Fix the below dependency on `home` plugin inner workings // Because the home feature catalogue does not have enable/disable functionality we pass // the config in but keep a reference for enabling and disabling showing on home based on @@ -85,9 +83,16 @@ export class WatcherUIPlugin implements Plugin { home.featureCatalogue.register(watcherHome); licensing.license$.pipe(first(), map(licenseToLicenseStatus)).subscribe(({ valid }) => { + // NOTE: We enable the plugin by default instead of disabling it by default because this + // creates a race condition that can cause the app nav item to not render in the side nav. + // The race condition still exists, but it will result in the item rendering when it shouldn't + // (e.g. on a license it's not available for), instead of *not* rendering when it *should*, + // which is a less frustrating UX. if (valid) { watcherESApp.enable(); watcherHome.showOnHomePage = true; + } else { + watcherESApp.disable(); } }); } From bc6aadd0fa5591910813b135d3c24a4424ce35bc Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Tue, 9 Jun 2020 06:42:12 -0700 Subject: [PATCH 43/91] [Ingest Manager] Update queries from `stream.*` to `dataset.*` (#68322) Resolves #67672 Part of https://github.com/elastic/package-registry/issues/491 See https://github.com/elastic/package-registry/pull/492 for package registry changes. Updates existing queries to use `dataset.*` fields. from `stream.*` fields. I looked at the EPM code paths for asset installation, and did not find anything that would need to be changed based on the above package registry changes. We don't hardcode anything specific for field names. The package information (i.e. [nginx package info](https://epr.elastic.co/package/nginx/0.1.2/)) is not affected by the current package registry changes. --- .../server/routes/data_streams/handlers.ts | 10 +++++----- .../services/epm/elasticsearch/template/template.ts | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts index e4c860713a6f1..2c65b08a68700 100644 --- a/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts @@ -31,12 +31,12 @@ export const getListHandler: RequestHandler = async (context, request, response) must: [ { exists: { - field: 'stream.namespace', + field: 'dataset.namespace', }, }, { exists: { - field: 'stream.dataset', + field: 'dataset.name', }, }, ], @@ -54,19 +54,19 @@ export const getListHandler: RequestHandler = async (context, request, response) aggs: { dataset: { terms: { - field: 'stream.dataset', + field: 'dataset.name', size: 1, }, }, namespace: { terms: { - field: 'stream.namespace', + field: 'dataset.namespace', size: 1, }, }, type: { terms: { - field: 'stream.type', + field: 'dataset.type', size: 1, }, }, diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts index 85d4a85e245c2..ef3542b7ecffd 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts @@ -388,12 +388,12 @@ const getIndexQuery = (templateName: string) => ({ must: [ { exists: { - field: 'stream.namespace', + field: 'dataset.namespace', }, }, { exists: { - field: 'stream.dataset', + field: 'dataset.name', }, }, ], From f6e93a19d3d8d1d94e28991961e3e67eade1575b Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Tue, 9 Jun 2020 07:00:31 -0700 Subject: [PATCH 44/91] Fixed pre-configured docs link points to the wrong page and functional tests configs (#68606) * Fixed pre-configured docs link points to the wrong page and functional tests configs * Fixed doc link --- .../alerting/action-types/pre-configured-connectors.asciidoc | 2 +- .../sections/action_connector_form/connector_edit_flyout.tsx | 2 +- x-pack/test/alerting_api_integration/common/config.ts | 2 +- x-pack/test/functional_with_es_ssl/config.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/user/alerting/action-types/pre-configured-connectors.asciidoc b/docs/user/alerting/action-types/pre-configured-connectors.asciidoc index b3e401256f27b..e41bd0939495d 100644 --- a/docs/user/alerting/action-types/pre-configured-connectors.asciidoc +++ b/docs/user/alerting/action-types/pre-configured-connectors.asciidoc @@ -28,7 +28,7 @@ two out-of-the box connectors: <> and < actionTypeId: .slack <2> name: 'Slack #xyz' <3> - config: <4> + secrets: <4> webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz' webhook-service: actionTypeId: .webhook diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx index 24dead473fb61..cbbbbfaea7ea3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx @@ -197,7 +197,7 @@ export const ConnectorEditFlyout = ({ )} Date: Tue, 9 Jun 2020 16:13:01 +0200 Subject: [PATCH 45/91] [ML] Transforms: Support sub-aggregations (#68306) * [ML] WIP UI support for the sug-aggs * [ML] extract sug-aggs from es config * [ML] fix for range filter * [ML] delete sub-aggregation * [ML] isConfigInvalid * [ML] fix actions, support parent agg * [ML] update getAggConfigFromEsAgg * [ML] unit tests * [ML] SubAggsSection * [ML] fix snapshot, add validation * [ML] fix label capping * [ML] rename Filter query label * [ML] fix updateSubAggregation validation * [ML] fix state update warning * [ML] increase MAX_NESTING_SUB_AGGS * [ML] functional tests for sub-aggregations * [ML] change the tooltip message * [ML] update functional tests * [ML] fix typo --- .../public/app/common/pivot_aggs.test.ts | 25 ++ .../transform/public/app/common/pivot_aggs.ts | 44 ++- .../public/app/hooks/use_pivot_data.ts | 23 +- .../aggregation_dropdown/dropdown.tsx | 3 + .../agg_label_form.test.tsx.snap | 124 +++--- .../__snapshots__/list_form.test.tsx.snap | 2 +- .../aggregation_list/agg_label_form.tsx | 122 +++--- .../components/aggregation_list/list_form.tsx | 2 +- .../aggregation_list/sub_aggs_section.tsx | 95 +++++ .../pivot_configuration.tsx | 32 +- .../components/filter_agg_form.test.tsx | 2 +- .../filter_agg/components/filter_agg_form.tsx | 2 +- .../components/filter_range_form.tsx | 6 +- .../components/filter_term_form.tsx | 11 +- .../step_define/common/filter_agg/config.ts | 1 + .../step_define/hooks/use_pivot_config.ts | 353 +++++++++++++----- .../step_define/hooks/use_step_define_form.ts | 2 +- .../apps/transform/creation_index_pattern.ts | 62 ++- .../functional/services/transform/wizard.ts | 47 ++- 19 files changed, 700 insertions(+), 258 deletions(-) create mode 100644 x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/sub_aggs_section.tsx diff --git a/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts b/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts index ab00211313d62..9e748068742f3 100644 --- a/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts +++ b/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts @@ -44,4 +44,29 @@ describe('getAggConfigFromEsAgg', () => { }, }); }); + + test('should resolve sub-aggregations', () => { + const esConfig = { + filter: { + term: { region: 'sa-west-1' }, + }, + aggs: { + test_avg: { + avg: { + field: 'test_field', + }, + }, + }, + }; + + const result = getAggConfigFromEsAgg(esConfig, 'test_3'); + + expect(result.subAggs!.test_avg).toEqual({ + agg: 'avg', + aggName: 'test_avg', + dropDownName: 'test_avg', + field: 'test_field', + parentAgg: result, + }); + }); }); diff --git a/x-pack/plugins/transform/public/app/common/pivot_aggs.ts b/x-pack/plugins/transform/public/app/common/pivot_aggs.ts index d6b3fb974783d..54dfd9ecda7b1 100644 --- a/x-pack/plugins/transform/public/app/common/pivot_aggs.ts +++ b/x-pack/plugins/transform/public/app/common/pivot_aggs.ts @@ -79,17 +79,32 @@ export type PivotAggDict = { [key in AggName]: PivotAgg; }; +/** + * The maximum level of sub-aggregations + */ +export const MAX_NESTING_SUB_AGGS = 10; + // The internal representation of an aggregation definition. export interface PivotAggsConfigBase { agg: PivotSupportedAggs; aggName: AggName; dropDownName: string; + /** Indicates if aggregation supports sub-aggregations */ + isSubAggsSupported?: boolean; + /** Dictionary of the sub-aggregations */ + subAggs?: PivotAggsConfigDict; + /** Reference to the parent aggregation */ + parentAgg?: PivotAggsConfig; } /** * Resolves agg UI config from provided ES agg definition */ -export function getAggConfigFromEsAgg(esAggDefinition: Record, aggName: string) { +export function getAggConfigFromEsAgg( + esAggDefinition: Record, + aggName: string, + parentRef?: PivotAggsConfig +) { const aggKeys = Object.keys(esAggDefinition); // Find the main aggregation key @@ -108,12 +123,21 @@ export function getAggConfigFromEsAgg(esAggDefinition: Record, aggN const config = getAggFormConfig(agg, commonConfig); + if (parentRef) { + config.parentAgg = parentRef; + } + if (isPivotAggsWithExtendedForm(config)) { config.setUiConfigFromEs(esAggDefinition[agg]); } if (aggKeys.includes('aggs')) { - // TODO process sub-aggregation + config.subAggs = {}; + for (const [subAggName, subAggConfigs] of Object.entries( + esAggDefinition.aggs as Record + )) { + config.subAggs[subAggName] = getAggConfigFromEsAgg(subAggConfigs, subAggName, config); + } } return config; @@ -199,6 +223,7 @@ export function getEsAggFromAggConfig( delete esAgg.agg; delete esAgg.aggName; delete esAgg.dropDownName; + delete esAgg.parentAgg; if (isPivotAggsWithExtendedForm(pivotAggsConfig)) { esAgg = pivotAggsConfig.getEsAggConfig(); @@ -208,7 +233,20 @@ export function getEsAggFromAggConfig( } } - return { + const result = { [pivotAggsConfig.agg]: esAgg, }; + + if ( + isPivotAggsConfigWithUiSupport(pivotAggsConfig) && + pivotAggsConfig.subAggs !== undefined && + Object.keys(pivotAggsConfig.subAggs).length > 0 + ) { + result.aggs = {}; + for (const subAggConfig of Object.values(pivotAggsConfig.subAggs)) { + result.aggs[subAggConfig.aggName] = getEsAggFromAggConfig(subAggConfig); + } + } + + return result; } diff --git a/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts b/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts index 6266defc01e16..13544b80ed1b2 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts +++ b/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts @@ -31,12 +31,25 @@ import { PivotGroupByConfig, PivotQuery, PreviewMappings, + PivotAggsConfig, } from '../common'; import { SearchItems } from './use_search_items'; import { useApi } from './use_api'; import { isPivotAggsWithExtendedForm } from '../common/pivot_aggs'; +/** + * Checks if the aggregations collection is invalid. + */ +function isConfigInvalid(aggsArray: PivotAggsConfig[]): boolean { + return aggsArray.some((agg) => { + return ( + (isPivotAggsWithExtendedForm(agg) && !agg.isValid()) || + (agg.subAggs && isConfigInvalid(Object.values(agg.subAggs))) + ); + }); +} + function sortColumns(groupByArr: PivotGroupByConfig[]) { return (a: string, b: string) => { // make sure groupBy fields are always most left columns @@ -62,7 +75,7 @@ export const usePivotData = ( const [previewMappings, setPreviewMappings] = useState({ properties: {} }); const api = useApi(); - const aggsArr = dictionaryToArray(aggs); + const aggsArr = useMemo(() => dictionaryToArray(aggs), [aggs]); const groupByArr = dictionaryToArray(groupBy); // Filters mapping properties of type `object`, which get returned for nested field parents. @@ -136,11 +149,7 @@ export const usePivotData = ( return; } - const isConfigInvalid = aggsArr.some( - (agg) => isPivotAggsWithExtendedForm(agg) && !agg.isValid() - ); - - if (isConfigInvalid) { + if (isConfigInvalid(aggsArr)) { return; } @@ -185,7 +194,7 @@ export const usePivotData = ( /* eslint-disable react-hooks/exhaustive-deps */ }, [ indexPatternTitle, - JSON.stringify(aggsArr), + aggsArr, JSON.stringify(groupByArr), JSON.stringify(query), /* eslint-enable react-hooks/exhaustive-deps */ diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx index e5381f09713b5..c28588f727e97 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx @@ -13,6 +13,7 @@ interface Props { placeholder?: string; changeHandler(d: EuiComboBoxOptionOption[]): void; testSubj?: string; + isDisabled?: boolean; } export const DropDown: React.FC = ({ @@ -20,6 +21,7 @@ export const DropDown: React.FC = ({ options, placeholder = 'Search ...', testSubj, + isDisabled, }) => { return ( = ({ onChange={changeHandler} isClearable={false} data-test-subj={testSubj} + isDisabled={isDisabled} /> ); }; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/agg_label_form.test.tsx.snap b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/agg_label_form.test.tsx.snap index ed32fb3d6ad5f..10258f53aa25b 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/agg_label_form.test.tsx.snap +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/agg_label_form.test.tsx.snap @@ -1,70 +1,72 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Transform: Date histogram aggregation 1`] = ` - - + - - the-group-by-agg-name - - - - - } - closePopover={[Function]} - display="inlineBlock" - hasArrow={true} - id="transformFormPopover" - isOpen={false} - ownFocus={true} - panelPaddingSize="m" + + the-group-by-agg-name + + + - } - onChange={[Function]} - options={Object {}} - otherAggNames={Array []} + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + id="transformFormPopover" + isOpen={false} + ownFocus={true} + panelPaddingSize="m" + > + + + + + - - - - - - + + + `; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/list_form.test.tsx.snap b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/list_form.test.tsx.snap index 3134af4c8b21d..89b54e6d0a22f 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/list_form.test.tsx.snap +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/list_form.test.tsx.snap @@ -3,7 +3,7 @@ exports[`Transform: Minimal initialization 1`] = ` = ({ const helperText = isPivotAggsWithExtendedForm(item) && item.helperText && item.helperText(); + const isSubAggSupported = + isPivotAggsConfigWithUiSupport(item) && + item.isSubAggsSupported && + (isPivotAggsWithExtendedForm(item) ? item.isValid() : true); + return ( - - - - {item.aggName} - - - {helperText && ( - - - {helperText} - + <> + + + + {item.aggName} + - )} - - setPopoverVisibility(!isPopoverVisible)} - data-test-subj="transformAggregationEntryEditButton" + {helperText && ( + + + {helperText} + + + )} + + setPopoverVisibility(!isPopoverVisible)} + data-test-subj="transformAggregationEntryEditButton" + /> + } + isOpen={isPopoverVisible} + closePopover={() => setPopoverVisibility(false)} + > + - } - isOpen={isPopoverVisible} - closePopover={() => setPopoverVisibility(false)} - > - + + + deleteHandler(item.aggName)} + data-test-subj="transformAggregationEntryDeleteButton" /> - - - - deleteHandler(item.aggName)} - data-test-subj="transformAggregationEntryDeleteButton" - /> - - + + + + {isSubAggSupported && } + ); }; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/list_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/list_form.tsx index cbcb6c668b58a..a02f4455250d7 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/list_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/list_form.tsx @@ -32,7 +32,7 @@ export const AggListForm: React.FC = ({ deleteHandler, list, onCha const otherAggNames = listKeys.filter((k) => k !== aggName); return ( - + = ({ item }) => { + const { state, actions } = useContext(PivotConfigurationContext)!; + + const addSubAggHandler = useCallback( + (d: EuiComboBoxOptionOption[]) => { + actions.addSubAggregation(item, d); + }, + [actions, item] + ); + + const updateSubAggHandler = useCallback( + (prevSubItemName: string, subItem: PivotAggsConfig) => { + actions.updateSubAggregation(prevSubItemName, subItem); + }, + [actions] + ); + + const deleteSubAggHandler = useCallback( + (subAggName: string) => { + actions.deleteSubAggregation(item, subAggName); + }, + [actions, item] + ); + + const isNewSubAggAllowed: boolean = useMemo(() => { + let nestingLevel = 1; + let parentItem = item.parentAgg; + while (parentItem !== undefined) { + nestingLevel++; + parentItem = parentItem.parentAgg; + } + return nestingLevel <= MAX_NESTING_SUB_AGGS; + }, [item]); + + const dropdown = ( + + ); + + return ( + <> + + {item.subAggs && ( + + )} + {isNewSubAggAllowed ? ( + dropdown + ) : ( + + } + > + {dropdown} + + )} + + ); +}; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/pivot_configuration/pivot_configuration.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/pivot_configuration/pivot_configuration.tsx index 5de35a683a376..a3a2e7c4eadfa 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/pivot_configuration/pivot_configuration.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/pivot_configuration/pivot_configuration.tsx @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { isEqual } from 'lodash'; -import React, { memo, FC } from 'react'; +import React, { memo, FC, createContext } from 'react'; import { EuiFormRow } from '@elastic/eui'; @@ -16,20 +15,32 @@ import { DropDown } from '../aggregation_dropdown'; import { GroupByListForm } from '../group_by_list'; import { StepDefineFormHook } from '../step_define'; +export const PivotConfigurationContext = createContext< + StepDefineFormHook['pivotConfig'] | undefined +>(undefined); + export const PivotConfiguration: FC = memo( - ({ - actions: { + ({ actions, state }) => { + const { addAggregation, addGroupBy, deleteAggregation, deleteGroupBy, updateAggregation, updateGroupBy, - }, - state: { aggList, aggOptions, aggOptionsData, groupByList, groupByOptions, groupByOptionsData }, - }) => { + } = actions; + + const { + aggList, + aggOptions, + aggOptionsData, + groupByList, + groupByOptions, + groupByOptionsData, + } = state; + return ( - <> + = memo( /> - + ); - }, - (prevProps, nextProps) => { - return isEqual(prevProps.state, nextProps.state); } ); diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.test.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.test.tsx index 7e23e799ae32e..35f9734a59482 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.test.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.test.tsx @@ -42,7 +42,7 @@ describe('FilterAggForm', () => { ); - expect(getByLabelText('Filter agg')).toBeInTheDocument(); + expect(getByLabelText('Filter query')).toBeInTheDocument(); const { options } = (await findByTestId('transformFilterAggTypeSelector')) as HTMLSelectElement; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx index 3e67a16e3c1ed..ac6e93d3ed5eb 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx @@ -62,7 +62,7 @@ export const FilterAggForm: PivotAggsConfigFilter['AggFormComponent'] = ({ label={ } > diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_range_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_range_form.tsx index cfc6bb27c88a1..7f6c23dddb9fc 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_range_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_range_form.tsx @@ -60,7 +60,8 @@ export const FilterRangeForm: FilterAggConfigRange['aggTypeConfig']['FilterAggFo onChange={(e) => { updateConfig({ from: e.target.value === '' ? undefined : Number(e.target.value) }); }} - step={0.1} + // @ts-ignore + step="any" prepend={ { updateConfig({ to: e.target.value === '' ? undefined : Number(e.target.value) }); }} - step={0.1} + // @ts-ignore + step="any" append={ { // Simulate initial load. onSearchChange(''); + return () => { + // make sure the ongoing request is canceled + fetchOptions.cancel(); + }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -115,7 +117,6 @@ export const FilterTermForm: FilterAggConfigTerm['aggTypeConfig']['FilterAggForm value: undefined, }, }); - // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedField]); const selectedOptions = config?.value ? [{ label: config.value }] : undefined; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts index 8602a82db8f2f..d8b37b25f50d1 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts @@ -30,6 +30,7 @@ export function getFilterAggConfig( ): PivotAggsConfigFilter { return { ...commonConfig, + isSubAggsSupported: true, field: isPivotAggsConfigWithUiSupport(commonConfig) ? commonConfig.field : '', AggFormComponent: FilterAggForm, aggConfig: {}, diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_pivot_config.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_pivot_config.ts index 72bfbe369757b..d35d567fc8469 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_pivot_config.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_pivot_config.ts @@ -4,12 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { dictionaryToArray } from '../../../../../../../common/types/common'; import { useToastNotifications } from '../../../../../app_dependencies'; -import { AggName, DropDownLabel, PivotAggsConfig, PivotGroupByConfig } from '../../../../../common'; +import { + AggName, + DropDownLabel, + PivotAggsConfig, + PivotAggsConfigDict, + PivotGroupByConfig, +} from '../../../../../common'; import { getAggNameConflictToastMessages, @@ -18,136 +24,297 @@ import { } from '../common'; import { StepDefineFormProps } from '../step_define_form'; +/** + * Clones aggregation configuration and updates parent references + * for the sub-aggregations. + */ +function cloneAggItem(item: PivotAggsConfig, parentRef?: PivotAggsConfig) { + const newItem = { ...item }; + if (parentRef !== undefined) { + newItem.parentAgg = parentRef; + } + if (newItem.subAggs !== undefined) { + const newSubAggs: PivotAggsConfigDict = {}; + for (const [key, subItem] of Object.entries(newItem.subAggs)) { + newSubAggs[key] = cloneAggItem(subItem, newItem); + } + newItem.subAggs = newSubAggs; + } + return newItem; +} + +/** + * Returns a root aggregation configuration + * for provided aggregation item. + */ +function getRootAggregation(item: PivotAggsConfig) { + let rootItem = item; + while (rootItem.parentAgg !== undefined) { + rootItem = rootItem.parentAgg; + } + return rootItem; +} + export const usePivotConfig = ( defaults: StepDefineExposedState, indexPattern: StepDefineFormProps['searchItems']['indexPattern'] ) => { const toastNotifications = useToastNotifications(); - const { - aggOptions, - aggOptionsData, - groupByOptions, - groupByOptionsData, - } = getPivotDropdownOptions(indexPattern); + const { aggOptions, aggOptionsData, groupByOptions, groupByOptionsData } = useMemo( + () => getPivotDropdownOptions(indexPattern), + [indexPattern] + ); + // The list of selected aggregations + const [aggList, setAggList] = useState(defaults.aggList); // The list of selected group by fields const [groupByList, setGroupByList] = useState(defaults.groupByList); - const addGroupBy = (d: DropDownLabel[]) => { - const label: AggName = d[0].label; - const config: PivotGroupByConfig = groupByOptionsData[label]; - const aggName: AggName = config.aggName; + const addGroupBy = useCallback( + (d: DropDownLabel[]) => { + const label: AggName = d[0].label; + const config: PivotGroupByConfig = groupByOptionsData[label]; + const aggName: AggName = config.aggName; - const aggNameConflictMessages = getAggNameConflictToastMessages(aggName, aggList, groupByList); - if (aggNameConflictMessages.length > 0) { - aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); - return; - } + const aggNameConflictMessages = getAggNameConflictToastMessages( + aggName, + aggList, + groupByList + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } - groupByList[aggName] = config; - setGroupByList({ ...groupByList }); - }; - - const updateGroupBy = (previousAggName: AggName, item: PivotGroupByConfig) => { - const groupByListWithoutPrevious = { ...groupByList }; - delete groupByListWithoutPrevious[previousAggName]; - - const aggNameConflictMessages = getAggNameConflictToastMessages( - item.aggName, - aggList, - groupByListWithoutPrevious - ); - if (aggNameConflictMessages.length > 0) { - aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); - return; - } + groupByList[aggName] = config; + setGroupByList({ ...groupByList }); + }, + [aggList, groupByList, groupByOptionsData, toastNotifications] + ); - groupByListWithoutPrevious[item.aggName] = item; - setGroupByList(groupByListWithoutPrevious); - }; + const updateGroupBy = useCallback( + (previousAggName: AggName, item: PivotGroupByConfig) => { + const groupByListWithoutPrevious = { ...groupByList }; + delete groupByListWithoutPrevious[previousAggName]; - const deleteGroupBy = (aggName: AggName) => { - delete groupByList[aggName]; - setGroupByList({ ...groupByList }); - }; + const aggNameConflictMessages = getAggNameConflictToastMessages( + item.aggName, + aggList, + groupByListWithoutPrevious + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } - // The list of selected aggregations - const [aggList, setAggList] = useState(defaults.aggList); + groupByListWithoutPrevious[item.aggName] = item; + setGroupByList(groupByListWithoutPrevious); + }, + [aggList, groupByList, toastNotifications] + ); + + const deleteGroupBy = useCallback( + (aggName: AggName) => { + delete groupByList[aggName]; + setGroupByList({ ...groupByList }); + }, + [groupByList] + ); /** * Adds an aggregation to the list. */ - const addAggregation = (d: DropDownLabel[]) => { - const label: AggName = d[0].label; - const config: PivotAggsConfig = aggOptionsData[label]; - const aggName: AggName = config.aggName; - - const aggNameConflictMessages = getAggNameConflictToastMessages(aggName, aggList, groupByList); - if (aggNameConflictMessages.length > 0) { - aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); - return; - } + const addAggregation = useCallback( + (d: DropDownLabel[]) => { + const label: AggName = d[0].label; + const config: PivotAggsConfig = aggOptionsData[label]; + const aggName: AggName = config.aggName; + + const aggNameConflictMessages = getAggNameConflictToastMessages( + aggName, + aggList, + groupByList + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } - aggList[aggName] = config; - setAggList({ ...aggList }); - }; + aggList[aggName] = config; + setAggList({ ...aggList }); + }, + [aggList, aggOptionsData, groupByList, toastNotifications] + ); /** * Adds updated aggregation to the list */ - const updateAggregation = (previousAggName: AggName, item: PivotAggsConfig) => { - const aggListWithoutPrevious = { ...aggList }; - delete aggListWithoutPrevious[previousAggName]; - - const aggNameConflictMessages = getAggNameConflictToastMessages( - item.aggName, - aggListWithoutPrevious, - groupByList - ); - if (aggNameConflictMessages.length > 0) { - aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); - return; - } + const updateAggregation = useCallback( + (previousAggName: AggName, item: PivotAggsConfig) => { + const aggListWithoutPrevious = { ...aggList }; + delete aggListWithoutPrevious[previousAggName]; + + const aggNameConflictMessages = getAggNameConflictToastMessages( + item.aggName, + aggListWithoutPrevious, + groupByList + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } + aggListWithoutPrevious[item.aggName] = item; + setAggList(aggListWithoutPrevious); + }, + [aggList, groupByList, toastNotifications] + ); - aggListWithoutPrevious[item.aggName] = item; - setAggList(aggListWithoutPrevious); - }; + /** + * Adds sub-aggregation to the aggregation item + */ + const addSubAggregation = useCallback( + (item: PivotAggsConfig, d: DropDownLabel[]) => { + if (!item.isSubAggsSupported) { + throw new Error(`Aggregation "${item.agg}" does not support sub-aggregations`); + } + const label: AggName = d[0].label; + const config: PivotAggsConfig = aggOptionsData[label]; + + item.subAggs = item.subAggs ?? {}; + + const aggNameConflictMessages = getAggNameConflictToastMessages( + config.aggName, + item.subAggs, + {} + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } + + item.subAggs[config.aggName] = config; + + const newRootItem = cloneAggItem(getRootAggregation(item)); + updateAggregation(newRootItem.aggName, newRootItem); + }, + [aggOptionsData, toastNotifications, updateAggregation] + ); + + /** + * Updates sub-aggregation of the aggregation item + */ + const updateSubAggregation = useCallback( + (prevSubItemName: AggName, subItem: PivotAggsConfig) => { + const parent = subItem.parentAgg; + if (!parent || !parent.subAggs) { + throw new Error('No parent aggregation reference found'); + } + + const { [prevSubItemName]: deleted, ...newSubAgg } = parent.subAggs; + + const aggNameConflictMessages = getAggNameConflictToastMessages( + subItem.aggName, + newSubAgg, + {} + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } + + parent.subAggs = { + ...newSubAgg, + [subItem.aggName]: subItem, + }; + const newRootItem = cloneAggItem(getRootAggregation(subItem)); + updateAggregation(newRootItem.aggName, newRootItem); + }, + [toastNotifications, updateAggregation] + ); + + /** + * Deletes sub-aggregation of the aggregation item + */ + const deleteSubAggregation = useCallback( + (item: PivotAggsConfig, subAggName: string) => { + if (!item.subAggs || !item.subAggs[subAggName]) { + throw new Error('Unable to delete a sub-agg'); + } + delete item.subAggs[subAggName]; + const newRootItem = cloneAggItem(getRootAggregation(item)); + updateAggregation(newRootItem.aggName, newRootItem); + }, + [updateAggregation] + ); /** * Deletes aggregation from the list */ - const deleteAggregation = (aggName: AggName) => { - delete aggList[aggName]; - setAggList({ ...aggList }); - }; + const deleteAggregation = useCallback( + (aggName: AggName) => { + delete aggList[aggName]; + setAggList({ ...aggList }); + }, + [aggList] + ); - const pivotAggsArr = dictionaryToArray(aggList); - const pivotGroupByArr = dictionaryToArray(groupByList); + const pivotAggsArr = useMemo(() => dictionaryToArray(aggList), [aggList]); + const pivotGroupByArr = useMemo(() => dictionaryToArray(groupByList), [groupByList]); const valid = pivotGroupByArr.length > 0 && pivotAggsArr.length > 0; - return { - actions: { + const actions = useMemo(() => { + return { addAggregation, addGroupBy, + addSubAggregation, + updateSubAggregation, + deleteSubAggregation, deleteAggregation, deleteGroupBy, setAggList, setGroupByList, updateAggregation, updateGroupBy, - }, - state: { - aggList, - aggOptions, - aggOptionsData, - groupByList, - groupByOptions, - groupByOptionsData, - pivotAggsArr, - pivotGroupByArr, - valid, - }, - }; + }; + }, [ + addAggregation, + addGroupBy, + addSubAggregation, + deleteAggregation, + deleteGroupBy, + deleteSubAggregation, + updateAggregation, + updateGroupBy, + updateSubAggregation, + ]); + + return useMemo(() => { + return { + actions, + state: { + aggList, + aggOptions, + aggOptionsData, + groupByList, + groupByOptions, + groupByOptionsData, + pivotAggsArr, + pivotGroupByArr, + valid, + }, + }; + }, [ + actions, + aggList, + aggOptions, + aggOptionsData, + groupByList, + groupByOptions, + groupByOptionsData, + pivotAggsArr, + pivotGroupByArr, + valid, + ]); }; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts index fc47a9e3d3477..f5980ae2243d3 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts @@ -73,7 +73,7 @@ export const useStepDefineForm = ({ overrides, onChange, searchItems }: StepDefi }, [ JSON.stringify(advancedPivotEditor.state), JSON.stringify(advancedSourceEditor.state), - JSON.stringify(pivotConfig.state), + pivotConfig.state, JSON.stringify(searchBar.state), /* eslint-enable react-hooks/exhaustive-deps */ ]); diff --git a/x-pack/test/functional/apps/transform/creation_index_pattern.ts b/x-pack/test/functional/apps/transform/creation_index_pattern.ts index a72f1691af647..d6dbcde436dcc 100644 --- a/x-pack/test/functional/apps/transform/creation_index_pattern.ts +++ b/x-pack/test/functional/apps/transform/creation_index_pattern.ts @@ -57,6 +57,26 @@ export default function ({ getService }: FtrProviderContext) { transformFilterAggTypeSelector: 'term', transformFilterTermValueSelector: 'New York', }, + subAggs: [ + { + identifier: 'max(products.base_price)', + label: 'products.base_price.max', + }, + { + identifier: 'filter(customer_gender)', + label: 'customer_gender.filter', + form: { + transformFilterAggTypeSelector: 'term', + transformFilterTermValueSelector: 'FEMALE', + }, + subAggs: [ + { + identifier: 'avg(taxful_total_price)', + label: 'taxful_total_price.avg', + }, + ], + }, + ], }, ], transformId: `ec_1_${Date.now()}`, @@ -87,12 +107,33 @@ export default function ({ getService }: FtrProviderContext) { field: 'products.base_price', }, }, - 'geoip.city_name.filter': { + 'New York': { filter: { term: { 'geoip.city_name': 'New York', }, }, + aggs: { + 'products.base_price.max': { + max: { + field: 'products.base_price', + }, + }, + FEMALE: { + filter: { + term: { + customer_gender: 'FEMALE', + }, + }, + aggs: { + 'taxful_total_price.avg': { + avg: { + field: 'taxful_total_price', + }, + }, + }, + }, + }, }, }, }, @@ -131,6 +172,12 @@ export default function ({ getService }: FtrProviderContext) { form: { transformFilterAggTypeSelector: 'exists', }, + subAggs: [ + { + identifier: 'max(products.discount_amount)', + label: 'products.discount_amount.max', + }, + ], }, ], transformId: `ec_2_${Date.now()}`, @@ -162,6 +209,13 @@ export default function ({ getService }: FtrProviderContext) { field: 'customer_phone', }, }, + aggs: { + 'products.discount_amount.max': { + max: { + field: 'products.discount_amount', + }, + }, + }, }, }, }, @@ -249,11 +303,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('adds the aggregation entries', async () => { - for (const [index, agg] of testData.aggregationEntries.entries()) { - await transform.wizard.assertAggregationInputExists(); - await transform.wizard.assertAggregationInputValue([]); - await transform.wizard.addAggregationEntry(index, agg.identifier, agg.label, agg.form); - } + await transform.wizard.addAggregationEntries(testData.aggregationEntries); }); it('displays the advanced pivot editor switch', async () => { diff --git a/x-pack/test/functional/services/transform/wizard.ts b/x-pack/test/functional/services/transform/wizard.ts index 03c8b2867b240..8b61e8c895e30 100644 --- a/x-pack/test/functional/services/transform/wizard.ts +++ b/x-pack/test/functional/services/transform/wizard.ts @@ -242,14 +242,20 @@ export function TransformWizardProvider({ getService }: FtrProviderContext) { await this.assertGroupByEntryExists(index, expectedLabel, expectedIntervalLabel); }, - async assertAggregationInputExists() { - await testSubjects.existOrFail('transformAggregationSelection > comboBoxInput'); + getAggComboBoxInputSelector(parentSelector = ''): string { + return `${parentSelector && `${parentSelector} > `}${ + parentSelector ? 'transformSubAggregationSelection' : 'transformAggregationSelection' + } > comboBoxInput`; }, - async assertAggregationInputValue(expectedIdentifier: string[]) { + async assertAggregationInputExists(parentSelector?: string) { + await testSubjects.existOrFail(this.getAggComboBoxInputSelector(parentSelector)); + }, + + async assertAggregationInputValue(expectedIdentifier: string[], parentSelector?: string) { await retry.tryForTime(2000, async () => { const comboBoxSelectedOptions = await comboBox.getComboBoxSelectedOptions( - 'transformAggregationSelection > comboBoxInput' + this.getAggComboBoxInputSelector(parentSelector) ); expect(comboBoxSelectedOptions).to.eql( expectedIdentifier, @@ -258,11 +264,14 @@ export function TransformWizardProvider({ getService }: FtrProviderContext) { }); }, - async assertAggregationEntryExists(index: number, expectedLabel: string) { - await testSubjects.existOrFail(`transformAggregationEntry ${index}`); + async assertAggregationEntryExists(index: number, expectedLabel: string, parentSelector = '') { + const aggEntryPanelSelector = `${ + parentSelector && `${parentSelector} > ` + }transformAggregationEntry_${index}`; + await testSubjects.existOrFail(aggEntryPanelSelector); const actualLabel = await testSubjects.getVisibleText( - `transformAggregationEntry ${index} > transformAggregationEntryLabel` + `${aggEntryPanelSelector} > transformAggregationEntryLabel` ); expect(actualLabel).to.eql( expectedLabel, @@ -270,15 +279,31 @@ export function TransformWizardProvider({ getService }: FtrProviderContext) { ); }, + async addAggregationEntries(aggregationEntries: any[], parentSelector?: string) { + for (const [index, agg] of aggregationEntries.entries()) { + await this.assertAggregationInputExists(parentSelector); + await this.assertAggregationInputValue([], parentSelector); + await this.addAggregationEntry(index, agg.identifier, agg.label, agg.form, parentSelector); + + if (agg.subAggs) { + await this.addAggregationEntries( + agg.subAggs, + `${parentSelector ? `${parentSelector} > ` : ''}transformAggregationEntry_${index}` + ); + } + } + }, + async addAggregationEntry( index: number, identifier: string, expectedLabel: string, - formData?: Record + formData?: Record, + parentSelector = '' ) { - await comboBox.set('transformAggregationSelection > comboBoxInput', identifier); - await this.assertAggregationInputValue([]); - await this.assertAggregationEntryExists(index, expectedLabel); + await comboBox.set(this.getAggComboBoxInputSelector(parentSelector), identifier); + await this.assertAggregationInputValue([], parentSelector); + await this.assertAggregationEntryExists(index, expectedLabel, parentSelector); if (formData !== undefined) { await this.fillPopoverForm(identifier, expectedLabel, formData); From 6bb9e3fcf972e749bd2a30451fd829c4982a489b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Tue, 9 Jun 2020 15:56:54 +0100 Subject: [PATCH 46/91] [Telemetry] telemetry.sendUsageFrom: "server" by default (#68071) Co-authored-by: Elastic Machine --- docs/settings/telemetry-settings.asciidoc | 2 +- src/plugins/telemetry/server/config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/settings/telemetry-settings.asciidoc b/docs/settings/telemetry-settings.asciidoc index a5f5d1c44ffac..89c018a86eca6 100644 --- a/docs/settings/telemetry-settings.asciidoc +++ b/docs/settings/telemetry-settings.asciidoc @@ -29,7 +29,7 @@ See our https://www.elastic.co/legal/privacy-statement[Privacy Statement] to lea | Set to `'server'` to report the cluster statistics from the {kib} server. If the server fails to connect to our endpoint at https://telemetry.elastic.co/, it assumes it is behind a firewall and falls back to `'browser'` to send it from users' browsers - when they are navigating through {kib}. Defaults to 'browser'. + when they are navigating through {kib}. Defaults to `'server'`. | `telemetry.optIn` | Set to `true` to automatically opt into reporting cluster statistics. You can also opt out through diff --git a/src/plugins/telemetry/server/config.ts b/src/plugins/telemetry/server/config.ts index 99dde0c3b3d96..ae9b70bb9f367 100644 --- a/src/plugins/telemetry/server/config.ts +++ b/src/plugins/telemetry/server/config.ts @@ -56,7 +56,7 @@ export const configSchema = schema.object({ }) ), sendUsageFrom: schema.oneOf([schema.literal('server'), schema.literal('browser')], { - defaultValue: 'browser', + defaultValue: 'server', }), }); From 4a387727648e462082e8a998664cc3cbacb0fc69 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Tue, 9 Jun 2020 08:23:58 -0700 Subject: [PATCH 47/91] [DOCS] Adds documentation for drilldowns (#68122) * [DOCS] Adds documentation for drilldowns * [DOCS] Incorporates review comments * [DOCS] Fixes to text * Updated gif sans nav bars * [DOCS] Adds image of drilldowns and other tweaks to text Co-authored-by: KOTungseth --- docs/drilldowns/drilldowns.asciidoc | 108 ++++++++++++++++++ docs/drilldowns/images/drilldown_create.png | Bin 0 -> 87682 bytes docs/drilldowns/images/drilldown_menu.png | Bin 0 -> 53455 bytes docs/drilldowns/images/drilldown_on_panel.png | Bin 0 -> 41533 bytes .../images/drilldown_on_piechart.gif | Bin 0 -> 876715 bytes docs/user/dashboard.asciidoc | 2 + 6 files changed, 110 insertions(+) create mode 100644 docs/drilldowns/drilldowns.asciidoc create mode 100644 docs/drilldowns/images/drilldown_create.png create mode 100644 docs/drilldowns/images/drilldown_menu.png create mode 100644 docs/drilldowns/images/drilldown_on_panel.png create mode 100644 docs/drilldowns/images/drilldown_on_piechart.gif diff --git a/docs/drilldowns/drilldowns.asciidoc b/docs/drilldowns/drilldowns.asciidoc new file mode 100644 index 0000000000000..2687441c99340 --- /dev/null +++ b/docs/drilldowns/drilldowns.asciidoc @@ -0,0 +1,108 @@ +[[drilldowns]] +== Use drilldowns for dashboard actions + +Drilldowns, also known as custom actions, allow you to configure a +workflow for analyzing and troubleshooting your data. +Using a drilldown, you can navigate from one dashboard to another, +taking the current time range, filters, and other parameters with you, +so the context remains the same. You can continue your analysis from a new perspective. + +For example, you might have a dashboard that shows the overall status of multiple data centers. +You can create a drilldown that navigates from this dashboard to a dashboard +that shows a single data center or server. + +[float] +[[how-drilldowns-work]] +=== How drilldowns work + +Drilldowns are {kib} actions that you configure and store +in the dashboard saved object. Drilldowns are specific to the dashboard panel +for which you create them—they are not shared across panels. +A panel can have multiple drilldowns. + +This example shows a dashboard panel that contains a pie chart. +Typically, clicking a pie slice applies the current filter. +When a panel has a drilldown, clicking a pie slice opens a menu with +the default action and your drilldowns. Refer to the <> +for instructions on how to create this drilldown. + +[role="screenshot"] +image::images/drilldown_on_piechart.gif[Drilldown on pie chart that navigates to another dashboard] + +Third-party developers can create drilldowns. +Refer to https://github.com/elastic/kibana/tree/master/x-pack/examples/ui_actions_enhanced_examples[this example plugin] +to learn how to code drilldowns. + +[float] +[[create-manage-drilldowns]] +=== Create and manage drilldowns + +Your dashboard must be in *Edit* mode to create a drilldown. +Once a panel has at least one drilldown, the menu also includes a *Manage drilldowns* action +for editing and deleting drilldowns. + +[role="screenshot"] +image::images/drilldown_menu.png[Panel menu with Create drilldown and Manage drilldown actions] + +[float] +[[drilldowns-example]] +=== Try it: Create a drilldown + +This example shows how to create the *Host Overview* drilldown shown earlier in this doc. + +[float] +==== Set up the dashboards + +. Add the <> data set. + +. Create a new dashboard, called `Host Overview`, and include these visualizations +from the sample data set: ++ +[%hardbreaks] +*[Logs] Heatmap* +*[Logs] Visitors by OS* +*[Logs] Host, Visits, and Bytes Table* +*[Logs] Total Requests and Bytes* ++ +TIP: If you don’t see data for a panel, try changing the time range. + +. Open the *[Logs] Web traffic* dashboard. + +. Set a search and filter. ++ +[%hardbreaks] +Search: `extension.keyword:( “gz” or “css” or “deb”)` +Filter: `geo.src : CN` + +[float] +==== Create the drilldown + + +. In the dashboard menu bar, click *Edit*. + +. In *[Logs] Visitors by OS*, open the panel menu, and then select *Create drilldown*. + +. Give the drilldown a name. + +. Select *Host Overview* as the destination dashboard. + +. Keep both filters enabled so that the drilldown carries over the global filters and date range. ++ +Your input should look similar to this: ++ +[role="screenshot"] +image::images/drilldown_create.png[Create drilldown with entries for drilldown name and destination] + +. Click *Create drilldown.* + +. Save the dashboard. ++ +If you don’t save the drilldown, and then navigate away, the drilldown is lost. + +. In *[Logs] Visitors by OS*, click the `win 8` slice of the pie, and then select the name of your drilldown. ++ +[role="screenshot"] +image::images/drilldown_on_panel.png[Drilldown on pie chart that navigates to another dashboard] ++ +You are navigated to your destination dashboard. Verify that the search query, filters, +and time range are carried over. diff --git a/docs/drilldowns/images/drilldown_create.png b/docs/drilldowns/images/drilldown_create.png new file mode 100644 index 0000000000000000000000000000000000000000..1573a3dfb4f4f50acfb1b61e839081ddce76b68c GIT binary patch literal 87682 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 literal 0 HcmV?d00001 diff --git a/docs/drilldowns/images/drilldown_menu.png b/docs/drilldowns/images/drilldown_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..28e0d995f840d493d86cef60f2dd81ec6bd87833 GIT binary patch literal 53455 zcmdR$Wmg+*8?LcZ93G0h1a~R!8r`mw|Sa)?< z37G0}l0z66F&H^1aZMlC6Qhr&IMVn*l%3Q5$enje^f3K!}jE+zmx`%KySwtjbd>n6wg0XZR@uw~^`c`?J;xhwE$EsL<(5@BS2 zQ{aoaNN{MeuP-SqFK@H`974Rk*FKYvg`}MhmZ3(2_=YG&LX(QI(iGD<`B9dAJ=So8 z>E6<4<~KrwY72yFYtb=$&Y^uSt^K?>N*K7gr>hx%JYJ89%*R6McAKm zLf&n>2kdBP?W$N&XYUm&?5jVn^!*1vFOnf5T-u}!Cs%PXwE(U1kF@kv2*7DbBJuo_ zx)`WP4Ay(d1#ihqPFWr#bt{_}x~13Jc|X%BjdG7@wfIv=&W$ipcX0k96(%n7SKYI4 zIs#%ywq#FPUn`X`ji3}jHbQ>q2orEI>34DNq2mT=z#fqUVUg2~L@>n!FVpoG0)fRN zS0p1=QkD+j3O;#9ge2!sKnF6n<=gP5S9ElJO+Tsn(_GJpIY%A3YQQ6MXLZ4-1qx-92~N7SoDWw zJX*+~Y(n6iu>CjK`>_gDQ5F4l7*gcHt(gDVi2-0wH)NX}|l=|^u zk-i1 z%4I+RXOPBDTxOO&0m3C6-0A7**5)Q_tt&guPn9VNc`M`J4`B&C7|~hnAFDNNazzrb z0y|a)<{^?oBawt3?k8}gk&{~bh>ePe0VR-YofmU`xv^HbaaW9l@o!Q7 zgYY_ofb6xg%0r22+SUei@9IEp*MW@y8~7W9uhzzw9q?@#sd&Z>V0tF za1+99b5`CU*G~r+(Wsvvp79m5+Gd})*1LdXB4lMe&vEIQXXIQ7CrDUoW; z+{r%5IGTj(YdiSKA(ilaPx%w2JY_h57y%7#9ud|<6+YZWr{0nQg_PEyPv zGZ2q#VvofAr|fzN;m|>YLky`1`FbnkCHq9Tn`>D)lamba+A%DO>mLlhYA(;+VqanT z?}WwmLT>9YF~ni-+l#7SH4Q&VbC6P)UD2MJug8|IbWhXG>Xe{6UO=C$}6pzVjzX}gl!o!5C4a0ep;A&?e`xuz4+%C;mK)1d|CE#tkls) zpC?o2WSq1`l=k7!nAZMx=sK9NSup0)?H3E3ru@r7nwqevtgbbOrHUjAl?pGMQ$=q7 z9p2qC+8PzM1Y8b@94_aVbN|v;yzz|dzYVh_AVft-(}p-MwV>^EHH=iB`pRJIqV$4c z%-d5XT!iNBA9FybM@>B|V-%)XE;2oHbo^hW-@?Tw3w^ZYZqa(=>_~~G)fiE)uR#1N z%}J-Rqw<=D1syBxwL-!E!UsF*CC#THhtFGj<#C>wM}iY_Ze@1PqOQ_bO}tSRGkclu zx8luzHK@7)!ek;1>^$~JLh#P>n9A15 z2egDp56}X+0sKLlL=99qU7t){Z>ndNRytmCs*6eX1V9R9`bUL7h)TmFhZ}Z)-{7TrWQ&KfQZ}LQhpU8DbEk)^=@6_*Px<#@rc+C(!aMbz z4=ZO7Tx~We%u8rLYBne}BCxeyE^7U3Q|SxgqrK^LyU9Q&)_3|+;Pso)BHYc>UvU== z?%@+`)<#HKc~ei^_u1eV{p%EhZVBwC36-rx0_sy;y?*e}uf5;*XsFHr+SV9Z@a@+6 zRxesq8D6As=ne^jbBM+4+T)<7y_tv&!}zzZnX}STdcCHA2#2)}>43mMuxAC{RDsJlM`x zS4qjpj7FjpgFTP&)C*xN`FiBD%x&z?s^gNJ(?jL33`nH z*-X5uLYC`ooZapWoD{72VMChyQ<=3WeP<48NB;ih$lN=G4Fh#{gn^z!FI$>Y@O^)c zYT3~=JIst$b&D-Qq5lf_f(gS%TW~Z*zviHKs6iL zJjgmJ{CiMwQh(C!deC<=6jMsl=I6HZP&o3pJ&i8v*9(B(VKHk2Kdmc~r0Xbb=fDv) zXgzpMr!0<8b@gcxwD!KmlP(zz=-94HAxk=;!C@W=`{dteF1a*-0jOt2+2NVc(c zr!#S_XR?A7(m>7YK{_IDTMC^ebW%RSK%c8UmSncBd--3jW?)2CzAr2Se0S3mR@)|7 zJNX~a($-U%69~DC=gT;zi#sW8#__BR&8w&%AeQba=o|EzygzRouaEqXPZ20bUrx<%GWGEty)>l|IBC3^3&Z z_R`kd#2~C;Yw%2^mXWn$-WCB~D!rQGqsV>q^Yt{_rRn-dlD@gj&lL)g)TaCs5KT8E z1U?GD&8?Zq?NsC~=)T7cq*aqoV`gB{=k}iYiu#c~VaMxijV1WGR{dzE?1OqH)xdZB z`4%ea&3~(B91j;mdAnsC+JLy6O!B|2a+E=TLj;Stk)Iq=+2IAahlx{C3yq*c{tJCj~T>j zTqdcXV*a6T3h4pt#W2W(05i6q9aPuFUH(Yd{j~JFA69F1*$fTap`tDX5VbYWR?H8_ ze4?wpEQ?2w5ViS$R&tX7`O|^|sOpP~NAdjH5hd-SxLj%`$)HnRnJv}YK{pM;ac(Q4 zKJrnfRSb~!bUXFxqyR$<+PsrOKZNZz&KJwI-{x5Ma7~Qb0$r*Mn$+Mv*_aOf%LO~_?b`jt0ZZ**I59)Tfr0e^sC4$uf z4BA&$?`s;l3y-wgl`@GXFWg6=Sz>-27x**heW*?oA=xABe_NU|GwNab20Lqu%cQLt z8WzUE-H>8{;4d4lSxF)6=aH7dWiyOwk^51+*yKYmBi%pVWi@O`J?xd+e}WW$r3FDf zr4&PPq-nn+P?yhasZCW9=GhM(?Pkj<^ZvY`-3V0N0b;7w&(kmrN|bWYI=853g!Iit z-<}m3Y=0FxxSL|NEFo=_{eF?f5C%oBnATpBSRUbdQGmc5wXgpkv71TWTAC1`$WpsPTdBoo zCZ*ey-N$#TqR#tFM6Ww2Ofld=i)JZ~*Xyf7Og9nt0-tVvk#4Oyr`?SE*7kAX6lqi) zU@gr!6R_&sYP1*nY;Iv;T8e}PqJqa~=I*6PAjTRl^)IHDp!FCCOk0RHlys{us#kD; zSkc{m%=kg{S%Og;Eit3U!Ry4M9yB-whRlloi=iW%_V2g2b2{2`m{#NLVv+kXrMKiE zWD_KB(vTkK7Zjcxio+i`Xh1Pl?Peb@X!&rNVwV!QlNjU|)}m`bX795MzEZl}fWPbA zA1}tY z9FM1KQ@*SO7Wg*AqrbP0tH~p^1N8-gs_xQGw z2FGRn(-Y5j1PM3GFMkUNwWVW|E_We^{NUyg_&h|l!SCcqaRPmUr!7XY_@X^j{+By) zDa^}Fwz0>}WolAfnWBgxhA}Wt_88HQtV?@{JTJ};8wE9x)?~HMB#jnN|LC;!bC*Q8 z`M1d<9k|h44pP4cl2X^sTX=X>YL=_w0bHzLIod7WB6My?*rau*^>9qs{~>gPYlC_ z_VF&8QwuoBexVjZ{n@aa=^pk~eB+2xEQkH6djEqb(X@cg~GrM#=zDRv7G^=shiKUCb{=e{kQ&El(*H zba}x{A+n}hK(dVPwuy3-kTQ8bM8&_%Z{KV0rM-3~au7JxX**pxLLteJ8o?n|<67=$>mD|XzpF8?!2DnW12jE8X3qdfb=#RiD)A|) zD8q37*at3Gzg14gp1v}_<;>EAVt0>c*w-ipuMWg9?*W~%V;S2qZ4UjPg!d@|vH!B? z9pNq(%04io027fEAw9(r2JajTA-uDFwf;%6{GDdO?PA6?MzS!rk>k znd(iA*Ei0n_dRJzP*4eAWN{h^`ZAg%k=TT|Hin4>ljqNO<94_ax&%gD)X<>y8+)Ikb2^93K=+w(>}FO4MVTyVIjU_<94#1Q+ip2pL_ z`41yTS+e%0cJFkGh=4Y-8(Cs{WcvPZ;D9a}aePtgg^okaNvtQq(8&j-7~_3ZxbFvv z8#agI@c+IUjTkX0DU0YUw~BI}h&yttqWb%Fs!wGKWX(E|m6nFg96CeJx_>1QI(NVq z2xg6CQvrs)D8#s&xpNq|m>ZOQpufXcZ-DQ1rfvG4F;)P9F_ z<_?y$v`p?F7&vrP{)zsCNzy@;<>F$kpuFt?uI1P@@r53m6}$y@?=`P=OkUov4vuZD z7)1WqAhXc$2%|qTPKom+9W<-{&nkW^LBF=$-R}gg<^;(t(}Ryim%(p^@H;bQ)7XTB z3}I0s@d6!%#I{3&gQM$N&DKw^)lQd?4imLkt~&n-W1YYJUMwOa#<`>d@?CG6_$=;6 z4H=yGi~GA&z+1OI=(HKmcR_~6?0yi<@mN`jKFoGUMjN~)OR=sp*}Wnw73#k|=G_mO z)<8t}k?4Be`*?A2k*eQV4yA;(G@Fl@SkBJB6rDd2;n99B*GYMOA)EBbhR7mUX^vnM z?rjH3O7=~LeCnT{*O7@Op$dV8ZL`GrCCYm#?d!WmV7pRk7HMUP_xED(R=wImuZ#d2 zq*q50Q#d0pm%h0fbSIt}i}eQc24VG|UeDU?yc133C+}p*^$~%6edToPHx2lhu4ThY zy!xyGy#W++tvGpjvR``X64HNLouvPFxq2r$64}i&(o##kOAf?Z|F=}p*I5aSYoo_sxU`l+iA-43|5WJcqP|}&)8PL2%l^g3UGHj?4|lzArJtt#ljJe~Yn|Sp z*-=OR-(+=cGLw$XRkePn^7G3}k@!oSpYn+9hfz#q2DTI?tr`2F_`C#Bohq$BD=5{1 z1KYLrF{t%|Pt(T}(uZg1LA3&ku>1i#r8N%rZ^Ll6Z8Mc>N=LI*RflgccV8>@+F>Us z6rqJULzO;{j>K|PUbCGS5%v7mapkp3Fks|Uwd&b>Dtwl2qgF4cU z9Sc}~ksX>%kWJL9h56O_-T3i)J~nVW=&EFXcC7TALrE9)B@0Q;P2A4{U7`B~-_p6E z<#?Z@Z(c5+L3ZPDE38&p5|_;O0-jsZhy_#ygS}22Jl%9`%YG4mwhnbzZ8M^g!p5PI zJyE1RMl@A1Uqw*xZ<2B;E~i~QQe-MWFiR64tDeEN@6I1^A1!osz3r!P z1aFcfBsmS*@j6+c`L)>*)F~jJ%SBPe`s^7qQ>~>D^R1u5^HQp6LMOpkA(eiQqIF?` zFX7FwbvKn&-mOABm+eOmeQ$5Cda)wI!{(4L#ZTNv&Y$7CBzUinSrL0EFs{DDV5 zn2kF$mt{jy!@}E0Ex8>IU}#!>ukiE7rzu@i6D1;0k&pk@%X$;?ZE*0rZUIL5OR=|1 zhEakOAeQxU}> zb$fTEF_I)u!J6Ydqv=%o2{{_H!jORO=|LTdo}AUb22e|2T=#d5laiA8qQ91<4t77k z?*E+J>w-A9M@*@NL3ST5@0`Wss7AV#EBsVM2AtuqAxV{usdn8)yzG5)w&RZ4FEmL< z>MY4yL8PLt%@cOle)aZd^WCZq@_RE8Pe>~1V(?yF)NnfT2#ZY?dDNus7BEIB7)$ob zIevt6L@<6(4t%kqnT?J{8t@#a(H*xS;In#EB!mgAkJMnTD`}S+ z`G&m-qJeP7^=-f9SAd%1SWOlO%|xPql?HGEu8STR8=!@XwWAzs9uY`T0r$83iR2peczM zQbRzHr&d$ocYDJ6OwxOPbx^xqcX(D+YEUPyPPn`4DPNWvE_gTn%W}JT>~inNe8bC+ z;PYOQr8&u{_)*v7cB^BaSv9vW6Q+&pza`nWFu%?Am^o$5v7~JHP{Ig|J)J$}{U8)X z_7sl9SAuO=CGTJVE4~FK_msxtH*9PwbS2uIKqqM8>j@cQD!f+(tn`naTHB;?~yJS%-#m)Z}LOqSuSC1R$Mx zKmeXXkOA#km*_{yDSBiSGzp`mnV&Fr9$Jc{pP$BTU#b%k=dlOAe@{y*X}i2PFIBNk z-q+qhjrn=?O1p#kzhjndv;Je!qDywPEE~8W@_epA$a!x|DiIqwezLaaEq|=dlI>>s zmXISWsG7-4V*Gc?heUvO-{tm1Pws1fs-Cx(R<0IeQ~@{e`57Xihlb4gAMs;@)9lJO z<-64uwZMmsPF}4o!*-{zj)ysa^-@)F-{-$k4QsU=wQ)i-BRQhvZ4ks!WP%J4Rl|0!S%lbXqArsa6!zLpy@U^ifcGrx5PoY2jIsR+n&Xn-BCDu66 ztcLK_wZ-MA{TWcOMbhKn5`)p`i7_xT$nL+&XhH9PwN|~r=$%Pq(A-aPl~I<}_TOV> z!pS#<9t-mGh)3T_n-%1n9AP95V|)p|N!ZNe%*n}%1y>t0Z4Zf@sRwHoE83PBl%xi{ zy|5)5Em7K_n1RIPbOEX6(% zdGQ|4J-b`$i7XDL#IZ5k35s`V%i5#A2*?MZIlwPVz!iPIYhF)P@Wrz0epO*AbV!-j(5crTquf6_x?SJIhSIePS>$yJ9RczV3Xt|9;W`* zW8~iJ;10rxEHzGW`b0wTW%qpO_W;lvkIMILnT1t^Lx-Nc?o|z}nI!5K2V`!PpwYg(AV*RWd(H0N?}NDL;4xbE zW#dVF3J5FjC!X3-nqkDt6XsE6R1soa0-PvYAQQEt+^p2yv6>`_@=iok0fu1@qYNF-Z2WpH6!g&v8^PzhdpUm-LD|m zWw|Mb@qq)KW&9da7&k`6x}{EtZI(2M?#W1Sb-H@@E16Y`C~o5BrfV#VSKFTPSf)d} z(vZdqlA7w}Xi%X-5=)P#tSLTu6E$TgzA>L4XrKh?NKT*caNE;Sw>=o?+lcI?O zTt2aqhZGJe%b^(?hp@Z&N(f7OQ_63jBqdL-o`CofE|=t2^~ai~Xv9t#N^{T@z|bDV)i=wH84;xaoc_*5&?niCP0C;)*=ZCgxKO|& z`~alEvhUSFQ7pk7X)@Y6a3v>B>&<#TZ9iOje5!MZZUN29AweQ3APP}L(!H=e z7GT-0-S!nLyS)FV6YLwPtN?&bPN--+J_7=;a#N9h8I zhjWxhk!S=k6*}BUJ(VytYFj%IQM9Rwy#Phc;niC~y~8n4f-T*|38QQCRneq2_X!4ym+Y zw0esZkfuUbZX5Z|%tTNwuXg3oc_;ROP$<3xTv8};y}!jg5&_6P_IvC9fcO)1(%Mb> zXq#yU9cqgVw4kv!{G;{GtBe#IQ~&Wro!J9fqhLP|5JK@@kGf~T@jIf=NO>>I&St6= z4Fju{MBrR28%qRbt3n^7=zZX?@Nljx>i||Y^X*TyMWXW;co%NoNyWRU@*`r-mEYr! zYws7f-}+cM|Cp!hk75yhdf)R70vrjbsmxF}Q~Bn+%e-EII|MFKH-TISy)9px zqYPhNRXKcc_&2EyfFwL!lNa5Jf|<1Es^&FLpUIAiI4byq)qG)%`2fgo`idLn;s{qjB( z9JpM9)UI=glkMfD{Nde*HG|fqY&i~Q&&rhLCS0Z=L(xzry1M&`dPc{Wc#kRr^(9RP z<`HF76Juo~Xr6%KNBisjPN9J#Nu6URq`>|D1W|d*PHp?7J-if_zx7W|Of>Js)9`i0 zS0>JEHlg)6&fIYrz<^OGRem#D*P$?o3`O@Ju`%z>IBqZ@_u-bU-M)Hy{6#61WOMqD z%{_Se^l5DZK~(0obZn`zq1ejcb_Ae{G2eKZsfQbD!p`_9dC+xPwurmTorzM`PH`M* zQQ#AgEnC)mn%MIJE@q+HbOuw9hLG4#bcRvNdd)y5E@Egz|6q?GJFTfPj^SljlO3=h z4yY1Ze>wkNX;>>SbRp)qw!|{~X(O`5e%?8ucAIvjB56?WYELQK&F1X<`jD$F(Ot~+ zYjXb}WSkP)zl&DlKYK@y6B6%E5@NK=^`ybe?YcL^;y3AJ1kJ3YO9myh;rt<2kgEkHC3a(+fO z6(3lLl|>T9r%NHYhU%`F`bZKarQ|uSZ@@2_9n9evcjK{0v%GrDjl96$# zFCQ^SO828iqv~x&&+{jS<8u5h@7>u(pf|~_?aOpqM8MscVNCRoWW9Rpu$_Ybi3#4q9lw_=w(gYlbOPVA z9Kv^C?bNQf{#>S4n0X!S@biyB4e-5QB`?3)6RaG{Y&_om)%`lR$#rJbZA>~wj!(`8 zO{Y>uQp~VuchC9^YORPSI86# z&Ek1+d}sZs8nr;0>OB;j{cw41M{gv#IG72SY~FOA16Kv zUxh!Poi3+5ulwFfW;`v<%UdSfbw^=bB}P5TuYdGY@bL-nK;L51t}F!+xo*8QIXuYb z5??T%yQM(|+X$4*XCOHUojxP#dNnS!M|{6*j4a!t5+_()ENsV>Zw6I0y^nu$tXrL~ zo!Xf-W>)+ruC^`myx{DvKLw}xhCOEr7j8N%-9|=4n%(0j<)2muy|gjtWg8n1^Ezq6 z5po11T%Y_^lDmm*UQ4-K%cEv7;Qo+^6SkuRqi!IcA>xT0xd>b5@PI57hsDs(L56vw{ zqTEGNpjDB4B2`3V^+djM^UX>1(2u9h5?{AFqvkRU7Ffxo(G!<$=55ku9WzM zz5J+0U>OL!)452la5zO{g%X`Qwafv`R}m4G3VOEf5^{MHrsuMWq-Xe#Ck0K#IpF_hn6Z&V*ZnQBy!9UC-TS@mA6?r(B@QqGwla$D}>lL)maHE3=^ z*i4s_mP?S*tJ1duy2)~!tWrR$d@W=rXnsmV)VJRd;#;m&mVA`!y@F9EN$jJ-rkkA? znjbE?2KBiW2u)THp3g-t_lj}1mzT+LyiMK>X_7iBhV2A+tY&6rb)>tRRqA?8XA59Y z0k7w9?DI!-;%V)nY+?jA1X${kU8Em`_}Bzk6lA$%Zr2O0X)*M+G=1^Wh?wZN^G075 zq#3@MC)r(MvfQj7 z^cVUMmChh*n4@E%fIZ>Bz(7r^qVHp}b1ssJf2N4VPj_IOXc?7578UmEGu|k1YR)L6Xc*9?TkF zP~E)ZRzGKPv9-P%n{fut4B4(zF2xxEfciVPdkQQqZTZbz!kU@jCyr&t&o1;alxra zi%5J&pJYyvQufuSR!`x_<3N4DY#3 z$~<3E(ETTI(FthhMkg313& zQtIg8%RhNypcHr$9%v3Y1pJN`QzzpH_}P}D`fH(74c^!K++DrPkl&LqCdz^SQHMvq^G%d|c@?&Yc)Dm~~I6wH9jR1Z;SCCG6 zqu_6YoaDa)Xi%;qmz(Ws7QvDpB94!SiK${c*N~_gV)iveveWaJx72) ze%O@&O*c(GMM9Hk_XHh8Rnj?IttYt(OpkJ+$x?f3OL%2|6F$PxsWPUcQ^^5s)nGS= z0}T34+hx)C8ovYbQn(#wM*{Yp5HQGv8SXmX(key&VmjPj~x5O4<1_;H*h#9HAwcYAAn-?sxz#av;)NL5(M74@HCc4%jU29lvCDD0=kpLLB_qBZ?dybJtz zp^K&>KpJCFr>UUMqqfp=od6wg^kF zvlVRFm`wG84BkwG+~~3)8cMM;OePd>sG*nt@N{t0=Y&sPpheJ86k08|r9fP*{uU;` zQD`DyIDmzRrtGN-3Tz=le@P(5)~?oNHRzjVnyeJk+L1e0r(%~38}IPl+D$8&>82CnT|BXc*;kd_-C9WL!Fj7d7?XC~I>pFhB?@S!aFD~QEkB9Q9C=6>k7BFMd$1=7Zh3!9c^OL zaDg(URsBH7Beor#wq=k>uGo>!kx`oAdxo}8wdfy~V+_>g;e8^oY=d}z^n_sPxYtr! zK}=uYMe;ljtiZ%{EQAz7hr2N)Pr;L0aUEfSNZh)JG%oHoPP#6Qsy@{k-C$CelIz;> zKU9Lc=y&GzeZ0sReK*s3P=n3N6t39u4r3+%u>;ad$n(nnw}cCwmFgsh`~N4f|3BPl zs-IjSKnlC|Q~JB<7h8jx>lGTIlJ{9C5NidMcDEz1N1$@j3TiwKjDIbTh{#&to5hc~LT$M!cQY4=Y?J!{3t zV?F6yZo8V=UrvX9f((JcV&m~eGjKr(`ar+@5pYw!(hgt81MM2($=@;GfQ#(zt8%>!m1427#tA)y<58>5s1ZWW~7YX$!2*`)=qS|r@(W6@F zyv~V2yl%|EKeYL67AoUMv*nCDD-jHg0w_gya4x#L!(@bn;E7PHENH%h0k<%|6#fTG zw<`b~fXZ+Rz9`&rS(r6TqC!emi0aaB^t))#1m*J)we^=@_ zB`vLta$!duSOHQtU2@anQKqh5sr%o)B_ju^kcX~>WM7eG%$9n&rkw2aNK(nb(7eIj z=uRgb99)t40E#}HEEP$%Xs~e{iEuSvxF-Es^gfS=@huNu$^Hdl!b~^CYvFLS{X7}v z1wNyu>N~*Wtm+*0T@EJy3#3ezdHIgZbVOnm z_sjjgzu*#Hx6v;r;ARYy(|U$I=6mb_`;nvXb8S>|IG@MKV!c5sf(@=S`bgzf!#dPI zhW&Zn_~anKuywpmtwhAD>eg_Zl6^5KxOKeG6fb=FQ!$4}1Ipgr?#)6j z>%#I>&Ydq^3Cw*IN^T1zunb3g)udJj_3-^4JuUB{{B}9sPHwJo23VbG=Qw&zrIw9NgO-Wk{cdLRzciMo6yYE7SsfY3kM~<&?FCy-_17-= z3V&`@+X^H-r04M49OxU1IqN=iI&?o<#i-kTQEUl%f9CYouXpT{KO7XQSS{3qEa}m9 z3Mf5_K7V}|>@wZ#YWj_KP$$~P5w=psmQ+g5@bAgHn*~nL?1~6XD~dHgsFYM%|g6xn}Cg(j4k8K zPhpt*qf3p%6t?joJ1r*2C2ob~TqPy|Py}~woA_9~chV+Babthc7ETdZ*zB+x8OLdm z8+gkwo7H)__`A(oQOA;bx^|?s64L&Z>+SPbP*+{23ZYlBAo2fMq-=3OR4 zJf%@?3O}EN{PMsGI$zvC(>i&dlu3ZdkV`je86 z|9rO|mKl5j0`vVs8aWGAZ}{?GnMO(Rb?ZK>-ow5fa=Q=5YQj`&Tu@LD!Rw>FAn;39 zR~M0EW8%6r3cfaow)U#eUVFpkGZhsa;GqQM0KpqeDE@if(U>(;Wq=y~l9e(OV6u-y zAjdj}X-a-ATEF%nMs|7!Q8|s) z@^{5S@0I=Q^TR22n{gXPLTDd3X&+dpNb-qCfEg?(n=u96Nqh~=akD&2$YJ9n2>%3< z;2Y=f4D8TibnU|Xo^NOk7;G2^#kv~{M@~w*#m2a7b8_0)$F)j7crWVx_ytPB5t(Guw z64W{b(KyIzhHrnnG>N|ml=1>GKB)8Ru=DX%7-ZcaBfvtlW53Ch6*|h@$=&Vq{6e=r z^na5fPFi7-E~@NB?N2%CCQJEQ27{{ep|AE=sgC86_3}owTPiUzajuKKi-~ey0hK=_ zV2koCo8X-2wSNY$YoiUweVJ+gJ71}i*Zy<KW>sR7)yNglGQWm zMsQaWoCB>Js7wL;CF>!ej{*}<^`dxeEtaZL(k1IYK%c%yk-|sHlAT2nMVSm@c0kdE z1iUU4C5M`4fbdVrqp8+HsGI)9X?gGkEw=qDAZ~QYleiz=v!;kqUxelI;`TOG9#?V) z_5Lss@VMficC?qxB=zteZ}Q;^zi)tA^W`e&)i(qOj$_jFcfLzi=In0$ME9&2ImD#H zrwo)mVBV4HmHMG7f3A^i@-NH73+Cb7Fbp(pMC3;$|D6}C_jA{~qqcJ{XNm(XsuOY- zj9D+6OD=4D8o?Tmup6LqbTXR4LQVb~Mhf*TuqJ(KtA{g&eAz{mxtC2TKHwCWSp5!2zoT&WRpQIskSLFY}sL4JImP&3~1>i7F zWA@yg}0xRXMUe)i9m%($;(8%k|1RH&AZ2Xc)HT6^6NUMj} zd5)m3ecR5~YQK21mpCV#m5{_QC-k*KvkY6kS((KV6-=L6i;rg@ud4Y+@MBxla||I7 ze4el2?a2%N)FIx#Yw9RW^$J$xPPOgFcfIa#f9xFdH7IV*NM1IUcvgp(@Np#N!w6r} zhhuRC=A5J$=nOCxaaRz*cP)`l^o1-U3-tx5u%J-Qsi?tWQPb0R{ASxV276$}wDu;C zRKCk$`Qj5Dm@4uHdOd0MNwWZRN>p+ZC2Me+?G_aSIs#|DE#rWQV@WGfZ!!SQq=Mdk z`u{$z?k6SuUM}v;;qR6~GVFJzfDMEYm!q}8{B0Rn&%27!DwJ}5TG(=!9TWT0+#F$L ziMz73^~tE)x_&gH@8U3q=^wg!xg2L*Vg`#6XTwPYEp6BW&?!bPCV>Z=21WiF;h>2z zB3VnpY6;sY=L~B8p`QdPk&;_g{@9|RD`HkXwSWD2D~$l$86UxLkW7VX-Y0l#0P=ZyX2BC z^Vlyd{%4hqeXY%>#nu@VV%>cDN~nGFe-OfYZhk;}0xl1y_Z_}LY7zG}bQSBXC7}k@ zn^eSO+7h}x9O~kZ4{fuWh!CJFpu#8$bCr9M!bSMKVJ@T;(y?+);Q#g0Cwo5bOrm%(Av8J?1XZT(0vO(vCr1Zd)f#(M(+yNXa`>ck^FrwrPI>mh2dwgvBl6|E6bjmqtsJaj)n2M!TCJja9Y=Nk&=P_ySP$}%Ri zgjhXG?g~Br61^{yXx$>3cs)5g4vV0X|M?ab8vh&1Sz)3p5F=nC>MEgb<74jfHYA0$ zS^`6EJabgHN1%m(j7H(@8OApK?EiijfB`b#KPDk5i!~de)Uk_xKO@_TBzE593&YsZ zi{$F;2~S^=5+A3seG+Hz{x`hwhi$PMW8M7Jlj^%6ew|7yKd7t4WfT(rch{#bE@a~; zAI!lQFB#a;>2TPZtZHZ;ioM$C->^3hB{~@X$iS5LKZ}pfoR9X|D4NE`r|EtK6%Z@e z&xhgnd`1R|5F6KB!dzK%O6^>eez>xxdzT^KfBK5^5nv6jU z2@#E?FVr;{dI&{R^0;-P;_Gek|I^ZLh_Ldun;WScV&tSCKVKhnLXKriCKT?I`fM8| z^@5H52-Vgi(blgDc6#Lu!`1>zJF02rjIk=fsr+A_%38C%7B=j4Ka#bT?3rZgM_i*v ze}{!VyBBM{<>P4cIl359+4CzqnA5A=NLC}N{!x^K{3>p!UkWOD__T+wkaYUMn)cP69@R{67GmW1#!qlkUIA(CV47{3<0lMTW?u z$|}J-3k~oW6t}HjD8tp(%2m)ds;lpUsBMf$S{HnQkjTUH8FSlyjs9KiO>QX{Szk;v zJ*D?Ab#TLki$HyZ_-gK(TmHa7YjBjzX!<`ion=@XU6_Vjq_{i9EqKu4?q1xrP~6=e z3Z=MfX>lv=Qk>xK#ogUyhi`ZP!j(y8l1$EdRi$s$NH1_uNfq*Ca$a zh!15WoqOL^KQ6-nS8p==V4!@YMaq;Tr&cSa<)CoVOm9>7-QgjfF z7$J;%(R!dC{gRt1XpW=1Ph3Jmrs1RkGV#0L<@d&J4knZ&5;{9FY<@=amGSK9;xB!Ixf$ry=*aOazp{V^orFBUsw9s%U-HHm~ z+etE5Tl?l8Xmbou!^iG5st3lv!C>Q)a3gM>C1gn91f#ne z=Dc>|Q0eh63%Cej=orzReV)(tMxYhDMNMNnW-8WV6+dae{Dc!pJDS;nANpe*$;4aU zeu4mv2$9YCYamq*aa_rl;J60!(eV-WmwWRJ1Lq_#c19VIfSWvIkS9B%(ZTtPj_{bV zJIMNw8X3t)y^_RiFcITKo!9?Gl;@j*d862K;4_@* zdY6O){?(gz201eptNcDAP)~p{iu1o*hYI0oWp412;@#u9L6@6a!>Gl)2 zh$!!}r@JXA&-GpzHe7G=KU!6Yle*|s{D#Mm`YkT;Ner4ip9IW#mfVOxTQhs+zq{7y z4D_3d(@#EOVYFh6boo6ksS$12}uXf&LhIO6zMLk(OH8R=W zt#C2_MM;G1h>q0nj&-YxAWKPTOoj4GVn+iC<#enc*phu8DM`+1CtwCKCC z56YnaTyXHiOguNE3`90@f{UT+FMmZ>WRm}2r7>kyp@l#i+cxJyIMd|^6q16;`Nngs zX?j2*aqe2DrWQFlYqy+Q1r&&yZONk->7ichogu zb@bbt^ai&AZM{SxBbi0iC0^)NuXM@a<>t}pAH!XCi}yZ!Y&lg*ot=hm&}W)Z?pPu> zotSUQt{HAS@Q8=A6>}&tkGKBPUdxO6b|;J4Ks=t#dbTVH3#2F$j(S{a?QKuMvL=)C zp$TjS6xQ=pwj+6;o=i{7MJ>ym3!@2U!^L$8_A|KbBL&2`OxV|5oBvpR#~q=fq7p}; zNY-=-3r&RwZntD}WPfuRe!x}+4=%8qi@5y~Q$eI#?!H|PMdGd9<|*`WEE;5z{@zIj zi8G=t@QEA3r)?tUbHwdJ{VKE`FNU#eHJ?TdL(9es=bkwg+P#Pv^AY)Sr;OHq0Fl+< zh2am#$dArF`N8Oh@8W7oY47X!m>?ff%ZSpfOTE=$?j~BkG-?vizz-UU0}pJ`O}S3( zWVE=J2RUGBwV-ll(W#JoH)ax)NZYVGbBpzUuIemP}jRHRW}Qft4e z(LVz;!4cz}OBuD!N`a1}8lVEv0m?)o^>_c2!fZm?7PnJntm=k_hBDm-kq>_fy&i1^ z@;G}YLOYn_9q?&6VhQwNqLcY*?ZKglxQRk9cUTn^`2dR`nK$b@ghzqtcW%Y^4Hf;3 z);XBe2F;hI53)+&cMDpZ4X5+eEpEr1%;y5rh~mFE-+r|kePFsMOvZO9dxr!N`UYr= zVSQV5C|Trwi3EFH9Q_0xKTk+W3UX-yyQ<&5nZA{7$As0kkI`!M9OhY>iif|%Si*lS zAS6pmui_Ar(WWVrN~Xjh<>p?Tb)yY>pN=MK8fMS~c_aj61mf-Oh)wmY%==kn&)c?z zlAM;^?3OLVy~D<4Y1P<)EWjy;-2n4KUS1v_2fnS3ebpgW>;oINmo0l)bLEm$0*Q}& zj&IBu?cO%rD7a=0*CZVx9ucbL_&kpGL)M#iI0Pmi0)@VF*f@+{NG`Ku3xICwDbX2I9Kw zEa`CA|2l!veDEuHDvc4=^56)|z}Pt4rV)JKIa#lObicPbR%L%Cp!Ib>3R~Q;Sfe}= zsA)(rNWCtP=)NeA(gEgWj{gfvR8oTx_HJ&opBzX^hzHT}0Mvh-T5rA%!o$EISIDSK zKKqUVbZS-8SieLj(&_UOQ{W<~ME=?iHXZnTiGXFO{HyWLn85f%d4l66XfVTGJ_(N0 zM|jHNo1E`Qg}y}W90G0_m}WhFH%UuaYc2QT<{_45caCl!2aVEEhAg&LuW23Zm51Z~(I zU*ADpvTtoxaWo`#RvJJXONiQ)6%7o6N~$x)>&_#N0&CI_KVLC;-af}{J-dIER+tt7 zi7{pim0PHns>Mf=YN) zK5={E5jQgSoDQMXavX;duF1wPA2+y$ALJ7FIczgGH1A)iPHxBCcEWk_Nk_k^Tp!F# zka{#D?}%ng24LzTKWJ8VG%(lo^i>KuUvccEfofl2;ou-}q`vf*c#O%N(4?9;b7Pmd zC5dyzU*M1(DHCHdn>r^UoE3&*cpLH)5HnWyq|v6@R0GAv=bP+FoLLRUihM{as_!Vd zt;E!59vP$&ar9oV*Zh_+f))4Y>Awa;C}@>}#(ZQ?TU0v!!f66qt`bxA7jr|O-$qJl z{O|2kMAI`vG*KgGUSb3&JD4BzM|Kj4#K0jXdn4jDb4o(scZz{;sVt7wmuI-^K-Ks% zy<&>1;D!TiKGdo?;Rb>TPhTtpKjP%$iU$?rg1W|+C3}`SDM^!AX@TMULyGtB>&@!+ zg2kQAyCykY`swtWsr-c7W|SX?{-FV%N3Oe!d5@}pSac+CWc8N2Q&2|iC& z;o=vL;{4^vpidIZGmklWz~m20=~e1r{HvDPjj58$U*X;@AZw|c`I;H}8bJ%XuYc=f3 zNaKEU@cz3mA_A$PkJ{ni1>T;r{&KF;s-gRr+4EDm*MKgeh4%2zj-(+fMfJ0Lsqe?N0e* zn>QX@r}lZ`%1Rm!j$h!XK(FVAALFVd(h^Qo*}qs45`aS8G81L?$I|9L9rOvjpJL_u zw<+>Dya)^w-X$)>hLM+xx`zIj!SXq*ayqpZzihovpJUdA+YAh{StMQchC4jYRrdJl zgYgGTUmOL>GzC*pRY|V-yl?pZ^fp6b{$W~00!#Hl^BjMshOP|>2HqKbD(`q*n1VG% zpxpT|lkG6uE+IV-9M1noXqM*3$ALk0YqRxVtEPRmnmvTkI$8mwbt`&bqQDN@K;`pV3r{O}>3j{|Dteq8pof?=+8c z{ddjycV%LI4&bT4nKtU-LaWZ^Mj=&ifBq(Bs&iA)9jj4k#G;WU03HKMD}E_iYeSxh zUcc5U4Pt>(4w#s?R+;$n2yN%r@z8W##I^r@Qn3elW@2Hshd3Ykrnx^n$TJV50dC{h zHl(_JIz^@Cc~J~QCH>9rq0?Yj@vv6-0XYe1{>9Cfr|Yt8f49ff!&VauWf95IS`aMG z_={8tHRx5uFNLJ6LMLtjlVYy>y=>KALhcLhSwzTsqi)- z>UC*P%Y+^){%oezVf6mFn0@R zGbXjL6xy?tsUqvQtmF|Vo4R}q%ceqn04d-L=}?!M4QUS6h)DvC+A$e4Y5hd4N5QMS zr@C`{YMv6#JLt{Gil_4*1f23i+oYr9c|mt^QV&)FLfMb7lh_~DTPq|HldtC!g16tI zfV(-~8ve@~J6#S(ephjDNwuDKrw+}U^Gej9!n|ouc2L$MjabtjWOFpXvAc`oRlT} z6fgCAhO_eBSU*Qcw1PfIC>J#O&?=~;Ta<&jq#yqF8u4(xK>*iS}8YYgwf{e%XB`=&o zO`EA6IIfqJOQyrKCb3tar?o<@s&&-QSX(bWeEXt&%yYu~=B2c!1z#mu9j=|sO_Y9z zDTz-75vnds{~@(3c0xbtG02;RpN8N#Tri3L$C^5ru;h8SkN;>*HGGI@+Eu@4vm`?$o1z&L^tKU@ejY+oda>J&I0Y zlZo(b1Ok=a%gM&Li)${SPDFkbp>I@KCzH2<-i|TTm}Em#6XVU;Yk7uSu3iy_0ViXK zqs02F1$W!p_Ueb>Niub&NO>!k_?SX>Yi*My`L-4kL%iWv-Xd(d4ots{zX@5$nz{=t9V^^4P&K5Co&Z)?z9nvktoO%S)rS9_}X&9>GKlxMV~-Xn8MGp z%bKiDVElJ7>^{znqGc~TO8MjPF1iTp(ho;#dW}I3a&26g)lUTq zg!z;vrBSU{#JGwKR*5ji_s)VDwVlx5Kf+O3+%f^3flN7p#8i))(g~ct+VYx3MnAV&gPkt=Fk<)yzn7%QzjYG0#@3>kye#5>VhVYQ zs-R2m%GnAlwOP1Izey~~*L z(cT6Wvlwm>l~*fS97d`c=nDD9Sa!8g44%3(IY2w#8E*hH)@zWRdzz}iF=Snjm`gox zl%=Vv(VISJlRn2kSZZ6|*p0T~Ax1z{6pk>g3i?C&LfK?l`g-q7eNaJKbE2PeF2HGW8liv#36`JJ_BgdW-IvF&XJ6WLl#y z))v8a!{|@CV4F=r%3qi2RlXfE&dsU6eB=2SCF_cbRL-qDq4kIelRLLjC59hn5Z$0a zbH<{Ov*O+*bjEQd1s17ZC@jslS!!36G@h5i@{ppfA>igHctrex;u4ez9X{|cR&<`6 zK=9#C)$=Msq@*QRG;>y#CD9J1%OmosUpP`KW-+<6M7b?p2LlMHQ&LM{4$rMVePg@r zvYHRmesNywD!yXKe0umu&nh_G5K|w@EIBPUsoY4+SiR~mqy*BvT&b;8Ns%ydlYl3R zRM~CtePm|36w*W`;AzcG&-I+@V^Q-#Bkj+Ut$bt|_8|f%EA9BD9dBs6gVEi{@|*~{ zEgJ8!N>{k${u1Eyts>`$N$g$Fw6Q77npE>V6Ey8nx)$K(x;Iw^mxZqH&l&npc}jvj2aw6nga)I89@zb_#1nlCAd9|b24r!NgfM19dW41*Ef~Y-zKm#Ia^Dn zRfHctbtGotSHR~&WG5Bn@D9JRHN{}e0)h*$MtPT=-N6%y7x4S+Bl8igu- zpR@vnXl2ny1J7;Pp*skaWNhXt{$224@A3O>?2~`1*)B)bpBip3n3F(53!2Y{sls8z zhrx>gKt{49QZ1!;yuM%_kmF9-g4Ldf`z%LnfNch^oR{i;p8?)%xR~4S!%_vcRsY&~ z_w$LS=8t|7QYu&^*u%;sK|i3gZRFA%i;G6{a|lJVZSUW%aozkRp<;3NSWaixa0%rf zZSM07a1LHyRDkLwGJ${_g&+IM-;QElE?uqF@!axJsk?LMuz$=BR%wtlD}pgv`xYIcv{Ud$Ey_9kz#1phpG<>zV2^N~k_c2!iUZgLY44hG zY0N+^%S;IV!PwW`F_+Zuo8QwX>VF@wTddlj70xL=5)`NJ0_5XJ#7t*7D5SqHgrk8% zC&#h8^U2MwRwZLNe9hZFa?~8IM$3Inc_y&Z2OC)oJ_kva zR<{7DsAzsY*>vJ13Y}TU*B7w^#LgrVd~UVNkkOb+SZ&9b+Cit4>d{&9g20RfRKdG>fkZvT*CTr?XSZ$8zb-#+jow3 z9j=!h)rU12Ql*9y4dZ#XwpXQ!8MFG{_4Nu{x{jLs@l$rj%O=<8eW#(WoTtg7<-(sO zW?g^w18;`8XUZh8LD`8ek$M4=#tcsXsLz$5F7%Oq8!j7wpL;W1m3zt*fJYOA3K{pmAAivP`=z{}H)|05^!yCLf8 z1wq@sJ{4CAGE^Fc@P37Dh6b;hEkb5oF#~dV`|W!8$&kZ*rez=vn;cA0!f)M}4pQmp zV!AT?EWPB$G=LHP8uIQ3-E@|UxhyfYy4Y2B9(x^v=7+%JmfVC=%PGkI^2|>%p`#Y7 zr>zR)`j2MiCH0eYHbJg1LAS&6_B#5zWyhN_ zrG(Dya+N6lB_0|iKkwqiT`At;GbuTR{1(6El{D(l7Mqu0!KE^vgTQ`ydON30!w>)o zPL@L+s|ZSg7vf<)`j5^E=$dHowRSpOZHji?xW5yI(9q^;-$X!k9>)hFjnF>7VM&m= z-x~o**iYQ(^2S$7hIVmp>tYi))3=in_o*B&synEDfDmM5-fO>|1ReR}ka7<+S|h%LIc1z<#kV6 zHoQ&ZC+9$45{7|;Lmrj5-nMZV#eV9;37T%6v~lt0T)jnFXS=sLC??EeLs@u!vJEfK zKlf{j0wJ5#I>Y9bagG$V^F_5Ua}@#?C*IC34IZAkT}yYI z#$HdxFRfK|oi*P?Z%PZWExQGKa?yB_VFtB=5D~-$rn8Pix?jFrV)JyaPQG~fR>eT4iK3rx$5WfWAQlOO-oeucJB@0)T~ zK3-vKZR@=H=>5IL`zFs23#A}61n!8bX)?}^Nsh9+a;g)89m zyx?G_21;D{MBN($1GF;o^07aElJWRHM8!J-G)ev0?JbCEtoUZWDFkz4-?F9SQeZS& zppeR-OpEnA)M5-B1A`6@l_dVH5?A%5KOg4e!(CxThBLv=Jb+ci_?e@JoGi4PJ*mjs zm%e_-rDIdNGh5nA?`PT5F9A?tmz{wbntx4T6l}~?gRJ(xN|*O zSfy-UrZ0w>RIZ29iRwV(g9lyV9aT4Za1K;p{p2qo#7Z|+(7^-}RzW~OP$~WDO2A`M znMkXw=l5b3Sf<;7;mXL&@S^uy#e7?qoXuxmxLBnren-f8r%XQkBFtvFR$}#Q{&=?e z2YzNCFFWobTL?t{J_8|6{pFvf@bK`lz$zd%qs1+r)IS|;=y%^HTLt~$N36H^D)sF@ z@7sKii9AktJ!hE4?9BXxnny^}x`O=`n1ddm0S^Eg9W@J!@D5mu5h(8^z3CGFT3kiK zJ5&vxg}mq9<4eqhgrg!*<+{TIQx7oqRr0F&qpXCbo69D$$n8pUafe8 zYC|xgLgGbH^17c_xl#m}`>ClSe2Jf05*WD7koM zhQRA5I%~g75ez2)-t6-s4<&Eyi_U>(I*3F}8SB8O1Yq_TBlB@=7nf*1Cqf6}sTr=k zSgRbXowjv=4?vmE%{e^5b#J)SzEgd6B`F7jiyvjUB(S(Ag|@y1W5%Atdv9VsPjl0=aCmJ$J9nr1dcTEm*_P&S^ zM7JPTd-OgJHQ&lI7BforA~UN^*&54Hs_xVS>lP$#-JDk$&OKS9OH09T4Xk%TdV^mh zpg<|lB)eN|qS!3_TYp9TBO)W?0dz>?cC&0EZQmVc6EX_DQucCj%Qd>n0=e)7-oPn0 z7;kt+o`9WxLTT!5J-ivxXy2aV$|41X*NSvZr)W^F@2ttKP|v5`)7^4J~CO5nB#=CoRN-~c>nWguB>rd}A0n~g>4 zKT+RRa9{p`u4*F#0Z-36DKN<5ZeE(Zfpj!NOUi z1|IsmU3Yv|o*%hv<6J*}f*jhnQi40K$}YZ45A31mE?6hs-5qwJsegrMKwKqSsFo{K zJT|)U5*sjHkvX%Q9v)0&rmi|8y!3LBPBlSq)WzWTy&>{&_0G&(-^x5?gMkqfNA0eW z#(Xt(s2qph*ZE|>zzmD@_i%3m!&QK}?$E_^O5C8;qsb{KMsO0Vbvb3ST0)f@;fTnH zrl%rq3JIS3sK{@(;vb6`WgfT5O(YIe39Bb85_as(u}&#_uKLi9RYi5%*5aOpR*hTm zrjNm8DeLOssJ=I5z1e5-Y?afh-xM`Q=+cz%cRWAzN96GscJ*ylPQ&iwB^U2=xG25d zr2SIA*ICbuThEoN>Pq@@8VqRTNZ`XEg|3Ohpxg$@$Vf@ZBG$Fvd9-}#uaM|1wO-<# z)2`W=j{UM0Ld(t2VX(Q8FINrSRcL$oSk|2j(N9nkB4rZrc2O_4>B=LWe$;K(BS2Ye z>ri+0d<`C(2^97FVW8I0_PE_*FDaKah%-~gg1Dj^y;r1G+{$QJrStTJDxIQ8d_}mm zF&dha0+#v#2U<`r3B=>*C5z2Qci7otLm_<`g)g95ACkCcR!G(z#BA9w&>(%u9XIOn zBjTpMkZtm9RiTQl7M6Rk?6Y^mUQxeryeeahwxw^4`-pL(oGZ!$N#NsZ96Gw#&AeB^ z$`fj6#INhf^@B;40G8MWi}&iaU$U{_C;O_k$4r%L)*BM$WA<)F?M7 z3_1uzwcWA|@fhbXn8n4zD+tDKRM+cmmlSO` zKZpFRY-3EK*9dSX|HCNtw3^Jshwhvrw?f2=zch5{*Ega(|3|M)qnf<$k6o5d^S`Gr z=y!bZdeMy~ViYxIL%)`t`;d(~&NCNZKU1dM=h#iD+tnH(E|qQ6TG&oH6EP?vwf7=! z1dnlROn+}euq8LfGxPtOwY^1~s`vd1*5kfbRSflZ$;-Og2a#TXb-rqm#syftR=rT+ zi0H_;N$T%(;BB3bmg{$^CGXEv;<0|?_H>Cn7LH}kh}=izd`aW8kFyf)ULm1?#f+XJ zZa61J?6Dbe0Q|%x2zujHykdZc(}2RYq;<*IijC=vn58Ylq4ur`{W)u_3fz)Z<#o>`t zqJ)mimLeFt=4bX6&;Vnr1Mlya~%d)zr%EV!GK zEu4@>P6|Qz*2wT+)WPnxh-&GN^J7jJidDHHB-pBbFj$z0ItBFb7%c$+AU3{1meV7{( z7!ck*+o_cfQHw0y@ObiZ%gs913UiXNIbZ)bWq7uAP;lCDH}}cEkJesq>(qISHRanbY(~RN5LI*2-4kEl=?F?rinv?b z-U9`;!!cN=@z-wzL07lypUeqiP6%PRPY*^imsghXL2xKhUzkKx#w9u$`H z9fKE}t!L5|*mg3CtG_t}{)8Hr2a=F^+FbCvGbMSQ=fUc|_)9gl&}cI`E1fP+ zJHbn(Oq!h7Wz?DWs%tDu3O816L-$t^sfa51FggLXB-DiR#;%>5UfH1{br?U*W~OquhZkGAE3R@6Ws(;W>62n;k>`Y?VWQe&s$^#l*ulY0 zGLPsl3ULw#afV6?BzFTZ@im;h7s%E!iBV=-q4}ffLLxVwwoAE$gO|b+r7_S$$~ivK zP}_3!ziouvKfFg|DS+aGu3>|7!rST3J4qB{B(nECl=(<1N z%%jE`XT~rG*|BXgZZpFe%OttD`~7dmO1I6f#-`JaULZzj5k=D)vK-Wi9kx=j2U5^B2Ps&ULR4xBHhzn~eDOdebH@s|Gb zbn-qtQjLpKwo{)zbH*EwBa&7y_*iCGGuCLCqQR{obwb@h1KHGk{Az2Zdr~pcmUDndxQ_ia2 zD?3MHWJ&q9M0(*ex)oO>%Ax^@!bcK(7Zt0y$}x5$vuA3MX1)oJHk?CW?h6#`g^ANv z_hh57?T8!SP0Rk|e&Az1{$xbPTMjOd9Omcqc$6uxfBG+NjNSD2H1vf_SA*MhV^`kz zqcZIc1hLJlSdofRpR#8ctJOaW%jx&|beSb~?_On}AQn1RayQ9$hqbY95blZw2oFYA z#w;lp{n#E$k+M+Q?Lt;oXGqZ$+4<1~(=2?p1v&n`#Gp=#VvI+3f3Xv%c&r=I;BLZ~ z;pVMz7NYBZC&QFlQKAq>6ML2wbYF}EYI6my`^yQP6 zIm)@))x`80Gb#`H{TvTT(b0IMZmUhX%|ex~M)?v2C+i=X-w&KK*dyiIjqC$)e>ba5 zdwKU~^Rv=R+uM7mt4p=ZS=*&( zfx!h7k7oDysZW{jKq*+Lh*mDI^q>^NfMo=3MAnj;B!$3{w=U z-%dncv&$F+A;{l3NO#qxX4wm|S*p?;4GEEDMaFCls;oYx85_q?&G-HO{dHX!p$|~h z1#zM~o~zzLBOU}*)8{Sfs|ctmDvqer%JL6<5Wzz_hF_;Ic)K}$2waMO=XrszrD-nK zHM8N>Cz>;m|+BIlu29j_+2D! zbwBlvWK3%^jQpxt=1jidD&ywKa_3}na5|BfOE1;I|GuHMP63Lox9`Htzp~A6=Uk86 z=?8wZ8x`QSGBdd{12ZX8p<=SfhFQ2aS<69UvfNavo5s246YG0A7LFF6|2R86U5$m=3Q?W4S>2Vt8&ZRc$};=jl|ho0hv2UYL2AI`aaY`Ek` zVkIz`FuF zwDNGNC1s~kPT@<1xLzkqZLkvwC8rNMgI2lKHr1w&it1?=ce0_{Ye4tn%iE^UR@Bs# zN)$F(Zd(@T3Jgzm>G~NdU+$hFVb~0zOFA_YXNUoER1rie1x1atK?SgnPwW~NzM@NG zzBgAy-Le1BlOO@v$%0GZUpH8+B3xVopj}%tonQzw@sbRH>T#{CbY})zE;i;O`);Z? zeVBPDBfX|vRkD0eME`veD&6C$LCZu@I7YoY+ZG(cAQF1)HrX5{>}1m`RBgc z?C_?;)lUU9k$87iGjY+Ma~aPIBjz#+X;@WEt~>m+$ExaoC)1w6qMmYlDn$GGkxjm< zt7|!X%q`||#~U!9we4;*etZbrLgywS3c|opbmkvtu7^5~=R3Ds#Umu7v7W6+Nip=o zy+6CKaKEosNaH2$j4*f2vdn$BKBU}@J+yng$)XF|TI+o0X+008GT4y!bhQbS#${e0 z|LoTq4Nveg+AsQJdzGH*tNF8_)F=BDH(kI|n;+yzQ0t|RjWXVeI^B-wCz%mri#Jkq zIIPi^*UeE|_cIwe1U8$}Oi+)|L6|Z6*CLsEH4kA4OVzI7(?!Y(|E6(^uJ%5U^Wc4; zZLoIlDATSnIG8O@$_o$QJzFMVH@DOq3qM7h8irpsK%iNMqg;u94@OQ_FDkTIn5=e~ zU=#Nbm;LIIp3H1WZL6~iiV?c`mMJ=To7OR$93U3XqQ{)We`f?LHawM#-2y`LTem_l z@!j9(E;h!SMv3#xz87@$eE8C@5IZHU*z7g(fr`A1Y)tSHrVkdkw_Q37g~?{Bul!)! z%GJ=>qQaI_E8*CgN#6Ty-vvO#byib4yRmy{8Y@<=GgsV^0znW z{Okp85gXUZy83g!#|xLBRR7y>^o6}a_E zXd&3gYb5=XO7u~dyO4&+-@OZ`?ZF~+qk^5mq(M2Q$v|8eoWmECPI< zvY{{Ks$!~Bg7B`y{Ob9tVi)UXK6cn#l_E(C8cku6RrYb_r)Ru07RwT=GWAX_mA~NN zN9OAvabY&jY2436SB&m(N-yYQ-?e_n?JZ%M2R1ZO@+P?{S8k%?bIU_tgU; zS|T)J-7jaGar5D7dO!93!utpbO}PBskCrK?{2y>gqw~GAS2`B%&@(0YiiuDDra}O1 zbg=J-E*kSELa^y!znHY4uH1(l zEJEh#A^V?v&e=#KPTRZZu30k=KuND(M!kFw5sZXEA>5OWi7!+{R3N@U#6 z<~MiP{1Gn_8Pr3{c|mEa4*8SO@6Rq%XqtJ`?H-Q>LDdqxcd30k+e8MK|AAJNV^{uA zghS8sIjXnpKjWc(y&>w`bj{N`93rNR^;JoH^9oOPzqff_x)HEHuv=8z9I?NR7XY76 zy8HbUfYFu_7<~xu@;_;nU^~lyKlwNj?&2(F!4F3B`bUl(fwgpt%RTe~A$_X%dx{#n z{OH!!Trx-J(Sko@O6fZ3{TP4oHPHRk%JyDY$2nN81jZ!556=JsFS_MYK@y27EQG+~ z0T=4=@{8~~Ul2tuCy}e5bq>gupTjirB zI&~S}n8jDeQ%D9g6odl?2O~Ig}ktf%Mw_wg4I>U5t6G8{u9UNZbyg4#K0LkrjPCv zjB)s=Tj!9eLqOt4RqFyTP=v0}*w$&ZNWRL~Hw~L%R05 z&`_rzbo=r9QDwU3@P2S7Lhpi5>5E0knFk=>vKVTUDwxF(kqpi_W(C>x4su#W8nn0( zKU*^EHXKi*y&IX99T3_pa=^wUp+ zSBzNJuvYXSsJ5PZ0l1QkA+IqFsM|vhNKECh}$+Yx~B6C;me> zR43k<&r|P&U+`k3#hwOp2ZQA>6Sm1!FqCFAsV)T2J`F3iBCT@-+{A&c~rZ zTvB2v0;^Nymj`QkbUK?5)vQ;pC~T)vn57nCx0hBCB%9|W#qr|e$lSyDnjbXy_HuYN zi7yXg2v^(1Z=|HN&T6qa%56ctlhcA3h>KFn*H^LeC5*f28|^~%P!9x$QR|(Lif!S}Hi4;7HAseohrfO$++}}R{THCH=Mrfv{>EsYZ&*M+!x?TH~>Lcpy(;RIEgxumQk7v%dNan1+wdL5q2bs^7@xa?I zY&*bLM*9p@w)WfSAgUww)4)6J$i2?Ytx~8uf8*t9$LEpE_S-SzLCRg%!LQVXAxQ3z z&Y%LV*C9*1{E0~LPh4A@iV)?GpCZve+~S2L;;c|M!%>zN+_sqowuRUaFmoy zVBsmj4#OcjK~*7|^b3Q!L-X;Btrho(a65O-k0)6j4(p)t@RBv(NRzKs3@oS7gNRXK z1K}LQN)#H*`8t7MgN?Wxe=?6-$VD`2o%3)AKONIJ5CHqnN+*ZPvB;>d6L#ZW1 zJ0q+^07g$oSs?6sI+%Wj?Sikz-=Ue9Z(YKc}H<$ z$n|RtPxG1%P8bfxk?)pyG>!=0XlEcEEionE~Eiv9?CAuk4wFqw6r`? zV~I=Q0ZE}f3@PDGC0jo|g$4pQ{9T79M9g2$_UO45KmLtT3<}*mc}$p=vONAOWQqm; zz|g15X0#W~L|A}i_?KU>$@#mAS0Z4QXmq?Fmo+j^SXp&iWBhf-wVsuGKJq(agorp^;3tsj^H2Ho?H7 zVWHrlqJgje0TCL}i&0-i0hEYy(OZC`0K*8ql2S3+lmz6uZKJtR10rq9DeyKUGzT`i z_%N907AHg?b8enXz5hhBk5D2Y6p(wvKh-HxK=%EM0F;K79i6@&m0*c~op^huF?eog zC*G^rOg&Rm7q629%a;FMfdiSa;^-jAol?=Rp=0wM;NQF*ev%!kP;8X^u;!8ojYg4K zU{z_#?d`CzfdX*RgGr^VylO|1Z@!bB5nJh7NWx2k3{H|x8-bEd*U^bJt}1<*wasm? zb_sZ97I-aqj@}+U4$ZWpE(a%E`v0z5qcu9bfI9{>QAMYoge>?b5=majHuArh)c6s7 zz9uJAPt8QJqG^5WB+T3T;q5T*0*UZ{S#4v<_drt;t7U zj$M%2e}3j0 zL!7(Vsyyj`{|I1F9PJ;Xbj)0?7kK}H@a?3@95l($G2J>HoZNe}II`ZZ&oafDI~ls8 zQ&@sCQuM+bggeh4#%XJy;PRjvbOXrbP((k{7HW(sH2z=CJsg&((e|;iV?;uMh?7z8MDPYVcZ-OXD9u9qUrdF@XSKWWh>+ zkF4(gDlqri@yi%&-K4-tgeOX@bO6WuoJ z|5*SC0^n>Or*Gj>$sfOH)}&UIzAh@I{AG7z(kz6&>`*2jbQvj~E&7cA7AQV$6{9iZ?QyOensdHkUbSm_kHg2Bo z?mX_j04lxFx=O?2NS`jH!|@Xig1>ux&k<@oG6B1E*pW7oKmPcMR(<`FiOKe4l&h2D zg$~BYx|Uk)8xnpR&DdkT{%zH)%k#e0QW{0Y)7jAPDW(^RmH>y7U?1SP4Ci!c)!VJo zX|tKTEsq>FHt{%_ru07wQUJwH7aJw3PWw~8v<{<)>2iI!X4gZPDP#Z9v_D|0tVK?{ z#guHWp0&{VO5+-U;sb`*d2A0-Umr}z2fC86w}WUGxyBoWL$o`jjfGNh{Q+5Xf8TUMJ3O>+>`k3?utk* zD>cIsjdGU+y57zX&x1Y?{4!G=z+u`(nqOhyaXvodLjBW{hQ6bbM%pJ~O8t}0iH zvqCbsVuoJ0d7L;tSM(abO`jD0(p=(v#yjV{Klv7OfP&7hk+ZBNuSuv>Qq%4l3`N4b z_OJ(oAxR9Nhx8HF&*_i9e*f-WT9Si;ivE_OsYs_?9m0R^VPDI{g$G8)avEw%41w}czq>DOiKNI zcE&OV7=VuG=O@n}m1oYFNSDCmTG4qt3WL3FPKQ}wiYgu{sXd)~N!|?h^L87L-&3Am z$gED81qS5Q2@R7t^MhuEVKnvT8lYc*qp2uQE%9<#m(ihPM&8L@MJd!$_ zUCt6C_TxS&X1tURr}7M)1B0bIAY}{w2%HItiPjzy)^ioiX2wushK)Urh_JMVPmj8s zDZj>{idZXSgCA^Xb5xpCJnxM!xGtt*u=2#uO#tvC8utfL=>GrV>8zuodf#ZTw6s#v zASK-~gp^8mN_Te--JmGl-5}jacgN7(Fm!jrJ$!%nUjAb(&Kk~{dFPyWKcBsK>Yc_95_m+k1Ap!w5`3ySdrOjdO60(oM!QkQTGm?4^l>Pf%MqjRj_&3KQ$B3@?*^j3;rz^QP+2O%f+~D2I8PY9i zKY8}tCN$GTH#9Wr(M=|m2)?ssug&+7DKCE&fYOZm$^_7@{W8Z>De*4F%a89r*)NtN zyOjfOm?Ew^hiL-0l2M8(y>YhbcDh(*6deZEHv6@9;iS6*QU|u%SS>$2SBb@hg7Z1b*L{V@f*N2;ABRiQmmqy9(wG&lP!V(=Prptb4tCwf}Fp1 zzGbP5HCMYR7c8=wjbQW+Z$`}EDeT|(cCFISPwPJzvIEvFe`c@oS6CEa z7VI5pfq|)v$Pk~b*hI72Z?fB}1FuqK_Eo%2x2+=QqUAbk#|&OchW$6C&dLQt>a{hH z4^*K;PzgijG3(_zrR{8;_oKB?p%IFh2sYpb}*TAEh2A?O3by>sX1rft~H%s0x!+|SDHBS;}3RYsrS7k<&g`Ki5nErve08I)pv7Hi-D0}xVvN&LS*ZZozF@`*X9cVHm~hd6_-X#% zi|^z8BIyL|6Jw%a8-rGjvf*PW*&}63tn>;=v>!Q7tRcQl4KHlXbz%z*bV}3^s=)(R zB8ia)kFsr_$D*1iRy+PbNH6(q)M=`lNRV7i&pXeXqiP@X%T0eDFxKrvw;y7TrXY7c z{ZO}^&vRHQhnfV(MbH)~jy&@AyvBNR@T_kvMD>OfQ7o3tG0szw_0;@QPf_V|;HWeo zN`c`jMx@H*)%r19zD(;!Rsb2d$j72~ynh{T~6p0hx4p>xd3ra1h$of8X7-5(9|v^RgKHto^IY@{Bt zG4*x-(nh}+{1l_r6AD3Y5WJ3iG9m>khf3E!aiB2^6MCR_{>~!r{`0om>9}G9+s3NP zIPplX{m1z(g#eKTce#}HKOsL)0$EXVX|2!Q14$a;A6u`c4nLZzQ46COX@Z#xS>t^x za_x-dZ_(ErH@;R(wco!Wv?c!RbL^olEj1n9q#ZxNknlVOHIY@Xa6WG=H@M($w^hG^ zhHzddg9T@__>)z{DL=;SFK!`?eQXb3=edl%fbDS|dJd_sAAWI4DRana;kBv`oy@M4 z7_~3qVZ>(E5X!JFWvAv^>0Od~csyaC=|k+V<>9K#2*+VkjGX75cZ)u7Cp8P5x5GMw zVbUq{FaH%Rn#bY){iSdKx=`m-Et{#8j=oV1i~|RP^t8gc^z>2HS7{K$*^yd10(8W= zm)X&tc96Pn(`q8Ldzib#h+wD{rd=cw#)m{5oQvt*f}LXjfRysF;ep5-9l1M2`G^U8kx^R(UZIBx;w!K4UoSuDQ$`E8AuXA&&OtqTP`qSDr z`I?x)vM2YFpysW&PNK}P!`;XIaPq3^`OKzK#ddwVN7|)@-@r=4uKx|Q; ze3|81k)(JZx^?>&&XX;nL7B@eg&hq?182&Oc!OdO73oBuF2k% zfA8Rm>h7o?(B2l>o`&gwIv*Myu5^qSZ-Id7^(&g#1O2I(m^1Emzz=wnko}ZQJE;)R zRR+09r<%ZG)))&lU?B6qASRB57@uq6nOuC5sjv|e));6 zobPG++|>RZUCUK_O{(Le9=51RSP(6iLf9W(xveG?znHRAq9#{9IJlfYNhCD2LCKWm z8Onr-DmOQv-_RvD>CdqGVw_WV>JN3&$@blYY*7nbiJSi&i|7aYR@^)TlO`dFN!8W} z(M;>#x#02o68sRyL0?WwWA0z3?dgnvc0sA#%JyHxHK!UjpOR5V+wEl>7BvA#dqOyi+^Tx#YkT{XkYF3p`gX7X;T>x7FUvzcI<|96O{C)$y8ur{_0M#I`+ub@Il| zhce?4db=Fz>emm*5e{?>K>VeyjrkxJ5T3saoxf9$GmXRP*)5 z1-E+7V;eolQZCYxRgO2_g{pbY=~CpT?|2Vpi>92@K+A>BX|UyeV=<09XDCW@^H$p+ zUL3NTPE2XC4XwkgdF7w1-GMufb#%c=@(($7DE>3}BW@sj+W)Dlh;JchdiDhkD^hwuzrN{}Z+ z)4nS=2zHRIm%fNwCr_n`c_c)srN%|(k%g0PN`wg~83Pkp5*Hv+J$4mhg65ecwooso zj>#5l4Yg}_10u0*`c~MNU`LA%-PbgFDHUU-z=8R zvjlj)tLggd_^u+EG@#uF_-YsTX|?&C5qrkyVi=BSski}*GoB|QO*+F9Yb8h64h*S{ zhjiO(!_l0-WzBmxKR=cU`xc4^awqhi-X5@MgF33t!I(}8NWu*T1(Y?SX3v~RORR9m zfsr{BY;?T17tIFuqR1!!5w7Xz@IozF1_Qa%SQ5M7k}?T#E^SV^V1=&lD%AQ%HZV8v zrj2s`Z`}s9|55_9_m3Xe(K90rHDnckX(yD!JDj{ZCT0G+XHdf+whvH|G==`COqr7U zBFkj$vegE(2E}x+9j8dh2jm2jECZ#vgIIExGvvlE)>6aMulFe^Wo-wmED)f;hQw0O!~R@nHBUW~!s&+x(hMD*F`x8_nzo!Zyc8oBJL2&0xY~7>A{Q$d z`wQqjWodkWBU7IGv_|?B0W}7TU{h!kuoZovup>%MRg=Z|Y7PDwFfbYj1o}jatvP%R z{PXC5>YqVhOed|wM5RS8&~~&?7kwkvoQFsD5Ao?oA9Vi%*Qw#A7Wijv5IG2SUOy{y z1ey7w6gi~N*u`Orhjf%nDF<x6^r~%4fjJ%DhQZ>U^A|nxvdo5~44XWFPKmUly}d z{UsPD$pG_~8}O5vM#Ka}=J4*I0Tu>epwg4tHTdP(C^nW}O~d`hTO7;D#cXwfWHI3| z={gPjGq!vg6(yxK;EN;kk~hr@#c{gn2zbk8xP8L5yY+TsE3UC39dL#X4eNUM+5N*D z$Y3t#KfBFQY)cn-!U-DAaNHhxga;n3NGP_365 z4e_O;ys5RIZgRPku=(@hooJ{3YF3m08slNovz!@UGKbA)LFp9Q1ajqh5_HbJ#exKW zl(z#PLeDzeghf4^$519cYnr9 zP-IiOfBzPp-$e_Z7?j_|iGs(FIr@;^g6N!Rw$j|NRemRxryszpSg+@eqgp7u54QUW zCg%eKLbKsl8Hqn{Mw)ov zx^3`J-!lKGs)q`1o8lrL8;t#ACa0*Oy+MbO?(SGm0#%t#ddA?L9zLGUexTK9u6Vrf zgTYUY3^E&^m_C1G_qs~jdZ=_?HgT&l-BE^hUOTntPSw)p3yI!eIL^j0i;phf2Zj{j z_WT!;d_vC5^{!wu5#P2&6^j6zb{_>P2S%W-VL}F?K^XLD+A3tH<0_YOW}v`}{a7mL zpI&8hy3cSDjq|~bvW<+Gzfe0*1c7~Nuyv+Nk>%)WMkXX#HR^>Z9GU zx*+Mq^WTBwl$I-)6|)s-Y?CX-_LZd0ODtyAQeLt(n1 zaV|V*$QI0mq-#D^(Q0@DXqS|d{Q-ff?gf zM>@5CzJXV#A6xpmnk(UG{=hcc?* z^6rbHswYd?m+_Eu+>cQ)n{z6IT*OV1vNjLLe0(lfxYp03E}8&DRz9msN(s_`ewq|H z>iq$D4p55ZR*t-qWMqPDW%0h-vfGXYA2tj&!wK5e`*qy~p zKM8W}dOQ8$90j@F@U+hdGq$m0hlD6fk6jUBMYB_7)>Jm810QuuItUwYR;V;vFpQg@X7H+n=Z3HGWYgxtL3Un3#S@fF#75@xj$Mw5kygi zjKXWsY;x#l24Z2E8O)zksxI8ba$f*PzEl-40j5A<#~4&{?b}O%fA|v2PPU!eZJzsH zk12FhPOPwC5^wfkA}^;zx9#0FDVk7z^o?EO(Bu6Njc7}+qs7|zr~c^2aV5BS8vaIIU=2qZtvp*W5|co;of4ztMu2l@ZQ4TJ^p58 zyBxW3V$Z;GS0Lp2TYSLLfiHMV)m%4QraL*#?)2GdZ%X*aG|1Q4ntAr_G|9o1tldL9 z%gWqbzM%0>1`jcQdxW@OKH904(c~VwYRL+jwI1a8@_^{HMeWtz)_JF^&gQ#MMisr_ zFt!23#7upKfWAj34$w*B&KpuSSBJAjy`%5-1oE+aYt0Ka+Wa{bJPQN_VrG!d({<|Y-dTWDE{XcX z5F<<>T5HuTpWsCTO$=Q;pLo<5X^;ow*iECYdBW;BdarOkM`A4CI$Snj_m;BCmdSVc zhZFgDMt)+^BnV={if+UW_SgD0c+Za{SGj#*_k|jjnr_7SoECnawpx<%zQ?{5)wB}% zL8#%PU@ zv*9_iVz_5zxa<#A#$>H?`XSa;ePJ&Xkl8nE@IKJ-I=R?7+o)h_vitcbtRY7PQhVlV zkmhS|1oL8JDlsr5-LYMAb_@34OBMbU2*Py#f5{-f@ z!(Sq1f_yUl^i~Gk;Z>TQ}%Zo*Pr%o^0@x{ONg*Zlub zA;nOkuKQXRm=2{Nyqu4pZ}W&*Vx7c8?GIl8>7S~i3!s;>& zjgg}D+~#>zTxyY6^x@b~B6mzA9dIGD7IK)J zn-<5s{J#=RjqjVgGoQ}o=$Pu>GC&n)Pu0?>|Cf&j?AnE3V2(dADI!CXA}L!sD2>VFn13AkPHu&^+-@{+WeE~`sERGI{8+xY)*t4Mda&Q9iz z6hd2`hAB}~$bX;{EQ|+wy`94faNRL(Mr!^;rO08V2@`(CG$F_`@lxNXlQt!bJPzx> z{_g~0nXDVoLkaCtPX{RU5k2qBBxU>6ONHPUOO8q4y>224(KeZjRWS|!UmlD(%BuzV z*Cw=?wO9r#7lo_mzcXAyL;6gU@C()uYXi#jBE%8>nL4iJ+Ge+AFW{9oIw5PXEGC-i z=|F#H?=W7qZ0B$T!P0ZLz^os7k7VCBVBGQN^#6-pZ~18OybKSE9313Nq+fSWfQJ$m z;GJYIBIf$aqGNuur7kVo*~jCK#o#VZZI*+`}B6-EywFb}J4S{Lf$sadJ;Km(jHX6-N;4D!2

iUASMN+pMcTs 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 NQIu7asg`;j^gkXFrB(m{ literal 0 HcmV?d00001 diff --git a/docs/drilldowns/images/drilldown_on_piechart.gif b/docs/drilldowns/images/drilldown_on_piechart.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9b3311df03250b52220806b4c06ac516f1eae05 GIT binary patch literal 876715 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%0Ant24CEdj6eGvI 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%0AamPW#D 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 KSe)KjbS^2bmOUGh`W^abj((l7;UT}5F2 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�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 Date: Tue, 9 Jun 2020 10:43:24 -0500 Subject: [PATCH 48/91] Updated the Writing documentation section in CONTRIBUTING.md (#68434) * Updated the Writing documentation section in CONTRIBUTING.md * More changes --- CONTRIBUTING.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4bf659345d387..959c12af90463 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -661,18 +661,23 @@ To build the docs, you must clone the [elastic/docs](https://github.com/elastic/ repo as a sibling of your kibana repo. Follow the instructions in that project's README for getting the docs tooling set up. -**To build the docs and open them in your browser:** +**To build the Kibana docs and open them in your browser:** + +```bash +./docs/build_docs --doc kibana/docs/index.asciidoc --chunk 1 --open +``` +or ```bash node scripts/docs.js --open ``` -### Release Notes Process +### Release Notes process Part of this process only applies to maintainers, since it requires access to GitHub labels. -Kibana publishes major, minor and patch releases periodically through the year. During this process we run a script against this repo to collect the applicable PRs against that release and generate [Release Notes](https://www.elastic.co/guide/en/kibana/current/release-notes.html). -To include your change in the Release Notes: +Kibana publishes [Release Notes](https://www.elastic.co/guide/en/kibana/current/release-notes.html) for major and minor releases. To generate the Release Notes, the writers run a script against this repo to collect the merged PRs against the release. +To include your PRs in the Release Notes: 1. In the title, summarize what the PR accomplishes in language that is meaningful to the user. In general, use present tense (for example, Adds, Fixes) in sentence case. 2. Label the PR with the targeted version (ex: `v7.3.0`). @@ -681,9 +686,9 @@ To include your change in the Release Notes: * For an external-facing fix, use `release_note:fix`. Exception: docs, build, and test fixes do not go in the Release Notes. Neither fixes for issues that were only on `master` and never have been released. * For a deprecated feature, use `release_note:deprecation`. * For a breaking change, use `release_note:breaking`. - * To **NOT** include your changes in the Release Notes, please use `release_note:skip`. + * To **NOT** include your changes in the Release Notes, use `release_note:skip`. -We also produce a blog post that details more important breaking API changes every minor and major release. If the PR includes a breaking API change, apply the label `release_note:dev_docs`. Additionally add a brief summary of the break at the bottom of the PR using the format below: +We also produce a blog post that details more important breaking API changes in every major and minor release. When your PR includes a breaking API change, add the `release_note:dev_docs` label, and add a brief summary of the break at the bottom of the PR using the format below: ``` # Dev Docs From 7c0f838aaf196d94fcbdc09b840f2cd0b974f843 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Tue, 9 Jun 2020 11:48:37 -0500 Subject: [PATCH 49/91] [pre-req] Convert Workpad Config and state to TS (#68615) --- .../canvas/public/components/router/index.ts | 1 - .../components/workpad_color_picker/index.ts | 1 - .../workpad_config/{index.js => index.ts} | 19 +- .../workpad_config/workpad_config.js | 169 ----------------- .../workpad_config/workpad_config.tsx | 175 ++++++++++++++++++ .../workpad_header/view_menu/index.ts | 4 +- .../plugins/canvas/public/lib/create_thunk.ts | 23 +++ .../canvas/public/state/actions/elements.js | 2 +- .../canvas/public/state/actions/embeddable.ts | 3 +- .../state/actions/{workpad.js => workpad.ts} | 34 ++-- 10 files changed, 231 insertions(+), 200 deletions(-) rename x-pack/plugins/canvas/public/components/workpad_config/{index.js => index.ts} (63%) delete mode 100644 x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js create mode 100644 x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx create mode 100644 x-pack/plugins/canvas/public/lib/create_thunk.ts rename x-pack/plugins/canvas/public/state/actions/{workpad.js => workpad.ts} (54%) diff --git a/x-pack/plugins/canvas/public/components/router/index.ts b/x-pack/plugins/canvas/public/components/router/index.ts index 5e014870f5158..fa857c6f0cd3c 100644 --- a/x-pack/plugins/canvas/public/components/router/index.ts +++ b/x-pack/plugins/canvas/public/components/router/index.ts @@ -11,7 +11,6 @@ import { enableAutoplay, setRefreshInterval, setAutoplayInterval, - // @ts-ignore untyped local } from '../../state/actions/workpad'; // @ts-ignore untyped local import { Router as Component } from './router'; diff --git a/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts b/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts index c6dddab3b5dd1..abd40731078ec 100644 --- a/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts +++ b/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts @@ -5,7 +5,6 @@ */ import { connect } from 'react-redux'; -// @ts-ignore import { addColor, removeColor } from '../../state/actions/workpad'; import { getWorkpadColors } from '../../state/selectors/workpad'; diff --git a/x-pack/plugins/canvas/public/components/workpad_config/index.js b/x-pack/plugins/canvas/public/components/workpad_config/index.ts similarity index 63% rename from x-pack/plugins/canvas/public/components/workpad_config/index.js rename to x-pack/plugins/canvas/public/components/workpad_config/index.ts index 913cf7093e726..e417821fd4f67 100644 --- a/x-pack/plugins/canvas/public/components/workpad_config/index.js +++ b/x-pack/plugins/canvas/public/components/workpad_config/index.ts @@ -7,28 +7,29 @@ import { connect } from 'react-redux'; import { get } from 'lodash'; -import { sizeWorkpad, setName, setWorkpadCSS } from '../../state/actions/workpad'; +import { sizeWorkpad as setSize, setName, setWorkpadCSS } from '../../state/actions/workpad'; import { getWorkpad } from '../../state/selectors/workpad'; import { DEFAULT_WORKPAD_CSS } from '../../../common/lib/constants'; import { WorkpadConfig as Component } from './workpad_config'; +import { State } from '../../../types'; -const mapStateToProps = (state) => { +const mapStateToProps = (state: State) => { const workpad = getWorkpad(state); return { - name: get(workpad, 'name'), + name: get(workpad, 'name'), size: { - width: get(workpad, 'width'), - height: get(workpad, 'height'), + width: get(workpad, 'width'), + height: get(workpad, 'height'), }, - css: get(workpad, 'css', DEFAULT_WORKPAD_CSS), + css: get(workpad, 'css', DEFAULT_WORKPAD_CSS), }; }; const mapDispatchToProps = { - setSize: (size) => sizeWorkpad(size), - setName: (name) => setName(name), - setWorkpadCSS: (css) => setWorkpadCSS(css), + setSize, + setName, + setWorkpadCSS, }; export const WorkpadConfig = connect(mapStateToProps, mapDispatchToProps)(Component); diff --git a/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js b/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js deleted file mode 100644 index 45758c9965653..0000000000000 --- a/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; -import { - EuiFieldText, - EuiFieldNumber, - EuiBadge, - EuiButtonIcon, - EuiFormRow, - EuiFlexGroup, - EuiFlexItem, - EuiSpacer, - EuiTitle, - EuiToolTip, - EuiTextArea, - EuiAccordion, - EuiText, - EuiButton, -} from '@elastic/eui'; -import { DEFAULT_WORKPAD_CSS } from '../../../common/lib/constants'; -import { ComponentStrings } from '../../../i18n'; - -const { WorkpadConfig: strings } = ComponentStrings; - -export class WorkpadConfig extends PureComponent { - static propTypes = { - size: PropTypes.object.isRequired, - name: PropTypes.string.isRequired, - css: PropTypes.string, - setSize: PropTypes.func.isRequired, - setName: PropTypes.func.isRequired, - setWorkpadCSS: PropTypes.func.isRequired, - }; - - state = { - css: this.props.css, - }; - - render() { - const { size, name, setSize, setName, setWorkpadCSS } = this.props; - const { css } = this.state; - const rotate = () => setSize({ width: size.height, height: size.width }); - - const badges = [ - { - name: '1080p', - size: { height: 1080, width: 1920 }, - }, - { - name: '720p', - size: { height: 720, width: 1280 }, - }, - { - name: 'A4', - size: { height: 842, width: 590 }, - }, - { - name: strings.getUSLetterButtonLabel(), - size: { height: 792, width: 612 }, - }, - ]; - - return ( -

- ); - } -} diff --git a/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx b/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx new file mode 100644 index 0000000000000..7b7a1e08b2c5d --- /dev/null +++ b/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx @@ -0,0 +1,175 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent, useState } from 'react'; +import PropTypes from 'prop-types'; +import { + EuiFieldText, + EuiFieldNumber, + EuiBadge, + EuiButtonIcon, + EuiFormRow, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiTitle, + EuiToolTip, + EuiTextArea, + EuiAccordion, + EuiText, + EuiButton, +} from '@elastic/eui'; +import { DEFAULT_WORKPAD_CSS } from '../../../common/lib/constants'; +import { ComponentStrings } from '../../../i18n'; + +const { WorkpadConfig: strings } = ComponentStrings; + +interface Props { + size: { + height: number; + width: number; + }; + name: string; + css?: string; + setSize: ({ height, width }: { height: number; width: number }) => void; + setName: (name: string) => void; + setWorkpadCSS: (css: string) => void; +} + +export const WorkpadConfig: FunctionComponent = (props) => { + const [css, setCSS] = useState(props.css); + const { size, name, setSize, setName, setWorkpadCSS } = props; + const rotate = () => setSize({ width: size.height, height: size.width }); + + const badges = [ + { + name: '1080p', + size: { height: 1080, width: 1920 }, + }, + { + name: '720p', + size: { height: 720, width: 1280 }, + }, + { + name: 'A4', + size: { height: 842, width: 590 }, + }, + { + name: strings.getUSLetterButtonLabel(), + size: { height: 792, width: 612 }, + }, + ]; + + return ( +
+
+ +

{strings.getTitle()}

+
+
+ + + + + setName(e.target.value)} /> + + + + + + + + setSize({ width: Number(e.target.value), height: size.height })} + value={size.width} + /> + + + + + + + + + + + + setSize({ height: Number(e.target.value), width: size.width })} + value={size.height} + /> + + + + + + +
+ {badges.map((badge, i) => ( + setSize(badge.size)} + aria-label={strings.getPageSizeBadgeAriaLabel(badge.name)} + onClickAriaLabel={strings.getPageSizeBadgeOnClickAriaLabel(badge.name)} + > + {badge.name} + + ))} +
+ + +
+ + + {strings.getGlobalCSSLabel()} + + + } + > +
+ setCSS(e.target.value)} + rows={10} + /> + + setWorkpadCSS(css || DEFAULT_WORKPAD_CSS)}> + {strings.getApplyStylesheetButtonLabel()} + + +
+
+
+
+ ); +}; + +WorkpadConfig.propTypes = { + size: PropTypes.object.isRequired, + name: PropTypes.string.isRequired, + css: PropTypes.string, + setSize: PropTypes.func.isRequired, + setName: PropTypes.func.isRequired, + setWorkpadCSS: PropTypes.func.isRequired, +}; diff --git a/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts b/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts index e561607cb101e..0765973915f77 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts +++ b/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts @@ -14,13 +14,11 @@ import { State, CanvasWorkpadBoundingBox } from '../../../../types'; import { fetchAllRenderables } from '../../../state/actions/elements'; // @ts-ignore Untyped local import { setZoomScale, setFullscreen, selectToplevelNodes } from '../../../state/actions/transient'; -// @ts-ignore Untyped local import { setWriteable, setRefreshInterval, enableAutoplay, setAutoplayInterval, - // @ts-ignore Untyped local } from '../../../state/actions/workpad'; import { getZoomScale, canUserWrite } from '../../../state/selectors/app'; import { @@ -75,7 +73,7 @@ const mapDispatchToProps = (dispatch: Dispatch) => ({ }, doRefresh: () => dispatch(fetchAllRenderables()), setRefreshInterval: (interval: number) => dispatch(setRefreshInterval(interval)), - enableAutoplay: (autoplay: number) => dispatch(enableAutoplay(autoplay)), + enableAutoplay: (autoplay: number) => dispatch(enableAutoplay(!!autoplay)), setAutoplayInterval: (interval: number) => dispatch(setAutoplayInterval(interval)), }); diff --git a/x-pack/plugins/canvas/public/lib/create_thunk.ts b/x-pack/plugins/canvas/public/lib/create_thunk.ts new file mode 100644 index 0000000000000..cbcaeeccc8b93 --- /dev/null +++ b/x-pack/plugins/canvas/public/lib/create_thunk.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Dispatch, Action } from 'redux'; +// @ts-ignore untyped dependency +import { createThunk as createThunkFn } from 'redux-thunks/cjs'; +import { State } from '../../types'; + +type CreateThunk = ( + type: string, + fn: ( + params: { type: string; dispatch: Dispatch; getState: () => State }, + ...args: Arguments + ) => void +) => (...args: Arguments) => Action; + +// This declaration exists because redux-thunks is not typed, and has a dependency on +// Canvas State. Therefore, creating a wrapper that strongly-types the function-- and creates +// a single point of replacement, should the need arise-- is a nice workaround. +export const createThunk = createThunkFn as CreateThunk; diff --git a/x-pack/plugins/canvas/public/state/actions/elements.js b/x-pack/plugins/canvas/public/state/actions/elements.js index 47fbc782f90d3..e89e62917da39 100644 --- a/x-pack/plugins/canvas/public/state/actions/elements.js +++ b/x-pack/plugins/canvas/public/state/actions/elements.js @@ -5,10 +5,10 @@ */ import { createAction } from 'redux-actions'; -import { createThunk } from 'redux-thunks/cjs'; import immutable from 'object-path-immutable'; import { get, pick, cloneDeep, without } from 'lodash'; import { toExpression, safeElementFromExpression } from '@kbn/interpreter/common'; +import { createThunk } from '../../lib/create_thunk'; import { getPages, getNodeById, getNodes, getSelectedPageIndex } from '../selectors/workpad'; import { getValue as getResolvedArgsValue } from '../selectors/resolved_args'; import { getDefaultElement } from '../defaults'; diff --git a/x-pack/plugins/canvas/public/state/actions/embeddable.ts b/x-pack/plugins/canvas/public/state/actions/embeddable.ts index e2cf588ec20a9..a153cb7f4354d 100644 --- a/x-pack/plugins/canvas/public/state/actions/embeddable.ts +++ b/x-pack/plugins/canvas/public/state/actions/embeddable.ts @@ -6,8 +6,7 @@ import { Dispatch } from 'redux'; import { createAction } from 'redux-actions'; -// @ts-ignore Untyped -import { createThunk } from 'redux-thunks'; +import { createThunk } from '../../lib/create_thunk'; // @ts-ignore Untyped Local import { fetchRenderable } from './elements'; import { State } from '../../../types'; diff --git a/x-pack/plugins/canvas/public/state/actions/workpad.js b/x-pack/plugins/canvas/public/state/actions/workpad.ts similarity index 54% rename from x-pack/plugins/canvas/public/state/actions/workpad.js rename to x-pack/plugins/canvas/public/state/actions/workpad.ts index 167c156dce998..47df38838f890 100644 --- a/x-pack/plugins/canvas/public/state/actions/workpad.js +++ b/x-pack/plugins/canvas/public/state/actions/workpad.ts @@ -5,26 +5,28 @@ */ import { createAction } from 'redux-actions'; -import { createThunk } from 'redux-thunks/cjs'; import { without, includes } from 'lodash'; +import { createThunk } from '../../lib/create_thunk'; import { getWorkpadColors } from '../selectors/workpad'; +// @ts-ignore import { fetchAllRenderables } from './elements'; +import { CanvasWorkpad } from '../../../types'; -export const sizeWorkpad = createAction('sizeWorkpad'); -export const setName = createAction('setName'); -export const setWriteable = createAction('setWriteable'); -export const setColors = createAction('setColors'); -export const setRefreshInterval = createAction('setRefreshInterval'); -export const setWorkpadCSS = createAction('setWorkpadCSS'); -export const enableAutoplay = createAction('enableAutoplay'); -export const setAutoplayInterval = createAction('setAutoplayInterval'); -export const resetWorkpad = createAction('resetWorkpad'); +export const sizeWorkpad = createAction<{ height: number; width: number }>('sizeWorkpad'); +export const setName = createAction('setName'); +export const setWriteable = createAction('setWriteable'); +export const setColors = createAction('setColors'); +export const setRefreshInterval = createAction('setRefreshInterval'); +export const setWorkpadCSS = createAction('setWorkpadCSS'); +export const enableAutoplay = createAction('enableAutoplay'); +export const setAutoplayInterval = createAction('setAutoplayInterval'); +export const resetWorkpad = createAction('resetWorkpad'); export const initializeWorkpad = createThunk('initializeWorkpad', ({ dispatch }) => { dispatch(fetchAllRenderables()); }); -export const addColor = createThunk('addColor', ({ dispatch, getState }, color) => { +export const addColor = createThunk('addColor', ({ dispatch, getState }, color: string) => { const colors = getWorkpadColors(getState()).slice(0); if (!includes(colors, color)) { colors.push(color); @@ -32,16 +34,20 @@ export const addColor = createThunk('addColor', ({ dispatch, getState }, color) dispatch(setColors(colors)); }); -export const removeColor = createThunk('removeColor', ({ dispatch, getState }, color) => { +export const removeColor = createThunk('removeColor', ({ dispatch, getState }, color: string) => { dispatch(setColors(without(getWorkpadColors(getState()), color))); }); export const setWorkpad = createThunk( 'setWorkpad', - ({ dispatch, type }, workpad, { loadPages = true } = {}) => { + ( + { dispatch, type }, + workpad: CanvasWorkpad, + { loadPages = true }: { loadPages?: boolean } = {} + ) => { dispatch(createAction(type)(workpad)); // set the workpad object in state if (loadPages) { dispatch(initializeWorkpad()); - } // load all the elements on the workpad + } } ); From 91e4fd46f46e6fc2df229bb51ad9e7cf432ea0c4 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Tue, 9 Jun 2020 11:54:37 -0500 Subject: [PATCH 50/91] Enable exhaustive-deps; correct any lint warnings (#68453) Co-authored-by: Elastic Machine --- .eslintrc.js | 1 - .../workpad/workpad_app/workpad_telemetry.tsx | 16 +++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index c33f4de15b919..3cac46e7d2605 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -91,7 +91,6 @@ module.exports = { { files: ['x-pack/plugins/canvas/**/*.{js,ts,tsx}'], rules: { - 'react-hooks/exhaustive-deps': 'off', 'jsx-a11y/click-events-have-key-events': 'off', }, }, diff --git a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx index 47b461f22ad65..3014369d94857 100644 --- a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx +++ b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx @@ -69,6 +69,7 @@ export const withUnconnectedElementsLoadedTelemetry =

( ) => function ElementsLoadedTelemetry(props: ElementsLoadedTelemetryProps) { const { telemetryElementCounts, workpad, telemetryResolvedArgs, ...other } = props; + const { error, pending } = telemetryElementCounts; const [currentWorkpadId, setWorkpadId] = useState(undefined); const [hasReported, setHasReported] = useState(false); @@ -87,27 +88,20 @@ export const withUnconnectedElementsLoadedTelemetry =

( 0 ); - if ( - workpadElementCount === 0 || - (resolvedArgsAreForWorkpad && telemetryElementCounts.pending === 0) - ) { + if (workpadElementCount === 0 || (resolvedArgsAreForWorkpad && pending === 0)) { setHasReported(true); } else { setHasReported(false); } - } else if ( - !hasReported && - telemetryElementCounts.pending === 0 && - resolvedArgsAreForWorkpad - ) { - if (telemetryElementCounts.error > 0) { + } else if (!hasReported && pending === 0 && resolvedArgsAreForWorkpad) { + if (error > 0) { trackMetric(METRIC_TYPE.LOADED, [WorkpadLoadedMetric, WorkpadLoadedWithErrorsMetric]); } else { trackMetric(METRIC_TYPE.LOADED, WorkpadLoadedMetric); } setHasReported(true); } - }); + }, [currentWorkpadId, hasReported, error, pending, telemetryResolvedArgs, workpad]); return ; }; From 45c81ce1ab778488d839000ade4e1eae8181c342 Mon Sep 17 00:00:00 2001 From: Spencer Date: Tue, 9 Jun 2020 10:41:41 -0700 Subject: [PATCH 51/91] run page_load_metrics tests in visual regresssion jobs (#68570) Co-authored-by: spalger --- test/scripts/jenkins_visual_regression.sh | 3 +-- test/scripts/jenkins_xpack_visual_regression.sh | 6 ++++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/test/scripts/jenkins_visual_regression.sh b/test/scripts/jenkins_visual_regression.sh index c6fefd45b005d..a32782deec65b 100755 --- a/test/scripts/jenkins_visual_regression.sh +++ b/test/scripts/jenkins_visual_regression.sh @@ -11,8 +11,7 @@ mkdir -p "$installDir" tar -xzf "$linuxBuild" -C "$installDir" --strip=1 echo " -> running visual regression tests from kibana directory" -checks-reporter-with-killswitch "X-Pack visual regression tests" \ - yarn percy exec -t 500 -- -- \ +yarn percy exec -t 500 -- -- \ node scripts/functional_tests \ --debug --bail \ --kibana-install-dir "$installDir" \ diff --git a/test/scripts/jenkins_xpack_visual_regression.sh b/test/scripts/jenkins_xpack_visual_regression.sh index 96521ccc8f787..e406bb3e6106f 100755 --- a/test/scripts/jenkins_xpack_visual_regression.sh +++ b/test/scripts/jenkins_xpack_visual_regression.sh @@ -13,9 +13,11 @@ tar -xzf "$linuxBuild" -C "$installDir" --strip=1 echo " -> running visual regression tests from x-pack directory" cd "$XPACK_DIR" -checks-reporter-with-killswitch "X-Pack visual regression tests" \ - yarn percy exec -t 500 -- -- \ +yarn percy exec -t 500 -- -- \ node scripts/functional_tests \ --debug --bail \ --kibana-install-dir "$installDir" \ --config test/visual_regression/config.ts; + +cd "$KIBANA_DIR" +source "test/scripts/jenkins_xpack_page_load_metrics.sh" From 14410e0c79bdced1e402c3a303729f7328207efb Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Tue, 9 Jun 2020 13:47:00 -0400 Subject: [PATCH 52/91] [Endpoint] Re-enable Functional test case for Endpoint related pages (#68445) * Improve Policy test service provider - Added `getFullAgentConfig()` to Endpoint Policy Test data provider service * enable Policy List functional tests * Added Policy Details Tests * Add test ids to policy detail Max and Linux forms * Added page objects utilities and moved `clickOnEuiCheckbox` there --- .../pages/policy/view/policy_details.tsx | 14 +- .../view/policy_forms/events/checkbox.tsx | 17 +- .../policy/view/policy_forms/events/linux.tsx | 1 + .../policy/view/policy_forms/events/mac.tsx | 1 + .../view/policy_forms/events/windows.tsx | 1 + x-pack/scripts/functional_tests.js | 1 + .../{host_list.ts => endpoint_list.ts} | 43 ++-- .../feature_controls/endpoint_spaces.ts | 76 ------ .../apps/endpoint/feature_controls/index.ts | 13 - .../apps/endpoint/header_nav.ts | 55 ----- .../apps/endpoint/index.ts | 11 +- .../apps/endpoint/landing_page.ts | 29 --- .../apps/endpoint/policy_details.ts | 225 ++++++++++++++++++ .../apps/endpoint/policy_list.ts | 46 ++-- .../page_objects/endpoint_page.ts | 17 +- .../functional_endpoint/page_objects/index.ts | 4 + .../page_objects/page_utils.ts | 30 +++ .../page_objects/policy_page.ts | 59 +++++ .../services/endpoint_policy.ts | 163 +++++++++---- 19 files changed, 522 insertions(+), 284 deletions(-) rename x-pack/test/functional_endpoint/apps/endpoint/{host_list.ts => endpoint_list.ts} (84%) delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts create mode 100644 x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts create mode 100644 x-pack/test/functional_endpoint/page_objects/page_utils.ts create mode 100644 x-pack/test/functional_endpoint/page_objects/policy_page.ts diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index f4c4b36ce153f..d1f7da91bd6fa 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -68,11 +68,13 @@ export const PolicyDetails = React.memo(() => { } ), body: ( - + + + ), }); } else { @@ -116,7 +118,7 @@ export const PolicyDetails = React.memo(() => { ) : policyApiError ? ( - {policyApiError?.message} + {policyApiError?.message} ) : null} diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx index e5f3b2c7e8b7e..9ceade5d0264c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx @@ -5,23 +5,25 @@ */ import React, { useCallback, useMemo } from 'react'; -import { EuiCheckbox, htmlIdGenerator } from '@elastic/eui'; +import { EuiCheckbox, EuiCheckboxProps, htmlIdGenerator } from '@elastic/eui'; import { useDispatch } from 'react-redux'; - import { usePolicyDetailsSelector } from '../../policy_hooks'; import { policyConfig } from '../../../store/policy_details/selectors'; import { PolicyDetailsAction } from '../../../store/policy_details'; import { UIPolicyConfig } from '../../../../../../../common/endpoint/types'; +type EventsCheckboxProps = Omit & { + name: string; + setter: (config: UIPolicyConfig, checked: boolean) => UIPolicyConfig; + getter: (config: UIPolicyConfig) => boolean; +}; + export const EventsCheckbox = React.memo(function ({ name, setter, getter, -}: { - name: string; - setter: (config: UIPolicyConfig, checked: boolean) => UIPolicyConfig; - getter: (config: UIPolicyConfig) => boolean; -}) { + ...otherProps +}: EventsCheckboxProps) { const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); const selected = getter(policyDetailsConfig); const dispatch = useDispatch<(action: PolicyDetailsAction) => void>(); @@ -44,6 +46,7 @@ export const EventsCheckbox = React.memo(function ({ label={name} checked={selected} onChange={handleCheckboxChange} + {...otherProps} /> ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx index d0ddd5cb6fe2f..d7bae0d2e6bad 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx @@ -73,6 +73,7 @@ export const LinuxEvents = React.memo(() => { setIn(config)(item.os)('events')(item.protectionField)(checked) } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx index e2d6b70d33415..37709ff608857 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx @@ -73,6 +73,7 @@ export const MacEvents = React.memo(() => { setIn(config)(item.os)('events')(item.protectionField)(checked) } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx index 23f33cb6fd86f..3c7ecae0d9b4e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx @@ -113,6 +113,7 @@ export const WindowsEvents = React.memo(() => { setIn(config)(item.os)('events')(item.protectionField)(checked) } diff --git a/x-pack/scripts/functional_tests.js b/x-pack/scripts/functional_tests.js index 4392299a78e72..c120e1f780761 100644 --- a/x-pack/scripts/functional_tests.js +++ b/x-pack/scripts/functional_tests.js @@ -6,6 +6,7 @@ const alwaysImportedTests = [ require.resolve('../test/functional/config.js'), + require.resolve('../test/functional_endpoint/config.ts'), require.resolve('../test/functional_with_es_ssl/config.ts'), require.resolve('../test/functional/config_security_basic.ts'), require.resolve('../test/functional/config_security_trial.ts'), diff --git a/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts b/x-pack/test/functional_endpoint/apps/endpoint/endpoint_list.ts similarity index 84% rename from x-pack/test/functional_endpoint/apps/endpoint/host_list.ts rename to x-pack/test/functional_endpoint/apps/endpoint/endpoint_list.ts index 029953f113a9c..c5338e2a35765 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/endpoint_list.ts @@ -13,68 +13,71 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const testSubjects = getService('testSubjects'); // FLAKY: https://github.com/elastic/kibana/issues/63621 - describe.skip('host list', function () { + describe.skip('endpoint list', function () { this.tags('ciGroup7'); const sleep = (ms = 100) => new Promise((resolve) => setTimeout(resolve, ms)); before(async () => { await esArchiver.load('endpoint/metadata/api_feature'); - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/hosts'); - await pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.endpoint.navigateToEndpointList(); }); it('finds title', async () => { - const title = await testSubjects.getVisibleText('hostListTitle'); - expect(title).to.equal('Hosts'); + const title = await testSubjects.getVisibleText('pageViewHeaderLeftTitle'); + expect(title).to.equal('Endpoints'); }); it('displays table data', async () => { const expectedData = [ [ 'Hostname', + 'Host Status', 'Policy', 'Policy Status', 'Alerts', 'Operating System', 'IP Address', - 'Sensor Version', + 'Version', 'Last Active', ], [ 'cadmann-4.example.com', + 'Error', 'Policy Name', 'Policy Status', '0', 'windows 10.0', '10.192.213.130, 10.70.28.129', - 'version', - 'xxxx', + '6.6.1', + 'Jan 24, 2020 @ 16:06:09.541', ], [ 'thurlow-9.example.com', + 'Error', 'Policy Name', 'Policy Status', '0', 'windows 10.0', '10.46.229.234', - 'version', - 'xxxx', + '6.0.0', + 'Jan 24, 2020 @ 16:06:09.541', ], [ 'rezzani-7.example.com', + 'Error', 'Policy Name', 'Policy Status', '0', 'windows 10.0', '10.101.149.26, 2606:a000:ffc0:39:11ef:37b9:3371:578c', - 'version', - 'xxxx', + '6.8.0', + 'Jan 24, 2020 @ 16:06:09.541', ], ]; const tableData = await pageObjects.endpoint.getEndpointAppTableData('hostListTable'); expect(tableData).to.eql(expectedData); }); - it('no details flyout when host page displayed', async () => { + it('no details flyout when endpoint page displayed', async () => { await testSubjects.missingOrFail('hostDetailsFlyout'); }); @@ -108,22 +111,21 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await (await testSubjects.findAll('hostnameCellLink'))[1].click(); await sleep(500); // give page time to refresh and verify it did not change const hostDetailTitleNew = await testSubjects.getVisibleText('hostDetailsFlyoutTitle'); - expect(hostDetailTitleNew).to.eql(hostDetailTitleInitial); + expect(hostDetailTitleNew).to.equal(hostDetailTitleInitial); }); describe('no data', () => { before(async () => { // clear out the data and reload the page await esArchiver.unload('endpoint/metadata/api_feature'); - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/hosts'); - await pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.endpoint.navigateToEndpointList(); }); after(async () => { // reload the data so the other tests continue to pass await esArchiver.load('endpoint/metadata/api_feature'); }); it('displays no items found when empty', async () => { - // get the host list table data and verify message + // get the endpoint list table data and verify message const [, [noItemsFoundMessage]] = await pageObjects.endpoint.getEndpointAppTableData( 'hostListTable' ); @@ -133,12 +135,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('has a url with a host id', () => { before(async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory( - 'endpoint', - '/hosts', + await pageObjects.endpoint.navigateToEndpointList( 'selected_host=fc0ff548-feba-41b6-8367-65e8790d0eaf' ); - await pageObjects.header.waitUntilLoadingHasFinished(); }); it('shows a flyout', async () => { @@ -168,7 +167,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { '', '0', '00000000-0000-0000-0000-000000000000', - 'Successful', + 'Unknown', '10.101.149.262606:a000:ffc0:39:11ef:37b9:3371:578c', 'rezzani-7.example.com', '6.8.0', diff --git a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts b/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts deleted file mode 100644 index 27fabb515757a..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getPageObjects, getService }: FtrProviderContext) { - const pageObjects = getPageObjects(['common']); - const spacesService = getService('spaces'); - const testSubjects = getService('testSubjects'); - const appsMenu = getService('appsMenu'); - - describe('spaces', () => { - describe('space with no features disabled', () => { - before(async () => { - await spacesService.create({ - id: 'custom_space', - name: 'custom_space', - disabledFeatures: [], - }); - }); - - after(async () => { - await spacesService.delete('custom_space'); - }); - - it('shows endpoint navlink', async () => { - await pageObjects.common.navigateToApp('home', { - basePath: '/s/custom_space', - }); - const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.contain('Endpoint'); - }); - - it(`endpoint app shows 'Hello World'`, async () => { - await pageObjects.common.navigateToApp('endpoint', { - basePath: '/s/custom_space', - }); - await testSubjects.existOrFail('welcomeTitle'); - }); - - it(`endpoint hosts shows hosts lists page`, async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/hosts', undefined, { - basePath: '/s/custom_space', - ensureCurrentUrl: false, - shouldLoginIfPrompted: false, - }); - await testSubjects.existOrFail('hostPage'); - }); - }); - - describe('space with endpoint disabled', () => { - before(async () => { - await spacesService.create({ - id: 'custom_space', - name: 'custom_space', - disabledFeatures: ['endpoint'], - }); - }); - - after(async () => { - await spacesService.delete('custom_space'); - }); - - it(`doesn't show endpoint navlink`, async () => { - await pageObjects.common.navigateToApp('home', { - basePath: '/s/custom_space', - }); - const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).not.to.contain('Endpoint'); - }); - }); - }); -} diff --git a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts b/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts deleted file mode 100644 index da0919d7c39f3..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ loadTestFile }: FtrProviderContext) { - describe('feature controls', function () { - this.tags('skipFirefox'); - loadTestFile(require.resolve('./endpoint_spaces')); - }); -} diff --git a/x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts b/x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts deleted file mode 100644 index 48cdd6aec5b1a..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['common', 'endpoint']); - const testSubjects = getService('testSubjects'); - - describe('Header nav', function () { - this.tags('ciGroup7'); - before(async () => { - await pageObjects.common.navigateToApp('endpoint'); - }); - - it('renders the tabs when the app loads', async () => { - const homeTabText = await testSubjects.getVisibleText('homeEndpointTab'); - const hostsTabText = await testSubjects.getVisibleText('hostsEndpointTab'); - const alertsTabText = await testSubjects.getVisibleText('alertsEndpointTab'); - const policiesTabText = await testSubjects.getVisibleText('policiesEndpointTab'); - - expect(homeTabText.trim()).to.be('Home'); - expect(hostsTabText.trim()).to.be('Hosts'); - expect(alertsTabText.trim()).to.be('Alerts'); - expect(policiesTabText.trim()).to.be('Policies'); - }); - - it('renders the hosts page when the Hosts tab is selected', async () => { - await (await testSubjects.find('hostsEndpointTab')).click(); - await testSubjects.existOrFail('hostPage'); - }); - - it('renders the alerts page when the Alerts tab is selected', async () => { - await (await testSubjects.find('alertsEndpointTab')).click(); - await testSubjects.existOrFail('alertListPage'); - }); - - it('renders the policy page when Policy tab is selected', async () => { - await (await testSubjects.find('policiesEndpointTab')).click(); - await testSubjects.existOrFail('policyListPage'); - }); - - it('renders the home page when Home tab is selected after selecting another tab', async () => { - await (await testSubjects.find('hostsEndpointTab')).click(); - await testSubjects.existOrFail('hostPage'); - - await (await testSubjects.find('homeEndpointTab')).click(); - await testSubjects.existOrFail('welcomeTitle'); - }); - }); -}; diff --git a/x-pack/test/functional_endpoint/apps/endpoint/index.ts b/x-pack/test/functional_endpoint/apps/endpoint/index.ts index 296ee45ff181c..199d138d1c450 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/index.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/index.ts @@ -9,12 +9,11 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('endpoint', function () { this.tags('ciGroup7'); - loadTestFile(require.resolve('./feature_controls')); - loadTestFile(require.resolve('./landing_page')); - loadTestFile(require.resolve('./header_nav')); - loadTestFile(require.resolve('./host_list')); + loadTestFile(require.resolve('./endpoint_list')); loadTestFile(require.resolve('./policy_list')); - loadTestFile(require.resolve('./alerts')); - loadTestFile(require.resolve('./resolver')); + loadTestFile(require.resolve('./policy_details')); + + // loadTestFile(require.resolve('./alerts')); + // loadTestFile(require.resolve('./resolver')); }); } diff --git a/x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts b/x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts deleted file mode 100644 index f2a55df56421a..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['common', 'endpoint']); - const testSubjects = getService('testSubjects'); - - describe('Endpoint landing page', function () { - this.tags('ciGroup7'); - before(async () => { - await pageObjects.common.navigateToApp('endpoint'); - }); - - it('Loads the endpoint app', async () => { - const welcomeEndpointMessage = await pageObjects.endpoint.welcomeEndpointTitle(); - expect(welcomeEndpointMessage).to.be('Hello World'); - }); - - it('Does not display a toast indicating that the ingest manager failed to initialize', async () => { - await testSubjects.missingOrFail('euiToastHeader'); - }); - }); -}; diff --git a/x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts new file mode 100644 index 0000000000000..25fb477b5a99a --- /dev/null +++ b/x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts @@ -0,0 +1,225 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const pageObjects = getPageObjects(['common', 'endpoint', 'policy', 'endpointPageUtils']); + const testSubjects = getService('testSubjects'); + const policyTestResources = getService('policyTestResources'); + + describe('When on the Endpoint Policy Details Page', function () { + this.tags(['ciGroup7']); + + describe('with an invalid policy id', () => { + it('should display an error', async () => { + await pageObjects.policy.navigateToPolicyDetails('invalid-id'); + await testSubjects.existOrFail('policyDetailsIdNotFoundMessage'); + expect(await testSubjects.getVisibleText('policyDetailsIdNotFoundMessage')).to.equal( + 'Saved object [ingest-datasources/invalid-id] not found' + ); + }); + }); + + describe('with a valid policy id', () => { + let policyInfo: PolicyTestResourceInfo; + + before(async () => { + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.datasource.id); + }); + + after(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + } + }); + + it('should display policy view', async () => { + expect(await testSubjects.getVisibleText('pageViewHeaderLeftTitle')).to.equal( + policyInfo.datasource.name + ); + }); + }); + + describe('and the save button is clicked', () => { + let policyInfo: PolicyTestResourceInfo; + + beforeEach(async () => { + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.datasource.id); + }); + + afterEach(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + } + }); + + it('should display success toast on successful save', async () => { + await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_dns'); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + expect(await testSubjects.getVisibleText('policyDetailsSuccessMessage')).to.equal( + `Policy ${policyInfo.datasource.name} has been updated.` + ); + }); + it('should persist update on the screen', async () => { + await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_process'); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + await pageObjects.policy.navigateToPolicyList(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.datasource.id); + + expect(await (await testSubjects.find('policyWindowsEvent_process')).isSelected()).to.equal( + false + ); + }); + it('should have updated policy data in overall agent configuration', async () => { + // This test ensures that updates made to the Endpoint Policy are carried all the way through + // to the generated Agent Configuration that is dispatch down to the Elastic Agent. + + await Promise.all([ + pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_file'), + pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyLinuxEvent_file'), + pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyMacEvent_file'), + ]); + await pageObjects.policy.confirmAndSave(); + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + + const agentFullConfig = await policyTestResources.getFullAgentConfig( + policyInfo.agentConfig.id + ); + + expect(agentFullConfig).to.eql({ + datasources: [ + { + enabled: true, + id: policyInfo.datasource.id, + inputs: [ + { + enabled: true, + policy: { + linux: { + advanced: { + elasticsearch: { + indices: { + control: 'control-index', + event: 'event-index', + logging: 'logging-index', + }, + kernel: { + connect: true, + process: true, + }, + }, + }, + events: { + file: false, + network: true, + process: true, + }, + logging: { + file: 'info', + stdout: 'debug', + }, + }, + mac: { + advanced: { + elasticsearch: { + indices: { + control: 'control-index', + event: 'event-index', + logging: 'logging-index', + }, + kernel: { + connect: true, + process: true, + }, + }, + }, + events: { + file: false, + network: true, + process: true, + }, + logging: { + file: 'info', + stdout: 'debug', + }, + malware: { + mode: 'detect', + }, + }, + windows: { + advanced: { + elasticsearch: { + indices: { + control: 'control-index', + event: 'event-index', + logging: 'logging-index', + }, + kernel: { + connect: true, + process: true, + }, + }, + }, + events: { + dll_and_driver_load: true, + dns: true, + file: false, + network: true, + process: true, + registry: true, + security: true, + }, + logging: { + file: 'info', + stdout: 'debug', + }, + malware: { + mode: 'prevent', + }, + }, + }, + streams: [], + type: 'endpoint', + }, + ], + name: 'Protect East Coast', + namespace: 'default', + package: { + name: 'endpoint', + version: policyInfo.packageInfo.version, + }, + use_output: 'default', + }, + ], + id: policyInfo.agentConfig.id, + outputs: { + default: { + hosts: ['http://localhost:9200'], + type: 'elasticsearch', + }, + }, + revision: 3, + settings: { + monitoring: { + enabled: false, + logs: false, + metrics: false, + }, + }, + }); + }); + }); + }); +} diff --git a/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts b/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts index 11b1b8e718ff7..9f87f884b327e 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts @@ -8,15 +8,15 @@ import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; export default function ({ getPageObjects, getService }: FtrProviderContext) { - const pageObjects = getPageObjects(['common', 'endpoint']); + const pageObjects = getPageObjects(['common', 'endpoint', 'policy']); const testSubjects = getService('testSubjects'); const policyTestResources = getService('policyTestResources'); + const RELATIVE_DATE_FORMAT = /\d (?:seconds|minutes) ago/i; - // FLAKY: https://github.com/elastic/kibana/issues/66579 - describe.skip('When on the Endpoint Policy List', function () { + describe('When on the Endpoint Policy List', function () { this.tags(['ciGroup7']); before(async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/policy'); + await pageObjects.policy.navigateToPolicyList(); }); it('loads the Policy List Page', async () => { @@ -34,10 +34,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const allHeaderCells = await pageObjects.endpoint.tableHeaderVisibleText('policyTable'); expect(allHeaderCells).to.eql([ 'Policy Name', - 'Revision', + 'Created By', + 'Created Date', + 'Last Updated By', + 'Last Updated', 'Version', - 'Description', - 'Agent Configuration', + 'Actions', ]); }); it('should show empty table results message', async () => { @@ -47,13 +49,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(noItemsFoundMessage).to.equal('No items found'); }); - xdescribe('and policies exists', () => { + describe('and policies exists', () => { let policyInfo: PolicyTestResourceInfo; before(async () => { // load/create a policy and then navigate back to the policy view so that the list is refreshed policyInfo = await policyTestResources.createPolicy(); - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/policy'); + await pageObjects.policy.navigateToPolicyList(); await pageObjects.endpoint.waitForTableToHaveData('policyTable'); }); after(async () => { @@ -64,26 +66,24 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('should show policy on the list', async () => { const [, policyRow] = await pageObjects.endpoint.getEndpointAppTableData('policyTable'); - expect(policyRow).to.eql([ - 'Protect East Coast', - '1', - 'Elastic Endpoint v1.0.0', - 'Protect the worlds data - but in the East Coast', - policyInfo.agentConfig.id, + // Validate row data with the exception of the Date columns - since those are initially + // shown as relative. + expect([policyRow[0], policyRow[1], policyRow[3], policyRow[5], policyRow[6]]).to.eql([ + 'Protect East Coastrev. 1', + 'elastic', + 'elastic', + `${policyInfo.datasource.package?.title} v${policyInfo.datasource.package?.version}`, + '', ]); + [policyRow[2], policyRow[4]].forEach((relativeDate) => { + expect(relativeDate).to.match(RELATIVE_DATE_FORMAT); + }); }); it('should show policy name as link', async () => { const policyNameLink = await testSubjects.find('policyNameLink'); expect(await policyNameLink.getTagName()).to.equal('a'); expect(await policyNameLink.getAttribute('href')).to.match( - new RegExp(`\/endpoint\/policy\/${policyInfo.datasource.id}$`) - ); - }); - it('should show agent configuration as link', async () => { - const agentConfigLink = await testSubjects.find('agentConfigLink'); - expect(await agentConfigLink.getTagName()).to.equal('a'); - expect(await agentConfigLink.getAttribute('href')).to.match( - new RegExp(`\/app\/ingestManager\#\/configs\/${policyInfo.datasource.config_id}$`) + new RegExp(`\/management\/policy\/${policyInfo.datasource.id}$`) ); }); }); diff --git a/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts b/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts index 7f78bd6b804f7..3234169e7265e 100644 --- a/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts +++ b/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts @@ -7,11 +7,22 @@ import { WebElementWrapper } from 'test/functional/services/lib/web_element_wrapper'; import { FtrProviderContext } from '../ftr_provider_context'; -export function EndpointPageProvider({ getService }: FtrProviderContext) { +export function EndpointPageProvider({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); + const pageObjects = getPageObjects(['common', 'header']); const retry = getService('retry'); return { + /** + * Navigate to the Endpoints list page + */ + async navigateToEndpointList(searchParams?: string) { + await pageObjects.common.navigateToApp('securitySolution', { + hash: `/management/endpoints${searchParams ? `?${searchParams}` : ''}`, + }); + await pageObjects.header.waitUntilLoadingHasFinished(); + }, + /** * Finds the Table with the given `selector` (test subject) and returns * back an array containing the table's header column text @@ -31,10 +42,6 @@ export function EndpointPageProvider({ getService }: FtrProviderContext) { ); }, - async welcomeEndpointTitle() { - return await testSubjects.getVisibleText('welcomeTitle'); - }, - /** * Finds a table and returns the data in a nested array with row 0 is the headers if they exist. * It uses euiTableCellContent to avoid poluting the array data with the euiTableRowCell__mobileHeader data. diff --git a/x-pack/test/functional_endpoint/page_objects/index.ts b/x-pack/test/functional_endpoint/page_objects/index.ts index 8138ce2eeccb3..5b550bea5b55d 100644 --- a/x-pack/test/functional_endpoint/page_objects/index.ts +++ b/x-pack/test/functional_endpoint/page_objects/index.ts @@ -7,9 +7,13 @@ import { pageObjects as xpackFunctionalPageObjects } from '../../functional/page_objects'; import { EndpointPageProvider } from './endpoint_page'; import { EndpointAlertsPageProvider } from './endpoint_alerts_page'; +import { EndpointPolicyPageProvider } from './policy_page'; +import { EndpointPageUtils } from './page_utils'; export const pageObjects = { ...xpackFunctionalPageObjects, endpoint: EndpointPageProvider, + policy: EndpointPolicyPageProvider, + endpointPageUtils: EndpointPageUtils, endpointAlerts: EndpointAlertsPageProvider, }; diff --git a/x-pack/test/functional_endpoint/page_objects/page_utils.ts b/x-pack/test/functional_endpoint/page_objects/page_utils.ts new file mode 100644 index 0000000000000..daf66464f7e1e --- /dev/null +++ b/x-pack/test/functional_endpoint/page_objects/page_utils.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrProviderContext } from '../ftr_provider_context'; + +export function EndpointPageUtils({ getService }: FtrProviderContext) { + const find = getService('find'); + + return { + /** + * Finds a given EuiCheckbox by test subject and clicks on it + * + * @param euiCheckBoxTestId + */ + async clickOnEuiCheckbox(euiCheckBoxTestId: string) { + // This utility is needed because EuiCheckbox forwards the test subject on to + // the actual `` which is not actually visible/accessible on the page. + // In order to actually cause the state of the checkbox to change, the `

@@ -19,7 +24,16 @@ exports[`CertStatus renders expected elements for valid props 1`] = ` class="euiFlexItem euiFlexItem--flexGrowZero" > - OK + OK +
+
+ for 4 months +
+
diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx b/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx index e7a86ce98fa3c..ea0a49a4a6c5b 100644 --- a/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx +++ b/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx @@ -5,45 +5,95 @@ */ import React from 'react'; -import { EuiHealth } from '@elastic/eui'; +import moment from 'moment'; +import styled from 'styled-components'; +import { EuiHealth, EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { useSelector } from 'react-redux'; import { Cert } from '../../../common/runtime_types'; import { useCertStatus } from '../../hooks'; import * as labels from './translations'; import { CERT_STATUS } from '../../../common/constants'; +import { selectDynamicSettings } from '../../state/selectors'; interface Props { cert: Cert; } +const DateText = styled(EuiText)` + display: inline-block; + margin-left: 5px; +`; + export const CertStatus: React.FC = ({ cert }) => { const certStatus = useCertStatus(cert?.not_after, cert?.not_before); + const dss = useSelector(selectDynamicSettings); + + const relativeDate = moment(cert?.not_after).fromNow(); + if (certStatus === CERT_STATUS.EXPIRING_SOON) { return ( - {labels.EXPIRES_SOON} + + {labels.EXPIRES_SOON} + {' '} + + {relativeDate} + + ); } if (certStatus === CERT_STATUS.EXPIRED) { return ( - {labels.EXPIRED} + + {labels.EXPIRED} + {' '} + + {relativeDate} + + ); } if (certStatus === CERT_STATUS.TOO_OLD) { + const ageThreshold = dss.settings?.certAgeThreshold; + + const oldRelativeDate = moment(cert?.not_before).add(ageThreshold, 'days').fromNow(); + return ( - {labels.TOO_OLD} + + {labels.TOO_OLD} + + {oldRelativeDate} + + ); } + const okRelativeDate = moment(cert?.not_after).fromNow(true); + return ( - {labels.OK} + + {labels.OK} + {' '} + + + + ); }; From ee5284e7fd6c04d24416fc04f8362c2bc0046982 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 9 Jun 2020 14:24:47 -0400 Subject: [PATCH 54/91] [Component templates] Table view (#68031) --- .../plugins/index_management/common/index.ts | 2 +- .../component_template_serialization.test.ts | 94 ++++++++ .../lib/component_template_serialization.ts | 86 ++++++++ .../index_management/common/lib/index.ts | 5 + .../common/types/component_templates.ts | 39 ++++ .../index_management/common/types/index.ts | 2 + .../common/types/templates.ts | 5 + .../public/application/app.tsx | 6 +- .../component_template_list.test.ts | 174 +++++++++++++++ .../component_template_list.helpers.ts | 95 ++++++++ .../helpers/http_requests.ts | 52 +++++ .../client_integration/helpers/index.ts | 15 ++ .../helpers/setup_environment.tsx | 45 ++++ .../component_template_list.tsx | 75 +++++++ .../component_template_list/delete_modal.tsx | 128 +++++++++++ .../component_template_list/empty_prompt.tsx | 43 ++++ .../component_template_list/error.tsx | 38 ++++ .../component_template_list/index.ts | 7 + .../component_template_list/table.tsx | 205 ++++++++++++++++++ .../component_templates_context.tsx | 63 ++++++ .../component_templates/constants.ts | 10 + .../components/component_templates/index.ts | 11 + .../components/component_templates/lib/api.ts | 44 ++++ .../component_templates/lib/documentation.ts | 16 ++ .../component_templates/lib/index.ts | 11 + .../component_templates/lib/request.ts | 31 +++ .../component_templates/shared_imports.ts | 15 ++ .../components/component_templates/types.ts | 17 ++ .../public/application/components/index.ts | 1 + .../public/application/index.tsx | 18 +- .../public/application/sections/home/home.tsx | 29 ++- .../public/application/sections/home/index.ts | 2 +- .../server/client/elasticsearch.ts | 11 + .../routes/api/component_templates/get.ts | 34 ++- .../index_management/component_templates.ts | 10 +- .../apps/index_management/home_page.ts | 17 ++ .../page_objects/index_management_page.ts | 2 +- 37 files changed, 1436 insertions(+), 22 deletions(-) create mode 100644 x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts create mode 100644 x-pack/plugins/index_management/common/lib/component_template_serialization.ts create mode 100644 x-pack/plugins/index_management/common/types/component_templates.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/constants.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/types.ts diff --git a/x-pack/plugins/index_management/common/index.ts b/x-pack/plugins/index_management/common/index.ts index 3792e322ae40b..4ad428744deab 100644 --- a/x-pack/plugins/index_management/common/index.ts +++ b/x-pack/plugins/index_management/common/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export { PLUGIN, API_BASE_PATH, CREATE_LEGACY_TEMPLATE_BY_DEFAULT } from './constants'; +export { PLUGIN, API_BASE_PATH, CREATE_LEGACY_TEMPLATE_BY_DEFAULT, BASE_PATH } from './constants'; export { getTemplateParameter } from './lib'; diff --git a/x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts b/x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts new file mode 100644 index 0000000000000..eaa7f24017a2f --- /dev/null +++ b/x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { deserializeComponentTemplate } from './component_template_serialization'; + +describe('deserializeComponentTemplate', () => { + test('deserializes a component template', () => { + expect( + deserializeComponentTemplate( + { + name: 'my_component_template', + component_template: { + version: 1, + _meta: { + serialization: { + id: 10, + class: 'MyComponentTemplate', + }, + description: 'set number of shards to one', + }, + template: { + settings: { + number_of_shards: 1, + }, + mappings: { + _source: { + enabled: false, + }, + properties: { + host_name: { + type: 'keyword', + }, + created_at: { + type: 'date', + format: 'EEE MMM dd HH:mm:ss Z yyyy', + }, + }, + }, + }, + }, + }, + [ + { + name: 'my_index_template', + index_template: { + index_patterns: ['foo'], + template: { + settings: { + number_of_replicas: 2, + }, + }, + composed_of: ['my_component_template'], + }, + }, + ] + ) + ).toEqual({ + name: 'my_component_template', + version: 1, + _meta: { + serialization: { + id: 10, + class: 'MyComponentTemplate', + }, + description: 'set number of shards to one', + }, + template: { + settings: { + number_of_shards: 1, + }, + mappings: { + _source: { + enabled: false, + }, + properties: { + host_name: { + type: 'keyword', + }, + created_at: { + type: 'date', + format: 'EEE MMM dd HH:mm:ss Z yyyy', + }, + }, + }, + }, + _kbnMeta: { + usedBy: ['my_index_template'], + }, + }); + }); +}); diff --git a/x-pack/plugins/index_management/common/lib/component_template_serialization.ts b/x-pack/plugins/index_management/common/lib/component_template_serialization.ts new file mode 100644 index 0000000000000..0db81bf81d300 --- /dev/null +++ b/x-pack/plugins/index_management/common/lib/component_template_serialization.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { + TemplateFromEs, + ComponentTemplateFromEs, + ComponentTemplateDeserialized, + ComponentTemplateListItem, +} from '../types'; + +const hasEntries = (data: object = {}) => Object.entries(data).length > 0; + +/** + * Normalize a list of component templates to a map where each key + * is a component template name, and the value is an array of index templates name using it + * + * @example + * + { + "comp-1": [ + "template-1", + "template-2" + ], + "comp2": [ + "template-1", + "template-2" + ] + } + * + * @param indexTemplatesEs List of component templates + */ + +const getIndexTemplatesToUsedBy = (indexTemplatesEs: TemplateFromEs[]) => { + return indexTemplatesEs.reduce((acc, item) => { + if (item.index_template.composed_of) { + item.index_template.composed_of.forEach((component) => { + acc[component] = acc[component] ? [...acc[component], item.name] : [item.name]; + }); + } + return acc; + }, {} as { [key: string]: string[] }); +}; + +export function deserializeComponentTemplate( + componentTemplateEs: ComponentTemplateFromEs, + indexTemplatesEs: TemplateFromEs[] +) { + const { name, component_template: componentTemplate } = componentTemplateEs; + const { template, _meta, version } = componentTemplate; + + const indexTemplatesToUsedBy = getIndexTemplatesToUsedBy(indexTemplatesEs); + + const deserializedComponentTemplate: ComponentTemplateDeserialized = { + name, + template, + version, + _meta, + _kbnMeta: { + usedBy: indexTemplatesToUsedBy[name] || [], + }, + }; + + return deserializedComponentTemplate; +} + +export function deserializeComponenTemplateList( + componentTemplateEs: ComponentTemplateFromEs, + indexTemplatesEs: TemplateFromEs[] +) { + const { name, component_template: componentTemplate } = componentTemplateEs; + const { template } = componentTemplate; + + const indexTemplatesToUsedBy = getIndexTemplatesToUsedBy(indexTemplatesEs); + + const componentTemplateListItem: ComponentTemplateListItem = { + name, + usedBy: indexTemplatesToUsedBy[name] || [], + hasSettings: hasEntries(template.settings), + hasMappings: hasEntries(template.mappings), + hasAliases: hasEntries(template.aliases), + }; + + return componentTemplateListItem; +} diff --git a/x-pack/plugins/index_management/common/lib/index.ts b/x-pack/plugins/index_management/common/lib/index.ts index 16eb544c56a08..c67d28da2c24b 100644 --- a/x-pack/plugins/index_management/common/lib/index.ts +++ b/x-pack/plugins/index_management/common/lib/index.ts @@ -11,3 +11,8 @@ export { } from './template_serialization'; export { getTemplateParameter } from './utils'; + +export { + deserializeComponentTemplate, + deserializeComponenTemplateList, +} from './component_template_serialization'; diff --git a/x-pack/plugins/index_management/common/types/component_templates.ts b/x-pack/plugins/index_management/common/types/component_templates.ts new file mode 100644 index 0000000000000..bc7ebdc2753dd --- /dev/null +++ b/x-pack/plugins/index_management/common/types/component_templates.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IndexSettings } from './indices'; +import { Aliases } from './aliases'; +import { Mappings } from './mappings'; + +export interface ComponentTemplateSerialized { + template: { + settings?: IndexSettings; + aliases?: Aliases; + mappings?: Mappings; + }; + version?: number; + _meta?: { [key: string]: any }; +} + +export interface ComponentTemplateDeserialized extends ComponentTemplateSerialized { + name: string; + _kbnMeta: { + usedBy: string[]; + }; +} + +export interface ComponentTemplateFromEs { + name: string; + component_template: ComponentTemplateSerialized; +} + +export interface ComponentTemplateListItem { + name: string; + usedBy: string[]; + hasMappings: boolean; + hasAliases: boolean; + hasSettings: boolean; +} diff --git a/x-pack/plugins/index_management/common/types/index.ts b/x-pack/plugins/index_management/common/types/index.ts index b467f020978a5..81a06156dd291 100644 --- a/x-pack/plugins/index_management/common/types/index.ts +++ b/x-pack/plugins/index_management/common/types/index.ts @@ -11,3 +11,5 @@ export * from './indices'; export * from './mappings'; export * from './templates'; + +export * from './component_templates'; diff --git a/x-pack/plugins/index_management/common/types/templates.ts b/x-pack/plugins/index_management/common/types/templates.ts index f113aa44d058f..006a2d9dea8f2 100644 --- a/x-pack/plugins/index_management/common/types/templates.ts +++ b/x-pack/plugins/index_management/common/types/templates.ts @@ -49,6 +49,11 @@ export interface TemplateDeserialized { }; } +export interface TemplateFromEs { + name: string; + index_template: TemplateSerialized; +} + /** * Interface for the template list in our UI table * we don't include the mappings, settings and aliases diff --git a/x-pack/plugins/index_management/public/application/app.tsx b/x-pack/plugins/index_management/public/application/app.tsx index 10bbe3ced64da..bfd99de6949e5 100644 --- a/x-pack/plugins/index_management/public/application/app.tsx +++ b/x-pack/plugins/index_management/public/application/app.tsx @@ -5,10 +5,12 @@ */ import React, { useEffect } from 'react'; + import { Router, Switch, Route, Redirect } from 'react-router-dom'; import { ScopedHistory } from 'kibana/public'; + import { UIM_APP_LOAD } from '../../common/constants'; -import { IndexManagementHome } from './sections/home'; +import { IndexManagementHome, homeSections } from './sections/home'; import { TemplateCreate } from './sections/template_create'; import { TemplateClone } from './sections/template_clone'; import { TemplateEdit } from './sections/template_edit'; @@ -32,7 +34,7 @@ export const AppWithoutRouter = () => ( - + ); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts new file mode 100644 index 0000000000000..830cc0ee6a980 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts @@ -0,0 +1,174 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { setupEnvironment, pageHelpers } from './helpers'; +import { ComponentTemplateListTestBed } from './helpers/component_template_list.helpers'; +import { API_BASE_PATH } from '../../../../../../common/constants'; +import { ComponentTemplateListItem } from '../../types'; + +const { setup } = pageHelpers.componentTemplateList; + +jest.mock('ui/i18n', () => { + const I18nContext = ({ children }: any) => children; + return { I18nContext }; +}); + +describe('', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: ComponentTemplateListTestBed; + + afterAll(() => { + server.restore(); + }); + + beforeEach(async () => { + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + + describe('With component templates', () => { + const componentTemplate1: ComponentTemplateListItem = { + name: 'test_component_template_1', + hasMappings: true, + hasAliases: true, + hasSettings: true, + usedBy: [], + }; + + const componentTemplate2: ComponentTemplateListItem = { + name: 'test_component_template_2', + hasMappings: true, + hasAliases: true, + hasSettings: true, + usedBy: ['test_index_template_1'], + }; + + const componentTemplates = [componentTemplate1, componentTemplate2]; + + httpRequestsMockHelpers.setLoadComponentTemplatesResponse(componentTemplates); + + test('should render the list view', async () => { + const { table } = testBed; + + // Verify table content + const { tableCellsValues } = table.getMetaData('componentTemplatesTable'); + tableCellsValues.forEach((row, i) => { + const { name, usedBy } = componentTemplates[i]; + const usedByText = usedBy.length === 0 ? 'Not in use' : usedBy.length.toString(); + + expect(row).toEqual(['', name, usedByText, '', '', '', '']); + }); + }); + + test('should reload the component templates data', async () => { + const { component, actions } = testBed; + const totalRequests = server.requests.length; + + await act(async () => { + actions.clickReloadButton(); + }); + + component.update(); + + expect(server.requests.length).toBe(totalRequests + 1); + expect(server.requests[server.requests.length - 1].url).toBe( + `${API_BASE_PATH}/component_templates` + ); + }); + + test('should delete a component template', async () => { + const { actions, component } = testBed; + const { name: componentTemplateName } = componentTemplate1; + + await act(async () => { + actions.clickDeleteActionAt(0); + }); + + // We need to read the document "body" as the modal is added there and not inside + // the component DOM tree. + const modal = document.body.querySelector( + '[data-test-subj="deleteComponentTemplatesConfirmation"]' + ); + const confirmButton: HTMLButtonElement | null = modal!.querySelector( + '[data-test-subj="confirmModalConfirmButton"]' + ); + + expect(modal).not.toBe(null); + expect(modal!.textContent).toContain('Delete component template'); + + httpRequestsMockHelpers.setDeleteComponentTemplateResponse({ + itemsDeleted: [componentTemplateName], + errors: [], + }); + + await act(async () => { + confirmButton!.click(); + }); + + component.update(); + + const deleteRequest = server.requests[server.requests.length - 2]; + + expect(deleteRequest.method).toBe('DELETE'); + expect(deleteRequest.url).toBe( + `${API_BASE_PATH}/component_templates/${componentTemplateName}` + ); + expect(deleteRequest.status).toEqual(200); + }); + }); + + describe('No component templates', () => { + beforeEach(async () => { + httpRequestsMockHelpers.setLoadComponentTemplatesResponse([]); + + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + + test('should display an empty prompt', async () => { + const { exists, find } = testBed; + + expect(exists('sectionLoading')).toBe(false); + expect(exists('emptyList')).toBe(true); + expect(find('emptyList.title').text()).toEqual('Start by creating a component template'); + }); + }); + + describe('Error handling', () => { + beforeEach(async () => { + const error = { + status: 500, + error: 'Internal server error', + message: 'Internal server error', + }; + + httpRequestsMockHelpers.setLoadComponentTemplatesResponse(undefined, { body: error }); + + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + + test('should render an error message if error fetching component templates', async () => { + const { exists, find } = testBed; + + expect(exists('componentTemplatesLoadError')).toBe(true); + expect(find('componentTemplatesLoadError').text()).toContain( + 'Unable to load component templates. Try again.' + ); + }); + }); +}); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts new file mode 100644 index 0000000000000..8fb4dcff0bcea --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { BASE_PATH } from '../../../../../../../common'; +import { + registerTestBed, + TestBed, + TestBedConfig, + findTestSubject, + nextTick, +} from '../../../../../../../../../test_utils'; +import { WithAppDependencies } from './setup_environment'; +import { ComponentTemplateList } from '../../../component_template_list'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: [`${BASE_PATH}component_templates`], + componentRoutePath: `${BASE_PATH}component_templates`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WithAppDependencies(ComponentTemplateList), testBedConfig); + +export type ComponentTemplateListTestBed = TestBed & { + actions: ReturnType; +}; + +const createActions = (testBed: TestBed) => { + const { find } = testBed; + + /** + * User Actions + */ + const clickReloadButton = () => { + find('reloadButton').simulate('click'); + }; + + const clickComponentTemplateAt = async (index: number) => { + const { component, table, router } = testBed; + const { rows } = table.getMetaData('componentTemplatesTable'); + const componentTemplateLink = findTestSubject( + rows[index].reactWrapper, + 'componentTemplateDetailsLink' + ); + + await act(async () => { + const { href } = componentTemplateLink.props(); + router.navigateTo(href!); + await nextTick(); + component.update(); + }); + }; + + const clickDeleteActionAt = (index: number) => { + const { table } = testBed; + + const { rows } = table.getMetaData('componentTemplatesTable'); + const deleteButton = findTestSubject(rows[index].reactWrapper, 'deleteComponentTemplateButton'); + + deleteButton.simulate('click'); + }; + + return { + clickReloadButton, + clickComponentTemplateAt, + clickDeleteActionAt, + }; +}; + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + return { + ...testBed, + actions: createActions(testBed), + }; +}; + +export type ComponentTemplateTestSubjects = + | 'componentTemplatesTable' + | 'componentTemplateDetails' + | 'componentTemplateDetails.title' + | 'deleteComponentTemplatesConfirmation' + | 'emptyList' + | 'emptyList.title' + | 'sectionLoading' + | 'componentTemplatesLoadError' + | 'deleteComponentTemplateButton' + | 'reloadButton'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts new file mode 100644 index 0000000000000..8473041ee0af3 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import sinon, { SinonFakeServer } from 'sinon'; +import { API_BASE_PATH } from '../../../../../../../common'; + +// Register helpers to mock HTTP Requests +const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { + const setLoadComponentTemplatesResponse = (response?: any[], error?: any) => { + const status = error ? error.status || 400 : 200; + const body = error ? error.body : response; + + server.respondWith('GET', `${API_BASE_PATH}/component_templates`, [ + status, + { 'Content-Type': 'application/json' }, + JSON.stringify(body), + ]); + }; + + const setDeleteComponentTemplateResponse = (response?: object) => { + server.respondWith('DELETE', `${API_BASE_PATH}/component_templates/:name`, [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(response), + ]); + }; + + return { + setLoadComponentTemplatesResponse, + setDeleteComponentTemplateResponse, + }; +}; + +export const init = () => { + const server = sinon.fakeServer.create(); + server.respondImmediately = true; + + // Define default response for unhandled requests. + // We make requests to APIs which don't impact the component under test, e.g. UI metric telemetry, + // and we can mock them all with a 200 instead of mocking each one individually. + server.respondWith([200, {}, 'DefaultMockedResponse']); + + const httpRequestsMockHelpers = registerHttpRequestMockHelpers(server); + + return { + server, + httpRequestsMockHelpers, + }; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts new file mode 100644 index 0000000000000..c1d75b3c2dd9b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { setup as componentTemplatesListSetup } from './component_template_list.helpers'; + +export { nextTick, getRandomString, findTestSubject } from '../../../../../../../../../test_utils'; + +export { setupEnvironment } from './setup_environment'; + +export const pageHelpers = { + componentTemplateList: { setup: componentTemplatesListSetup }, +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx new file mode 100644 index 0000000000000..c0aeb70166b5b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +/* eslint-disable @kbn/eslint/no-restricted-paths */ +import React from 'react'; +import axios from 'axios'; +import axiosXhrAdapter from 'axios/lib/adapters/xhr'; + +import { HttpSetup } from 'kibana/public'; +import { BASE_PATH, API_BASE_PATH } from '../../../../../../../common/constants'; +import { + notificationServiceMock, + docLinksServiceMock, +} from '../../../../../../../../../../src/core/public/mocks'; + +import { init as initHttpRequests } from './http_requests'; +import { ComponentTemplatesProvider } from '../../../component_templates_context'; + +const mockHttpClient = axios.create({ adapter: axiosXhrAdapter }); + +const appDependencies = { + httpClient: (mockHttpClient as unknown) as HttpSetup, + apiBasePath: API_BASE_PATH, + appBasePath: BASE_PATH, + trackMetric: () => {}, + docLinks: docLinksServiceMock.createStartContract(), + toasts: notificationServiceMock.createSetupContract().toasts, +}; + +export const setupEnvironment = () => { + const { server, httpRequestsMockHelpers } = initHttpRequests(); + + return { + server, + httpRequestsMockHelpers, + }; +}; + +export const WithAppDependencies = (Comp: any) => (props: any) => ( + + + +); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx new file mode 100644 index 0000000000000..41fa608ef538b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState, useEffect } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { SectionLoading } from '../shared_imports'; +import { useComponentTemplatesContext } from '../component_templates_context'; +import { UIM_COMPONENT_TEMPLATE_LIST_LOAD } from '../constants'; + +import { EmptyPrompt } from './empty_prompt'; +import { ComponentTable } from './table'; +import { LoadError } from './error'; +import { ComponentTemplatesDeleteModal } from './delete_modal'; + +export const ComponentTemplateList: React.FunctionComponent = () => { + const { api, trackMetric } = useComponentTemplatesContext(); + + const { data, isLoading, error, sendRequest } = api.useLoadComponentTemplates(); + + const [componentTemplatesToDelete, setComponentTemplatesToDelete] = useState([]); + + // Track component loaded + useEffect(() => { + trackMetric('loaded', UIM_COMPONENT_TEMPLATE_LIST_LOAD); + }, [trackMetric]); + + if (data && data.length === 0) { + return ; + } + + let content: React.ReactNode; + + if (isLoading) { + content = ( + + + + ); + } else if (data?.length) { + content = ( + + ); + } else if (error) { + content = ; + } + + return ( +
+ {content} + {componentTemplatesToDelete?.length > 0 ? ( + { + if (deleteResponse?.hasDeletedComponentTemplates) { + // refetch the component templates + sendRequest(); + } + setComponentTemplatesToDelete([]); + }} + componentTemplatesToDelete={componentTemplatesToDelete} + /> + ) : null} +
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx new file mode 100644 index 0000000000000..bf621065842b5 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx @@ -0,0 +1,128 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { useComponentTemplatesContext } from '../component_templates_context'; + +export const ComponentTemplatesDeleteModal = ({ + componentTemplatesToDelete, + callback, +}: { + componentTemplatesToDelete: string[]; + callback: (data?: { hasDeletedComponentTemplates: boolean }) => void; +}) => { + const { toasts, api } = useComponentTemplatesContext(); + const numComponentTemplatesToDelete = componentTemplatesToDelete.length; + + const handleDeleteComponentTemplates = () => { + api + .deleteComponentTemplates(componentTemplatesToDelete) + .then(({ data: { itemsDeleted, errors }, error }) => { + const hasDeletedComponentTemplates = itemsDeleted && itemsDeleted.length; + + if (hasDeletedComponentTemplates) { + const successMessage = + itemsDeleted.length === 1 + ? i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.successDeleteSingleNotificationMessageText', + { + defaultMessage: "Deleted component template '{componentTemplateName}'", + values: { componentTemplateName: componentTemplatesToDelete[0] }, + } + ) + : i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.successDeleteMultipleNotificationMessageText', + { + defaultMessage: + 'Deleted {numSuccesses, plural, one {# component template} other {# component templates}}', + values: { numSuccesses: itemsDeleted.length }, + } + ); + + callback({ hasDeletedComponentTemplates }); + toasts.addSuccess(successMessage); + } + + if (error || errors?.length) { + const hasMultipleErrors = + errors?.length > 1 || (error && componentTemplatesToDelete.length > 1); + const errorMessage = hasMultipleErrors + ? i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.multipleErrorsNotificationMessageText', + { + defaultMessage: 'Error deleting {count} component templates', + values: { + count: errors?.length || componentTemplatesToDelete.length, + }, + } + ) + : i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.errorNotificationMessageText', + { + defaultMessage: "Error deleting component template '{name}'", + values: { name: (errors && errors[0].name) || componentTemplatesToDelete[0] }, + } + ); + toasts.addDanger(errorMessage); + } + }); + }; + + const handleOnCancel = () => { + callback(); + }; + + return ( + + + } + onCancel={handleOnCancel} + onConfirm={handleDeleteComponentTemplates} + cancelButtonText={ + + } + confirmButtonText={ + + } + > + <> +

+ +

+ +
    + {componentTemplatesToDelete.map((name) => ( +
  • {name}
  • + ))} +
+ +
+
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx new file mode 100644 index 0000000000000..edd9f77cbf635 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiEmptyPrompt, EuiLink } from '@elastic/eui'; + +import { useComponentTemplatesContext } from '../component_templates_context'; + +export const EmptyPrompt: FunctionComponent = () => { + const { documentation } = useComponentTemplatesContext(); + + return ( + + {i18n.translate('xpack.idxMgmt.home.componentTemplates.emptyPromptTitle', { + defaultMessage: 'Start by creating a component template', + })} + + } + body={ +

+ +
+ + {i18n.translate('xpack.idxMgmt.home.componentTemplates.emptyPromptDocumentionLink', { + defaultMessage: 'Learn more', + })} + +

+ } + /> + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx new file mode 100644 index 0000000000000..aa37b9ce5767c --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiLink, EuiCallOut } from '@elastic/eui'; + +export interface Props { + onReloadClick: () => void; +} + +export const LoadError: FunctionComponent = ({ onReloadClick }) => { + return ( + + + + ), + }} + /> + } + /> + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts new file mode 100644 index 0000000000000..84ee48d14bb8c --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ComponentTemplateList } from './component_template_list'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx new file mode 100644 index 0000000000000..2d9557e64e6e7 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx @@ -0,0 +1,205 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { + EuiInMemoryTable, + EuiButton, + EuiInMemoryTableProps, + EuiTextColor, + EuiIcon, +} from '@elastic/eui'; + +import { ComponentTemplateListItem } from '../types'; + +export interface Props { + componentTemplates: ComponentTemplateListItem[]; + onReloadClick: () => void; + onDeleteClick: (componentTemplateName: string[]) => void; +} + +export const ComponentTable: FunctionComponent = ({ + componentTemplates, + onReloadClick, + onDeleteClick, +}) => { + const [selection, setSelection] = useState([]); + + const tableProps: EuiInMemoryTableProps = { + itemId: 'name', + isSelectable: true, + 'data-test-subj': 'componentTemplatesTable', + sorting: { sort: { field: 'name', direction: 'asc' } }, + selection: { + onSelectionChange: setSelection, + selectable: ({ usedBy }) => usedBy.length === 0, + selectableMessage: (selectable) => + selectable + ? i18n.translate('xpack.idxMgmt.componentTemplatesList.table.selectionLabel', { + defaultMessage: 'Select this component template', + }) + : i18n.translate('xpack.idxMgmt.componentTemplatesList.table.disabledSelectionLabel', { + defaultMessage: 'Component template is in use and cannot be deleted', + }), + }, + rowProps: () => ({ + 'data-test-subj': 'componentTemplateTableRow', + }), + search: { + toolsLeft: + selection.length > 0 ? ( + onDeleteClick(selection.map(({ name }) => name))} + color="danger" + > + + + ) : undefined, + toolsRight: [ + + {i18n.translate('xpack.idxMgmt.componentTemplatesList.table.reloadButtonLabel', { + defaultMessage: 'Reload', + })} + , + ], + box: { + incremental: true, + }, + filters: [ + { + type: 'field_value_toggle_group', + field: 'usedBy.length', + items: [ + { + value: 1, + name: i18n.translate( + 'xpack.idxMgmt.componentTemplatesList.table.inUseFilterOptionLabel', + { + defaultMessage: 'In use', + } + ), + operator: 'gte', + }, + { + value: 0, + name: i18n.translate( + 'xpack.idxMgmt.componentTemplatesList.table.notInUseFilterOptionLabel', + { + defaultMessage: 'Not in use', + } + ), + operator: 'eq', + }, + ], + }, + ], + }, + pagination: { + initialPageSize: 10, + pageSizeOptions: [10, 20, 50], + }, + columns: [ + { + field: 'name', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.nameColumnTitle', { + defaultMessage: 'Name', + }), + sortable: true, + }, + { + field: 'usedBy', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.isInUseColumnTitle', { + defaultMessage: 'Index templates', + }), + sortable: true, + render: (usedBy: string[]) => { + if (usedBy.length) { + return usedBy.length; + } + + return ( + + + + + + ); + }, + }, + { + field: 'hasMappings', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.mappingsColumnTitle', { + defaultMessage: 'Mappings', + }), + truncateText: true, + sortable: true, + render: (hasMappings: boolean) => (hasMappings ? : null), + }, + { + field: 'hasSettings', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.settingsColumnTitle', { + defaultMessage: 'Settings', + }), + truncateText: true, + sortable: true, + render: (hasSettings: boolean) => (hasSettings ? : null), + }, + { + field: 'hasAliases', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.aliasesColumnTitle', { + defaultMessage: 'Aliases', + }), + truncateText: true, + sortable: true, + render: (hasAliases: boolean) => (hasAliases ? : null), + }, + { + name: ( + + ), + actions: [ + { + 'data-test-subj': 'deleteComponentTemplateButton', + isPrimary: true, + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.deleteActionLabel', { + defaultMessage: 'Delete', + }), + description: i18n.translate( + 'xpack.idxMgmt.componentTemplatesList.table.deleteActionDescription', + { defaultMessage: 'Delete this component template' } + ), + type: 'icon', + icon: 'trash', + color: 'danger', + onClick: ({ name }) => onDeleteClick([name]), + enabled: ({ usedBy }) => usedBy.length === 0, + }, + ], + }, + ], + items: componentTemplates ?? [], + }; + + return ; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx new file mode 100644 index 0000000000000..6f5f5bdebd6d0 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { createContext, useContext } from 'react'; +import { HttpSetup, DocLinksSetup, NotificationsSetup } from 'src/core/public'; + +import { getApi, getUseRequest, getSendRequest, getDocumentation } from './lib'; + +const ComponentTemplatesContext = createContext(undefined); + +interface Props { + httpClient: HttpSetup; + apiBasePath: string; + appBasePath: string; + trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void; + docLinks: DocLinksSetup; + toasts: NotificationsSetup['toasts']; +} + +interface Context { + api: ReturnType; + documentation: ReturnType; + trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void; + toasts: NotificationsSetup['toasts']; + appBasePath: string; +} + +export const ComponentTemplatesProvider = ({ + children, + value, +}: { + value: Props; + children: React.ReactNode; +}) => { + const { httpClient, apiBasePath, trackMetric, docLinks, toasts, appBasePath } = value; + + const useRequest = getUseRequest(httpClient); + const sendRequest = getSendRequest(httpClient); + + const api = getApi(useRequest, sendRequest, apiBasePath, trackMetric); + const documentation = getDocumentation(docLinks); + + return ( + + {children} + + ); +}; + +export const useComponentTemplatesContext = () => { + const ctx = useContext(ComponentTemplatesContext); + if (!ctx) { + throw new Error( + '"useComponentTemplatesContext" can only be called inside of ComponentTemplatesProvider!' + ); + } + return ctx; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts b/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts new file mode 100644 index 0000000000000..3e763119fa9fb --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +// ui metric constants +export const UIM_COMPONENT_TEMPLATE_LIST_LOAD = 'component_template_list_load'; +export const UIM_COMPONENT_TEMPLATE_DELETE = 'component_template_delete'; +export const UIM_COMPONENT_TEMPLATE_DELETE_MANY = 'component_template_delete_many'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/index.ts new file mode 100644 index 0000000000000..e0219ec71787f --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ComponentTemplatesProvider } from './component_templates_context'; + +export { ComponentTemplateList } from './component_template_list'; + +export * from './types'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts new file mode 100644 index 0000000000000..351e83c6c0cb5 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ComponentTemplateListItem } from '../types'; +import { UseRequestHook, SendRequestHook } from './request'; +import { UIM_COMPONENT_TEMPLATE_DELETE_MANY, UIM_COMPONENT_TEMPLATE_DELETE } from '../constants'; + +export const getApi = ( + useRequest: UseRequestHook, + sendRequest: SendRequestHook, + apiBasePath: string, + trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void +) => { + function useLoadComponentTemplates() { + return useRequest({ + path: `${apiBasePath}/component_templates`, + method: 'get', + }); + } + + function deleteComponentTemplates(names: string[]) { + const result = sendRequest({ + path: `${apiBasePath}/component_templates/${names + .map((name) => encodeURIComponent(name)) + .join(',')}`, + method: 'delete', + }); + + trackMetric( + 'count', + names.length > 1 ? UIM_COMPONENT_TEMPLATE_DELETE_MANY : UIM_COMPONENT_TEMPLATE_DELETE + ); + + return result; + } + + return { + useLoadComponentTemplates, + deleteComponentTemplates, + }; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts new file mode 100644 index 0000000000000..dc27dadf0b807 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DocLinksSetup } from 'src/core/public'; + +export const getDocumentation = ({ ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }: DocLinksSetup) => { + const docsBase = `${ELASTIC_WEBSITE_URL}guide/en`; + const esDocsBase = `${docsBase}/elasticsearch/reference/${DOC_LINK_VERSION}`; + + return { + componentTemplates: `${esDocsBase}/indices-component-template.html`, + }; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts new file mode 100644 index 0000000000000..9a91312f83294 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export * from './api'; + +export * from './request'; + +export * from './documentation'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts new file mode 100644 index 0000000000000..97ffa4d875ecb --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { HttpSetup } from 'src/core/public'; + +import { + UseRequestConfig, + UseRequestResponse, + SendRequestConfig, + SendRequestResponse, + sendRequest as _sendRequest, + useRequest as _useRequest, +} from '../shared_imports'; + +export type UseRequestHook = (config: UseRequestConfig) => UseRequestResponse; +export type SendRequestHook = (config: SendRequestConfig) => Promise; + +export const getUseRequest = (httpClient: HttpSetup): UseRequestHook => ( + config: UseRequestConfig +) => { + return _useRequest(httpClient, config); +}; + +export const getSendRequest = (httpClient: HttpSetup): SendRequestHook => ( + config: SendRequestConfig +) => { + return _sendRequest(httpClient, config); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts b/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts new file mode 100644 index 0000000000000..863b00b353c49 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { + UseRequestConfig, + UseRequestResponse, + SendRequestConfig, + SendRequestResponse, + sendRequest, + useRequest, + SectionLoading, +} from '../../../../../../../src/plugins/es_ui_shared/public'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/types.ts b/x-pack/plugins/index_management/public/application/components/component_templates/types.ts new file mode 100644 index 0000000000000..0aab3b6b0a94a --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/types.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +// Ideally, we shouldn't depend on anything in index management that is +// outside of the components_templates directory +// We could consider creating shared types or duplicating the types here if +// the component_templates app were to move outside of index management +import { + ComponentTemplateSerialized, + ComponentTemplateDeserialized, + ComponentTemplateListItem, +} from '../../../../common'; + +export { ComponentTemplateSerialized, ComponentTemplateDeserialized, ComponentTemplateListItem }; diff --git a/x-pack/plugins/index_management/public/application/components/index.ts b/x-pack/plugins/index_management/public/application/components/index.ts index e6d836c0d0501..7ec25ed5583b7 100644 --- a/x-pack/plugins/index_management/public/application/components/index.ts +++ b/x-pack/plugins/index_management/public/application/components/index.ts @@ -11,3 +11,4 @@ export { PageErrorForbidden } from './page_error'; export { TemplateDeleteModal } from './template_delete_modal'; export { TemplateForm } from './template_form'; export * from './mappings_editor'; +export * from './component_templates'; diff --git a/x-pack/plugins/index_management/public/application/index.tsx b/x-pack/plugins/index_management/public/application/index.tsx index 8da556cc81fcc..5d1096c9ee24e 100644 --- a/x-pack/plugins/index_management/public/application/index.tsx +++ b/x-pack/plugins/index_management/public/application/index.tsx @@ -10,9 +10,12 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { CoreStart } from '../../../../../src/core/public'; +import { API_BASE_PATH, BASE_PATH } from '../../common'; + import { AppContextProvider, AppDependencies } from './app_context'; import { App } from './app'; import { indexManagementStore } from './store'; +import { ComponentTemplatesProvider } from './components'; export const renderApp = ( elem: HTMLElement | null, @@ -22,15 +25,26 @@ export const renderApp = ( return () => undefined; } - const { i18n } = core; + const { i18n, docLinks, notifications } = core; const { Context: I18nContext } = i18n; const { services, history } = dependencies; + const componentTemplateProviderValues = { + httpClient: services.httpService.httpClient, + apiBasePath: API_BASE_PATH, + appBasePath: BASE_PATH, + trackMetric: services.uiMetricService.trackMetric.bind(services.uiMetricService), + docLinks, + toasts: notifications.toasts, + }; + render( - + + + , diff --git a/x-pack/plugins/index_management/public/application/sections/home/home.tsx b/x-pack/plugins/index_management/public/application/sections/home/home.tsx index 9d4331d742a25..0ddf4fefce466 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/home.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/home.tsx @@ -21,9 +21,16 @@ import { import { documentationService } from '../../services/documentation'; import { IndexList } from './index_list'; import { TemplateList } from './template_list'; +import { ComponentTemplateList } from '../../components/component_templates'; import { breadcrumbService } from '../../services/breadcrumbs'; -type Section = 'indices' | 'templates'; +export enum Section { + Indices = 'indices', + IndexTemplates = 'templates', + ComponentTemplates = 'component_templates', +} + +export const homeSections = [Section.Indices, Section.IndexTemplates, Section.ComponentTemplates]; interface MatchParams { section: Section; @@ -37,11 +44,11 @@ export const IndexManagementHome: React.FunctionComponent { const tabs = [ { - id: 'indices' as Section, + id: Section.Indices, name: , }, { - id: 'templates' as Section, + id: Section.IndexTemplates, name: ( ), }, + { + id: Section.ComponentTemplates, + name: ( + + ), + }, ]; const onSectionChange = (newSection: Section) => { @@ -106,13 +122,14 @@ export const IndexManagementHome: React.FunctionComponent - - + + + diff --git a/x-pack/plugins/index_management/public/application/sections/home/index.ts b/x-pack/plugins/index_management/public/application/sections/home/index.ts index 3a29ef4e58555..b53910748aedb 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index.ts +++ b/x-pack/plugins/index_management/public/application/sections/home/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { IndexManagementHome } from './home'; +export { IndexManagementHome, Section, homeSections } from './home'; diff --git a/x-pack/plugins/index_management/server/client/elasticsearch.ts b/x-pack/plugins/index_management/server/client/elasticsearch.ts index 65bd5411a249b..b51f7d924dba7 100644 --- a/x-pack/plugins/index_management/server/client/elasticsearch.ts +++ b/x-pack/plugins/index_management/server/client/elasticsearch.ts @@ -10,6 +10,7 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) Client.prototype.dataManagement = components.clientAction.namespaceFactory(); const dataManagement = Client.prototype.dataManagement.prototype; + // Component templates dataManagement.getComponentTemplates = ca({ urls: [ { @@ -60,4 +61,14 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) ], method: 'DELETE', }); + + // Composable index templates + dataManagement.getComposableIndexTemplates = ca({ + urls: [ + { + fmt: '/_index_template', + }, + ], + method: 'GET', + }); }; diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts index 87aa64421624e..f6f8e7d63d370 100644 --- a/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts +++ b/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts @@ -5,6 +5,11 @@ */ import { schema } from '@kbn/config-schema'; +import { + deserializeComponentTemplate, + deserializeComponenTemplateList, +} from '../../../../common/lib'; +import { ComponentTemplateFromEs } from '../../../../common'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '../index'; @@ -20,9 +25,25 @@ export function registerGetAllRoute({ router, license, lib: { isEsError } }: Rou const { callAsCurrentUser } = ctx.dataManagement!.client; try { - const response = await callAsCurrentUser('dataManagement.getComponentTemplates'); + const { + component_templates: componentTemplates, + }: { component_templates: ComponentTemplateFromEs[] } = await callAsCurrentUser( + 'dataManagement.getComponentTemplates' + ); + + const { index_templates: indexTemplates } = await callAsCurrentUser( + 'dataManagement.getComposableIndexTemplates' + ); + + const body = componentTemplates.map((componentTemplate) => { + const deserializedComponentTemplateListItem = deserializeComponenTemplateList( + componentTemplate, + indexTemplates + ); + return deserializedComponentTemplateListItem; + }); - return res.ok({ body: response.component_templates }); + return res.ok({ body }); } catch (error) { if (isEsError(error)) { return res.customError({ @@ -56,11 +77,12 @@ export function registerGetAllRoute({ router, license, lib: { isEsError } }: Rou } ); + const { index_templates: indexTemplates } = await callAsCurrentUser( + 'dataManagement.getComposableIndexTemplates' + ); + return res.ok({ - body: { - ...componentTemplates[0], - name, - }, + body: deserializeComponentTemplate(componentTemplates[0], indexTemplates), }); } catch (error) { if (isEsError(error)) { diff --git a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts index a33e82ad9f79d..64bf03a043b55 100644 --- a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts +++ b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts @@ -61,7 +61,10 @@ export default function ({ getService }: FtrProviderContext) { expect(testComponentTemplate).to.eql({ name: COMPONENT_NAME, - component_template: COMPONENT, + usedBy: [], + hasSettings: true, + hasMappings: true, + hasAliases: false, }); }); }); @@ -74,8 +77,9 @@ export default function ({ getService }: FtrProviderContext) { expect(body).to.eql({ name: COMPONENT_NAME, - component_template: { - ...COMPONENT, + ...COMPONENT, + _kbnMeta: { + usedBy: [], }, }); }); diff --git a/x-pack/test/functional/apps/index_management/home_page.ts b/x-pack/test/functional/apps/index_management/home_page.ts index e985e338122e7..cca0a5d1ad1bd 100644 --- a/x-pack/test/functional/apps/index_management/home_page.ts +++ b/x-pack/test/functional/apps/index_management/home_page.ts @@ -47,5 +47,22 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(templateList).to.be(true); }); }); + + describe('Component templates', () => { + it('renders the component templates tab', async () => { + // Navigate to the component templates tab + await pageObjects.indexManagement.changeTabs('component_templatesTab'); + + await pageObjects.header.waitUntilLoadingHasFinished(); + + // Verify url + const url = await browser.getCurrentUrl(); + expect(url).to.contain(`/component_templates`); + + // There should be no component templates by default, so we verify the empty prompt displays + const componentTemplateEmptyPrompt = await testSubjects.exists('emptyList'); + expect(componentTemplateEmptyPrompt).to.be(true); + }); + }); }); }; diff --git a/x-pack/test/functional/page_objects/index_management_page.ts b/x-pack/test/functional/page_objects/index_management_page.ts index d12186f2e2189..9bfcd79671b4d 100644 --- a/x-pack/test/functional/page_objects/index_management_page.ts +++ b/x-pack/test/functional/page_objects/index_management_page.ts @@ -44,7 +44,7 @@ export function IndexManagementPageProvider({ getService }: FtrProviderContext) }; }); }, - async changeTabs(tab: 'indicesTab' | 'templatesTab') { + async changeTabs(tab: 'indicesTab' | 'templatesTab' | 'component_templatesTab') { await testSubjects.click(tab); }, }; From 5d8de7a162a28dd987804e15dd33eac185df2070 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 9 Jun 2020 21:40:05 +0300 Subject: [PATCH 55/91] Use Search API in Vega (#68257) * Use Search API in Vega * fix PR comments * fix PR comments --- ...-data-public.getsearchparamsfromrequest.md | 44 ++++++++++++ .../kibana-plugin-plugins-data-public.md | 1 + .../vis_type_vega/vega_visualization.js | 44 ++++++++++-- src/plugins/data/public/index.ts | 1 + src/plugins/data/public/public.api.md | 46 ++++++++---- .../public/search/fetch/get_search_params.ts | 18 ++++- src/plugins/data/public/search/fetch/index.ts | 1 + src/plugins/data/public/search/index.ts | 1 + .../search/search_source/search_source.ts | 15 ++-- .../public/__mocks__/services.ts | 10 +-- .../public/data_model/es_query_parser.js | 41 ++++------- .../public/data_model/es_query_parser.test.js | 26 ++++--- .../public/data_model/search_api.ts | 60 ++++++++++++++++ .../public/data_model/search_cache.js | 48 ------------- .../public/data_model/search_cache.test.js | 71 ------------------- .../public/data_model/vega_parser.js | 4 +- .../public/data_model/vega_parser.test.js | 18 ++++- src/plugins/vis_type_vega/public/plugin.ts | 2 + src/plugins/vis_type_vega/public/services.ts | 14 +++- src/plugins/vis_type_vega/public/vega_fn.ts | 4 +- .../public/vega_request_handler.ts | 33 +++++---- 21 files changed, 289 insertions(+), 213 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md create mode 100644 src/plugins/vis_type_vega/public/data_model/search_api.ts delete mode 100644 src/plugins/vis_type_vega/public/data_model/search_cache.js delete mode 100644 src/plugins/vis_type_vega/public/data_model/search_cache.test.js diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md new file mode 100644 index 0000000000000..1923f0e2e4ea1 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md @@ -0,0 +1,44 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [getSearchParamsFromRequest](./kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md) + +## getSearchParamsFromRequest() function + +Signature: + +```typescript +export declare function getSearchParamsFromRequest(searchRequest: SearchRequest, dependencies: { + injectedMetadata: CoreStart['injectedMetadata']; + uiSettings: IUiSettingsClient; +}): { + rest_total_hits_as_int: boolean; + ignore_unavailable: boolean; + ignore_throttled: boolean; + max_concurrent_shard_requests: any; + preference: any; + timeout: string | undefined; + index: any; + body: any; +}; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| searchRequest | SearchRequest | | +| dependencies | {
injectedMetadata: CoreStart['injectedMetadata'];
uiSettings: IUiSettingsClient;
} | | + +Returns: + +`{ + rest_total_hits_as_int: boolean; + ignore_unavailable: boolean; + ignore_throttled: boolean; + max_concurrent_shard_requests: any; + preference: any; + timeout: string | undefined; + index: any; + body: any; +}` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index e818fb009fb19..bc1eb9100e85c 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -40,6 +40,7 @@ | [getEsPreference(uiSettings, sessionId)](./kibana-plugin-plugins-data-public.getespreference.md) | | | [getQueryLog(uiSettings, storage, appName, language)](./kibana-plugin-plugins-data-public.getquerylog.md) | | | [getSearchErrorType({ message })](./kibana-plugin-plugins-data-public.getsearcherrortype.md) | | +| [getSearchParamsFromRequest(searchRequest, dependencies)](./kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md) | | | [getTime(indexPattern, timeRange, options)](./kibana-plugin-plugins-data-public.gettime.md) | | | [plugin(initializerContext)](./kibana-plugin-plugins-data-public.plugin.md) | | diff --git a/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js index 6d6eb69e66792..485390dc50a79 100644 --- a/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js +++ b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js @@ -44,7 +44,7 @@ import vegaMapImage256 from './vega_map_image_256.png'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { VegaParser } from '../../../../../../plugins/vis_type_vega/public/data_model/vega_parser'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { SearchCache } from '../../../../../../plugins/vis_type_vega/public/data_model/search_cache'; +import { SearchAPI } from '../../../../../../plugins/vis_type_vega/public/data_model/search_api'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { createVegaTypeDefinition } from '../../../../../../plugins/vis_type_vega/public/vega_type'; @@ -205,7 +205,14 @@ describe('VegaVisualizations', () => { try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaliteGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaliteGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); await vegaVis.render(vegaParser, vis.params, { data: true }); @@ -227,7 +234,14 @@ describe('VegaVisualizations', () => { let vegaVis; try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); await vegaVis.render(vegaParser, vis.params, { data: true }); @@ -243,7 +257,14 @@ describe('VegaVisualizations', () => { let vegaVis; try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaTooltipGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaTooltipGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); await vegaVis.render(vegaParser, vis.params, { data: true }); @@ -285,7 +306,14 @@ describe('VegaVisualizations', () => { let vegaVis; try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaMapGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaMapGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); domNode.style.width = '256px'; @@ -324,7 +352,11 @@ describe('VegaVisualizations', () => { } ] }`, - new SearchCache() + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) ); await vegaParser.parseAsync(); diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index eb3f937a4168b..301ff8d3f67d8 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -358,6 +358,7 @@ export { ISearchSource, parseSearchSourceJSON, injectSearchSourceReferences, + getSearchParamsFromRequest, extractSearchSourceReferences, SearchSourceFields, EsQuerySortValue, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 7054575e8ef9e..bd3ec0d3f2294 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -30,6 +30,7 @@ import { IconType } from '@elastic/eui'; import { InjectedIntl } from '@kbn/i18n/react'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { IUiSettingsClient } from 'src/core/public'; +import { IUiSettingsClient as IUiSettingsClient_3 } from 'kibana/public'; import { Location } from 'history'; import { LocationDescriptorObject } from 'history'; import { MaybePromise } from '@kbn/utility-types'; @@ -641,6 +642,23 @@ export function getQueryLog(uiSettings: IUiSettingsClient, storage: IStorageWrap // @public (undocumented) export function getSearchErrorType({ message }: Pick): "UNSUPPORTED_QUERY" | undefined; +// Warning: (ae-missing-release-tag) "getSearchParamsFromRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function getSearchParamsFromRequest(searchRequest: SearchRequest, dependencies: { + injectedMetadata: CoreStart['injectedMetadata']; + uiSettings: IUiSettingsClient_3; +}): { + rest_total_hits_as_int: boolean; + ignore_unavailable: boolean; + ignore_throttled: boolean; + max_concurrent_shard_requests: any; + preference: any; + timeout: string | undefined; + index: any; + body: any; +}; + // Warning: (ae-missing-release-tag) "getTime" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1851,20 +1869,20 @@ export const UI_SETTINGS: { // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:378:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:387:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:397:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:401:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:378:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:379:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:399:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:402:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/fetch/get_search_params.ts b/src/plugins/data/public/search/fetch/get_search_params.ts index 60bdc9ed6473a..f2ad243ce72d0 100644 --- a/src/plugins/data/public/search/fetch/get_search_params.ts +++ b/src/plugins/data/public/search/fetch/get_search_params.ts @@ -17,8 +17,9 @@ * under the License. */ -import { IUiSettingsClient } from 'kibana/public'; +import { IUiSettingsClient, CoreStart } from 'kibana/public'; import { UI_SETTINGS } from '../../../common'; +import { SearchRequest } from './types'; const sessionId = Date.now(); @@ -53,3 +54,18 @@ export function getPreference(config: IUiSettingsClient) { export function getTimeout(esShardTimeout: number) { return esShardTimeout > 0 ? `${esShardTimeout}ms` : undefined; } + +export function getSearchParamsFromRequest( + searchRequest: SearchRequest, + dependencies: { injectedMetadata: CoreStart['injectedMetadata']; uiSettings: IUiSettingsClient } +) { + const { injectedMetadata, uiSettings } = dependencies; + const esShardTimeout = injectedMetadata.getInjectedVar('esShardTimeout') as number; + const searchParams = getSearchParams(uiSettings, esShardTimeout); + + return { + index: searchRequest.index.title || searchRequest.index, + body: searchRequest.body, + ...searchParams, + }; +} diff --git a/src/plugins/data/public/search/fetch/index.ts b/src/plugins/data/public/search/fetch/index.ts index 39845ec31bfaa..ab856d681ba12 100644 --- a/src/plugins/data/public/search/fetch/index.ts +++ b/src/plugins/data/public/search/fetch/index.ts @@ -20,6 +20,7 @@ export * from './types'; export { getSearchParams, + getSearchParamsFromRequest, getPreference, getTimeout, getIgnoreThrottled, diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index 53686f9be9b4d..1b5395e1071c5 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -44,6 +44,7 @@ export { SearchRequest, SearchResponse, getSearchErrorType, + getSearchParamsFromRequest, } from './fetch'; export { diff --git a/src/plugins/data/public/search/search_source/search_source.ts b/src/plugins/data/public/search/search_source/search_source.ts index b926739112e0e..a33cda964bd1d 100644 --- a/src/plugins/data/public/search/search_source/search_source.ts +++ b/src/plugins/data/public/search/search_source/search_source.ts @@ -77,7 +77,7 @@ import { filterDocvalueFields } from './filter_docvalue_fields'; import { fieldWildcardFilter } from '../../../../kibana_utils/public'; import { IIndexPattern, ISearchGeneric, SearchRequest } from '../..'; import { SearchSourceOptions, SearchSourceFields } from './types'; -import { FetchOptions, RequestFailure, getSearchParams, handleResponse } from '../fetch'; +import { FetchOptions, RequestFailure, handleResponse, getSearchParamsFromRequest } from '../fetch'; import { getEsQueryConfig, buildEsQuery, Filter, UI_SETTINGS } from '../../../common'; import { getHighlightRequest } from '../../../common/field_formats'; @@ -204,13 +204,12 @@ export class SearchSource { */ private fetch$(searchRequest: SearchRequest, signal?: AbortSignal) { const { search, injectedMetadata, uiSettings } = this.dependencies; - const esShardTimeout = injectedMetadata.getInjectedVar('esShardTimeout') as number; - const searchParams = getSearchParams(uiSettings, esShardTimeout); - const params = { - index: searchRequest.index.title || searchRequest.index, - body: searchRequest.body, - ...searchParams, - }; + + const params = getSearchParamsFromRequest(searchRequest, { + injectedMetadata, + uiSettings, + }); + return search({ params, indexType: searchRequest.indexType }, { signal }).pipe( map(({ rawResponse }) => handleResponse(searchRequest, rawResponse)) ); diff --git a/src/plugins/vis_type_vega/public/__mocks__/services.ts b/src/plugins/vis_type_vega/public/__mocks__/services.ts index 1bf051232e4c9..4775241a66d50 100644 --- a/src/plugins/vis_type_vega/public/__mocks__/services.ts +++ b/src/plugins/vis_type_vega/public/__mocks__/services.ts @@ -16,10 +16,10 @@ * specific language governing permissions and limitations * under the License. */ +import { CoreStart, IUiSettingsClient, NotificationsStart, SavedObjectsStart } from 'kibana/public'; import { createGetterSetter } from '../../../kibana_utils/public'; import { DataPublicPluginStart } from '../../../data/public'; -import { IUiSettingsClient, NotificationsStart, SavedObjectsStart } from 'kibana/public'; import { dataPluginMock } from '../../../data/public/mocks'; import { coreMock } from '../../../../core/public/mocks'; @@ -34,22 +34,24 @@ setNotifications(coreMock.createStart().notifications); export const [getUISettings, setUISettings] = createGetterSetter('UISettings'); setUISettings(coreMock.createStart().uiSettings); +export const [getInjectedMetadata, setInjectedMetadata] = createGetterSetter< + CoreStart['injectedMetadata'] +>('InjectedMetadata'); +setInjectedMetadata(coreMock.createStart().injectedMetadata); + export const [getSavedObjects, setSavedObjects] = createGetterSetter( 'SavedObjects' ); setSavedObjects(coreMock.createStart().savedObjects); export const [getInjectedVars, setInjectedVars] = createGetterSetter<{ - esShardTimeout: number; enableExternalUrls: boolean; emsTileLayerId: unknown; }>('InjectedVars'); setInjectedVars({ emsTileLayerId: {}, enableExternalUrls: true, - esShardTimeout: 10000, }); -export const getEsShardTimeout = () => getInjectedVars().esShardTimeout; export const getEnableExternalUrls = () => getInjectedVars().enableExternalUrls; export const getEmsTileLayerId = () => getInjectedVars().emsTileLayerId; diff --git a/src/plugins/vis_type_vega/public/data_model/es_query_parser.js b/src/plugins/vis_type_vega/public/data_model/es_query_parser.js index 066c9f06fc109..387301c2c7de9 100644 --- a/src/plugins/vis_type_vega/public/data_model/es_query_parser.js +++ b/src/plugins/vis_type_vega/public/data_model/es_query_parser.js @@ -17,11 +17,9 @@ * under the License. */ -import _ from 'lodash'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; - -import { getEsShardTimeout } from '../services'; +import { isPlainObject, cloneDeep } from 'lodash'; const TIMEFILTER = '%timefilter%'; const AUTOINTERVAL = '%autointerval%'; @@ -37,12 +35,11 @@ const TIMEFIELD = '%timefield%'; * This class parses ES requests specified in the data.url objects. */ export class EsQueryParser { - constructor(timeCache, searchCache, filters, onWarning) { + constructor(timeCache, searchAPI, filters, onWarning) { this._timeCache = timeCache; - this._searchCache = searchCache; + this._searchAPI = searchAPI; this._filters = filters; this._onWarning = onWarning; - this._esShardTimeout = getEsShardTimeout(); } // noinspection JSMethodCanBeStatic @@ -59,7 +56,7 @@ export class EsQueryParser { if (body === undefined) { url.body = body = {}; - } else if (!_.isPlainObject(body)) { + } else if (!isPlainObject(body)) { throw new Error( i18n.translate('visTypeVega.esQueryParser.urlBodyValueTypeErrorMessage', { defaultMessage: '{configName} must be an object', @@ -167,7 +164,7 @@ export class EsQueryParser { if (context) { // Use dashboard context - const newQuery = _.cloneDeep(this._filters); + const newQuery = cloneDeep(this._filters); if (timefield) { newQuery.bool.must.push(body.query); } @@ -179,34 +176,20 @@ export class EsQueryParser { return { dataObject, url }; } - mapRequest = (request) => { - const esRequest = request.url; - if (this._esShardTimeout) { - // remove possible timeout query param to prevent two conflicting timeout parameters - const { body = {}, timeout, ...rest } = esRequest; //eslint-disable-line no-unused-vars - body.timeout = `${this._esShardTimeout}ms`; - return { - body, - ...rest, - }; - } else { - return esRequest; - } - }; - /** * Process items generated by parseUrl() * @param {object[]} requests each object is generated by parseUrl() * @returns {Promise} */ async populateData(requests) { - const esSearches = requests.map(this.mapRequest); + const esSearches = requests.map((r) => r.url); + const data$ = this._searchAPI.search(esSearches); - const results = await this._searchCache.search(esSearches); + const results = await data$.toPromise(); - for (let i = 0; i < requests.length; i++) { - requests[i].dataObject.values = results[i]; - } + results.forEach((data) => { + requests[data.id].dataObject.values = data.rawResponse; + }); } /** @@ -222,7 +205,7 @@ export class EsQueryParser { const item = obj[pos]; if (isQuery && (item === MUST_CLAUSE || item === MUST_NOT_CLAUSE)) { const ctxTag = item === MUST_CLAUSE ? 'must' : 'must_not'; - const ctx = _.cloneDeep(this._filters); + const ctx = cloneDeep(this._filters); if (ctx && ctx.bool && ctx.bool[ctxTag]) { if (Array.isArray(ctx.bool[ctxTag])) { // replace one value with an array of values diff --git a/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js b/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js index c519da33ab1c9..fd474bef73b8c 100644 --- a/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js @@ -94,28 +94,36 @@ describe(`EsQueryParser time`, () => { }); describe('EsQueryParser.populateData', () => { - let searchStub; + let searchApiStub; + let data; let parser; beforeEach(() => { - searchStub = jest.fn(() => Promise.resolve([{}, {}])); - parser = new EsQueryParser({}, { search: searchStub }, undefined, undefined); + searchApiStub = { + search: jest.fn(() => ({ + toPromise: jest.fn(() => Promise.resolve(data)), + })), + }; + parser = new EsQueryParser({}, searchApiStub, undefined, undefined); }); test('should set the timeout for each request', async () => { + data = [ + { id: 0, rawResponse: {} }, + { id: 1, rawResponse: {} }, + ]; await parser.populateData([ { url: { body: {} }, dataObject: {} }, { url: { body: {} }, dataObject: {} }, ]); - expect(searchStub.mock.calls[0][0][0].body.timeout).toBe.defined; + + expect(searchApiStub.search.mock.calls[0][0][0].body).toBeDefined(); }); test('should remove possible timeout parameters on a request', async () => { - await parser.populateData([ - { url: { timeout: '500h', body: { timeout: '500h' } }, dataObject: {} }, - ]); - expect(searchStub.mock.calls[0][0][0].body.timeout).toBe.defined; - expect(searchStub.mock.calls[0][0][0].timeout).toBe(undefined); + data = [{ id: 0, rawResponse: {} }]; + await parser.populateData([{ url: { body: { timeout: '500h' } }, dataObject: {} }]); + expect(searchApiStub.search.mock.calls[0][0][0].body.timeout).toBeDefined(); }); }); diff --git a/src/plugins/vis_type_vega/public/data_model/search_api.ts b/src/plugins/vis_type_vega/public/data_model/search_api.ts new file mode 100644 index 0000000000000..c2eecf13c2d51 --- /dev/null +++ b/src/plugins/vis_type_vega/public/data_model/search_api.ts @@ -0,0 +1,60 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +import { combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { CoreStart, IUiSettingsClient } from 'kibana/public'; +import { + getSearchParamsFromRequest, + SearchRequest, + DataPublicPluginStart, +} from '../../../data/public'; + +export interface SearchAPIDependencies { + uiSettings: IUiSettingsClient; + injectedMetadata: CoreStart['injectedMetadata']; + search: DataPublicPluginStart['search']; +} + +export class SearchAPI { + constructor( + private readonly dependencies: SearchAPIDependencies, + private readonly abortSignal?: AbortSignal + ) {} + + search(searchRequests: SearchRequest[]) { + const { search } = this.dependencies.search; + + return combineLatest( + searchRequests.map((request, index) => { + const params = getSearchParamsFromRequest(request, { + uiSettings: this.dependencies.uiSettings, + injectedMetadata: this.dependencies.injectedMetadata, + }); + + return search({ params }, { signal: this.abortSignal }).pipe( + map((data) => ({ + id: index, + rawResponse: data.rawResponse, + })) + ); + }) + ); + } +} diff --git a/src/plugins/vis_type_vega/public/data_model/search_cache.js b/src/plugins/vis_type_vega/public/data_model/search_cache.js deleted file mode 100644 index 41e4c67c3b2ad..0000000000000 --- a/src/plugins/vis_type_vega/public/data_model/search_cache.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ - -import LruCache from 'lru-cache'; - -export class SearchCache { - constructor(es, cacheOpts) { - this._es = es; - this._cache = new LruCache(cacheOpts); - } - - /** - * Execute multiple searches, possibly combining the results of the cached searches - * with the new ones already in cache - * @param {object[]} requests array of search requests - */ - search(requests) { - const promises = []; - - for (const request of requests) { - const key = JSON.stringify(request); - let pending = this._cache.get(key); - if (pending === undefined) { - pending = this._es.search(request); - this._cache.set(key, pending); - } - promises.push(pending); - } - - return Promise.all(promises); - } -} diff --git a/src/plugins/vis_type_vega/public/data_model/search_cache.test.js b/src/plugins/vis_type_vega/public/data_model/search_cache.test.js deleted file mode 100644 index 92f80545ce1b5..0000000000000 --- a/src/plugins/vis_type_vega/public/data_model/search_cache.test.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 - * - * 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. - */ - -import { SearchCache } from './search_cache'; -jest.mock('../services'); - -describe(`SearchCache`, () => { - class FauxEs { - constructor() { - // contains all request batches, separated by 0 - this.searches = []; - } - - async search(request) { - this.searches.push(request); - return { req: request }; - } - } - - const request1 = { body: 'b1' }; - const expected1 = { req: { body: 'b1' } }; - const request2 = { body: 'b2' }; - const expected2 = { req: { body: 'b2' } }; - const request3 = { body: 'b3' }; - const expected3 = { req: { body: 'b3' } }; - - it(`sequence`, async () => { - const sc = new SearchCache(new FauxEs()); - - // empty request - let res = await sc.search([]); - expect(res).toEqual([]); - expect(sc._es.searches).toEqual([]); - - // single request - res = await sc.search([request1]); - expect(res).toEqual([expected1]); - expect(sc._es.searches).toEqual([request1]); - - // repeat the same search, use array notation - res = await sc.search([request1]); - expect(res).toEqual([expected1]); - expect(sc._es.searches).toEqual([request1]); // no new entries - - // new single search - res = await sc.search([request2]); - expect(res).toEqual([expected2]); - expect(sc._es.searches).toEqual([request1, request2]); - - // multiple search, some new, some old - res = await sc.search([request1, request3, request2]); - expect(res).toEqual([expected1, expected3, expected2]); - expect(sc._es.searches).toEqual([request1, request2, request3]); - }); -}); diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.js index f541b9f104adc..cbfe2a6ede4f2 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.js @@ -46,7 +46,7 @@ const locToDirMap = { const DEFAULT_PARSER = 'elasticsearch'; export class VegaParser { - constructor(spec, searchCache, timeCache, filters, serviceSettings) { + constructor(spec, searchAPI, timeCache, filters, serviceSettings) { this.spec = spec; this.hideWarnings = false; this.error = undefined; @@ -54,7 +54,7 @@ export class VegaParser { const onWarn = this._onWarning.bind(this); this._urlParsers = { - elasticsearch: new EsQueryParser(timeCache, searchCache, filters, onWarn), + elasticsearch: new EsQueryParser(timeCache, searchAPI, filters, onWarn), emsfile: new EmsFileParser(serviceSettings), url: new UrlParser(onWarn), }; diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js index 1bd26b8713044..a40ef31260b6f 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js @@ -78,9 +78,25 @@ describe(`VegaParser._setDefaultColors`, () => { }); describe('VegaParser._resolveEsQueries', () => { + let searchApiStub; + const data = [ + { + id: 0, + rawResponse: [42], + }, + ]; + + beforeEach(() => { + searchApiStub = { + search: jest.fn(() => ({ + toPromise: jest.fn(() => Promise.resolve(data)), + })), + }; + }); + function check(spec, expected, warnCount) { return async () => { - const vp = new VegaParser(spec, { search: async () => [[42]] }, 0, 0, { + const vp = new VegaParser(spec, searchApiStub, 0, 0, { getFileLayers: async () => [{ name: 'file1', url: 'url1' }], getUrlForRegionLayer: async (layer) => { return layer.url; diff --git a/src/plugins/vis_type_vega/public/plugin.ts b/src/plugins/vis_type_vega/public/plugin.ts index 1bce7ac92e564..b3e35dac3711f 100644 --- a/src/plugins/vis_type_vega/public/plugin.ts +++ b/src/plugins/vis_type_vega/public/plugin.ts @@ -28,6 +28,7 @@ import { setUISettings, setKibanaMapFactory, setMapsLegacyConfig, + setInjectedMetadata, } from './services'; import { createVegaFn } from './vega_fn'; @@ -96,5 +97,6 @@ export class VegaPlugin implements Plugin, void> { setNotifications(core.notifications); setSavedObjects(core.savedObjects); setData(data); + setInjectedMetadata(core.injectedMetadata); } } diff --git a/src/plugins/vis_type_vega/public/services.ts b/src/plugins/vis_type_vega/public/services.ts index f2fddb41cf72b..7d988d464b52b 100644 --- a/src/plugins/vis_type_vega/public/services.ts +++ b/src/plugins/vis_type_vega/public/services.ts @@ -17,8 +17,13 @@ * under the License. */ -import { SavedObjectsStart } from 'kibana/public'; -import { NotificationsStart, IUiSettingsClient } from 'src/core/public'; +import { + CoreStart, + SavedObjectsStart, + NotificationsStart, + IUiSettingsClient, +} from 'src/core/public'; + import { DataPublicPluginStart } from '../../data/public'; import { createGetterSetter } from '../../kibana_utils/public'; import { MapsLegacyConfigType } from '../../maps_legacy/public'; @@ -34,6 +39,10 @@ export const [getKibanaMapFactory, setKibanaMapFactory] = createGetterSetter('UISettings'); +export const [getInjectedMetadata, setInjectedMetadata] = createGetterSetter< + CoreStart['injectedMetadata'] +>('InjectedMetadata'); + export const [getSavedObjects, setSavedObjects] = createGetterSetter( 'SavedObjects' ); @@ -48,6 +57,5 @@ export const [getMapsLegacyConfig, setMapsLegacyConfig] = createGetterSetter getInjectedVars().esShardTimeout; export const getEnableExternalUrls = () => getInjectedVars().enableExternalUrls; export const getEmsTileLayerId = () => getMapsLegacyConfig().emsTileLayerId; diff --git a/src/plugins/vis_type_vega/public/vega_fn.ts b/src/plugins/vis_type_vega/public/vega_fn.ts index 6d45e043f7cee..a9c915fcfb636 100644 --- a/src/plugins/vis_type_vega/public/vega_fn.ts +++ b/src/plugins/vis_type_vega/public/vega_fn.ts @@ -54,8 +54,8 @@ export const createVegaFn = ( help: '', }, }, - async fn(input, args) { - const vegaRequestHandler = createVegaRequestHandler(dependencies); + async fn(input, args, context) { + const vegaRequestHandler = createVegaRequestHandler(dependencies, context.abortSignal); const response = await vegaRequestHandler({ timeRange: get(input, 'timeRange'), diff --git a/src/plugins/vis_type_vega/public/vega_request_handler.ts b/src/plugins/vis_type_vega/public/vega_request_handler.ts index efc02e368efa8..ac28f0b3782b2 100644 --- a/src/plugins/vis_type_vega/public/vega_request_handler.ts +++ b/src/plugins/vis_type_vega/public/vega_request_handler.ts @@ -19,14 +19,14 @@ import { Filter, esQuery, TimeRange, Query } from '../../data/public'; -// @ts-ignore -import { SearchCache } from './data_model/search_cache'; +import { SearchAPI } from './data_model/search_api'; + // @ts-ignore import { TimeCache } from './data_model/time_cache'; import { VegaVisualizationDependencies } from './plugin'; import { VisParams } from './vega_fn'; -import { getData } from './services'; +import { getData, getInjectedMetadata } from './services'; interface VegaRequestHandlerParams { query: Query; @@ -35,12 +35,11 @@ interface VegaRequestHandlerParams { visParams: VisParams; } -export function createVegaRequestHandler({ - plugins: { data }, - core: { uiSettings }, - serviceSettings, -}: VegaVisualizationDependencies) { - let searchCache: SearchCache | undefined; +export function createVegaRequestHandler( + { plugins: { data }, core: { uiSettings }, serviceSettings }: VegaVisualizationDependencies, + abortSignal?: AbortSignal +) { + let searchAPI: SearchAPI; const { timefilter } = data.query.timefilter; const timeCache = new TimeCache(timefilter, 3 * 1000); @@ -50,11 +49,15 @@ export function createVegaRequestHandler({ query, visParams, }: VegaRequestHandlerParams) { - if (!searchCache) { - searchCache = new SearchCache(getData().search.__LEGACY.esClient, { - max: 10, - maxAge: 4 * 1000, - }); + if (!searchAPI) { + searchAPI = new SearchAPI( + { + uiSettings, + search: getData().search, + injectedMetadata: getInjectedMetadata(), + }, + abortSignal + ); } timeCache.setTimeRange(timeRange); @@ -63,7 +66,7 @@ export function createVegaRequestHandler({ const filtersDsl = esQuery.buildEsQuery(undefined, query, filters, esQueryConfigs); // @ts-ignore const { VegaParser } = await import('./data_model/vega_parser'); - const vp = new VegaParser(visParams.spec, searchCache, timeCache, filtersDsl, serviceSettings); + const vp = new VegaParser(visParams.spec, searchAPI, timeCache, filtersDsl, serviceSettings); return await vp.parseAsync(); }; From 5260c32706316c80982cde3e5921187e6a24e3d0 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Tue, 9 Jun 2020 12:50:33 -0600 Subject: [PATCH 56/91] [Security] [Cases] Attach timeline to existing case (#68580) --- .../cases/components/add_comment/index.tsx | 32 + .../cases/components/all_cases/columns.tsx | 274 +++---- .../cases/components/all_cases/index.test.tsx | 16 +- .../cases/components/all_cases/index.tsx | 694 +++++++++--------- .../components/all_cases_modal/index.test.tsx | 140 ++++ .../components/all_cases_modal/index.tsx | 56 ++ .../all_cases_modal/translations.ts | 10 + .../public/cases/pages/case_details.tsx | 2 - .../public/common/mock/global_state.ts | 1 + .../public/common/mock/index.ts | 1 + .../components/flyout/header/index.tsx | 8 +- .../header_with_close_button/index.test.tsx | 30 +- .../__snapshots__/timeline.test.tsx.snap | 51 +- .../components/timeline/index.test.tsx | 14 +- .../insert_timeline_popover/index.test.tsx | 30 +- .../insert_timeline_popover/index.tsx | 35 +- .../use_insert_timeline.tsx | 2 +- .../timeline/properties/helpers.tsx | 51 +- .../timeline/properties/index.test.tsx | 477 ++++-------- .../components/timeline/properties/index.tsx | 39 + .../properties/properties_right.test.tsx | 4 +- .../timeline/properties/properties_right.tsx | 69 +- .../timeline/properties/translations.ts | 7 + .../components/timeline/timeline.test.tsx | 24 + .../timelines/store/timeline/actions.ts | 3 + .../timelines/store/timeline/helpers.ts | 1 + .../timelines/store/timeline/reducer.ts | 22 +- .../timelines/store/timeline/selectors.ts | 5 +- .../public/timelines/store/timeline/types.ts | 7 + 29 files changed, 1166 insertions(+), 939 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx index a57fae8081bea..a830b299d655b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx @@ -8,6 +8,7 @@ import { EuiButton, EuiLoadingSpinner } from '@elastic/eui'; import React, { useCallback, useEffect } from 'react'; import styled from 'styled-components'; +import { useDispatch } from 'react-redux'; import { CommentRequest } from '../../../../../case/common/api'; import { usePostComment } from '../../containers/use_post_comment'; import { Case } from '../../containers/types'; @@ -18,6 +19,12 @@ import { Form, useForm, UseField } from '../../../shared_imports'; import * as i18n from './translations'; import { schema } from './schema'; +import { + dispatchUpdateTimeline, + queryTimelineById, +} from '../../../timelines/components/open_timeline/helpers'; +import { updateIsLoading as dispatchUpdateIsLoading } from '../../../timelines/store/timeline/actions'; +import { useApolloClient } from '../../../common/utils/apollo_context'; const MySpinner = styled(EuiLoadingSpinner)` position: absolute; @@ -46,6 +53,8 @@ export const AddComment = React.memo( options: { stripEmptyFields: false }, schema, }); + const dispatch = useDispatch(); + const apolloClient = useApolloClient(); const { handleCursorChange, handleOnTimelineChange } = useInsertTimeline( form, 'comment' @@ -62,6 +71,28 @@ export const AddComment = React.memo( // eslint-disable-next-line react-hooks/exhaustive-deps }, [insertQuote]); + const handleTimelineClick = useCallback( + (timelineId: string) => { + queryTimelineById({ + apolloClient, + timelineId, + updateIsLoading: ({ + id: currentTimelineId, + isLoading: isLoadingTimeline, + }: { + id: string; + isLoading: boolean; + }) => + dispatch( + dispatchUpdateIsLoading({ id: currentTimelineId, isLoading: isLoadingTimeline }) + ), + updateTimeline: dispatchUpdateTimeline(dispatch), + }); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [apolloClient] + ); + const onSubmit = useCallback(async () => { const { isValid, data } = await form.submit(); if (isValid) { @@ -86,6 +117,7 @@ export const AddComment = React.memo( dataTestSubj: 'add-comment', placeholder: i18n.ADD_COMMENT_HELP_TEXT, onCursorPositionUpdate: handleCursorChange, + onClickTimeline: handleTimelineClick, bottomRightContent: ( export const getCasesColumns = ( actions: Array>, - filterStatus: string -): CasesColumns[] => [ - { - name: i18n.NAME, - render: (theCase: Case) => { - if (theCase.id != null && theCase.title != null) { - const caseDetailsLinkComponent = ( - - {theCase.title} - - ); - return theCase.status === 'open' ? ( - caseDetailsLinkComponent - ) : ( - <> - + filterStatus: string, + isModal: boolean +): CasesColumns[] => { + const columns = [ + { + name: i18n.NAME, + render: (theCase: Case) => { + if (theCase.id != null && theCase.title != null) { + const caseDetailsLinkComponent = !isModal ? ( + + {theCase.title} + + ) : ( + {theCase.title} + ); + return theCase.status === 'open' ? ( + caseDetailsLinkComponent + ) : ( + <> {caseDetailsLinkComponent} - {i18n.CLOSED} - - - ); - } - return getEmptyTagValue(); + + {i18n.CLOSED} + + + ); + } + return getEmptyTagValue(); + }, }, - }, - { - field: 'createdBy', - name: i18n.REPORTER, - render: (createdBy: Case['createdBy']) => { - if (createdBy != null) { - return ( - <> - - - {createdBy.fullName ? createdBy.fullName : createdBy.username ?? ''} - - - ); - } - return getEmptyTagValue(); + { + field: 'createdBy', + name: i18n.REPORTER, + render: (createdBy: Case['createdBy']) => { + if (createdBy != null) { + return ( + <> + + + {createdBy.fullName ? createdBy.fullName : createdBy.username ?? ''} + + + ); + } + return getEmptyTagValue(); + }, + }, + { + field: 'tags', + name: i18n.TAGS, + render: (tags: Case['tags']) => { + if (tags != null && tags.length > 0) { + return ( + + {tags.map((tag: string, i: number) => ( + + {tag} + + ))} + + ); + } + return getEmptyTagValue(); + }, + truncateText: true, }, - }, - { - field: 'tags', - name: i18n.TAGS, - render: (tags: Case['tags']) => { - if (tags != null && tags.length > 0) { - return ( - - {tags.map((tag: string, i: number) => ( - - {tag} - - ))} - - ); - } - return getEmptyTagValue(); + { + align: 'right' as HorizontalAlignment, + field: 'totalComment', + name: i18n.COMMENTS, + sortable: true, + render: (totalComment: Case['totalComment']) => + totalComment != null + ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) + : getEmptyTagValue(), }, - truncateText: true, - }, - { - align: 'right', - field: 'totalComment', - name: i18n.COMMENTS, - sortable: true, - render: (totalComment: Case['totalComment']) => - totalComment != null - ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) - : getEmptyTagValue(), - }, - filterStatus === 'open' - ? { - field: 'createdAt', - name: i18n.OPENED_ON, - sortable: true, - render: (createdAt: Case['createdAt']) => { - if (createdAt != null) { - return ( - - - - ); - } - return getEmptyTagValue(); - }, - } - : { - field: 'closedAt', - name: i18n.CLOSED_ON, - sortable: true, - render: (closedAt: Case['closedAt']) => { - if (closedAt != null) { - return ( - - - - ); - } - return getEmptyTagValue(); + filterStatus === 'open' + ? { + field: 'createdAt', + name: i18n.OPENED_ON, + sortable: true, + render: (createdAt: Case['createdAt']) => { + if (createdAt != null) { + return ( + + + + ); + } + return getEmptyTagValue(); + }, + } + : { + field: 'closedAt', + name: i18n.CLOSED_ON, + sortable: true, + render: (closedAt: Case['closedAt']) => { + if (closedAt != null) { + return ( + + + + ); + } + return getEmptyTagValue(); + }, }, + { + name: i18n.EXTERNAL_INCIDENT, + render: (theCase: Case) => { + if (theCase.id != null) { + return ; + } + return getEmptyTagValue(); }, - { - name: i18n.EXTERNAL_INCIDENT, - render: (theCase: Case) => { - if (theCase.id != null) { - return ; - } - return getEmptyTagValue(); }, - }, - { - name: i18n.INCIDENT_MANAGEMENT_SYSTEM, - render: (theCase: Case) => { - if (theCase.externalService != null) { - return renderStringField( - `${theCase.externalService.connectorName}`, - `case-table-column-connector` - ); - } - return getEmptyTagValue(); + { + name: i18n.INCIDENT_MANAGEMENT_SYSTEM, + render: (theCase: Case) => { + if (theCase.externalService != null) { + return renderStringField( + `${theCase.externalService.connectorName}`, + `case-table-column-connector` + ); + } + return getEmptyTagValue(); + }, + }, + { + name: i18n.ACTIONS, + actions, }, - }, - { - name: i18n.ACTIONS, - actions, - }, -]; + ]; + if (isModal) { + columns.pop(); // remove actions if in modal + } + return columns; +}; interface Props { theCase: Case; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx index e3f4fee15ce68..bbb96f433d3c8 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx @@ -151,8 +151,22 @@ describe('AllCases', () => { expect(column.find('.euiTableRowCell--hideForDesktop').text()).toEqual(columnName); expect(column.find('span').text()).toEqual(emptyTag); }; - getCasesColumns([], 'open').map((i, key) => i.name != null && checkIt(`${i.name}`, key)); + getCasesColumns([], 'open', false).map((i, key) => i.name != null && checkIt(`${i.name}`, key)); }); + + it('should not render case link or actions on modal=true', () => { + const wrapper = mount( + + + + ); + const checkIt = (columnName: string) => { + expect(columnName).not.toEqual(i18n.ACTIONS); + }; + getCasesColumns([], 'open', true).map((i, key) => i.name != null && checkIt(`${i.name}`)); + expect(wrapper.find(`a[data-test-subj="case-details-link"]`).exists()).toBeFalsy(); + }); + it('should tableHeaderSortButton AllCases', () => { const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index 32a7c4078071e..d27f383fb94e3 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - +/* eslint-disable react-hooks/exhaustive-deps */ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { EuiBasicTable, @@ -72,7 +72,6 @@ const ProgressLoader = styled(EuiProgress)` z-index: ${theme.eui.euiZHeader}; `} `; - const getSortField = (field: string): SortFieldCase => { if (field === SortFieldCase.createdAt) { return SortFieldCase.createdAt; @@ -83,368 +82,373 @@ const getSortField = (field: string): SortFieldCase => { }; interface AllCasesProps { + onRowClick?: (id: string) => void; + isModal?: boolean; userCanCrud: boolean; } -export const AllCases = React.memo(({ userCanCrud }) => { - const urlSearch = useGetUrlSearch(navTabs.case); - const { actionLicense } = useGetActionLicense(); - const { - countClosedCases, - countOpenCases, - isLoading: isCasesStatusLoading, - fetchCasesStatus, - } = useGetCasesStatus(); - const { - data, - dispatchUpdateCaseProperty, - filterOptions, - loading, - queryParams, - selectedCases, - refetchCases, - setFilters, - setQueryParams, - setSelectedCases, - } = useGetCases(); +export const AllCases = React.memo( + ({ onRowClick = () => {}, isModal = false, userCanCrud }) => { + const urlSearch = useGetUrlSearch(navTabs.case); + const { actionLicense } = useGetActionLicense(); + const { + countClosedCases, + countOpenCases, + isLoading: isCasesStatusLoading, + fetchCasesStatus, + } = useGetCasesStatus(); + const { + data, + dispatchUpdateCaseProperty, + filterOptions, + loading, + queryParams, + selectedCases, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + } = useGetCases(); - // Delete case - const { - dispatchResetIsDeleted, - handleOnDeleteConfirm, - handleToggleModal, - isLoading: isDeleting, - isDeleted, - isDisplayConfirmDeleteModal, - } = useDeleteCases(); - - // Update case - const { - dispatchResetIsUpdated, - isLoading: isUpdating, - isUpdated, - updateBulkStatus, - } = useUpdateCases(); - const [deleteThisCase, setDeleteThisCase] = useState({ - title: '', - id: '', - }); - const [deleteBulk, setDeleteBulk] = useState([]); - const filterRefetch = useRef<() => void>(); - const setFilterRefetch = useCallback( - (refetchFilter: () => void) => { - filterRefetch.current = refetchFilter; - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [filterRefetch.current] - ); - const refreshCases = useCallback( - (dataRefresh = true) => { - if (dataRefresh) refetchCases(); - fetchCasesStatus(); - setSelectedCases([]); - setDeleteBulk([]); - if (filterRefetch.current != null) { - filterRefetch.current(); - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [filterOptions, queryParams, filterRefetch.current] - ); + // Delete case + const { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isLoading: isDeleting, + isDeleted, + isDisplayConfirmDeleteModal, + } = useDeleteCases(); - useEffect(() => { - if (isDeleted) { - refreshCases(); - dispatchResetIsDeleted(); - } - if (isUpdated) { - refreshCases(); - dispatchResetIsUpdated(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isDeleted, isUpdated]); - const confirmDeleteModal = useMemo( - () => ( - 0} - onCancel={handleToggleModal} - onConfirm={handleOnDeleteConfirm.bind( - null, - deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] - )} - /> - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [deleteBulk, deleteThisCase, isDisplayConfirmDeleteModal] - ); + // Update case + const { + dispatchResetIsUpdated, + isLoading: isUpdating, + isUpdated, + updateBulkStatus, + } = useUpdateCases(); + const [deleteThisCase, setDeleteThisCase] = useState({ + title: '', + id: '', + }); + const [deleteBulk, setDeleteBulk] = useState([]); + const filterRefetch = useRef<() => void>(); + const setFilterRefetch = useCallback( + (refetchFilter: () => void) => { + filterRefetch.current = refetchFilter; + }, + [filterRefetch.current] + ); + const refreshCases = useCallback( + (dataRefresh = true) => { + if (dataRefresh) refetchCases(); + fetchCasesStatus(); + setSelectedCases([]); + setDeleteBulk([]); + if (filterRefetch.current != null) { + filterRefetch.current(); + } + }, + [filterOptions, queryParams, filterRefetch.current] + ); - const toggleDeleteModal = useCallback((deleteCase: Case) => { - handleToggleModal(); - setDeleteThisCase(deleteCase); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + useEffect(() => { + if (isDeleted) { + refreshCases(); + dispatchResetIsDeleted(); + } + if (isUpdated) { + refreshCases(); + dispatchResetIsUpdated(); + } + }, [isDeleted, isUpdated]); + const confirmDeleteModal = useMemo( + () => ( + 0} + onCancel={handleToggleModal} + onConfirm={handleOnDeleteConfirm.bind( + null, + deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] + )} + /> + ), + [deleteBulk, deleteThisCase, isDisplayConfirmDeleteModal] + ); - const toggleBulkDeleteModal = useCallback( - (caseIds: string[]) => { + const toggleDeleteModal = useCallback((deleteCase: Case) => { handleToggleModal(); - if (caseIds.length === 1) { - const singleCase = selectedCases.find((theCase) => theCase.id === caseIds[0]); - if (singleCase) { - return setDeleteThisCase({ id: singleCase.id, title: singleCase.title }); + setDeleteThisCase(deleteCase); + }, []); + + const toggleBulkDeleteModal = useCallback( + (caseIds: string[]) => { + handleToggleModal(); + if (caseIds.length === 1) { + const singleCase = selectedCases.find((theCase) => theCase.id === caseIds[0]); + if (singleCase) { + return setDeleteThisCase({ id: singleCase.id, title: singleCase.title }); + } } - } - const convertToDeleteCases: DeleteCase[] = caseIds.map((id) => ({ id })); - setDeleteBulk(convertToDeleteCases); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCases] - ); + const convertToDeleteCases: DeleteCase[] = caseIds.map((id) => ({ id })); + setDeleteBulk(convertToDeleteCases); + }, + [selectedCases] + ); - const handleUpdateCaseStatus = useCallback( - (status: string) => { - updateBulkStatus(selectedCases, status); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCases] - ); + const handleUpdateCaseStatus = useCallback( + (status: string) => { + updateBulkStatus(selectedCases, status); + }, + [selectedCases] + ); - const selectedCaseIds = useMemo( - (): string[] => selectedCases.map((caseObj: Case) => caseObj.id), - [selectedCases] - ); + const selectedCaseIds = useMemo( + (): string[] => selectedCases.map((caseObj: Case) => caseObj.id), + [selectedCases] + ); - const getBulkItemsPopoverContent = useCallback( - (closePopover: () => void) => ( - - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal] - ); - const handleDispatchUpdate = useCallback( - (args: Omit) => { - dispatchUpdateCaseProperty({ ...args, refetchCasesStatus: fetchCasesStatus }); - }, - [dispatchUpdateCaseProperty, fetchCasesStatus] - ); + const getBulkItemsPopoverContent = useCallback( + (closePopover: () => void) => ( + + ), + [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal] + ); + const handleDispatchUpdate = useCallback( + (args: Omit) => { + dispatchUpdateCaseProperty({ ...args, refetchCasesStatus: fetchCasesStatus }); + }, + [dispatchUpdateCaseProperty, fetchCasesStatus] + ); - const actions = useMemo( - () => - getActions({ - caseStatus: filterOptions.status, - deleteCaseOnClick: toggleDeleteModal, - dispatchUpdate: handleDispatchUpdate, - }), - [filterOptions.status, toggleDeleteModal, handleDispatchUpdate] - ); + const actions = useMemo( + () => + getActions({ + caseStatus: filterOptions.status, + deleteCaseOnClick: toggleDeleteModal, + dispatchUpdate: handleDispatchUpdate, + }), + [filterOptions.status, toggleDeleteModal, handleDispatchUpdate] + ); - const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); + const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); - const tableOnChangeCallback = useCallback( - ({ page, sort }: EuiBasicTableOnChange) => { - let newQueryParams = queryParams; - if (sort) { - newQueryParams = { - ...newQueryParams, - sortField: getSortField(sort.field), - sortOrder: sort.direction, - }; - } - if (page) { - newQueryParams = { - ...newQueryParams, - page: page.index + 1, - perPage: page.size, - }; - } - setQueryParams(newQueryParams); - refreshCases(false); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [queryParams] - ); + const tableOnChangeCallback = useCallback( + ({ page, sort }: EuiBasicTableOnChange) => { + let newQueryParams = queryParams; + if (sort) { + newQueryParams = { + ...newQueryParams, + sortField: getSortField(sort.field), + sortOrder: sort.direction, + }; + } + if (page) { + newQueryParams = { + ...newQueryParams, + page: page.index + 1, + perPage: page.size, + }; + } + setQueryParams(newQueryParams); + refreshCases(false); + }, + [queryParams] + ); - const onFilterChangedCallback = useCallback( - (newFilterOptions: Partial) => { - if (newFilterOptions.status && newFilterOptions.status === 'closed') { - setQueryParams({ sortField: SortFieldCase.closedAt }); - } else if (newFilterOptions.status && newFilterOptions.status === 'open') { - setQueryParams({ sortField: SortFieldCase.createdAt }); - } - setFilters(newFilterOptions); - refreshCases(false); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [filterOptions, queryParams] - ); + const onFilterChangedCallback = useCallback( + (newFilterOptions: Partial) => { + if (newFilterOptions.status && newFilterOptions.status === 'closed') { + setQueryParams({ sortField: SortFieldCase.closedAt }); + } else if (newFilterOptions.status && newFilterOptions.status === 'open') { + setQueryParams({ sortField: SortFieldCase.createdAt }); + } + setFilters(newFilterOptions); + refreshCases(false); + }, + [filterOptions, queryParams] + ); - const memoizedGetCasesColumns = useMemo( - () => getCasesColumns(userCanCrud ? actions : [], filterOptions.status), - [actions, filterOptions.status, userCanCrud] - ); - const memoizedPagination = useMemo( - () => ({ - pageIndex: queryParams.page - 1, - pageSize: queryParams.perPage, - totalItemCount: data.total, - pageSizeOptions: [5, 10, 15, 20, 25], - }), - [data, queryParams] - ); + const memoizedGetCasesColumns = useMemo( + () => getCasesColumns(userCanCrud ? actions : [], filterOptions.status, isModal), + [actions, filterOptions.status, userCanCrud, isModal] + ); + const memoizedPagination = useMemo( + () => ({ + pageIndex: queryParams.page - 1, + pageSize: queryParams.perPage, + totalItemCount: data.total, + pageSizeOptions: [5, 10, 15, 20, 25], + }), + [data, queryParams] + ); - const sorting: EuiTableSortingType = { - sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, - }; - const euiBasicTableSelectionProps = useMemo>( - () => ({ onSelectionChange: setSelectedCases }), - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCases] - ); - const isCasesLoading = useMemo( - () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, - [loading] - ); - const isDataEmpty = useMemo(() => data.total === 0, [data]); + const sorting: EuiTableSortingType = { + sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, + }; + const euiBasicTableSelectionProps = useMemo>( + () => ({ onSelectionChange: setSelectedCases }), + [selectedCases] + ); + const isCasesLoading = useMemo( + () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, + [loading] + ); + const isDataEmpty = useMemo(() => data.total === 0, [data]); - return ( - <> - {!isEmpty(actionsErrors) && ( - - )} - - - - - - - - - - } - titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} - urlSearch={urlSearch} - /> - - - - {i18n.CREATE_TITLE} - - - - - {(isCasesLoading || isDeleting || isUpdating) && !isDataEmpty && ( - - )} - - - {isCasesLoading && isDataEmpty ? ( -
- -
- ) : ( -
- - - - - {i18n.SHOWING_CASES(data.total ?? 0)} - - - - - {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} - - {userCanCrud && ( - - {i18n.BULK_ACTIONS} - - )} - - {i18n.REFRESH} - - - - - {i18n.NO_CASES}} - titleSize="xs" - body={i18n.NO_CASES_BODY} - actions={ - - {i18n.ADD_NEW_CASE} - - } + const TableWrap = useMemo(() => (isModal ? 'span' : Panel), [isModal]); + return ( + <> + {!isEmpty(actionsErrors) && ( + + )} + {!isModal && ( + + + + + + + - } - onChange={tableOnChangeCallback} - pagination={memoizedPagination} - selection={userCanCrud ? euiBasicTableSelectionProps : {}} - sorting={sorting} - /> -
+ + + } + titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} + urlSearch={urlSearch} + /> + + + + {i18n.CREATE_TITLE} + + + + + )} + {(isCasesLoading || isDeleting || isUpdating) && !isDataEmpty && ( + )} -
- {confirmDeleteModal} - - ); -}); + + + {isCasesLoading && isDataEmpty ? ( +
+ +
+ ) : ( +
+ + + + + {i18n.SHOWING_CASES(data.total ?? 0)} + + + {!isModal && ( + + + {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} + + {userCanCrud && ( + + {i18n.BULK_ACTIONS} + + )} + + {i18n.REFRESH} + + + )} + + + {i18n.NO_CASES}} + titleSize="xs" + body={i18n.NO_CASES_BODY} + actions={ + + {i18n.ADD_NEW_CASE} + + } + /> + } + onChange={tableOnChangeCallback} + pagination={memoizedPagination} + rowProps={(item) => + isModal + ? { + onClick: () => onRowClick(item.id), + } + : {} + } + selection={userCanCrud && !isModal ? euiBasicTableSelectionProps : undefined} + sorting={sorting} + /> +
+ )} +
+ {confirmDeleteModal} + + ); + } +); AllCases.displayName = 'AllCases'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx new file mode 100644 index 0000000000000..a24cb6a87de74 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { mount } from 'enzyme'; +import React from 'react'; +import { AllCasesModal } from '.'; +import { TestProviders } from '../../../common/mock'; + +import { useGetCasesMockState, basicCaseId } from '../../containers/mock'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { useGetCases } from '../../containers/use_get_cases'; +import { useGetCasesStatus } from '../../containers/use_get_cases_status'; +import { useUpdateCases } from '../../containers/use_bulk_update_case'; +import { EuiTableRow } from '@elastic/eui'; + +jest.mock('../../containers/use_bulk_update_case'); +jest.mock('../../containers/use_delete_cases'); +jest.mock('../../containers/use_get_cases'); +jest.mock('../../containers/use_get_cases_status'); + +const useDeleteCasesMock = useDeleteCases as jest.Mock; +const useGetCasesMock = useGetCases as jest.Mock; +const useGetCasesStatusMock = useGetCasesStatus as jest.Mock; +const useUpdateCasesMock = useUpdateCases as jest.Mock; +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); + +const onCloseCaseModal = jest.fn(); +const onRowClick = jest.fn(); +const defaultProps = { + onCloseCaseModal, + onRowClick, + showCaseModal: true, +}; +describe('AllCasesModal', () => { + const dispatchResetIsDeleted = jest.fn(); + const dispatchResetIsUpdated = jest.fn(); + const dispatchUpdateCaseProperty = jest.fn(); + const handleOnDeleteConfirm = jest.fn(); + const handleToggleModal = jest.fn(); + const refetchCases = jest.fn(); + const setFilters = jest.fn(); + const setQueryParams = jest.fn(); + const setSelectedCases = jest.fn(); + const updateBulkStatus = jest.fn(); + const fetchCasesStatus = jest.fn(); + + const defaultGetCases = { + ...useGetCasesMockState, + dispatchUpdateCaseProperty, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + }; + const defaultDeleteCases = { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isDeleted: false, + isDisplayConfirmDeleteModal: false, + isLoading: false, + }; + const defaultCasesStatus = { + countClosedCases: 0, + countOpenCases: 5, + fetchCasesStatus, + isError: false, + isLoading: true, + }; + const defaultUpdateCases = { + isUpdated: false, + isLoading: false, + isError: false, + dispatchResetIsUpdated, + updateBulkStatus, + }; + /* eslint-disable no-console */ + // Silence until enzyme fixed to use ReactTestUtils.act() + const originalError = console.error; + beforeAll(() => { + console.error = jest.fn(); + }); + afterAll(() => { + console.error = originalError; + }); + /* eslint-enable no-console */ + beforeEach(() => { + jest.resetAllMocks(); + useUpdateCasesMock.mockImplementation(() => defaultUpdateCases); + useGetCasesMock.mockImplementation(() => defaultGetCases); + useDeleteCasesMock.mockImplementation(() => defaultDeleteCases); + useGetCasesStatusMock.mockImplementation(() => defaultCasesStatus); + }); + + it('renders with unselectable rows', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeTruthy(); + expect(wrapper.find(EuiTableRow).first().prop('isSelectable')).toBeFalsy(); + }); + it('does not render modal if showCaseModal: false', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeFalsy(); + }); + it('onRowClick called when row is clicked', () => { + const wrapper = mount( + + + + ); + const firstRow = wrapper.find(EuiTableRow).first(); + firstRow.simulate('click'); + expect(onRowClick.mock.calls[0][0]).toEqual(basicCaseId); + }); + it('Closing modal calls onCloseCaseModal', () => { + const wrapper = mount( + + + + ); + const modalClose = wrapper.find('.euiModal__closeIcon').first(); + modalClose.simulate('click'); + expect(onCloseCaseModal).toBeCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx new file mode 100644 index 0000000000000..d2ca0f0cd02ee --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { + EuiModal, + EuiModalBody, + EuiModalHeader, + EuiModalHeaderTitle, + EuiOverlayMask, +} from '@elastic/eui'; +import { useGetUserSavedObjectPermissions } from '../../../common/lib/kibana'; +import { AllCases } from '../all_cases'; +import * as i18n from './translations'; + +interface AllCasesModalProps { + onCloseCaseModal: () => void; + showCaseModal: boolean; + onRowClick: (id: string) => void; +} + +export const AllCasesModalComponent = ({ + onCloseCaseModal, + onRowClick, + showCaseModal, +}: AllCasesModalProps) => { + const userPermissions = useGetUserSavedObjectPermissions(); + let modal; + if (showCaseModal) { + modal = ( + + + + {i18n.SELECT_CASE_TITLE} + + + + + + + ); + } + + return <>{modal}; +}; + +export const AllCasesModal = React.memo(AllCasesModalComponent); + +AllCasesModal.displayName = 'AllCasesModal'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts new file mode 100644 index 0000000000000..e0f84d8541424 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +export const SELECT_CASE_TITLE = i18n.translate('xpack.securitySolution.case.caseModal.title', { + defaultMessage: 'Select case to attach timeline', +}); diff --git a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx index 5dfe12179b990..780de303c02d3 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx @@ -10,7 +10,6 @@ import { useParams, Redirect } from 'react-router-dom'; import { WrapperPage } from '../../common/components/wrapper_page'; import { useGetUrlSearch } from '../../common/components/navigation/use_get_url_search'; import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; -import { SpyRoute } from '../../common/utils/route/spy_routes'; import { getCaseUrl } from '../../common/components/link_to'; import { navTabs } from '../../app/home/home_navigations'; import { CaseView } from '../components/case_view'; @@ -36,7 +35,6 @@ export const CaseDetailsPage = React.memo(() => { )} - ) : null; }); diff --git a/x-pack/plugins/security_solution/public/common/mock/global_state.ts b/x-pack/plugins/security_solution/public/common/mock/global_state.ts index 4af39ade70d25..3e84e4035e15e 100644 --- a/x-pack/plugins/security_solution/public/common/mock/global_state.ts +++ b/x-pack/plugins/security_solution/public/common/mock/global_state.ts @@ -229,6 +229,7 @@ export const mockGlobalState: State = { status: TimelineStatus.active, }, }, + insertTimeline: null, }, /** * These state's are wrapped in `Immutable`, but for compatibility with the overall app architecture, diff --git a/x-pack/plugins/security_solution/public/common/mock/index.ts b/x-pack/plugins/security_solution/public/common/mock/index.ts index bdad0ab1712ab..30eb4c63f40b8 100644 --- a/x-pack/plugins/security_solution/public/common/mock/index.ts +++ b/x-pack/plugins/security_solution/public/common/mock/index.ts @@ -15,3 +15,4 @@ export * from './test_providers'; export * from './utils'; export * from './mock_ecs'; export * from './timeline_results'; +export * from './kibana_react'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx index ab8a24889e9bf..8ad32d6e2cad0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx @@ -33,14 +33,14 @@ const StatefulFlyoutHeader = React.memo( associateNote, createTimeline, description, - isFavorite, isDataInTimeline, isDatepickerLocked, - title, + isFavorite, noteIds, notesById, status, timelineId, + title, toggleLock, updateDescription, updateIsFavorite, @@ -61,15 +61,15 @@ const StatefulFlyoutHeader = React.memo( isDataInTimeline={isDataInTimeline} isDatepickerLocked={isDatepickerLocked} isFavorite={isFavorite} - title={title} noteIds={noteIds} status={status} timelineId={timelineId} + title={title} toggleLock={toggleLock} updateDescription={updateDescription} updateIsFavorite={updateIsFavorite} - updateTitle={updateTitle} updateNote={updateNote} + updateTitle={updateTitle} usersViewing={usersViewing} /> ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx index 34a20e7215906..e5fc8b68b1cb7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx @@ -10,22 +10,26 @@ import React from 'react'; import { TestProviders } from '../../../../common/mock'; import { FlyoutHeaderWithCloseButton } from '.'; -jest.mock('../../../../common/lib/kibana', () => { - return { - useKibana: jest.fn().mockReturnValue({ - services: { - application: { - capabilities: { - securitySolution: { - crud: true, - }, +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: jest.fn(), +})); +jest.mock('../../../../common/lib/kibana', () => ({ + ...jest.requireActual('../../../../common/lib/kibana'), + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, }, }, }, - }), - useUiSetting$: jest.fn().mockReturnValue([]), - }; -}); + }, + }), + useUiSetting$: jest.fn().mockReturnValue([]), + useGetUserSavedObjectPermissions: jest.fn(), +})); describe('FlyoutHeaderWithCloseButton', () => { test('renders correctly against snapshot', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap index 4ed0b52fc0f14..4e6cce618880b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap @@ -606,19 +606,40 @@ exports[`Timeline rendering renders correctly against snapshot 1`] = ` }, "filters": Array [], "uiSettings": Object { - "get": [Function], - "get$": [MockFunction], - "getAll": [MockFunction], - "getSaved$": [MockFunction], - "getUpdate$": [MockFunction], - "getUpdateErrors$": [MockFunction], - "isCustom": [MockFunction], - "isDeclared": [MockFunction], - "isDefault": [MockFunction], - "isOverridden": [MockFunction], - "overrideLocalDefault": [MockFunction], - "remove": [MockFunction], - "set": [MockFunction], + "get": [MockFunction] { + "calls": Array [ + Array [ + "query:allowLeadingWildcards", + ], + Array [ + "query:queryString:options", + ], + Array [ + "courier:ignoreFilterIfFieldNotInIndex", + ], + Array [ + "dateFormat:tz", + ], + ], + "results": Array [ + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + ], + }, }, "updated$": Subject { "_isScalar": false, @@ -826,7 +847,7 @@ exports[`Timeline rendering renders correctly against snapshot 1`] = ` } inputId="timeline" /> - - + `; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx index 931623d080198..3110129867628 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx @@ -26,15 +26,25 @@ import { mockDataProviders } from './data_providers/mock/mock_data_providers'; import { StatefulTimeline, Props as StatefulTimelineProps } from './index'; import { Timeline } from './timeline'; -jest.mock('../../../common/lib/kibana'); +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); + const mockUseResizeObserver: jest.Mock = useResizeObserver as jest.Mock; jest.mock('use-resize-observer/polyfilled'); mockUseResizeObserver.mockImplementation(() => ({})); const mockUseSignalIndex: jest.Mock = useSignalIndex as jest.Mock; jest.mock('../../../alerts/containers/detection_engine/alerts/use_signal_index'); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: jest.fn(), +})); jest.mock('../flyout/header_with_close_button'); - describe('StatefulTimeline', () => { let props = {} as StatefulTimelineProps; const sort: Sort = { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx index 0a70413b7ea29..2ffbae1f7eb5c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx @@ -17,6 +17,14 @@ jest.mock('react-redux', () => { return { ...reactRedux, useDispatch: () => mockDispatch, + useSelector: jest + .fn() + .mockReturnValueOnce({ + timelineId: 'timeline-id', + timelineSavedObjectId: '34578-3497-5893-47589-34759', + timelineTitle: 'Timeline title', + }) + .mockReturnValue(null), }; }); const mockLocation = { @@ -25,17 +33,6 @@ const mockLocation = { search: '', state: '', }; -const mockLocationWithState = { - ...mockLocation, - state: { - insertTimeline: { - timelineId: 'timeline-id', - timelineSavedObjectId: '34578-3497-5893-47589-34759', - timelineTitle: 'Timeline title', - }, - }, -}; - const onTimelineChange = jest.fn(); const defaultProps = { isDisabled: false, @@ -43,18 +40,21 @@ const defaultProps = { }; describe('Insert timeline popover ', () => { - beforeEach(() => { - jest.resetAllMocks(); + afterEach(() => { + jest.clearAllMocks(); }); it('should insert a timeline when passed in the router state', () => { - jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocationWithState); mount(); - expect(mockDispatch).toBeCalledWith({ + expect(mockDispatch.mock.calls[0][0]).toEqual({ payload: { id: 'timeline-id', show: false }, type: 'x-pack/security_solution/local/timeline/SHOW_TIMELINE', }); expect(onTimelineChange).toBeCalledWith('Timeline title', '34578-3497-5893-47589-34759'); + expect(mockDispatch.mock.calls[1][0]).toEqual({ + payload: null, + type: 'x-pack/security_solution/local/timeline/SET_INSERT_TIMELINE', + }); }); it('should do nothing when router state', () => { jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx index ed4d742bb8b4d..de199d9a1cc2e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx @@ -6,14 +6,15 @@ import { EuiButtonIcon, EuiPopover, EuiSelectableOption, EuiToolTip } from '@elastic/eui'; import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; -import { useLocation } from 'react-router-dom'; -import { useDispatch } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import { OpenTimelineResult } from '../../open_timeline/types'; import { SelectableTimeline } from '../selectable_timeline'; import * as i18n from '../translations'; -import { timelineActions } from '../../../../timelines/store/timeline'; +import { timelineActions, timelineSelectors } from '../../../../timelines/store/timeline'; import { TimelineType } from '../../../../../common/types/timeline'; +import { State } from '../../../../common/store'; +import { setInsertTimeline } from '../../../store/timeline/actions'; interface InsertTimelinePopoverProps { isDisabled: boolean; @@ -21,14 +22,6 @@ interface InsertTimelinePopoverProps { onTimelineChange: (timelineTitle: string, timelineId: string | null) => void; } -interface RouterState { - insertTimeline: { - timelineId: string; - timelineSavedObjectId: string; - timelineTitle: string; - }; -} - type Props = InsertTimelinePopoverProps; export const InsertTimelinePopoverComponent: React.FC = ({ @@ -38,22 +31,18 @@ export const InsertTimelinePopoverComponent: React.FC = ({ }) => { const dispatch = useDispatch(); const [isPopoverOpen, setIsPopoverOpen] = useState(false); - const { state } = useLocation(); - const [routerState, setRouterState] = useState(state ?? null); + const insertTimeline = useSelector((state: State) => { + return timelineSelectors.selectInsertTimeline(state); + }); useEffect(() => { - if (routerState && routerState.insertTimeline) { - dispatch( - timelineActions.showTimeline({ id: routerState.insertTimeline.timelineId, show: false }) - ); - onTimelineChange( - routerState.insertTimeline.timelineTitle, - routerState.insertTimeline.timelineSavedObjectId - ); - setRouterState(null); + if (insertTimeline != null) { + dispatch(timelineActions.showTimeline({ id: insertTimeline.timelineId, show: false })); + onTimelineChange(insertTimeline.timelineTitle, insertTimeline.timelineSavedObjectId); + dispatch(setInsertTimeline(null)); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [routerState]); + }, [insertTimeline, dispatch]); const handleClosePopover = useCallback(() => { setIsPopoverOpen(false); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx index 0f9e64082a603..6269bc1b4a1a3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx @@ -17,7 +17,7 @@ export const useInsertTimeline = (form: FormHook, fieldNa }); const handleOnTimelineChange = useCallback( (title: string, id: string | null) => { - const builtLink = `${basePath}/app/siem#/timelines?timeline=(id:'${id}',isOpen:!t)`; + const builtLink = `${basePath}/app/security#/timelines?timeline=(id:'${id}',isOpen:!t)`; const currentValue = form.getFormData()[fieldName]; const newValue: string = [ currentValue.slice(0, cursorPosition.start), diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx index 9e74298f3aca9..00a0e57324841 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx @@ -21,7 +21,7 @@ import React, { useCallback } from 'react'; import uuid from 'uuid'; import styled from 'styled-components'; import { useHistory } from 'react-router-dom'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import { TimelineTypeLiteral, @@ -41,6 +41,7 @@ import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { NOTES_PANEL_WIDTH } from './notes_size'; import { ButtonContainer, DescriptionContainer, LabelText, NameField, StyledStar } from './styles'; import * as i18n from './translations'; +import { setInsertTimeline } from '../../../store/timeline/actions'; import { useCreateTimelineButton } from './use_create_timeline'; export const historyToolTip = 'The chronological history of actions related to this timeline'; @@ -144,23 +145,25 @@ interface NewCaseProps { export const NewCase = React.memo( ({ onClosePopover, timelineId, timelineStatus, timelineTitle }) => { const history = useHistory(); + const dispatch = useDispatch(); const { savedObjectId } = useSelector((state: State) => timelineSelectors.selectTimeline(state, timelineId) ); + const handleClick = useCallback(() => { onClosePopover(); history.push({ pathname: `/${SiemPageName.case}/create`, - state: { - insertTimeline: { - timelineId, - timelineSavedObjectId: savedObjectId, - timelineTitle: timelineTitle.length > 0 ? timelineTitle : i18n.UNTITLED_TIMELINE, - }, - }, }); + dispatch( + setInsertTimeline({ + timelineId, + timelineSavedObjectId: savedObjectId, + timelineTitle: timelineTitle.length > 0 ? timelineTitle : i18n.UNTITLED_TIMELINE, + }) + ); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [onClosePopover, history, timelineId, timelineTitle]); + }, [dispatch, onClosePopover, history, timelineId, timelineTitle]); return ( ( ); NewCase.displayName = 'NewCase'; +interface ExistingCaseProps { + onClosePopover: () => void; + onOpenCaseModal: () => void; + timelineStatus: TimelineStatus; +} +export const ExistingCase = React.memo( + ({ onClosePopover, onOpenCaseModal, timelineStatus }) => { + const handleClick = useCallback(() => { + onClosePopover(); + onOpenCaseModal(); + }, [onOpenCaseModal, onClosePopover]); + + return ( + <> + + {i18n.ATTACH_TIMELINE_TO_EXISTING_CASE} + + + ); + } +); +ExistingCase.displayName = 'ExistingCase'; + export interface NewTimelineProps { createTimeline?: CreateTimeline; closeGearMenu?: () => void; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx index 952a7c104e19e..505d0b8cba854 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx @@ -6,33 +6,43 @@ import { mount } from 'enzyme'; import React from 'react'; -import { Provider as ReduxStoreProvider } from 'react-redux'; - import { TimelineStatus } from '../../../../../common/types/timeline'; import { mockGlobalState, apolloClientObservable, SUB_PLUGINS_REDUCER, + TestProviders, } from '../../../../common/mock'; import { createStore, State } from '../../../../common/store'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Properties, showDescriptionThreshold, showNotesThreshold } from '.'; +import { SiemPageName } from '../../../../app/types'; +import { setInsertTimeline } from '../../../store/timeline/actions'; +export { nextTick } from '../../../../../../../test_utils'; + +import { act } from 'react-dom/test-utils'; -jest.mock('../../../../common/lib/kibana', () => ({ - useKibana: jest.fn().mockReturnValue({ - services: { - application: { - capabilities: { - securitySolution: { - crud: true, +jest.mock('../../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../../common/lib/kibana'); + return { + ...originalModule, + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, }, }, }, - }, - }), - useUiSetting$: jest.fn().mockReturnValue([]), -})); + }), + useUiSetting$: jest.fn().mockReturnValue([]), + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); +const mockDispatch = jest.fn(); jest.mock('../../../../common/components/utils', () => { return { useThrottledResizeObserver: jest.fn(), @@ -48,21 +58,44 @@ jest.mock('react-redux', () => { }; }); -jest.mock('react-router-dom', () => { - const originalModule = jest.requireActual('react-router-dom'); +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useDispatch: () => mockDispatch, + useSelector: jest.fn().mockReturnValue({ savedObjectId: '1', urlState: {} }), +})); +const mockHistoryPush = jest.fn(); - return { - ...originalModule, - useHistory: jest.fn(), - }; -}); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})); jest.mock('./use_create_timeline', () => ({ useCreateTimelineButton: jest.fn().mockReturnValue({ getButton: jest.fn() }), })); - +const usersViewing = ['elastic']; +const defaultProps = { + associateNote: jest.fn(), + createTimeline: jest.fn(), + isDataInTimeline: false, + isDatepickerLocked: false, + isFavorite: false, + title: '', + description: '', + getNotesByIds: jest.fn(), + noteIds: [], + status: TimelineStatus.active, + timelineId: 'abc', + toggleLock: jest.fn(), + updateDescription: jest.fn(), + updateIsFavorite: jest.fn(), + updateTitle: jest.fn(), + updateNote: jest.fn(), + usersViewing, +}; describe('Properties', () => { - const usersViewing = ['elastic']; const state: State = mockGlobalState; let mockedWidth = 1000; let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); @@ -75,27 +108,9 @@ describe('Properties', () => { test('renders correctly', () => { const wrapper = mount( - - - + + + ); wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); @@ -104,31 +119,16 @@ describe('Properties', () => { expect(wrapper.find('button[data-test-subj="attach-timeline-case"]').prop('disabled')).toEqual( false ); + expect( + wrapper.find('button[data-test-subj="attach-timeline-existing-case"]').prop('disabled') + ).toEqual(false); }); test('renders correctly draft timeline', () => { const wrapper = mount( - - - + + + ); wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); @@ -136,31 +136,16 @@ describe('Properties', () => { expect(wrapper.find('button[data-test-subj="attach-timeline-case"]').prop('disabled')).toEqual( true ); + expect( + wrapper.find('button[data-test-subj="attach-timeline-existing-case"]').prop('disabled') + ).toEqual(true); }); test('it renders an empty star icon when it is NOT a favorite', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="timeline-favorite-empty-star"]').exists()).toEqual(true); @@ -168,27 +153,9 @@ describe('Properties', () => { test('it renders a filled star icon when it is a favorite', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="timeline-favorite-filled-star"]').exists()).toEqual(true); @@ -198,27 +165,9 @@ describe('Properties', () => { const title = 'foozle'; const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="timeline-title"]').first().props().value).toEqual(title); @@ -226,27 +175,9 @@ describe('Properties', () => { test('it renders the date picker with the lock icon', () => { const wrapper = mount( - - - + + + ); expect( @@ -259,27 +190,9 @@ describe('Properties', () => { test('it renders the lock icon when isDatepickerLocked is true', () => { const wrapper = mount( - - - + + + ); expect( wrapper @@ -291,27 +204,9 @@ describe('Properties', () => { test('it renders the unlock icon when isDatepickerLocked is false', () => { const wrapper = mount( - - - + + + ); expect( wrapper @@ -328,27 +223,9 @@ describe('Properties', () => { (useThrottledResizeObserver as jest.Mock).mockReturnValue({ width: showDescriptionThreshold }); const wrapper = mount( - - - + + + ); expect( @@ -369,27 +246,9 @@ describe('Properties', () => { }); const wrapper = mount( - - - + + + ); expect( @@ -404,27 +263,9 @@ describe('Properties', () => { mockedWidth = showNotesThreshold; const wrapper = mount( - - - + + + ); expect( @@ -442,27 +283,9 @@ describe('Properties', () => { }); const wrapper = mount( - - - + + + ); expect( @@ -475,27 +298,9 @@ describe('Properties', () => { test('it renders a settings icon', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="settings-gear"]').exists()).toEqual(true); @@ -505,27 +310,9 @@ describe('Properties', () => { const title = 'port scan'; const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="avatar"]').exists()).toEqual(true); @@ -533,29 +320,45 @@ describe('Properties', () => { test('it does NOT render an avatar for the current user viewing the timeline when it does NOT have a title', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="avatar"]').exists()).toEqual(false); }); + + test('insert timeline - new case', () => { + const wrapper = mount( + + + + ); + wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); + wrapper.find('[data-test-subj="attach-timeline-case"]').first().simulate('click'); + + expect(mockHistoryPush).toBeCalledWith({ pathname: `/${SiemPageName.case}/create` }); + expect(mockDispatch).toBeCalledWith( + setInsertTimeline({ + timelineId: defaultProps.timelineId, + timelineSavedObjectId: '1', + timelineTitle: 'coolness', + }) + ); + }); + + test('insert timeline - existing case', async () => { + const wrapper = mount( + + + + ); + wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); + wrapper.find('[data-test-subj="attach-timeline-existing-case"]').first().simulate('click'); + + await act(async () => { + await Promise.resolve({}); + }); + expect(wrapper.find('[data-test-subj="all-cases-modal"]').exists()).toBeTruthy(); + }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx index d4c43c9929f0e..be79c0773bf88 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx @@ -6,6 +6,8 @@ import React, { useState, useCallback, useMemo } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { useHistory } from 'react-router-dom'; import { TimelineStatus, TimelineTypeLiteral } from '../../../../../common/types/timeline'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Note } from '../../../../common/lib/note'; @@ -16,6 +18,12 @@ import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { TimelineProperties } from './styles'; import { PropertiesRight } from './properties_right'; import { PropertiesLeft } from './properties_left'; +import { AllCasesModal } from '../../../../cases/components/all_cases_modal'; +import { SiemPageName } from '../../../../app/types'; +import * as i18n from './translations'; +import { State } from '../../../../common/store'; +import { timelineSelectors } from '../../../store/timeline'; +import { setInsertTimeline } from '../../../store/timeline/actions'; type CreateTimeline = ({ id, @@ -87,6 +95,7 @@ export const Properties = React.memo( const [showActions, setShowActions] = useState(false); const [showNotes, setShowNotes] = useState(false); const [showTimelineModal, setShowTimelineModal] = useState(false); + const dispatch = useDispatch(); const onButtonClick = useCallback(() => setShowActions(!showActions), [showActions]); const onToggleShowNotes = useCallback(() => setShowNotes(!showNotes), [showNotes]); @@ -98,6 +107,30 @@ export const Properties = React.memo( setShowTimelineModal(true); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const [showCaseModal, setShowCaseModal] = useState(false); + const onCloseCaseModal = useCallback(() => setShowCaseModal(false), []); + const onOpenCaseModal = useCallback(() => setShowCaseModal(true), []); + const history = useHistory(); + const currentTimeline = useSelector((state: State) => + timelineSelectors.selectTimeline(state, timelineId) + ); + + const onRowClick = useCallback( + (id: string) => { + onCloseCaseModal(); + history.push({ + pathname: `/${SiemPageName.case}/${id}`, + }); + dispatch( + setInsertTimeline({ + timelineId, + timelineSavedObjectId: currentTimeline.savedObjectId, + timelineTitle: title.length > 0 ? title : i18n.UNTITLED_TIMELINE, + }) + ); + }, + [onCloseCaseModal, currentTimeline, dispatch, history, timelineId, title] + ); const datePickerWidth = useMemo( () => @@ -144,6 +177,7 @@ export const Properties = React.memo( onButtonClick={onButtonClick} onClosePopover={onClosePopover} onCloseTimelineModal={onCloseTimelineModal} + onOpenCaseModal={onOpenCaseModal} onOpenTimelineModal={onOpenTimelineModal} onToggleShowNotes={onToggleShowNotes} showActions={showActions} @@ -159,6 +193,11 @@ export const Properties = React.memo( updateNote={updateNote} usersViewing={usersViewing} /> + ); } diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx index 58927e7b236e7..e297a3cc595d6 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx @@ -28,9 +28,10 @@ jest.mock('./new_template_timeline', () => { jest.mock('./helpers', () => { return { Description: jest.fn().mockReturnValue(
), - NotesButton: jest.fn().mockReturnValue(
), + ExistingCase: jest.fn().mockReturnValue(
), NewCase: jest.fn().mockReturnValue(
), NewTimeline: jest.fn().mockReturnValue(
), + NotesButton: jest.fn().mockReturnValue(
), }; }); @@ -62,6 +63,7 @@ describe('Properties Right', () => { noteIds: [], onToggleShowNotes: jest.fn(), onCloseTimelineModal: jest.fn(), + onOpenCaseModal: jest.fn(), onOpenTimelineModal: jest.fn(), status: TimelineStatus.active, showTimelineModal: false, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx index f9ab7fb2e69ae..a9baf73676ffb 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx @@ -14,6 +14,7 @@ import { EuiToolTip, EuiAvatar, } from '@elastic/eui'; +import { NewTimeline, Description, NotesButton, NewCase, ExistingCase } from './helpers'; import { disableTemplate } from '../../../../../common/constants'; import { TimelineStatus } from '../../../../../common/types/timeline'; @@ -27,7 +28,6 @@ import { OpenTimelineModalButton } from '../../open_timeline/open_timeline_modal import { OpenTimelineModal } from '../../open_timeline/open_timeline_modal'; import * as i18n from './translations'; -import { Description, NotesButton, NewCase, NewTimeline } from './helpers'; import { NewTemplateTimeline } from './new_template_timeline'; export const PropertiesRightStyle = styled(EuiFlexGroup)` @@ -64,54 +64,56 @@ Avatar.displayName = 'Avatar'; type UpdateDescription = ({ id, description }: { id: string; description: string }) => void; export type UpdateNote = (note: Note) => void; -export interface PropertiesRightComponentProps { - onButtonClick: () => void; - onClosePopover: () => void; - showActions: boolean; - timelineId: string; - isDataInTimeline: boolean; - showNotes: boolean; - showNotesFromWidth: boolean; - showDescription: boolean; - showUsersView: boolean; - usersViewing: string[]; - description: string; - updateDescription: UpdateDescription; +interface PropertiesRightComponentProps { associateNote: AssociateNote; + description: string; getNotesByIds: (noteIds: string[]) => Note[]; + isDataInTimeline: boolean; noteIds: string[]; - onToggleShowNotes: () => void; + onButtonClick: () => void; + onClosePopover: () => void; onCloseTimelineModal: () => void; + onOpenCaseModal: () => void; onOpenTimelineModal: () => void; + onToggleShowNotes: () => void; + showActions: boolean; + showDescription: boolean; + showNotes: boolean; + showNotesFromWidth: boolean; showTimelineModal: boolean; + showUsersView: boolean; status: TimelineStatus; + timelineId: string; title: string; + updateDescription: UpdateDescription; updateNote: UpdateNote; + usersViewing: string[]; } const PropertiesRightComponent: React.FC = ({ - onButtonClick, - showActions, - onClosePopover, - timelineId, - isDataInTimeline, - showNotesFromWidth, - showNotes, - showDescription, - showUsersView, - usersViewing, - description, - updateDescription, associateNote, + description, getNotesByIds, + isDataInTimeline, noteIds, + onButtonClick, + onClosePopover, + onCloseTimelineModal, + onOpenCaseModal, + onOpenTimelineModal, onToggleShowNotes, - updateNote, + showActions, + showDescription, + showNotes, + showNotesFromWidth, showTimelineModal, + showUsersView, status, - onCloseTimelineModal, - onOpenTimelineModal, + timelineId, title, + updateDescription, + updateNote, + usersViewing, }) => { const uiCapabilities = useKibana().services.application.capabilities; const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; @@ -170,6 +172,13 @@ const PropertiesRightComponent: React.FC = ({ timelineStatus={status} /> + + + ({})); +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + return { + ...originalModule, + useHistory: jest.fn(), + }; +}); +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useKibana: jest.fn().mockReturnValue({ + services: { + uiSettings: { + get: jest.fn(), + }, + savedObjects: { + client: {}, + }, + }, + }), + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); describe('Timeline', () => { let props = {} as TimelineComponentProps; const sort: Sort = { diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts index e8b5ba68eecdf..c5df017604b0c 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts @@ -17,6 +17,7 @@ import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/t import { EventType, KqlMode, TimelineModel, ColumnHeaderOptions } from './model'; import { TimelineNonEcsData } from '../../../graphql/types'; import { TimelineTypeLiteral } from '../../../../common/types/timeline'; +import { InsertTimeline } from './types'; const actionCreator = actionCreatorFactory('x-pack/security_solution/local/timeline'); @@ -98,6 +99,8 @@ export const addTimeline = actionCreator<{ timeline: TimelineModel; }>('ADD_TIMELINE'); +export const setInsertTimeline = actionCreator('SET_INSERT_TIMELINE'); + export const startTimelineSaving = actionCreator<{ id: string; }>('START_TIMELINE_SAVING'); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts index 97ac423cee653..03e9ca176ee82 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts @@ -36,6 +36,7 @@ export const initialTimelineState: TimelineState = { newTimelineModel: null, }, showCallOutUnauthorizedMsg: false, + insertTimeline: null, }; interface AddTimelineHistoryParams { diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts index 3666968e8ab92..5e314f1597451 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts @@ -6,14 +6,17 @@ import { reducerWithInitialState } from 'typescript-fsa-reducers'; import { - addTimeline, addHistory, addNote, addNoteToEvent, addProvider, + addTimeline, applyDeltaToColumnWidth, applyDeltaToWidth, applyKqlFilterQuery, + clearEventsDeleted, + clearEventsLoading, + clearSelected, createTimeline, dataProviderEdited, endTimelineSaving, @@ -21,12 +24,12 @@ import { removeColumn, removeProvider, setEventsDeleted, - clearEventsDeleted, setEventsLoading, - clearEventsLoading, + setFilters, + setInsertTimeline, setKqlFilterQueryDraft, + setSavedQueryId, setSelected, - clearSelected, showCallOutUnauthorizedMsg, showTimeline, startTimelineSaving, @@ -37,9 +40,11 @@ import { updateDataProviderExcluded, updateDataProviderKqlQuery, updateDescription, + updateEventType, updateHighlightedDropAndProviderId, updateIsFavorite, updateIsLive, + updateIsLoading, updateItemsPerPage, updateItemsPerPageOptions, updateKqlMode, @@ -50,10 +55,6 @@ import { updateTimeline, updateTitle, upsertColumn, - updateIsLoading, - setSavedQueryId, - setFilters, - updateEventType, } from './actions'; import { addNewTimeline, @@ -107,6 +108,7 @@ export const initialTimelineState: TimelineState = { newTimelineModel: null, }, showCallOutUnauthorizedMsg: false, + insertTimeline: null, }; /** The reducer for all timeline actions */ @@ -486,4 +488,8 @@ export const timelineReducer = reducerWithInitialState(initialTimelineState) timelineById: state.timelineById, }), })) + .case(setInsertTimeline, (state, insertTimeline) => ({ + ...state, + insertTimeline, + })) .build(); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts index af7ac075468c3..a80a28660e28b 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts @@ -10,7 +10,7 @@ import { isFromKueryExpressionValid } from '../../../common/lib/keury'; import { State } from '../../../common/store/types'; import { TimelineModel } from './model'; -import { AutoSavedWarningMsg, TimelineById } from './types'; +import { AutoSavedWarningMsg, InsertTimeline, TimelineById } from './types'; const selectTimelineById = (state: State): TimelineById => state.timeline.timelineById; @@ -22,6 +22,9 @@ const selectCallOutUnauthorizedMsg = (state: State): boolean => export const selectTimeline = (state: State, timelineId: string): TimelineModel => state.timeline.timelineById[timelineId]; +export const selectInsertTimeline = (state: State): InsertTimeline | null => + state.timeline.insertTimeline; + export const autoSaveMsgSelector = createSelector(selectAutoSaveMsg, (autoSaveMsg) => autoSaveMsg); export const timelineByIdSelector = createSelector( diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts index 1cc4517d2c964..aa6c308614287 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts @@ -16,6 +16,12 @@ export interface TimelineById { [id: string]: TimelineModel; } +export interface InsertTimeline { + timelineId: string; + timelineSavedObjectId: string | null; + timelineTitle: string; +} + export const EMPTY_TIMELINE_BY_ID: TimelineById = {}; // stable reference /** The state of all timelines is stored here */ @@ -23,6 +29,7 @@ export interface TimelineState { timelineById: TimelineById; autoSavedWarningMsg: AutoSavedWarningMsg; showCallOutUnauthorizedMsg: boolean; + insertTimeline: InsertTimeline | null; } export interface ActionTimeline extends Action { From f4cfa491d8a2acbcd0365952cb6a893bd534c55f Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 9 Jun 2020 12:11:53 -0700 Subject: [PATCH 57/91] Prefer using npm_execpath when spawning Yarn (#68673) Prevents instances where an incorrect version of Yarn is used from a parent directory containing node_modules. Signed-off-by: Tyler Smalley --- packages/kbn-pm/dist/index.js | 9 +++++---- packages/kbn-pm/src/utils/scripts.ts | 10 ++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 93152ef1b71dc..ef2b7e7c06a25 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -55242,6 +55242,7 @@ __webpack_require__.r(__webpack_exports__); * under the License. */ +const YARN_EXEC = process.env.npm_execpath || 'yarn'; /** * Install all dependencies in the given directory @@ -55250,7 +55251,7 @@ async function installInDir(directory, extraArgs = []) { const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any // given time (e.g. to avoid conflicts). - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', options, { + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, options, { cwd: directory }); } @@ -55262,7 +55263,7 @@ async function runScriptInPackage(script, args, pkg) { const execOpts = { cwd: pkg.path }; - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['run', script, ...args], execOpts); + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['run', script, ...args], execOpts); } /** * Run script in the given directory @@ -55277,7 +55278,7 @@ function runScriptInPackageStreaming({ const execOpts = { cwd: pkg.path }; - return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])('yarn', ['run', script, ...args], execOpts, { + return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])(YARN_EXEC, ['run', script, ...args], execOpts, { prefix: pkg.name, debug }); @@ -55285,7 +55286,7 @@ function runScriptInPackageStreaming({ async function yarnWorkspacesInfo(directory) { const { stdout - } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['--json', 'workspaces', 'info'], { + } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['--json', 'workspaces', 'info'], { cwd: directory, stdio: 'pipe' }); diff --git a/packages/kbn-pm/src/utils/scripts.ts b/packages/kbn-pm/src/utils/scripts.ts index 728ac4287b1ce..6b1dc729906f2 100644 --- a/packages/kbn-pm/src/utils/scripts.ts +++ b/packages/kbn-pm/src/utils/scripts.ts @@ -20,6 +20,8 @@ import { spawn, spawnStreaming } from './child_process'; import { Project } from './project'; +const YARN_EXEC = process.env.npm_execpath || 'yarn'; + interface WorkspaceInfo { location: string; workspaceDependencies: string[]; @@ -37,7 +39,7 @@ export async function installInDir(directory: string, extraArgs: string[] = []) // We pass the mutex flag to ensure only one instance of yarn runs at any // given time (e.g. to avoid conflicts). - await spawn('yarn', options, { + await spawn(YARN_EXEC, options, { cwd: directory, }); } @@ -50,7 +52,7 @@ export async function runScriptInPackage(script: string, args: string[], pkg: Pr cwd: pkg.path, }; - await spawn('yarn', ['run', script, ...args], execOpts); + await spawn(YARN_EXEC, ['run', script, ...args], execOpts); } /** @@ -71,14 +73,14 @@ export function runScriptInPackageStreaming({ cwd: pkg.path, }; - return spawnStreaming('yarn', ['run', script, ...args], execOpts, { + return spawnStreaming(YARN_EXEC, ['run', script, ...args], execOpts, { prefix: pkg.name, debug, }); } export async function yarnWorkspacesInfo(directory: string): Promise { - const { stdout } = await spawn('yarn', ['--json', 'workspaces', 'info'], { + const { stdout } = await spawn(YARN_EXEC, ['--json', 'workspaces', 'info'], { cwd: directory, stdio: 'pipe', }); From ccb607303b4f5d76c13f941703611854f40188c8 Mon Sep 17 00:00:00 2001 From: Andrew Cholakian Date: Tue, 9 Jun 2020 15:16:14 -0500 Subject: [PATCH 58/91] [Uptime] Fix race on overview page query (#67843) Fixes https://github.com/elastic/kibana/issues/67842 by requerying during the refine phase to see if a newer matching doc has come in. --- .../refine_potential_matches.test.ts | 112 ++++++++++++++++++ .../server/lib/requests/search/fetch_chunk.ts | 4 +- .../requests/search/find_potential_matches.ts | 44 +------ .../search/refine_potential_matches.ts | 90 +++++++++----- 4 files changed, 174 insertions(+), 76 deletions(-) create mode 100644 x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts new file mode 100644 index 0000000000000..283f5fb8909f6 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { fullyMatchingIds } from '../refine_potential_matches'; +import { MonitorLocCheckGroup } from '..'; + +const mockQueryResult = (opts: { latestSummary: any; latestMatching: any }) => { + return { + aggregations: { + monitor: { + buckets: [ + { + key: 'my-monitor', + location: { + buckets: [ + { + key: 'my-location', + summaries: { + latest: { + hits: { + hits: [ + { + _source: opts.latestSummary, + }, + ], + }, + }, + }, + latest_matching: { + top: { + hits: { + hits: [ + { + _source: opts.latestMatching, + }, + ], + }, + }, + }, + }, + ], + }, + }, + ], + }, + }, + }; +}; + +describe('fully matching IDs', () => { + it('should exclude items whose latest result does not match', () => { + const queryRes = mockQueryResult({ + latestSummary: { + '@timestamp': '2020-06-04T12:39:54.698-0500', + monitor: { + check_group: 'latest-summary-check-group', + }, + summary: { + up: 1, + down: 0, + }, + }, + latestMatching: { + '@timestamp': '2019-06-04T12:39:54.698-0500', + summary: { + up: 1, + down: 0, + }, + }, + }); + const res = fullyMatchingIds(queryRes, undefined); + const expected = new Map(); + expect(res).toEqual(expected); + }); + + it('should include items whose latest result does match', () => { + const queryRes = mockQueryResult({ + latestSummary: { + '@timestamp': '2020-06-04T12:39:54.698-0500', + monitor: { + check_group: 'latest-summary-check-group', + }, + summary: { + up: 1, + down: 0, + }, + }, + latestMatching: { + '@timestamp': '2020-06-04T12:39:54.698-0500', + summary: { + up: 1, + down: 0, + }, + }, + }); + const res = fullyMatchingIds(queryRes, undefined); + const expected = new Map(); + expected.set('my-monitor', [ + { + checkGroup: 'latest-summary-check-group', + location: 'my-location', + monitorId: 'my-monitor', + status: 'up', + summaryTimestamp: new Date('2020-06-04T12:39:54.698-0500'), + }, + ]); + expect(res).toEqual(expected); + }); +}); diff --git a/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts b/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts index 77676ac9a6373..2a5f1f1261cb3 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts @@ -26,12 +26,12 @@ export const fetchChunk: ChunkFetcher = async ( searchAfter: any, size: number ): Promise => { - const { monitorIds, checkGroups, searchAfter: foundSearchAfter } = await findPotentialMatches( + const { monitorIds, searchAfter: foundSearchAfter } = await findPotentialMatches( queryContext, searchAfter, size ); - const matching = await refinePotentialMatches(queryContext, monitorIds, checkGroups); + const matching = await refinePotentialMatches(queryContext, monitorIds); return { monitorGroups: matching, diff --git a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts index a3e7324086073..ac4ff91230b95 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts @@ -8,12 +8,8 @@ import { get, set } from 'lodash'; import { CursorDirection } from '../../../../common/runtime_types'; import { QueryContext } from './query_context'; -// This is the first phase of the query. In it, we find the most recent check groups that matched the given query. -// Note that these check groups may not be the most recent groups for the matching monitor ID! We'll filter those /** - * This is the first phase of the query. In it, we find the most recent check groups that matched the given query. - * Note that these check groups may not be the most recent groups for the matching monitor ID. They'll be filtered - * out in the next phase. + * This is the first phase of the query. In it, we find all monitor IDs that have ever matched the given filters. * @param queryContext the data and resources needed to perform the query * @param searchAfter indicates where Elasticsearch should continue querying on subsequent requests, if at all * @param size the minimum size of the matches to chunk @@ -24,29 +20,14 @@ export const findPotentialMatches = async ( size: number ) => { const queryResult = await query(queryContext, searchAfter, size); - const checkGroups = new Set(); const monitorIds: string[] = []; get(queryResult, 'aggregations.monitors.buckets', []).forEach((b: any) => { const monitorId = b.key.monitor_id; monitorIds.push(monitorId); - - // Doc count can be zero if status filter optimization does not match - if (b.doc_count > 0) { - // Here we grab the most recent 2 check groups per location and add them to the list. - // Why 2? Because the most recent one may be a partial result from mode: all, and hence not match a summary doc. - b.locations.buckets.forEach((lb: any) => { - lb.ips.buckets.forEach((ib: any) => { - ib.top.hits.hits.forEach((h: any) => { - checkGroups.add(h._source.monitor.check_group); - }); - }); - }); - } }); return { monitorIds, - checkGroups, searchAfter: queryResult.aggregations?.monitors?.after_key, }; }; @@ -89,29 +70,6 @@ const queryBody = async (queryContext: QueryContext, searchAfter: any, size: num }, ], }, - aggs: { - // Here we grab the most recent 2 check groups per location. - // Why 2? Because the most recent one may not be for a summary, it may be incomplete. - locations: { - terms: { field: 'observer.geo.name', missing: '__missing__' }, - aggs: { - ips: { - terms: { field: 'monitor.ip', missing: '0.0.0.0' }, - aggs: { - top: { - top_hits: { - sort: [{ '@timestamp': 'desc' }], - _source: { - includes: ['monitor.check_group', '@timestamp'], - }, - size: 2, - }, - }, - }, - }, - }, - }, - }, }, }, }; diff --git a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts index e5e3de322cbc7..2f54f3f6dd689 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts @@ -18,18 +18,14 @@ import { MonitorGroups, MonitorLocCheckGroup } from './fetch_page'; // check groups for their associated monitor IDs. If not, it discards the result. export const refinePotentialMatches = async ( queryContext: QueryContext, - potentialMatchMonitorIDs: string[], - potentialMatchCheckGroups: Set + potentialMatchMonitorIDs: string[] ): Promise => { if (potentialMatchMonitorIDs.length === 0) { return []; } - const recentGroupsMatchingStatus = await fullyMatchingIds( - queryContext, - potentialMatchMonitorIDs, - potentialMatchCheckGroups - ); + const queryResult = await query(queryContext, potentialMatchMonitorIDs); + const recentGroupsMatchingStatus = await fullyMatchingIds(queryResult, queryContext.statusFilter); // Return the monitor groups filtering out potential matches that weren't current const matches: MonitorGroups[] = potentialMatchMonitorIDs @@ -49,27 +45,35 @@ export const refinePotentialMatches = async ( return matches; }; -const fullyMatchingIds = async ( - queryContext: QueryContext, - potentialMatchMonitorIDs: string[], - potentialMatchCheckGroups: Set -) => { - const mostRecentQueryResult = await mostRecentCheckGroups(queryContext, potentialMatchMonitorIDs); - +export const fullyMatchingIds = (queryResult: any, statusFilter?: string) => { const matching = new Map(); - MonitorLoop: for (const monBucket of mostRecentQueryResult.aggregations.monitor.buckets) { + MonitorLoop: for (const monBucket of queryResult.aggregations.monitor.buckets) { const monitorId: string = monBucket.key; const groups: MonitorLocCheckGroup[] = []; + // Did at least one location match? + let matched = false; for (const locBucket of monBucket.location.buckets) { const location = locBucket.key; - const topSource = locBucket.top.hits.hits[0]._source; - const checkGroup = topSource.monitor.check_group; - const status = topSource.summary.down > 0 ? 'down' : 'up'; + const latestSource = locBucket.summaries.latest.hits.hits[0]._source; + const latestStillMatchingSource = locBucket.latest_matching.top.hits.hits[0]?._source; + // If the most recent document still matches the most recent document matching the current filters + // we can include this in the result + // + // We just check if the timestamp is greater. Note this may match an incomplete check group + // that has not yet sent a summary doc + if ( + latestStillMatchingSource && + latestStillMatchingSource['@timestamp'] >= latestSource['@timestamp'] + ) { + matched = true; + } + const checkGroup = latestSource.monitor.check_group; + const status = latestSource.summary.down > 0 ? 'down' : 'up'; // This monitor doesn't match, so just skip ahead and don't add it to the output // Only skip in case of up statusFilter, for a monitor to be up, all checks should be up - if (queryContext?.statusFilter === 'up' && queryContext.statusFilter !== status) { + if (statusFilter === 'up' && statusFilter !== status) { continue MonitorLoop; } @@ -78,12 +82,12 @@ const fullyMatchingIds = async ( location, checkGroup, status, - summaryTimestamp: topSource['@timestamp'], + summaryTimestamp: new Date(latestSource['@timestamp']), }); } - // We only truly match the monitor if one of the most recent check groups was found in the potential matches phase - if (groups.some((g) => potentialMatchCheckGroups.has(g.checkGroup))) { + // If one location matched, include data from all locations in the result set + if (matched) { matching.set(monitorId, groups); } } @@ -91,7 +95,7 @@ const fullyMatchingIds = async ( return matching; }; -export const mostRecentCheckGroups = async ( +export const query = async ( queryContext: QueryContext, potentialMatchMonitorIDs: string[] ): Promise => { @@ -104,8 +108,6 @@ export const mostRecentCheckGroups = async ( filter: [ await queryContext.dateRangeFilter(), { terms: { 'monitor.id': potentialMatchMonitorIDs } }, - // only match summary docs because we only want the latest *complete* check group. - { exists: { field: 'summary' } }, ], }, }, @@ -116,13 +118,39 @@ export const mostRecentCheckGroups = async ( location: { terms: { field: 'observer.geo.name', missing: 'N/A', size: 100 }, aggs: { - top: { - top_hits: { - sort: [{ '@timestamp': 'desc' }], - _source: { - includes: ['monitor.check_group', '@timestamp', 'summary.up', 'summary.down'], + summaries: { + // only match summary docs because we only want the latest *complete* check group. + filter: { exists: { field: 'summary' } }, + aggs: { + latest: { + top_hits: { + sort: [{ '@timestamp': 'desc' }], + _source: { + includes: [ + 'monitor.check_group', + '@timestamp', + 'summary.up', + 'summary.down', + ], + }, + size: 1, + }, + }, + }, + }, + // We want to find the latest check group, even if it's not part of a summary + latest_matching: { + filter: queryContext.filterClause || { match_all: {} }, + aggs: { + top: { + top_hits: { + sort: [{ '@timestamp': 'desc' }], + _source: { + includes: ['monitor.check_group', '@timestamp'], + }, + size: 1, + }, }, - size: 1, }, }, }, From 696d71e13a436b536b518a3e3ff097c33596417c Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Tue, 9 Jun 2020 16:37:03 -0400 Subject: [PATCH 59/91] [ML] DF Analytics: Creation wizard part 2 (#68462) * Add ability to clone job * remove deprecated creation form code * ensure excludes cloned correctly and update clone action jest test * remove unused translations * update helper function name --- .../data_frame_analytics/_index.scss | 2 - .../analysis_fields_table.tsx | 2 +- .../configuration_step_form.tsx | 38 +- .../form_options_validation.ts | 2 +- .../supported_fields_message.tsx | 5 +- .../create_analytics_advanced_editor.tsx | 7 +- .../create_analytics_advanced_editor/index.ts | 0 .../components/create_step/create_step.tsx | 13 +- .../components/shared}/index.ts | 2 +- .../components/shared}/messages.tsx | 2 +- .../pages/analytics_creation/page.tsx | 54 +- .../analytics_list/action_clone.test.ts | 38 +- .../analytics_list/action_clone.tsx | 74 +- .../components/analytics_list/actions.tsx | 14 +- .../analytics_list/analytics_list.tsx | 7 - .../_create_analytics_flyout.scss | 3 - .../create_analytics_flyout/_index.scss | 1 - .../create_analytics_flyout.test.tsx | 42 - .../create_analytics_flyout.tsx | 108 --- .../create_analytics_flyout/index.ts | 7 - .../create_analytics_flyout_wrapper.tsx | 28 - .../create_analytics_flyout_wrapper/index.ts | 7 - .../_create_analytics_form.scss | 31 - .../create_analytics_form/_index.scss | 1 - .../create_analytics_form.test.tsx | 69 -- .../create_analytics_form.tsx | 850 ------------------ .../create_analytics_form/job_description.tsx | 37 - .../create_analytics_form/job_type.tsx | 80 -- .../use_create_analytics_form/actions.ts | 7 - .../use_create_analytics_form/reducer.test.ts | 15 - .../use_create_analytics_form/reducer.ts | 12 - .../use_create_analytics_form/state.test.ts | 54 +- .../hooks/use_create_analytics_form/state.ts | 27 +- .../use_create_analytics_form.test.tsx | 28 +- .../use_create_analytics_form.ts | 21 - .../analytics_job_creation.tsx | 7 +- .../translations/translations/ja-JP.json | 17 - .../translations/translations/zh-CN.json | 17 - 38 files changed, 236 insertions(+), 1493 deletions(-) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management/components/create_analytics_form => analytics_creation/components/configuration_step}/form_options_validation.ts (93%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management => analytics_creation}/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx (95%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management => analytics_creation}/components/create_analytics_advanced_editor/index.ts (100%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management/components/create_analytics_form => analytics_creation/components/shared}/index.ts (79%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management/components/create_analytics_form => analytics_creation/components/shared}/messages.tsx (92%) delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss index 5508c021d3313..140593cb17f6e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss @@ -1,5 +1,3 @@ @import 'pages/analytics_exploration/components/regression_exploration/index'; @import 'pages/analytics_management/components/analytics_list/index'; -@import 'pages/analytics_management/components/create_analytics_form/index'; -@import 'pages/analytics_management/components/create_analytics_flyout/index'; @import 'pages/analytics_management/components/create_analytics_button/index'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx index ad540285e49f0..09aea596d81e9 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx @@ -85,7 +85,7 @@ export const MemoizedAnalysisFieldsTable: FC<{ if (excludes.length > 0) { setCurrentSelection(excludes); } - }, []); + }, [tableItems]); // Only set form state on unmount to prevent re-renders due to props changing if exludes was updated on each selection useEffect(() => { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index 9446dfd4ed525..e63756686a4ba 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -20,13 +20,13 @@ import { TRAINING_PERCENT_MAX, } from '../../../../common/analytics'; import { CreateAnalyticsStepProps } from '../../../analytics_management/hooks/use_create_analytics_form'; -import { Messages } from '../../../analytics_management/components/create_analytics_form/messages'; +import { Messages } from '../shared'; import { DEFAULT_MODEL_MEMORY_LIMIT, getJobConfigFromFormState, State, } from '../../../analytics_management/hooks/use_create_analytics_form/state'; -import { shouldAddAsDepVarOption } from '../../../analytics_management/components/create_analytics_form/form_options_validation'; +import { shouldAddAsDepVarOption } from './form_options_validation'; import { ml } from '../../../../../services/ml_api_service'; import { getToastNotifications } from '../../../../../util/dependency_cache'; @@ -56,7 +56,7 @@ export const ConfigurationStepForm: FC = ({ const { currentSavedSearch, currentIndexPattern } = mlContext; const { savedSearchQuery, savedSearchQueryStr } = useSavedSearch(); - const { initiateWizard, setEstimatedModelMemoryLimit, setFormState } = actions; + const { setEstimatedModelMemoryLimit, setFormState } = actions; const { estimatedModelMemoryLimit, form, isJobCreated, requestMessages } = state; const firstUpdate = useRef(true); const { @@ -75,9 +75,12 @@ export const ConfigurationStepForm: FC = ({ modelMemoryLimit, previousJobType, requiredFieldsError, + sourceIndex, trainingPercent, } = form; + const toastNotifications = getToastNotifications(); + const setJobConfigQuery = ({ query, queryString }: { query: any; queryString: string }) => { setFormState({ jobConfigQuery: query, jobConfigQueryString: queryString }); }; @@ -90,7 +93,7 @@ export const ConfigurationStepForm: FC = ({ const indexPreviewProps = { ...indexData, dataTestSubj: 'mlAnalyticsCreationDataGrid', - toastNotifications: getToastNotifications(), + toastNotifications, }; const isJobTypeWithDepVar = @@ -209,7 +212,8 @@ export const ConfigurationStepForm: FC = ({ }); } } catch (e) { - let errorMessage; + let maxDistinctValuesErrorMessage; + if ( jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION && e.body && @@ -218,7 +222,23 @@ export const ConfigurationStepForm: FC = ({ (e.body.message.includes('must have at most') || e.body.message.includes('must have at least')) ) { - errorMessage = e.body.message; + maxDistinctValuesErrorMessage = e.body.message; + } + + if ( + e.body && + e.body.message !== undefined && + e.body.message.includes('status_exception') && + e.body.message.includes('Unable to estimate memory usage as no documents') + ) { + toastNotifications.addWarning( + i18n.translate('xpack.ml.dataframe.analytics.create.allDocsMissingFieldsErrorMessage', { + defaultMessage: `Unable to estimate memory usage. There are mapped fields for source index [{index}] that do not exist in any indexed documents. You will have to switch to the JSON editor for explicit field selection and include only fields that exist in indexed documents.`, + values: { + index: sourceIndex, + }, + }) + ); } const fallbackModelMemoryLimit = jobType !== undefined @@ -227,17 +247,13 @@ export const ConfigurationStepForm: FC = ({ setEstimatedModelMemoryLimit(fallbackModelMemoryLimit); setFormState({ fieldOptionsFetchFail: true, - maxDistinctValuesError: errorMessage, + maxDistinctValuesError: maxDistinctValuesErrorMessage, loadingFieldOptions: false, ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: fallbackModelMemoryLimit } : {}), }); } }, 300); - useEffect(() => { - initiateWizard(); - }, []); - useEffect(() => { setFormState({ sourceIndex: currentIndexPattern.title }); }, []); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/form_options_validation.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/form_options_validation.ts similarity index 93% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/form_options_validation.ts rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/form_options_validation.ts index 0579283c97d61..bf3ab01549139 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/form_options_validation.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/form_options_validation.ts @@ -7,7 +7,7 @@ import { ES_FIELD_TYPES } from '../../../../../../../../../../src/plugins/data/public'; import { Field, EVENT_RATE_FIELD_ID } from '../../../../../../../common/types/fields'; import { ANALYSIS_CONFIG_TYPE } from '../../../../common/analytics'; -import { AnalyticsJobType } from '../../hooks/use_create_analytics_form/state'; +import { AnalyticsJobType } from '../../../analytics_management/hooks/use_create_analytics_form/state'; import { BASIC_NUMERICAL_TYPES, EXTENDED_NUMERICAL_TYPES } from '../../../../common/fields'; export const CATEGORICAL_TYPES = new Set(['ip', 'keyword']); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx index fe13cc1d6edfc..0a4ba67831818 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx @@ -12,10 +12,7 @@ import { AnalyticsJobType } from '../../../analytics_management/hooks/use_create import { ANALYSIS_CONFIG_TYPE } from '../../../../common/analytics'; import { Field, EVENT_RATE_FIELD_ID } from '../../../../../../../common/types/fields'; import { BASIC_NUMERICAL_TYPES, EXTENDED_NUMERICAL_TYPES } from '../../../../common/fields'; -import { - OMIT_FIELDS, - CATEGORICAL_TYPES, -} from '../../../analytics_management/components/create_analytics_form/form_options_validation'; +import { OMIT_FIELDS, CATEGORICAL_TYPES } from './form_options_validation'; import { ES_FIELD_TYPES } from '../../../../../../../../../../src/plugins/data/public'; import { newJobCapsService } from '../../../../../services/new_job_capabilities_service'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx similarity index 95% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx index 17b905cab135b..a35a314bec985 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx @@ -22,9 +22,9 @@ import { XJsonMode } from '../../../../../../../shared_imports'; const xJsonMode = new XJsonMode(); -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -import { CreateStep } from '../../../analytics_creation/components/create_step'; -import { ANALYTICS_STEPS } from '../../../analytics_creation/page'; +import { CreateAnalyticsFormProps } from '../../../analytics_management/hooks/use_create_analytics_form'; +import { CreateStep } from '../create_step'; +import { ANALYTICS_STEPS } from '../../page'; export const CreateAnalyticsAdvancedEditor: FC = (props) => { const { actions, state } = props; @@ -125,7 +125,6 @@ export const CreateAnalyticsAdvancedEditor: FC = (prop onChange={onChange} setOptions={{ fontSize: '12px', - maxLines: 20, }} theme="textmate" aria-label={i18n.translate( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/index.ts similarity index 100% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/index.ts rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/index.ts diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx index 2dda5f5d819b7..8d51848a25f50 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx @@ -16,7 +16,7 @@ import { import { i18n } from '@kbn/i18n'; import { CreateAnalyticsFormProps } from '../../../analytics_management/hooks/use_create_analytics_form'; -import { Messages } from '../../../analytics_management/components/create_analytics_form/messages'; +import { Messages } from '../shared'; import { ANALYTICS_STEPS } from '../../page'; import { BackToListPanel } from '../back_to_list_panel'; @@ -26,14 +26,7 @@ interface Props extends CreateAnalyticsFormProps { export const CreateStep: FC = ({ actions, state, step }) => { const { createAnalyticsJob, startAnalyticsJob } = actions; - const { - isAdvancedEditorValidJson, - isJobCreated, - isJobStarted, - isModalButtonDisabled, - isValid, - requestMessages, - } = state; + const { isAdvancedEditorValidJson, isJobCreated, isJobStarted, isValid, requestMessages } = state; const [checked, setChecked] = useState(true); @@ -75,7 +68,7 @@ export const CreateStep: FC = ({ actions, state, step }) => { { +interface Props { + jobId?: DataFrameAnalyticsId; +} + +export const Page: FC = ({ jobId }) => { const [currentStep, setCurrentStep] = useState(ANALYTICS_STEPS.CONFIGURATION); const [activatedSteps, setActivatedSteps] = useState([true, false, false, false]); @@ -44,23 +50,36 @@ export const Page: FC = () => { const createAnalyticsForm = useCreateAnalyticsForm(); const { isAdvancedEditorEnabled } = createAnalyticsForm.state; const { jobType } = createAnalyticsForm.state.form; - const { switchToAdvancedEditor } = createAnalyticsForm.actions; + const { initiateWizard, setJobClone, switchToAdvancedEditor } = createAnalyticsForm.actions; useEffect(() => { - if (activatedSteps[currentStep] === false) { - activatedSteps.splice(currentStep, 1, true); - setActivatedSteps(activatedSteps); - } - }, [currentStep]); + initiateWizard(); - useEffect(() => { if (currentIndexPattern) { (async function () { await newJobCapsService.initializeFromIndexPattern(currentIndexPattern, false, false); + + if (jobId !== undefined) { + const analyticsConfigs = await ml.dataFrameAnalytics.getDataFrameAnalytics(jobId); + if ( + Array.isArray(analyticsConfigs.data_frame_analytics) && + analyticsConfigs.data_frame_analytics.length > 0 + ) { + const clonedJobConfig: any = analyticsConfigs.data_frame_analytics[0]; + await setJobClone(clonedJobConfig); + } + } })(); } }, []); + useEffect(() => { + if (activatedSteps[currentStep] === false) { + activatedSteps.splice(currentStep, 1, true); + setActivatedSteps(activatedSteps); + } + }, [currentStep]); + const analyticsWizardSteps = [ { title: i18n.translate('xpack.ml.dataframe.analytics.creation.configurationStepTitle', { @@ -127,10 +146,19 @@ export const Page: FC = () => {

- + {jobId === undefined && ( + + )} + {jobId !== undefined && ( + + )}

diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts index 9221f8c500326..01d92d8e192c1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts @@ -140,8 +140,8 @@ describe('Analytics job clone action', () => { expect(isAdvancedConfig(advancedClassificationJob)).toBe(true); }); - test('should detect advanced outlier_detection job', () => { - const advancedOutlierDetectionJob = { + test('should detect advanced regression job', () => { + const advancedRegressionJob = { description: "Outlier detection job with 'glass' dataset", source: { index: ['glass_withoutdupl_norm'], @@ -155,10 +155,8 @@ describe('Analytics job clone action', () => { results_field: 'ml', }, analysis: { - outlier_detection: { - compute_feature_influence: false, - outlier_fraction: 0.05, - standardization_enabled: true, + regression: { + loss_function: 'msle', }, }, analyzed_fields: { @@ -168,7 +166,7 @@ describe('Analytics job clone action', () => { model_memory_limit: '1mb', allow_lazy_start: false, }; - expect(isAdvancedConfig(advancedOutlierDetectionJob)).toBe(true); + expect(isAdvancedConfig(advancedRegressionJob)).toBe(true); }); test('should detect a custom query', () => { @@ -207,32 +205,6 @@ describe('Analytics job clone action', () => { expect(isAdvancedConfig(advancedRegressionJob)).toBe(true); }); - test('should detect custom analysis settings', () => { - const config = { - description: "Classification clone with 'bank-marketing' dataset", - source: { - index: 'bank-marketing', - }, - dest: { - index: 'bank_classification4', - }, - analyzed_fields: { - excludes: [], - }, - analysis: { - classification: { - dependent_variable: 'y', - training_percent: 71, - max_trees: 1500, - num_top_feature_importance_values: 4, - }, - }, - model_memory_limit: '400mb', - }; - - expect(isAdvancedConfig(config)).toBe(true); - }); - test('should detect as advanced if the prop is unknown', () => { const config = { description: "Classification clone with 'bank-marketing' dataset", diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx index cfb11856670c4..a1f0448b819d1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx @@ -8,10 +8,12 @@ import { EuiButtonEmpty } from '@elastic/eui'; import React, { FC } from 'react'; import { isEqual, cloneDeep } from 'lodash'; import { i18n } from '@kbn/i18n'; +import { IIndexPattern } from 'src/plugins/data/common'; import { DeepReadonly } from '../../../../../../../common/types/common'; import { DataFrameAnalyticsConfig, isOutlierAnalysis } from '../../../../common'; import { isClassificationAnalysis, isRegressionAnalysis } from '../../../../common/analytics'; import { DEFAULT_RESULTS_FIELD } from '../../../../common/constants'; +import { useMlKibana } from '../../../../../contexts/kibana'; import { CreateAnalyticsFormProps, DEFAULT_NUM_TOP_FEATURE_IMPORTANCE_VALUES, @@ -19,6 +21,7 @@ import { import { State } from '../../hooks/use_create_analytics_form/state'; import { DataFrameAnalyticsListRow } from './common'; import { checkPermission } from '../../../../../capabilities/check_capabilities'; +import { extractErrorMessage } from '../../../../../util/error_utils'; interface PropDefinition { /** @@ -74,31 +77,39 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo }, eta: { optional: true, + formKey: 'eta', }, feature_bag_fraction: { optional: true, + formKey: 'featureBagFraction', }, max_trees: { optional: true, + formKey: 'maxTrees', }, gamma: { optional: true, + formKey: 'gamma', }, lambda: { optional: true, + formKey: 'lambda', }, num_top_classes: { optional: true, defaultValue: 2, + formKey: 'numTopClasses', }, prediction_field_name: { optional: true, defaultValue: `${config.analysis.classification.dependent_variable}_prediction`, + formKey: 'predictionFieldName', }, randomize_seed: { optional: true, // By default it is randomly generated ignore: true, + formKey: 'randomizeSeed', }, num_top_feature_importance_values: { optional: true, @@ -118,23 +129,29 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo standardization_enabled: { defaultValue: true, optional: true, + formKey: 'standardizationEnabled', }, compute_feature_influence: { defaultValue: true, optional: true, + formKey: 'computeFeatureInfluence', }, outlier_fraction: { defaultValue: 0.05, optional: true, + formKey: 'outlierFraction', }, feature_influence_threshold: { optional: true, + formKey: 'featureInfluenceThreshold', }, method: { optional: true, + formKey: 'method', }, n_neighbors: { optional: true, + formKey: 'nNeighbors', }, }, } @@ -152,22 +169,28 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo }, eta: { optional: true, + formKey: 'eta', }, feature_bag_fraction: { optional: true, + formKey: 'featureBagFraction', }, max_trees: { optional: true, + formKey: 'maxTrees', }, gamma: { optional: true, + formKey: 'gamma', }, lambda: { optional: true, + formKey: 'lambda', }, prediction_field_name: { optional: true, defaultValue: `${config.analysis.regression.dependent_variable}_prediction`, + formKey: 'predictionFieldName', }, num_top_feature_importance_values: { optional: true, @@ -178,11 +201,15 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo optional: true, // By default it is randomly generated ignore: true, + formKey: 'randomizeSeed', }, loss_function: { optional: true, defaultValue: 'mse', }, + loss_function_parameter: { + optional: true, + }, }, } : {}), @@ -332,9 +359,52 @@ export const CloneAction: FC = ({ createAnalyticsForm, item }) const buttonText = i18n.translate('xpack.ml.dataframe.analyticsList.cloneJobButtonLabel', { defaultMessage: 'Clone job', }); - const { actions } = createAnalyticsForm; + + const { notifications, savedObjects } = useMlKibana().services; + const savedObjectsClient = savedObjects.client; + const onClick = async () => { - await actions.setJobClone(item.config); + const sourceIndex = Array.isArray(item.config.source.index) + ? item.config.source.index[0] + : item.config.source.index; + let sourceIndexId; + + try { + const response = await savedObjectsClient.find({ + type: 'index-pattern', + perPage: 10, + search: `"${sourceIndex}"`, + searchFields: ['title'], + fields: ['title'], + }); + + const ip = response.savedObjects.find( + (obj) => obj.attributes.title.toLowerCase() === sourceIndex.toLowerCase() + ); + if (ip !== undefined) { + sourceIndexId = ip.id; + } + } catch (e) { + const { toasts } = notifications; + const error = extractErrorMessage(e); + + toasts.addDanger( + i18n.translate( + 'xpack.ml.dataframe.analyticsList.fetchSourceIndexPatternForCloneErrorMessage', + { + defaultMessage: + 'An error occurred checking if index pattern {indexPattern} exists: {error}', + values: { indexPattern: sourceIndex, error }, + } + ) + ); + } + + if (sourceIndexId) { + window.location.href = `ml#/data_frame_analytics/new_job?index=${encodeURIComponent( + sourceIndexId + )}&jobId=${item.config.id}`; + } }; return ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx index 295a3988e1b58..72514c91ff58b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiToolTip } from '@elastic/eui'; -// import { DeepReadonly } from '../../../../../../../common/types/common'; +import { DeepReadonly } from '../../../../../../../common/types/common'; import { checkPermission, @@ -21,7 +21,7 @@ import { isClassificationAnalysis, } from '../../../../common/analytics'; import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -// import { CloneAction } from './action_clone'; +import { CloneAction } from './action_clone'; import { getResultsUrl, isDataFrameAnalyticsRunning, DataFrameAnalyticsListRow } from './common'; import { stopAnalytics } from '../../services/analytics_service'; @@ -106,10 +106,10 @@ export const getActions = (createAnalyticsForm: CreateAnalyticsFormProps) => { return ; }, }, - // { - // render: (item: DeepReadonly) => { - // return ; - // }, - // }, + { + render: (item: DeepReadonly) => { + return ; + }, + }, ]; }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx index bb012a2190859..25e3a2808fc61 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx @@ -51,7 +51,6 @@ import { AnalyticStatsBarStats, StatsBar } from '../../../../../components/stats import { RefreshAnalyticsListButton } from '../refresh_analytics_list_button'; import { CreateAnalyticsButton } from '../create_analytics_button'; import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -import { CreateAnalyticsFlyoutWrapper } from '../create_analytics_flyout_wrapper'; import { getSelectedJobIdFromUrl } from '../../../../../jobs/jobs_list/components/utils'; import { SourceSelection } from '../source_selection'; @@ -286,9 +285,6 @@ export const DataFrameAnalyticsList: FC = ({ } data-test-subj="mlNoDataFrameAnalyticsFound" /> - {!isManagementTable && createAnalyticsForm && ( - - )} {isSourceIndexModalVisible === true && ( setIsSourceIndexModalVisible(false)} /> )} @@ -440,9 +436,6 @@ export const DataFrameAnalyticsList: FC = ({ />
- {!isManagementTable && createAnalyticsForm?.state.isModalVisible && ( - - )} {isSourceIndexModalVisible === true && ( setIsSourceIndexModalVisible(false)} /> )} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss deleted file mode 100644 index e6c6ffafc446a..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss +++ /dev/null @@ -1,3 +0,0 @@ -.mlAnalyticsCreateFlyout__footerButton { - float: right; -} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss deleted file mode 100644 index 668b35f8370d2..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'create_analytics_flyout'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx deleted file mode 100644 index dc91c955184b0..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { mount } from 'enzyme'; -import React from 'react'; -import { mountHook } from 'test_utils/enzyme_helpers'; - -import { CreateAnalyticsFlyout } from './create_analytics_flyout'; - -import { MlContext } from '../../../../../contexts/ml'; -import { kibanaContextValueMock } from '../../../../../contexts/ml/__mocks__/kibana_context_value'; - -import { useCreateAnalyticsForm } from '../../hooks/use_create_analytics_form'; - -const getMountedHook = () => - mountHook( - () => useCreateAnalyticsForm(), - ({ children }) => ( - {children} - ) - ); - -// workaround to make React.memo() work with enzyme -jest.mock('react', () => { - const r = jest.requireActual('react'); - return { ...r, memo: (x: any) => x }; -}); - -describe('Data Frame Analytics: ', () => { - test('Minimal initialization', () => { - const { getLastHookValue } = getMountedHook(); - const props = getLastHookValue(); - const wrapper = mount(); - - expect(wrapper.find('[data-test-subj="mlDataFrameAnalyticsFlyoutHeaderTitle"]').text()).toBe( - 'Create analytics job' - ); - }); -}); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx deleted file mode 100644 index b0f13e398cc50..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { FC } from 'react'; - -import { - EuiButton, - EuiButtonEmpty, - EuiFlyout, - EuiFlyoutBody, - EuiFlyoutHeader, - EuiFlyoutFooter, - EuiTitle, -} from '@elastic/eui'; - -import { i18n } from '@kbn/i18n'; - -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; - -export const CreateAnalyticsFlyout: FC = ({ - actions, - children, - state, -}) => { - const { closeModal, createAnalyticsJob, startAnalyticsJob } = actions; - const { - isJobCreated, - isJobStarted, - isModalButtonDisabled, - isValid, - isAdvancedEditorValidJson, - cloneJob, - } = state; - - const headerText = !!cloneJob - ? i18n.translate('xpack.ml.dataframe.analytics.clone.flyoutHeaderTitle', { - defaultMessage: 'Clone job from {job_id}', - values: { job_id: cloneJob.id }, - }) - : i18n.translate('xpack.ml.dataframe.analytics.create.flyoutHeaderTitle', { - defaultMessage: 'Create analytics job', - }); - - return ( - - - -

{headerText}

-
-
- {children} - - {(!isJobCreated || !isJobStarted) && ( - - {isJobCreated === true - ? i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCloseButton', { - defaultMessage: 'Close', - }) - : i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCancelButton', { - defaultMessage: 'Cancel', - })} - - )} - - {!isJobCreated && !isJobStarted && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCreateButton', { - defaultMessage: 'Create', - })} - - )} - {isJobCreated && !isJobStarted && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.flyoutStartButton', { - defaultMessage: 'Start', - })} - - )} - {isJobCreated && isJobStarted && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCloseButton', { - defaultMessage: 'Close', - })} - - )} - -
- ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts deleted file mode 100644 index 3a25359373aa6..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { CreateAnalyticsFlyout } from './create_analytics_flyout'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx deleted file mode 100644 index 2f3c38b6ffe4e..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { FC } from 'react'; - -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; - -import { CreateAnalyticsAdvancedEditor } from '../create_analytics_advanced_editor'; -import { CreateAnalyticsForm } from '../create_analytics_form'; -import { CreateAnalyticsFlyout } from '../create_analytics_flyout'; - -export const CreateAnalyticsFlyoutWrapper: FC = (props) => { - const { isAdvancedEditorEnabled, isModalVisible } = props.state; - - if (isModalVisible === false) { - return null; - } - - return ( - - {isAdvancedEditorEnabled === false && } - {isAdvancedEditorEnabled === true && } - - ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts deleted file mode 100644 index c8e7a958f6d42..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { CreateAnalyticsFlyoutWrapper } from './create_analytics_flyout_wrapper'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss deleted file mode 100644 index 9b4559f9e2cb2..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss +++ /dev/null @@ -1,31 +0,0 @@ -/* - The job creation form displayed in the modal adapts its height dynamically - if the content changes. If a form element changes to show/hide error messages, - this results in a changing height of the modal. If you type quickly e.g. - in the job ID input field and type chars which are invalid only for example - at the end of the string, this will result in an unwanted height toggling - effect. The following CSS avoids this by 1) delaying the visilibity of the - error message by 500ms and 2) animating the height and opacity to create - a fade-in effect after that so the modal grows smoothly and doesn't - toggle its height. - */ - -@keyframes mlDelayedShow { - 0%, 50% { - max-height: 0; - opacity: 0; - padding: 0; - visibility: hidden; - } - 100% { - max-height: 300px; - opacity: 1; - padding-top: $euiSizeS; - } -} - -.mlDataFrameAnalyticsCreateForm { - .euiFormErrorText { - animation: mlDelayedShow 1s; - } -} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss deleted file mode 100644 index 66fa2c02e60f5..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'create_analytics_form'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx deleted file mode 100644 index 85cd70912b41f..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { mount } from 'enzyme'; -import React from 'react'; -import { mountHook } from 'test_utils/enzyme_helpers'; - -import { CreateAnalyticsForm } from './create_analytics_form'; - -import { MlContext } from '../../../../../contexts/ml'; -import { kibanaContextValueMock } from '../../../../../contexts/ml/__mocks__/kibana_context_value'; - -import { useCreateAnalyticsForm } from '../../hooks/use_create_analytics_form'; - -const getMountedHook = () => - mountHook( - () => useCreateAnalyticsForm(), - ({ children }) => ( - {children} - ) - ); - -// workaround to make React.memo() work with enzyme -jest.mock('react', () => { - const r = jest.requireActual('react'); - return { ...r, memo: (x: any) => x }; -}); - -jest.mock('../../../../../contexts/kibana', () => ({ - useMlKibana: () => { - return { - services: { - docLinks: () => ({ - ELASTIC_WEBSITE_URL: 'https://www.elastic.co/', - DOC_LINK_VERSION: 'jest-metadata-mock-branch', - }), - }, - }; - }, -})); - -describe('Data Frame Analytics: ', () => { - test('Minimal initialization', () => { - const { getLastHookValue } = getMountedHook(); - const props = getLastHookValue(); - const wrapper = mount( - - - - ); - - const euiFormRows = wrapper.find('EuiFormRow'); - expect(euiFormRows.length).toBe(10); - - const row1 = euiFormRows.at(0); - expect(row1.find('label').text()).toBe('Job type'); - - const options = row1.find('option'); - expect(options.at(0).props().value).toBe(''); - expect(options.at(1).props().value).toBe('outlier_detection'); - expect(options.at(2).props().value).toBe('regression'); - - const row2 = euiFormRows.at(1); - expect(row2.find('EuiSwitch').text()).toBe('Enable advanced editor'); - }); -}); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx deleted file mode 100644 index 64fe736e67b17..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx +++ /dev/null @@ -1,850 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Fragment, FC, useEffect, useMemo, useRef } from 'react'; - -import { - EuiComboBox, - EuiComboBoxOptionOption, - EuiForm, - EuiFieldNumber, - EuiFieldText, - EuiFormRow, - EuiLink, - EuiRange, - EuiSwitch, -} from '@elastic/eui'; -import { debounce } from 'lodash'; - -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; - -import { useMlKibana } from '../../../../../contexts/kibana'; -import { ml } from '../../../../../services/ml_api_service'; -import { newJobCapsService } from '../../../../../services/new_job_capabilities_service'; -import { useMlContext } from '../../../../../contexts/ml'; -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -import { - DEFAULT_MODEL_MEMORY_LIMIT, - getJobConfigFromFormState, - State, -} from '../../hooks/use_create_analytics_form/state'; -import { JOB_ID_MAX_LENGTH } from '../../../../../../../common/constants/validation'; -import { Messages } from './messages'; -import { JobType } from './job_type'; -import { JobDescriptionInput } from './job_description'; -import { getModelMemoryLimitErrors } from '../../hooks/use_create_analytics_form/reducer'; -import { IndexPattern, indexPatterns } from '../../../../../../../../../../src/plugins/data/public'; -import { - ANALYSIS_CONFIG_TYPE, - DfAnalyticsExplainResponse, - FieldSelectionItem, - NUM_TOP_FEATURE_IMPORTANCE_VALUES_MIN, - TRAINING_PERCENT_MIN, - TRAINING_PERCENT_MAX, -} from '../../../../common/analytics'; -import { shouldAddAsDepVarOption, OMIT_FIELDS } from './form_options_validation'; - -const requiredFieldsErrorText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.requiredFieldsErrorMessage', - { - defaultMessage: 'At least one field must be included in the analysis.', - } -); - -export const CreateAnalyticsForm: FC = ({ actions, state }) => { - const { - services: { docLinks }, - } = useMlKibana(); - const { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } = docLinks; - const { setFormState, setEstimatedModelMemoryLimit } = actions; - const mlContext = useMlContext(); - const { - estimatedModelMemoryLimit, - form, - indexPatternsMap, - isAdvancedEditorEnabled, - isJobCreated, - requestMessages, - } = state; - - const forceInput = useRef(null); - const firstUpdate = useRef(true); - - const { - createIndexPattern, - dependentVariable, - dependentVariableFetchFail, - dependentVariableOptions, - description, - destinationIndex, - destinationIndexNameEmpty, - destinationIndexNameExists, - destinationIndexNameValid, - destinationIndexPatternTitleExists, - excludes, - excludesOptions, - fieldOptionsFetchFail, - jobId, - jobIdEmpty, - jobIdExists, - jobIdValid, - jobIdInvalidMaxLength, - jobType, - loadingDepVarOptions, - loadingFieldOptions, - maxDistinctValuesError, - modelMemoryLimit, - modelMemoryLimitValidationResult, - numTopFeatureImportanceValues, - numTopFeatureImportanceValuesValid, - previousJobType, - previousSourceIndex, - requiredFieldsError, - sourceIndex, - sourceIndexNameEmpty, - sourceIndexNameValid, - sourceIndexContainsNumericalFields, - sourceIndexFieldsCheckFailed, - trainingPercent, - } = form; - const characterList = indexPatterns.ILLEGAL_CHARACTERS_VISIBLE.join(', '); - - const mmlErrors = useMemo(() => getModelMemoryLimitErrors(modelMemoryLimitValidationResult), [ - modelMemoryLimitValidationResult, - ]); - - const isJobTypeWithDepVar = - jobType === ANALYSIS_CONFIG_TYPE.REGRESSION || jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION; - - // Find out if index pattern contain numeric fields. Provides a hint in the form - // that an analytics jobs is not able to identify outliers if there are no numeric fields present. - const validateSourceIndexFields = async () => { - try { - const indexPattern: IndexPattern = await mlContext.indexPatterns.get( - indexPatternsMap[sourceIndex].value - ); - const containsNumericalFields: boolean = indexPattern.fields.some( - ({ name, type }) => !OMIT_FIELDS.includes(name) && type === 'number' - ); - - setFormState({ - sourceIndexContainsNumericalFields: containsNumericalFields, - sourceIndexFieldsCheckFailed: false, - }); - } catch (e) { - setFormState({ - sourceIndexFieldsCheckFailed: true, - }); - } - }; - - const onCreateOption = (searchValue: string, flattenedOptions: EuiComboBoxOptionOption[]) => { - const normalizedSearchValue = searchValue.trim().toLowerCase(); - - if (!normalizedSearchValue) { - return; - } - - const newOption = { - label: searchValue, - }; - - // Create the option if it doesn't exist. - if ( - !flattenedOptions.some( - (option: EuiComboBoxOptionOption) => - option.label.trim().toLowerCase() === normalizedSearchValue - ) - ) { - excludesOptions.push(newOption); - setFormState({ excludes: [...excludes, newOption.label] }); - } - }; - - const debouncedGetExplainData = debounce(async () => { - const jobTypeOrIndexChanged = - previousSourceIndex !== sourceIndex || previousJobType !== jobType; - const shouldUpdateModelMemoryLimit = !firstUpdate.current || !modelMemoryLimit; - const shouldUpdateEstimatedMml = - !firstUpdate.current || !modelMemoryLimit || estimatedModelMemoryLimit === ''; - - if (firstUpdate.current) { - firstUpdate.current = false; - } - // Reset if sourceIndex or jobType changes (jobType requires dependent_variable to be set - - // which won't be the case if switching from outlier detection) - if (jobTypeOrIndexChanged) { - setFormState({ - loadingFieldOptions: true, - }); - } - - try { - const jobConfig = getJobConfigFromFormState(form); - delete jobConfig.dest; - delete jobConfig.model_memory_limit; - const resp: DfAnalyticsExplainResponse = await ml.dataFrameAnalytics.explainDataFrameAnalytics( - jobConfig - ); - const expectedMemoryWithoutDisk = resp.memory_estimation?.expected_memory_without_disk; - - if (shouldUpdateEstimatedMml) { - setEstimatedModelMemoryLimit(expectedMemoryWithoutDisk); - } - - const fieldSelection: FieldSelectionItem[] | undefined = resp.field_selection; - - let hasRequiredFields = false; - if (fieldSelection) { - for (let i = 0; i < fieldSelection.length; i++) { - const field = fieldSelection[i]; - if (field.is_included === true && field.is_required === false) { - hasRequiredFields = true; - break; - } - } - } - - // If sourceIndex has changed load analysis field options again - if (jobTypeOrIndexChanged) { - const analyzedFieldsOptions: EuiComboBoxOptionOption[] = []; - - if (resp.field_selection) { - resp.field_selection.forEach((selectedField: FieldSelectionItem) => { - if (selectedField.is_included === true && selectedField.name !== dependentVariable) { - analyzedFieldsOptions.push({ label: selectedField.name }); - } - }); - } - - setFormState({ - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemoryWithoutDisk } : {}), - excludesOptions: analyzedFieldsOptions, - loadingFieldOptions: false, - fieldOptionsFetchFail: false, - maxDistinctValuesError: undefined, - requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, - }); - } else { - setFormState({ - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemoryWithoutDisk } : {}), - requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, - }); - } - } catch (e) { - let errorMessage; - if ( - jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION && - e.body && - e.body.message !== undefined && - e.body.message.includes('status_exception') && - e.body.message.includes('must have at most') - ) { - errorMessage = e.body.message; - } - const fallbackModelMemoryLimit = - jobType !== undefined - ? DEFAULT_MODEL_MEMORY_LIMIT[jobType] - : DEFAULT_MODEL_MEMORY_LIMIT.outlier_detection; - setEstimatedModelMemoryLimit(fallbackModelMemoryLimit); - setFormState({ - fieldOptionsFetchFail: true, - maxDistinctValuesError: errorMessage, - loadingFieldOptions: false, - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: fallbackModelMemoryLimit } : {}), - }); - } - }, 400); - - const loadDepVarOptions = async (formState: State['form']) => { - setFormState({ - loadingDepVarOptions: true, - // clear when the source index changes - maxDistinctValuesError: undefined, - sourceIndexFieldsCheckFailed: false, - sourceIndexContainsNumericalFields: true, - }); - try { - const indexPattern: IndexPattern = await mlContext.indexPatterns.get( - indexPatternsMap[sourceIndex].value - ); - - if (indexPattern !== undefined) { - const formStateUpdate: { - loadingDepVarOptions: boolean; - dependentVariableFetchFail: boolean; - dependentVariableOptions: State['form']['dependentVariableOptions']; - dependentVariable?: State['form']['dependentVariable']; - } = { - loadingDepVarOptions: false, - dependentVariableFetchFail: false, - dependentVariableOptions: [] as State['form']['dependentVariableOptions'], - }; - - await newJobCapsService.initializeFromIndexPattern(indexPattern, false, false); - // Get fields and filter for supported types for job type - const { fields } = newJobCapsService; - - let resetDependentVariable = true; - for (const field of fields) { - if (shouldAddAsDepVarOption(field, jobType)) { - formStateUpdate.dependentVariableOptions.push({ - label: field.id, - }); - - if (formState.dependentVariable === field.id) { - resetDependentVariable = false; - } - } - } - - if (resetDependentVariable) { - formStateUpdate.dependentVariable = ''; - } - - setFormState(formStateUpdate); - } - } catch (e) { - setFormState({ loadingDepVarOptions: false, dependentVariableFetchFail: true }); - } - }; - - const getSourceIndexErrorMessages = () => { - const errors = []; - if (!sourceIndexNameEmpty && !sourceIndexNameValid) { - errors.push( - - - - ); - } - - if (sourceIndexFieldsCheckFailed === true) { - errors.push( - - - - ); - } - - return errors; - }; - - const onSourceIndexChange = (selectedOptions: EuiComboBoxOptionOption[]) => { - setFormState({ - excludes: [], - excludesOptions: [], - previousSourceIndex: sourceIndex, - sourceIndex: selectedOptions[0].label || '', - requiredFieldsError: undefined, - }); - }; - - useEffect(() => { - if (isJobTypeWithDepVar && sourceIndexNameEmpty === false) { - loadDepVarOptions(form); - } - - if (jobType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION && sourceIndexNameEmpty === false) { - validateSourceIndexFields(); - } - }, [sourceIndex, jobType, sourceIndexNameEmpty]); - - useEffect(() => { - const hasBasicRequiredFields = - jobType !== undefined && sourceIndex !== '' && sourceIndexNameValid === true; - - const hasRequiredAnalysisFields = - (isJobTypeWithDepVar && dependentVariable !== '') || - jobType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION; - - if (hasBasicRequiredFields && hasRequiredAnalysisFields) { - debouncedGetExplainData(); - } - - return () => { - debouncedGetExplainData.cancel(); - }; - }, [ - jobType, - sourceIndex, - sourceIndexNameEmpty, - dependentVariable, - trainingPercent, - JSON.stringify(excludes), - ]); - - // Temp effect to close the context menu popover on Clone button click - useEffect(() => { - if (forceInput.current === null) { - return; - } - const evt = document.createEvent('MouseEvents'); - evt.initEvent('mouseup', true, true); - forceInput.current.dispatchEvent(evt); - }, []); - - const noSupportetdAnalysisFields = - excludesOptions.length === 0 && fieldOptionsFetchFail === false && !sourceIndexNameEmpty; - - return ( - - - {!isJobCreated && ( - - - - - - - { - if (input) { - forceInput.current = input; - } - }} - disabled={isJobCreated} - placeholder={i18n.translate('xpack.ml.dataframe.analytics.create.jobIdPlaceholder', { - defaultMessage: 'Job ID', - })} - value={jobId} - onChange={(e) => setFormState({ jobId: e.target.value })} - aria-label={i18n.translate( - 'xpack.ml.dataframe.analytics.create.jobIdInputAriaLabel', - { - defaultMessage: 'Choose a unique analytics job ID.', - } - )} - isInvalid={(!jobIdEmpty && !jobIdValid) || jobIdExists} - data-test-subj="mlAnalyticsCreateJobFlyoutJobIdInput" - /> - - - - - {!isJobCreated && ( - - a.label.localeCompare(b.label) - )} - selectedOptions={ - indexPatternsMap[sourceIndex] !== undefined ? [{ label: sourceIndex }] : [] - } - onChange={onSourceIndexChange} - isClearable={false} - data-test-subj="mlAnalyticsCreateJobFlyoutSourceIndexSelect" - /> - )} - {isJobCreated && ( - - )} - - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.destinationIndexInvalidError', - { - defaultMessage: 'Invalid destination index name.', - } - )} -
- - {i18n.translate( - 'xpack.ml.dataframe.stepDetailsForm.destinationIndexInvalidErrorLink', - { - defaultMessage: 'Learn more about index name limitations.', - } - )} - -
, - ] - } - > - setFormState({ destinationIndex: e.target.value })} - aria-label={i18n.translate( - 'xpack.ml.dataframe.analytics.create.destinationIndexInputAriaLabel', - { - defaultMessage: 'Choose a unique destination index name.', - } - )} - isInvalid={!destinationIndexNameEmpty && !destinationIndexNameValid} - data-test-subj="mlAnalyticsCreateJobFlyoutDestinationIndexInput" - /> - - {(jobType === ANALYSIS_CONFIG_TYPE.REGRESSION || - jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION) && ( - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.dependentVariableMaxDistictValuesError', - { - defaultMessage: 'Invalid. {message}', - values: { message: maxDistinctValuesError }, - } - )} - , - ] - : []), - ]} - > - - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.dependentVariableOptionsFetchError', - { - defaultMessage: - 'There was a problem fetching fields. Please refresh the page and try again.', - } - )} - , - ] - : []), - ]} - > - - setFormState({ - dependentVariable: selectedOptions[0].label || '', - }) - } - isClearable={false} - isInvalid={dependentVariable === ''} - data-test-subj="mlAnalyticsCreateJobFlyoutDependentVariableSelect" - /> - - - setFormState({ trainingPercent: +e.target.value })} - data-test-subj="mlAnalyticsCreateJobFlyoutTrainingPercentSlider" - /> - - {/* num_top_feature_importance_values */} - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.numTopFeatureImportanceValuesErrorText', - { - defaultMessage: - 'Invalid maximum number of feature importance values.', - } - )} - , - ] - : []), - ]} - > - setFormState({ numTopFeatureImportanceValues: +e.target.value })} - step={1} - value={numTopFeatureImportanceValues} - /> - - - )} - - - - - ({ - label: field, - }))} - onCreateOption={onCreateOption} - onChange={(selectedOptions) => - setFormState({ excludes: selectedOptions.map((option) => option.label) }) - } - isClearable={true} - data-test-subj="mlAnalyticsCreateJobFlyoutExcludesSelect" - /> - - - setFormState({ modelMemoryLimit: e.target.value })} - isInvalid={modelMemoryLimitValidationResult !== null} - data-test-subj="mlAnalyticsCreateJobFlyoutModelMemoryInput" - /> - - - setFormState({ createIndexPattern: !createIndexPattern })} - data-test-subj="mlAnalyticsCreateJobFlyoutCreateIndexPatternSwitch" - /> - - - )} -
- ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx deleted file mode 100644 index 46301a6f832e7..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { FC } from 'react'; -import { EuiFormRow, EuiTextArea } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; - -const helpText = i18n.translate('xpack.ml.dataframe.analytics.create.jobDescription.helpText', { - defaultMessage: 'Optional descriptive text', -}); - -interface Props { - description: string; - setFormState: React.Dispatch>; -} - -export const JobDescriptionInput: FC = ({ description, setFormState }) => ( - - { - const value = e.target.value; - setFormState({ description: value }); - }} - data-test-subj="mlDFAnalyticsJobCreationJobDescription" - /> - -); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx deleted file mode 100644 index 6daa72dd805b1..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Fragment, FC } from 'react'; -import { i18n } from '@kbn/i18n'; - -import { EuiFormRow, EuiSelect } from '@elastic/eui'; -import { ANALYSIS_CONFIG_TYPE } from '../../../../common'; - -import { AnalyticsJobType } from '../../hooks/use_create_analytics_form/state'; - -interface Props { - type: AnalyticsJobType; - setFormState: React.Dispatch>; -} - -export const JobType: FC = ({ type, setFormState }) => { - const outlierHelpText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.outlierDetectionHelpText', - { - defaultMessage: - 'Outlier detection jobs require a source index that is mapped as a table-like data structure and analyze only numeric and boolean fields. Use the advanced editor to add custom options to the configuration.', - } - ); - - const regressionHelpText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.outlierRegressionHelpText', - { - defaultMessage: - 'Regression jobs analyze only numeric fields. Use the advanced editor to apply custom options, such as the prediction field name.', - } - ); - - const classificationHelpText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.classificationHelpText', - { - defaultMessage: - 'Classification jobs require a source index that is mapped as a table-like data structure and support fields that are numeric, boolean, text, keyword, or ip. Use the advanced editor to apply custom options, such as the prediction field name.', - } - ); - - const helpText = { - [ANALYSIS_CONFIG_TYPE.REGRESSION]: regressionHelpText, - [ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION]: outlierHelpText, - [ANALYSIS_CONFIG_TYPE.CLASSIFICATION]: classificationHelpText, - }; - - return ( - - - ({ - value: jobType, - text: jobType.replace(/_/g, ' '), - }))} - value={type} - hasNoInitialSelection={true} - onChange={(e) => { - const value = e.target.value as AnalyticsJobType; - setFormState({ - previousJobType: type, - jobType: value, - excludes: [], - requiredFieldsError: undefined, - }); - }} - data-test-subj="mlAnalyticsCreateJobFlyoutJobTypeSelect" - /> - - - ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts index c42e03b584a56..a9eedbb2bc5e3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts @@ -57,11 +57,6 @@ export type Action = } | { type: ACTION.SET_IS_JOB_CREATED; isJobCreated: State['isJobCreated'] } | { type: ACTION.SET_IS_JOB_STARTED; isJobStarted: State['isJobStarted'] } - | { - type: ACTION.SET_IS_MODAL_BUTTON_DISABLED; - isModalButtonDisabled: State['isModalButtonDisabled']; - } - | { type: ACTION.SET_IS_MODAL_VISIBLE; isModalVisible: State['isModalVisible'] } | { type: ACTION.SET_JOB_CONFIG; payload: State['jobConfig'] } | { type: ACTION.SET_JOB_IDS; jobIds: State['jobIds'] } | { type: ACTION.SET_ESTIMATED_MODEL_MEMORY_LIMIT; value: State['estimatedModelMemoryLimit'] } @@ -71,12 +66,10 @@ export type Action = export interface ActionDispatchers { closeModal: () => void; createAnalyticsJob: () => void; - openModal: () => Promise; initiateWizard: () => Promise; resetAdvancedEditorMessages: () => void; setAdvancedEditorRawString: (payload: State['advancedEditorRawString']) => void; setFormState: (payload: Partial) => void; - setIsModalVisible: (payload: State['isModalVisible']) => void; setJobConfig: (payload: State['jobConfig']) => void; startAnalyticsJob: () => void; switchToAdvancedEditor: () => void; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts index fc604c9f5eb0b..e6769a7b64e2b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts @@ -79,21 +79,6 @@ describe('useCreateAnalyticsForm', () => { expect(resettedState).toEqual(initialState); }); - test('reducer(): open/close the modal', () => { - const initialState = getInitialState(); - expect(initialState.isModalVisible).toBe(false); - - const openModalState = reducer(initialState, { - type: ACTION.OPEN_MODAL, - }); - expect(openModalState.isModalVisible).toBe(true); - - const closedModalState = reducer(openModalState, { - type: ACTION.CLOSE_MODAL, - }); - expect(closedModalState.isModalVisible).toBe(false); - }); - test('reducer(): add/reset request messages', () => { const initialState = getInitialState(); expect(initialState.requestMessages).toHaveLength(0); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts index a79a8fcf61ed4..1353a35d8ecc6 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts @@ -442,12 +442,6 @@ export function reducer(state: State, action: Action): State { case ACTION.RESET_REQUEST_MESSAGES: return { ...state, requestMessages: [] }; - case ACTION.CLOSE_MODAL: - return { ...state, isModalVisible: false }; - - case ACTION.OPEN_MODAL: - return { ...state, isModalVisible: true }; - case ACTION.RESET_ADVANCED_EDITOR_MESSAGES: return { ...state, advancedEditorMessages: [] }; @@ -536,12 +530,6 @@ export function reducer(state: State, action: Action): State { case ACTION.SET_IS_JOB_STARTED: return { ...state, isJobStarted: action.isJobStarted }; - case ACTION.SET_IS_MODAL_BUTTON_DISABLED: - return { ...state, isModalButtonDisabled: action.isModalButtonDisabled }; - - case ACTION.SET_IS_MODAL_VISIBLE: - return { ...state, isModalVisible: action.isModalVisible }; - case ACTION.SET_JOB_CONFIG: return validateAdvancedEditor({ ...state, jobConfig: action.payload }); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts index 547a55da7438b..b9a9caadcebd0 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts @@ -4,7 +4,43 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getInitialState, getJobConfigFromFormState } from './state'; +import { + getCloneFormStateFromJobConfig, + getInitialState, + getJobConfigFromFormState, +} from './state'; + +const regJobConfig = { + id: 'reg-test-01', + description: 'Reg test job description', + source: { + index: ['reg-test-index'], + query: { + match_all: {}, + }, + }, + dest: { + index: 'reg-test-01-index', + results_field: 'ml', + }, + analysis: { + regression: { + dependent_variable: 'price', + num_top_feature_importance_values: 2, + prediction_field_name: 'airbnb_test', + training_percent: 5, + randomize_seed: 4998776294664380000, + }, + }, + analyzed_fields: { + includes: [], + excludes: [], + }, + model_memory_limit: '22mb', + create_time: 1590514291395, + version: '8.0.0', + allow_lazy_start: false, +}; describe('useCreateAnalyticsForm', () => { test('state: getJobConfigFromFormState()', () => { @@ -28,4 +64,20 @@ describe('useCreateAnalyticsForm', () => { 'the-source-index-2', ]); }); + + test('state: getCloneFormStateFromJobConfig()', () => { + const clonedState = getCloneFormStateFromJobConfig(regJobConfig); + + expect(clonedState?.sourceIndex).toBe('reg-test-index'); + expect(clonedState?.excludes).toStrictEqual([]); + expect(clonedState?.dependentVariable).toBe('price'); + expect(clonedState?.numTopFeatureImportanceValues).toBe(2); + expect(clonedState?.predictionFieldName).toBe('airbnb_test'); + expect(clonedState?.trainingPercent).toBe(5); + expect(clonedState?.randomizeSeed).toBe(4998776294664380000); + expect(clonedState?.modelMemoryLimit).toBe('22mb'); + // destination index and job id should be undefined + expect(clonedState?.destinationIndex).toBe(undefined); + expect(clonedState?.jobId).toBe(undefined); + }); }); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts index 387ce89ee4120..8a07704e39910 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts @@ -92,7 +92,6 @@ export interface State { outlierFraction: undefined | number; predictionFieldName: undefined | string; previousJobType: null | AnalyticsJobType; - previousSourceIndex: EsIndexName | undefined; requiredFieldsError: string | undefined; randomizeSeed: undefined | number; sourceIndex: EsIndexName; @@ -110,8 +109,6 @@ export interface State { isAdvancedEditorValidJson: boolean; isJobCreated: boolean; isJobStarted: boolean; - isModalButtonDisabled: boolean; - isModalVisible: boolean; isValid: boolean; jobConfig: DeepPartial; jobIds: DataFrameAnalyticsId[]; @@ -167,7 +164,6 @@ export const getInitialState = (): State => ({ outlierFraction: undefined, predictionFieldName: undefined, previousJobType: null, - previousSourceIndex: undefined, requiredFieldsError: undefined, randomizeSeed: undefined, sourceIndex: '', @@ -189,8 +185,6 @@ export const getInitialState = (): State => ({ isAdvancedEditorValidJson: true, isJobCreated: false, isJobStarted: false, - isModalVisible: false, - isModalButtonDisabled: false, isValid: false, jobIds: [], requestMessages: [], @@ -328,6 +322,14 @@ export const getJobConfigFromFormState = ( return jobConfig; }; +function toCamelCase(property: string): string { + const camelCased = property.replace(/_([a-z])/g, function (g) { + return g[1].toUpperCase(); + }); + + return camelCased; +} + /** * Extracts form state for a job clone from the analytics job configuration. * For cloning we keep job id and destination index empty. @@ -353,13 +355,12 @@ export function getCloneFormStateFromJobConfig( ) { const analysisConfig = analyticsJobConfig.analysis[jobType]; - resultState.dependentVariable = analysisConfig.dependent_variable; - resultState.numTopFeatureImportanceValues = analysisConfig.num_top_feature_importance_values; - resultState.trainingPercent = analysisConfig.training_percent; - - if (isClassificationAnalysis(analyticsJobConfig.analysis)) { - // @ts-ignore - resultState.numTopClasses = analysisConfig.num_top_classes; + for (const key in analysisConfig) { + if (analysisConfig.hasOwnProperty(key)) { + const camelCased = toCamelCase(key); + // @ts-ignore + resultState[camelCased] = analysisConfig[key]; + } } } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx index 182e50a5d74d1..ac1c710e1d106 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx @@ -46,39 +46,13 @@ describe('getErrorMessage()', () => { describe('useCreateAnalyticsForm()', () => { test('initialization', () => { const { getLastHookValue } = getMountedHook(); - const { state, actions } = getLastHookValue(); + const { actions } = getLastHookValue(); - expect(state.isModalVisible).toBe(false); - expect(typeof actions.closeModal).toBe('function'); expect(typeof actions.createAnalyticsJob).toBe('function'); - expect(typeof actions.openModal).toBe('function'); expect(typeof actions.startAnalyticsJob).toBe('function'); expect(typeof actions.setFormState).toBe('function'); }); - test('open/close modal', () => { - const { act, getLastHookValue } = getMountedHook(); - const { state, actions } = getLastHookValue(); - - expect(state.isModalVisible).toBe(false); - - act(() => { - // this should be actions.openModal(), but that doesn't work yet because act() doesn't support async yet. - // we need to wait for an update to React 16.9 - actions.setIsModalVisible(true); - }); - const { state: stateModalOpen } = getLastHookValue(); - expect(stateModalOpen.isModalVisible).toBe(true); - - act(() => { - // this should be actions.closeModal(), but that doesn't work yet because act() doesn't support async yet. - // we need to wait for an update to React 16.9 - actions.setIsModalVisible(false); - }); - const { state: stateModalClosed } = getLastHookValue(); - expect(stateModalClosed.isModalVisible).toBe(false); - }); - // TODO // add tests for createAnalyticsJob() and startAnalyticsJob() // once React 16.9 with support for async act() is available. diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts index c4cbe149f88bc..2de9a1dcadd4b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts @@ -87,12 +87,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { dispatch({ type: ACTION.SET_IS_JOB_STARTED, isJobStarted }); }; - const setIsModalButtonDisabled = (isModalButtonDisabled: boolean) => - dispatch({ type: ACTION.SET_IS_MODAL_BUTTON_DISABLED, isModalButtonDisabled }); - - const setIsModalVisible = (isModalVisible: boolean) => - dispatch({ type: ACTION.SET_IS_MODAL_VISIBLE, isModalVisible }); - const setJobIds = (jobIds: DataFrameAnalyticsId[]) => dispatch({ type: ACTION.SET_JOB_IDS, jobIds }); @@ -102,7 +96,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const createAnalyticsJob = async () => { resetRequestMessages(); - setIsModalButtonDisabled(true); const analyticsJobConfig = (isAdvancedEditorEnabled ? jobConfig @@ -123,7 +116,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } ), }); - setIsModalButtonDisabled(false); setIsJobCreated(true); if (createIndexPattern) { createKibanaIndexPattern(); @@ -139,7 +131,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } ), }); - setIsModalButtonDisabled(false); } }; @@ -267,13 +258,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } }; - const openModal = async () => { - await mlContext.indexPatterns.clearCache(); - resetForm(); - await prepareFormValidation(); - dispatch({ type: ACTION.OPEN_MODAL }); - }; - const initiateWizard = async () => { await mlContext.indexPatterns.clearCache(); await prepareFormValidation(); @@ -327,8 +311,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const setJobClone = async (cloneJob: DeepReadonly) => { resetForm(); - await prepareFormValidation(); - const config = extractCloningConfig(cloneJob); if (isAdvancedConfig(config)) { setJobConfig(config); @@ -339,18 +321,15 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } dispatch({ type: ACTION.SET_JOB_CLONE, cloneJob }); - dispatch({ type: ACTION.OPEN_MODAL }); }; const actions: ActionDispatchers = { closeModal, createAnalyticsJob, - openModal, initiateWizard, resetAdvancedEditorMessages, setAdvancedEditorRawString, setFormState, - setIsModalVisible, setJobConfig, startAnalyticsJob, switchToAdvancedEditor, diff --git a/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx b/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx index 68af9a2a49cab..ebc7bd95fb0c3 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx @@ -30,12 +30,15 @@ export const analyticsJobsCreationRoute: MlRoute = { }; const PageWrapper: FC = ({ location, deps }) => { - const { index, savedSearchId }: Record = parse(location.search, { sort: false }); + const { index, jobId, savedSearchId }: Record = parse(location.search, { + sort: false, + }); + const { context } = useResolver(index, savedSearchId, deps.config, basicResolvers(deps)); return ( - + ); }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 5be46ce4bcd2d..76636779001e7 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9654,7 +9654,6 @@ "xpack.ml.dataframe.analytics.classificationExploration.showActions": "アクションを表示", "xpack.ml.dataframe.analytics.classificationExploration.showAllColumns": "すべての列を表示", "xpack.ml.dataframe.analytics.classificationExploration.tableJobIdTitle": "分類ジョブID {jobId}のデスティネーションインデックス", - "xpack.ml.dataframe.analytics.clone.flyoutHeaderTitle": "{job_id} からのジョブのクローンを作成", "xpack.ml.dataframe.analytics.create.advancedEditor.codeEditorAriaLabel": "高度な分析ジョブエディター", "xpack.ml.dataframe.analytics.create.advancedEditor.configRequestBody": "構成リクエスト本文", "xpack.ml.dataframe.analytics.create.advancedEditor.jobIdExistsError": "このIDの分析ジョブが既に存在します。", @@ -9687,22 +9686,12 @@ "xpack.ml.dataframe.analytics.create.destinationIndexLabel": "デスティネーションインデックス", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessage": "Kibanaインデックスパターンの作成中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessageError": "インデックスパターン{indexPatternName}はすでに作成されています。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorHelpText": "高度なエディターからこのフォームには戻れません。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorSwitch": "詳細エディターを有効にする", "xpack.ml.dataframe.analytics.create.errorCreatingDataFrameAnalyticsJob": "データフレーム分析ジョブの作成中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameAnalyticsList": "既存のデータフレーム分析ジョブIDの取得中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameIndexNames": "既存のインデックス名の取得中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorGettingIndexPatternTitles": "既存のインデックスパターンのタイトルの取得中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorStartingDataFrameAnalyticsJob": "データフレーム分析ジョブの開始中にエラーが発生しました。", - "xpack.ml.dataframe.analytics.create.excludedFieldsHelpText": "分析から除外するフィールドを選択してください。他のすべてのサポートされるフィールドが含まれます。", "xpack.ml.dataframe.analytics.create.excludedFieldsLabel": "除外されたフィールド", - "xpack.ml.dataframe.analytics.create.excludesInputAriaLabel": "任意。除外するフィールドを入力または選択してください。", - "xpack.ml.dataframe.analytics.create.excludesOptionsNoSupportedFields": "このインデックスパターンのサポートされている分析フィールドが見つかりませんでした。", - "xpack.ml.dataframe.analytics.create.flyoutCancelButton": "キャンセル", - "xpack.ml.dataframe.analytics.create.flyoutCloseButton": "閉じる", - "xpack.ml.dataframe.analytics.create.flyoutCreateButton": "作成", - "xpack.ml.dataframe.analytics.create.flyoutHeaderTitle": "分析ジョブの作成", - "xpack.ml.dataframe.analytics.create.flyoutStartButton": "開始", "xpack.ml.dataframe.analytics.create.indexPatternAlreadyExistsError": "このタイトルのインデックスパターンが既に存在します。", "xpack.ml.dataframe.analytics.create.indexPatternExistsError": "このタイトルのインデックスパターンが既に存在します。", "xpack.ml.dataframe.analytics.create.jobDescription.helpText": "オプションの説明テキストです", @@ -9723,12 +9712,6 @@ "xpack.ml.dataframe.analytics.create.numTopFeatureImportanceValuesLabel": "機能重要度値", "xpack.ml.dataframe.analytics.create.outlierDetectionHelpText": "外れ値検出ジョブは、表に示すようなデータ構造でマッピングされたソースインデックスを必要とし、数字とブール値フィールドのみを分析します。カスタムオプションを構成に追加するには、詳細エディターを使用します。", "xpack.ml.dataframe.analytics.create.outlierRegressionHelpText": "リグレッションジョブは数値フィールドのみを分析します。予測フィールド名などのカスタムオプションを適用するには、詳細エディターを使用します。", - "xpack.ml.dataframe.analytics.create.sourceIndexFieldCheckError": "数値フィールドの確認中に問題が発生しました。ページを更新して再起動してください。", - "xpack.ml.dataframe.analytics.create.sourceIndexHelpText": "このインデックスパターンには数字タイプのフィールドが含まれていません。分析ジョブで外れ値が検出されない可能性があります。", - "xpack.ml.dataframe.analytics.create.sourceIndexInputAriaLabel": "ソースインデックスパターンまたは検索。", - "xpack.ml.dataframe.analytics.create.sourceIndexInvalidError": "無効なソースインデックス名。スペースや{characterList}を含めることはできません", - "xpack.ml.dataframe.analytics.create.sourceIndexLabel": "ソースインデックス", - "xpack.ml.dataframe.analytics.create.sourceIndexPlaceholder": "ソースインデックスパターンを選択してください。", "xpack.ml.dataframe.analytics.create.startDataFrameAnalyticsSuccessMessage": "データフレーム分析 {jobId} の開始リクエストが受け付けられました。", "xpack.ml.dataframe.analytics.create.trainingPercentLabel": "トレーニングパーセンテージ", "xpack.ml.dataframe.analytics.errorCallout.evaluateErrorTitle": "データの読み込み中にエラーが発生しました。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index dff26907b48ed..331e9d67c3897 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9658,7 +9658,6 @@ "xpack.ml.dataframe.analytics.classificationExploration.showActions": "显示操作", "xpack.ml.dataframe.analytics.classificationExploration.showAllColumns": "显示所有列", "xpack.ml.dataframe.analytics.classificationExploration.tableJobIdTitle": "分类作业 ID {jobId} 的目标索引", - "xpack.ml.dataframe.analytics.clone.flyoutHeaderTitle": "从 {job_id} 克隆作业", "xpack.ml.dataframe.analytics.create.advancedEditor.codeEditorAriaLabel": "高级分析作业编辑器", "xpack.ml.dataframe.analytics.create.advancedEditor.configRequestBody": "配置请求正文", "xpack.ml.dataframe.analytics.create.advancedEditor.jobIdExistsError": "已存在具有此 ID 的分析作业。", @@ -9691,22 +9690,12 @@ "xpack.ml.dataframe.analytics.create.destinationIndexLabel": "目标 IP", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessage": "创建 Kibana 索引模式时发生错误:", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessageError": "索引模式 {indexPatternName} 已存在。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorHelpText": "您不能从高级编辑器切回到此表单。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorSwitch": "启用高级编辑器", "xpack.ml.dataframe.analytics.create.errorCreatingDataFrameAnalyticsJob": "创建数据帧分析作业时发生错误:", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameAnalyticsList": "获取现有数据帧分析作业 ID 时发生错误:", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameIndexNames": "获取现有索引名称时发生错误:", "xpack.ml.dataframe.analytics.create.errorGettingIndexPatternTitles": "获取现有索引模式标题时发生错误:", "xpack.ml.dataframe.analytics.create.errorStartingDataFrameAnalyticsJob": "启动数据帧分析作业时发生错误:", - "xpack.ml.dataframe.analytics.create.excludedFieldsHelpText": "选择要从分析中排除的字段。包括所有其他支持的字段。", "xpack.ml.dataframe.analytics.create.excludedFieldsLabel": "排除的字段", - "xpack.ml.dataframe.analytics.create.excludesInputAriaLabel": "可选。输入或选择要排除的字段。", - "xpack.ml.dataframe.analytics.create.excludesOptionsNoSupportedFields": "没有为此索引模式找到任何支持的分析字段。", - "xpack.ml.dataframe.analytics.create.flyoutCancelButton": "取消", - "xpack.ml.dataframe.analytics.create.flyoutCloseButton": "关闭", - "xpack.ml.dataframe.analytics.create.flyoutCreateButton": "创建", - "xpack.ml.dataframe.analytics.create.flyoutHeaderTitle": "创建分析作业", - "xpack.ml.dataframe.analytics.create.flyoutStartButton": "开始", "xpack.ml.dataframe.analytics.create.indexPatternAlreadyExistsError": "具有此名称的索引模式已存在。", "xpack.ml.dataframe.analytics.create.indexPatternExistsError": "具有此名称的索引模式已存在。", "xpack.ml.dataframe.analytics.create.jobDescription.helpText": "可选的描述文本", @@ -9727,12 +9716,6 @@ "xpack.ml.dataframe.analytics.create.numTopFeatureImportanceValuesLabel": "功能重要性值", "xpack.ml.dataframe.analytics.create.outlierDetectionHelpText": "离群值检测作业需要映射为表状数据结构的源索引,并仅分析数值和布尔值字段。使用高级编辑器将定制选项添加到配置。", "xpack.ml.dataframe.analytics.create.outlierRegressionHelpText": "回归作业仅分析数值字段。使用高级编辑器来应用定制选项,如预测字段名称。", - "xpack.ml.dataframe.analytics.create.sourceIndexFieldCheckError": "检查数值字段时出现问题。请刷新页面并重试。", - "xpack.ml.dataframe.analytics.create.sourceIndexHelpText": "此索引模式不包含任何数值类型字段。分析作业可能无法提供任何离群值。", - "xpack.ml.dataframe.analytics.create.sourceIndexInputAriaLabel": "源索引模式或搜索。", - "xpack.ml.dataframe.analytics.create.sourceIndexInvalidError": "源索引名称无效,其不能包含空格或以下字符:{characterList}", - "xpack.ml.dataframe.analytics.create.sourceIndexLabel": "源索引", - "xpack.ml.dataframe.analytics.create.sourceIndexPlaceholder": "选择源索引模式。", "xpack.ml.dataframe.analytics.create.startDataFrameAnalyticsSuccessMessage": "数据帧分析 {jobId} 启动请求已确认。", "xpack.ml.dataframe.analytics.create.trainingPercentLabel": "训练百分比", "xpack.ml.dataframe.analytics.errorCallout.evaluateErrorTitle": "加载数据时出错。", From 0306c7a8cf1efc34360f1422690dfffa1b057857 Mon Sep 17 00:00:00 2001 From: Greg Thompson Date: Tue, 9 Jun 2020 15:07:40 -0600 Subject: [PATCH 60/91] Upgrade EUI to v24.1.0 (#68141) * eui to 24.1.0 * src snapshot updates * x-pack snapshot updates * euiPaletteColorBlind param updates * euiPaletteColorBlind ts-ignore * fix collapsibleNav close button click for functional testing * await focus * increase legacy sass build timeout value Co-authored-by: Elastic Machine --- package.json | 2 +- packages/kbn-ui-shared-deps/package.json | 2 +- .../collapsible_nav.test.tsx.snap | 211 +++++++++--------- .../header/__snapshots__/header.test.tsx.snap | 85 ++++--- src/legacy/server/sass/build.test.js | 2 + .../__snapshots__/new_vis_modal.test.tsx.snap | 2 + test/functional/services/apps_menu.ts | 4 + .../plugins/kbn_tp_run_pipeline/package.json | 2 +- .../kbn_sample_panel_action/package.json | 2 +- .../kbn_tp_custom_visualizations/package.json | 2 +- .../kbn_tp_embeddable_explorer/package.json | 2 +- x-pack/package.json | 2 +- .../__test__/__snapshots__/List.test.tsx.snap | 18 ++ .../__snapshots__/asset.examples.storyshot | 8 + .../asset_manager.stories.storyshot | 8 + .../element_controls.stories.storyshot | 2 + .../element_grid.stories.storyshot | 6 + .../saved_elements_modal.stories.storyshot | 8 + .../sidebar_header.stories.storyshot | 4 + .../simple_template.examples.storyshot | 1 + .../public/classes/styles/color_utils.tsx | 4 +- .../__snapshots__/index.test.tsx.snap | 43 ++-- .../note_card_body.test.tsx.snap | 43 ++-- yarn.lock | 8 +- 24 files changed, 263 insertions(+), 208 deletions(-) diff --git a/package.json b/package.json index 5bf39a57c1ac5..419edcf268356 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "@elastic/charts": "19.2.0", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.8.0", - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "@elastic/filesaver": "1.1.2", "@elastic/good": "8.1.1-kibana2", "@elastic/numeral": "^2.5.0", diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index 744a656c54a7f..2c9251b03059a 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@elastic/charts": "19.2.0", - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "@elastic/numeral": "^2.5.0", "@kbn/i18n": "1.0.0", "@kbn/monaco": "1.0.0", diff --git a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap index f5b17f8d214e9..60963c0acb990 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap @@ -1014,7 +1014,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
@@ -1662,7 +1658,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
@@ -3119,38 +3111,43 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
- - - + +
+
- - - + + +
@@ -4717,7 +4715,7 @@ exports[`CollapsibleNav renders the default nav 3`] = ` @@ -5120,38 +5114,43 @@ exports[`CollapsibleNav renders the default nav 3`] = ` - - - + + +
@@ -9277,7 +9273,7 @@ exports[`Header renders 3`] = `
@@ -9764,38 +9756,43 @@ exports[`Header renders 3`] = ` - - - + + +
@@ -14302,6 +14300,7 @@ exports[`Header renders 4`] = ` > diff --git a/src/legacy/server/sass/build.test.js b/src/legacy/server/sass/build.test.js index 46a898c30f84e..71c43ac010962 100644 --- a/src/legacy/server/sass/build.test.js +++ b/src/legacy/server/sass/build.test.js @@ -33,6 +33,8 @@ afterEach(async () => { }); it('builds light themed SASS', async () => { + // Increased timeout from 5000ms due to intermittent timeout failures + jest.setTimeout(60000); const targetPath = resolve(TMP, 'style.css'); await new Build({ sourcePath: FIXTURE, diff --git a/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap b/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap index 22cc873cbdb5d..53ef164685a1c 100644 --- a/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap +++ b/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap @@ -1264,6 +1264,7 @@ exports[`NewVisModal filter for visualization types should render as expected 1` > @@ -2772,6 +2773,7 @@ exports[`NewVisModal should render as expected 1`] = ` > diff --git a/test/functional/services/apps_menu.ts b/test/functional/services/apps_menu.ts index 969bddbd30f9a..aa7934d6b1156 100644 --- a/test/functional/services/apps_menu.ts +++ b/test/functional/services/apps_menu.ts @@ -58,6 +58,10 @@ export function AppsMenuProvider({ getService, getPageObjects }: FtrProviderCont public async closeCollapsibleNav() { const CLOSE_BUTTON = '[data-test-subj=collapsibleNav] > button'; if (await find.existsByCssSelector(CLOSE_BUTTON)) { + // Close button is only visible when focused + const button = await find.byCssSelector(CLOSE_BUTTON); + await button.focus(); + await find.clickByCssSelector(CLOSE_BUTTON); } } diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json index acd78cb4955e3..24b38fae96653 100644 --- a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0", "react-dom": "^16.12.0" }, diff --git a/test/plugin_functional/plugins/kbn_sample_panel_action/package.json b/test/plugin_functional/plugins/kbn_sample_panel_action/package.json index 45d07933c4209..71a635c444b8c 100644 --- a/test/plugin_functional/plugins/kbn_sample_panel_action/package.json +++ b/test/plugin_functional/plugins/kbn_sample_panel_action/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0" }, "scripts": { diff --git a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json index ca99e9b5995c1..78f0b42a6fbda 100644 --- a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json +++ b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0" }, "scripts": { diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json index 63dde0fa96dd3..6dbc9c71f2e81 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0" }, "scripts": { diff --git a/x-pack/package.json b/x-pack/package.json index b3dcde2194d3f..fb708ab09d841 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -190,7 +190,7 @@ "@elastic/apm-rum-react": "^1.1.1", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.8.0", - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "@elastic/filesaver": "1.1.2", "@elastic/maki": "6.3.0", "@elastic/node-crypto": "1.1.1", diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap index 3de725dc58ea7..6a20e3c103709 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap @@ -161,6 +161,7 @@ exports[`ErrorGroupOverview -> List should render empty state 1`] = ` @@ -575,6 +576,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -754,6 +756,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -859,6 +862,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -889,6 +893,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -958,6 +963,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -984,6 +990,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -1089,6 +1096,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1119,6 +1127,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -1188,6 +1197,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1214,6 +1224,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -1319,6 +1330,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1349,6 +1361,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -1418,6 +1431,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1444,6 +1458,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -1549,6 +1564,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1579,6 +1595,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -1648,6 +1665,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > diff --git a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot index 6601f570209e9..14791cd3d8b25 100644 --- a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot +++ b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot @@ -63,6 +63,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -88,6 +89,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -118,6 +120,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -148,6 +151,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -237,6 +241,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > @@ -262,6 +267,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > @@ -292,6 +298,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > @@ -322,6 +329,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > diff --git a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot index aff630b21c770..1b8f1480759f6 100644 --- a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot @@ -422,6 +422,7 @@ Array [ > @@ -447,6 +448,7 @@ Array [ > @@ -477,6 +479,7 @@ Array [ > @@ -507,6 +510,7 @@ Array [ > @@ -585,6 +589,7 @@ Array [ > @@ -610,6 +615,7 @@ Array [ > @@ -640,6 +646,7 @@ Array [ > @@ -670,6 +677,7 @@ Array [ > diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot index 6f12f68356467..408b0679c415f 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot @@ -16,6 +16,7 @@ exports[`Storyshots components/SavedElementsModal/ElementControls has two button > @@ -42,6 +43,7 @@ exports[`Storyshots components/SavedElementsModal/ElementControls has two button > diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot index be0fb0573c394..1c506819df1fb 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot @@ -66,6 +66,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -92,6 +93,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -170,6 +172,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -196,6 +199,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -274,6 +278,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -300,6 +305,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot index 03093b41300b8..04b2184f27462 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot @@ -362,6 +362,7 @@ Array [ > @@ -388,6 +389,7 @@ Array [ > @@ -466,6 +468,7 @@ Array [ > @@ -492,6 +495,7 @@ Array [ > @@ -570,6 +574,7 @@ Array [ > @@ -596,6 +601,7 @@ Array [ > @@ -851,6 +857,7 @@ Array [ > @@ -877,6 +884,7 @@ Array [ > diff --git a/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot b/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot index 4d5b9570ee20f..16263aa7ea384 100644 --- a/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot @@ -55,6 +55,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > @@ -80,6 +81,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > @@ -105,6 +107,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > @@ -130,6 +133,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > diff --git a/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot b/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot index 14466cab1a698..f8583d7cd0dc0 100644 --- a/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot +++ b/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot @@ -169,6 +169,7 @@ exports[`Storyshots arguments/SeriesStyle/components simple: no series 1`] = ` > diff --git a/x-pack/plugins/maps/public/classes/styles/color_utils.tsx b/x-pack/plugins/maps/public/classes/styles/color_utils.tsx index 116e03096b0f5..0192a9d7ca68f 100644 --- a/x-pack/plugins/maps/public/classes/styles/color_utils.tsx +++ b/x-pack/plugins/maps/public/classes/styles/color_utils.tsx @@ -139,11 +139,11 @@ const COLOR_PALETTES_CONFIGS: ColorPalette[] = [ }, { id: 'palette_20', - colors: euiPaletteColorBlind(2), + colors: euiPaletteColorBlind({ rotations: 2 }), }, { id: 'palette_30', - colors: euiPaletteColorBlind(3), + colors: euiPaletteColorBlind({ rotations: 3 }), }, ]; diff --git a/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap index a2c7e72e51a9c..26775608637c0 100644 --- a/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap @@ -115,32 +115,28 @@ exports[`Paginated Table Component rendering it renders the default load more ta }, "euiCardSpacing": "16px", "euiCheckBoxSize": "16px", - "euiCodeBlockAdditionBackgroundColor": "#144212", - "euiCodeBlockAdditionColor": "#e6e1dc", - "euiCodeBlockAttributeColor": "#80cbbf", + "euiCodeBlockAdditionColor": "#54b399", + "euiCodeBlockAttributeColor": "inherit", "euiCodeBlockBackgroundColor": "#25262e", - "euiCodeBlockBuiltInColor": "#0086b3", "euiCodeBlockColor": "#dfe5ef", - "euiCodeBlockCommentColor": "#656565", - "euiCodeBlockDeletionBackgroundColor": "#660000", - "euiCodeBlockDeletionColor": "#e6e1dc", - "euiCodeBlockFunctionTitleColor": "#75a5ff", - "euiCodeBlockKeywordColor": "#c792ea", - "euiCodeBlockMetaColor": "#75a5ff", - "euiCodeBlockNameColor": "#e06c75", - "euiCodeBlockNumberColor": "#f77669", - "euiCodeBlockParamsColor": "#eefff7", - "euiCodeBlockRegexpColor": "#009926", - "euiCodeBlockSectionColor": "#ffc66d", + "euiCodeBlockCommentColor": "#8d919a", + "euiCodeBlockDeletionColor": "#ff6666", + "euiCodeBlockFunctionTitleColor": "inherit", + "euiCodeBlockKeywordColor": "#a184c2", + "euiCodeBlockMetaColor": "#8d919a", + "euiCodeBlockNameColor": "#6092c0", + "euiCodeBlockNumberColor": "#54b399", + "euiCodeBlockParamsColor": "inherit", + "euiCodeBlockSectionColor": "#e7664c", "euiCodeBlockSelectedBackgroundColor": "inherit", - "euiCodeBlockSelectorClassColor": "#ffcb68", - "euiCodeBlockSelectorIdColor": "#f77669", - "euiCodeBlockSelectorTagColor": "#c792ea", - "euiCodeBlockStringColor": "#c3e88d", - "euiCodeBlockSymbolColor": "#c792ea", - "euiCodeBlockTagColor": "#abb2bf", - "euiCodeBlockTitleColor": "#75a5ff", - "euiCodeBlockTypeColor": "#da4939", + "euiCodeBlockSelectorClassColor": "inherit", + "euiCodeBlockSelectorIdColor": "inherit", + "euiCodeBlockSelectorTagColor": "inherit", + "euiCodeBlockStringColor": "#d77092", + "euiCodeBlockSymbolColor": "#e7664c", + "euiCodeBlockTagColor": "#6092c0", + "euiCodeBlockTitleColor": "#da8b45", + "euiCodeBlockTypeColor": "#6092c0", "euiCodeFontFamily": "'Roboto Mono', 'Consolas', 'Menlo', 'Courier', monospace", "euiCollapsibleNavGroupDarkBackgroundColor": "#131317", "euiCollapsibleNavGroupDarkHighContrastColor": "#1ba9f5", @@ -230,6 +226,7 @@ exports[`Paginated Table Component rendering it renders the default load more ta "warning": "#ffce7a", }, "euiFilePickerTallHeight": "128px", + "euiFlyoutBorder": "1px solid #343741", "euiFocusBackgroundColor": "#232635", "euiFocusRingAnimStartColor": "rgba(27, 169, 245, 0)", "euiFocusRingAnimStartSize": "6px", diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap index 391aaba17ae3a..22f89ffc6927e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap @@ -115,32 +115,28 @@ exports[`NoteCardBody renders correctly against snapshot 1`] = ` }, "euiCardSpacing": "16px", "euiCheckBoxSize": "16px", - "euiCodeBlockAdditionBackgroundColor": "#144212", - "euiCodeBlockAdditionColor": "#e6e1dc", - "euiCodeBlockAttributeColor": "#80cbbf", + "euiCodeBlockAdditionColor": "#54b399", + "euiCodeBlockAttributeColor": "inherit", "euiCodeBlockBackgroundColor": "#25262e", - "euiCodeBlockBuiltInColor": "#0086b3", "euiCodeBlockColor": "#dfe5ef", - "euiCodeBlockCommentColor": "#656565", - "euiCodeBlockDeletionBackgroundColor": "#660000", - "euiCodeBlockDeletionColor": "#e6e1dc", - "euiCodeBlockFunctionTitleColor": "#75a5ff", - "euiCodeBlockKeywordColor": "#c792ea", - "euiCodeBlockMetaColor": "#75a5ff", - "euiCodeBlockNameColor": "#e06c75", - "euiCodeBlockNumberColor": "#f77669", - "euiCodeBlockParamsColor": "#eefff7", - "euiCodeBlockRegexpColor": "#009926", - "euiCodeBlockSectionColor": "#ffc66d", + "euiCodeBlockCommentColor": "#8d919a", + "euiCodeBlockDeletionColor": "#ff6666", + "euiCodeBlockFunctionTitleColor": "inherit", + "euiCodeBlockKeywordColor": "#a184c2", + "euiCodeBlockMetaColor": "#8d919a", + "euiCodeBlockNameColor": "#6092c0", + "euiCodeBlockNumberColor": "#54b399", + "euiCodeBlockParamsColor": "inherit", + "euiCodeBlockSectionColor": "#e7664c", "euiCodeBlockSelectedBackgroundColor": "inherit", - "euiCodeBlockSelectorClassColor": "#ffcb68", - "euiCodeBlockSelectorIdColor": "#f77669", - "euiCodeBlockSelectorTagColor": "#c792ea", - "euiCodeBlockStringColor": "#c3e88d", - "euiCodeBlockSymbolColor": "#c792ea", - "euiCodeBlockTagColor": "#abb2bf", - "euiCodeBlockTitleColor": "#75a5ff", - "euiCodeBlockTypeColor": "#da4939", + "euiCodeBlockSelectorClassColor": "inherit", + "euiCodeBlockSelectorIdColor": "inherit", + "euiCodeBlockSelectorTagColor": "inherit", + "euiCodeBlockStringColor": "#d77092", + "euiCodeBlockSymbolColor": "#e7664c", + "euiCodeBlockTagColor": "#6092c0", + "euiCodeBlockTitleColor": "#da8b45", + "euiCodeBlockTypeColor": "#6092c0", "euiCodeFontFamily": "'Roboto Mono', 'Consolas', 'Menlo', 'Courier', monospace", "euiCollapsibleNavGroupDarkBackgroundColor": "#131317", "euiCollapsibleNavGroupDarkHighContrastColor": "#1ba9f5", @@ -230,6 +226,7 @@ exports[`NoteCardBody renders correctly against snapshot 1`] = ` "warning": "#ffce7a", }, "euiFilePickerTallHeight": "128px", + "euiFlyoutBorder": "1px solid #343741", "euiFocusBackgroundColor": "#232635", "euiFocusRingAnimStartColor": "rgba(27, 169, 245, 0)", "euiFocusRingAnimStartSize": "6px", diff --git a/yarn.lock b/yarn.lock index f7b310cca7590..cf9126b668e51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1332,10 +1332,10 @@ tabbable "^1.1.0" uuid "^3.1.0" -"@elastic/eui@23.3.1": - version "23.3.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-23.3.1.tgz#08516910d24eb148110f99d3bd7551240f9ef3d4" - integrity sha512-81N5xXeZwm8HEPE5RAPQFFUNUzYlTVJcNhW+DDN0EY8MlxVob9hgHy0AwshQGfrHlqhm+4gix110pW3n9Jweyw== +"@elastic/eui@24.1.0": + version "24.1.0" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-24.1.0.tgz#40593cc474237e8c464d182faa50c748b3f66822" + integrity sha512-Y7s327h0Z8dsO6MY7Sn1k5pOrf9ZjWH/ZE2gVtfBn2He5aFahS/+A434EBqFG0YV5W1VZtYiXtSj0AE1gjtrrw== dependencies: "@types/chroma-js" "^2.0.0" "@types/enzyme" "^3.1.13" From 2e3578602fcf999b279cf0de4091630cbb4649ee Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Tue, 9 Jun 2020 16:17:28 -0500 Subject: [PATCH 61/91] APM Storybook fixes (#68671) * Resolve core legacy assets in @kbn/storybook webpack configuration * Ignore stories in Jest coverage * Combine effects in Cytoscape component so handlers are always added before events are triggered * Add mock context to ErrorRateAlertTrigger stories * Disable TransactionDurationAlertTrigger stories Changing the Cytoscape effect behavior is necessary because the layout was not being triggered when the final set of elements is provided as props to the component. When this is used in Kibana we're always starting with empty elements and fetching them, but in the Storybook we're starting out with the full elements. --- .../storybook_config/webpack.config.js | 23 ++++++++++++++++++- x-pack/plugins/apm/jest.config.js | 1 + .../app/ServiceMap/Cytoscape.stories.tsx | 2 +- .../components/app/ServiceMap/Cytoscape.tsx | 15 ++++-------- .../ErrorRateAlertTrigger/index.stories.tsx | 23 +++++++++++++------ .../index.stories.tsx | 16 +++++++++---- 6 files changed, 56 insertions(+), 24 deletions(-) diff --git a/packages/kbn-storybook/storybook_config/webpack.config.js b/packages/kbn-storybook/storybook_config/webpack.config.js index 2dd051882bb4b..543bb47656df8 100644 --- a/packages/kbn-storybook/storybook_config/webpack.config.js +++ b/packages/kbn-storybook/storybook_config/webpack.config.js @@ -17,7 +17,7 @@ * under the License. */ -const { resolve } = require('path'); +const { parse, resolve } = require('path'); const webpack = require('webpack'); const { stringifyRequest } = require('loader-utils'); const CopyWebpackPlugin = require('copy-webpack-plugin'); @@ -95,6 +95,27 @@ module.exports = async ({ config }) => { }, }, }, + { + loader: 'resolve-url-loader', + options: { + // If you don't have arguments (_, __) to the join function, the + // resolve-url-loader fails with a loader misconfiguration error. + // + // eslint-disable-next-line no-unused-vars + join: (_, __) => (uri, base) => { + if (!base || !parse(base).dir.includes('legacy')) { + return null; + } + + // URIs on mixins in src/legacy/public/styles need to be resolved. + if (uri.startsWith('ui/assets')) { + return resolve(REPO_ROOT, 'src/core/server/core_app/', uri.replace('ui/', '')); + } + + return null; + }, + }, + }, { loader: 'sass-loader', options: { diff --git a/x-pack/plugins/apm/jest.config.js b/x-pack/plugins/apm/jest.config.js index c3ae694fe8e14..43bdeb583c819 100644 --- a/x-pack/plugins/apm/jest.config.js +++ b/x-pack/plugins/apm/jest.config.js @@ -31,6 +31,7 @@ module.exports = { collectCoverageFrom: [ '**/*.{js,jsx,ts,tsx}', '!**/{__test__,__snapshots__,__examples__,integration_tests,tests}/**', + '!**/*.stories.{js,ts,tsx}', '!**/*.test.{js,ts,tsx}', '!**/dev_docs/**', '!**/e2e/**', diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx index 1c62d3cc03db0..30031a05304bb 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx @@ -346,7 +346,7 @@ storiesOf('app/ServiceMap/Cytoscape', module).add( }, }, ]; - return ; + return ; }, { info: { propTables: false, source: false }, diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx index cb908785d64d8..c57d702b9a546 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx @@ -121,15 +121,6 @@ export function Cytoscape({ const trackApmEvent = useUiTracker({ app: 'apm' }); - // Trigger a custom "data" event when data changes - useEffect(() => { - if (cy) { - cy.remove(cy.elements()); - cy.add(elements); - cy.trigger('data'); - } - }, [cy, elements]); - // Set up cytoscape event handlers useEffect(() => { const resetConnectedEdgeStyle = (node?: cytoscape.NodeSingular) => { @@ -223,6 +214,10 @@ export function Cytoscape({ cy.on('mouseout', 'edge, node', mouseoutHandler); cy.on('select', 'node', selectHandler); cy.on('unselect', 'node', unselectHandler); + + cy.remove(cy.elements()); + cy.add(elements); + cy.trigger('data'); } return () => { @@ -241,7 +236,7 @@ export function Cytoscape({ } clearTimeout(layoutstopDelayTimeout); }; - }, [cy, height, serviceName, trackApmEvent, width]); + }, [cy, elements, height, serviceName, trackApmEvent, width]); return ( diff --git a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx index 8f7ed54f91bd0..ebcb1627984ad 100644 --- a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx @@ -7,6 +7,11 @@ import { storiesOf } from '@storybook/react'; import React from 'react'; import { ErrorRateAlertTrigger } from '.'; +import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; +import { + mockApmPluginContextValue, + MockApmPluginContextWrapper, +} from '../../../context/ApmPluginContext/MockApmPluginContext'; storiesOf('app/ErrorRateAlertTrigger', module).add('example', () => { const params = { @@ -15,12 +20,16 @@ storiesOf('app/ErrorRateAlertTrigger', module).add('example', () => { }; return ( -
- undefined} - setAlertProperty={() => undefined} - /> -
+ +
+ undefined} + setAlertProperty={() => undefined} + /> +
+
); }); diff --git a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx index e2429d1225442..da9adbb8dfead 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx @@ -3,18 +3,24 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +// import { storiesOf } from '@storybook/react'; import { cloneDeep, merge } from 'lodash'; -import { storiesOf } from '@storybook/react'; import React from 'react'; import { TransactionDurationAlertTrigger } from '.'; +import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; import { - MockApmPluginContextWrapper, mockApmPluginContextValue, + MockApmPluginContextWrapper, } from '../../../context/ApmPluginContext/MockApmPluginContext'; import { MockUrlParamsContextProvider } from '../../../context/UrlParamsContext/MockUrlParamsContextProvider'; -import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; -storiesOf('app/TransactionDurationAlertTrigger', module).add('example', () => { +// Disabling this because we currently don't have a way to mock `useEnvironments` +// which is used by this component. Using the fetch-mock module should work, but +// our current storybook setup has core-js-related problems when trying to import +// it. +// storiesOf('app/TransactionDurationAlertTrigger', module).add('example', +// eslint-disable-next-line no-unused-expressions +() => { const params = { threshold: 1500, aggregationType: 'avg' as const, @@ -44,4 +50,4 @@ storiesOf('app/TransactionDurationAlertTrigger', module).add('example', () => {
); -}); +}; From 938771a537dfd58fbf79a80a630db16b8b8bc785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Tue, 9 Jun 2020 23:37:26 +0200 Subject: [PATCH 62/91] [Logs + Metrics UI] Clean up async plugin initialization (#67654) This refactors the browser-side plugin bootstrap code such that the eagerly loaded bundle `infra.plugin.js` is minimal and the rest of the logs and metrics app bundles are loaded only when the apps are visited. --- .../components/expression.tsx | 4 + .../components/validation.tsx | 3 +- .../public/alerting/metric_threshold/index.ts | 4 +- .../infra/public/apps/common_providers.tsx | 47 +++++++ .../infra/public/apps/common_styles.ts | 13 ++ .../plugins/infra/public/apps/legacy_app.tsx | 98 +++++++++++++ x-pack/plugins/infra/public/apps/logs_app.tsx | 66 +++++++++ .../plugins/infra/public/apps/metrics_app.tsx | 82 +++++++++++ .../plugins/infra/public/apps/start_app.tsx | 80 ----------- .../infra/public/apps/start_legacy_app.tsx | 100 ------------- .../alerting/inventory/expression.tsx | 4 + .../metric_inventory_threshold_alert_type.ts | 4 +- .../alerting/inventory/validation.tsx | 4 +- .../logs/expression_editor/editor.tsx | 4 + .../alerting/logs/log_threshold_alert_type.ts | 4 +- x-pack/plugins/infra/public/compose_libs.ts | 99 ------------- .../containers/with_state_from_location.tsx | 131 ------------------ .../public/graphql/log_entries.gql_query.ts | 44 ------ .../public/hooks/use_link_props.test.tsx | 14 +- x-pack/plugins/infra/public/index.ts | 5 +- .../observable_api/kibana_observable_api.ts | 45 ------ x-pack/plugins/infra/public/lib/lib.ts | 94 +------------ .../link_to/redirect_to_node_logs.test.tsx | 12 +- .../pages/link_to/redirect_to_node_logs.tsx | 2 +- .../infra/public/pages/logs/page_content.tsx | 1 + .../inventory_view/components/table_view.tsx | 2 +- .../inventory_view/hooks/use_waffle_time.ts | 4 +- .../metric_detail/hooks/metrics_time.test.tsx | 33 ++++- x-pack/plugins/infra/public/plugin.ts | 99 +++++-------- x-pack/plugins/infra/public/routers/index.ts | 15 -- .../infra/public/routers/logs_router.tsx | 31 ----- .../infra/public/routers/metrics_router.tsx | 41 ------ x-pack/plugins/infra/public/types.ts | 25 ++++ .../infra/public/utils/apollo_client.ts | 85 ++++++++++++ .../public/utils/triggers_actions_context.tsx | 6 +- .../infra/public/utils/use_url_state.ts | 3 +- 36 files changed, 528 insertions(+), 780 deletions(-) create mode 100644 x-pack/plugins/infra/public/apps/common_providers.tsx create mode 100644 x-pack/plugins/infra/public/apps/common_styles.ts create mode 100644 x-pack/plugins/infra/public/apps/legacy_app.tsx create mode 100644 x-pack/plugins/infra/public/apps/logs_app.tsx create mode 100644 x-pack/plugins/infra/public/apps/metrics_app.tsx delete mode 100644 x-pack/plugins/infra/public/apps/start_app.tsx delete mode 100644 x-pack/plugins/infra/public/apps/start_legacy_app.tsx delete mode 100644 x-pack/plugins/infra/public/compose_libs.ts delete mode 100644 x-pack/plugins/infra/public/containers/with_state_from_location.tsx delete mode 100644 x-pack/plugins/infra/public/graphql/log_entries.gql_query.ts delete mode 100644 x-pack/plugins/infra/public/lib/adapters/observable_api/kibana_observable_api.ts delete mode 100644 x-pack/plugins/infra/public/routers/index.ts delete mode 100644 x-pack/plugins/infra/public/routers/logs_router.tsx delete mode 100644 x-pack/plugins/infra/public/routers/metrics_router.tsx create mode 100644 x-pack/plugins/infra/public/types.ts create mode 100644 x-pack/plugins/infra/public/utils/apollo_client.ts diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx index 7a71bb68bc54f..d5d61733e8717 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx @@ -384,3 +384,7 @@ export const Expressions: React.FC = (props) => { ); }; + +// required for dynamic import +// eslint-disable-next-line import/no-default-export +export default Expressions; diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/validation.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/validation.tsx index 2d9524ca158c8..da342f0a45420 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/validation.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/validation.tsx @@ -5,7 +5,6 @@ */ import { i18n } from '@kbn/i18n'; -import { isNumber } from 'lodash'; import { MetricExpressionParams, Comparator, @@ -106,3 +105,5 @@ export function validateMetricThreshold({ return validationResult; } + +const isNumber = (value: unknown): value is number => typeof value === 'number'; diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/index.ts b/x-pack/plugins/infra/public/alerting/metric_threshold/index.ts index a40cb1eaec50c..6a999a86c99d1 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/index.ts +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/index.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; +import React from 'react'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AlertTypeModel } from '../../../../triggers_actions_ui/public/types'; -import { Expressions } from './components/expression'; import { validateMetricThreshold } from './components/validation'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { METRIC_THRESHOLD_ALERT_TYPE_ID } from '../../../server/lib/alerting/metric_threshold/types'; @@ -18,7 +18,7 @@ export function createMetricThresholdAlertType(): AlertTypeModel { defaultMessage: 'Metric threshold', }), iconClass: 'bell', - alertParamsExpression: Expressions, + alertParamsExpression: React.lazy(() => import('./components/expression')), validate: validateMetricThreshold, defaultActionMessage: i18n.translate( 'xpack.infra.metrics.alerting.threshold.defaultActionMessage', diff --git a/x-pack/plugins/infra/public/apps/common_providers.tsx b/x-pack/plugins/infra/public/apps/common_providers.tsx new file mode 100644 index 0000000000000..facb0f1539a10 --- /dev/null +++ b/x-pack/plugins/infra/public/apps/common_providers.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { CoreStart } from 'kibana/public'; +import { ApolloClient } from 'apollo-client'; +import { + useUiSetting$, + KibanaContextProvider, +} from '../../../../../src/plugins/kibana_react/public'; +import { TriggersActionsProvider } from '../utils/triggers_actions_context'; +import { ClientPluginDeps } from '../types'; +import { TriggersAndActionsUIPublicPluginStart } from '../../../triggers_actions_ui/public'; +import { ApolloClientContext } from '../utils/apollo_context'; +import { EuiThemeProvider } from '../../../observability/public'; +import { NavigationWarningPromptProvider } from '../utils/navigation_warning_prompt'; + +export const CommonInfraProviders: React.FC<{ + apolloClient: ApolloClient<{}>; + triggersActionsUI: TriggersAndActionsUIPublicPluginStart; +}> = ({ apolloClient, children, triggersActionsUI }) => { + const [darkMode] = useUiSetting$('theme:darkMode'); + + return ( + + + + {children} + + + + ); +}; + +export const CoreProviders: React.FC<{ + core: CoreStart; + plugins: ClientPluginDeps; +}> = ({ children, core, plugins }) => { + return ( + + {children} + + ); +}; diff --git a/x-pack/plugins/infra/public/apps/common_styles.ts b/x-pack/plugins/infra/public/apps/common_styles.ts new file mode 100644 index 0000000000000..546b83a69035c --- /dev/null +++ b/x-pack/plugins/infra/public/apps/common_styles.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const CONTAINER_CLASSNAME = 'infra-container-element'; + +export const prepareMountElement = (element: HTMLElement) => { + // Ensure the element we're handed from application mounting is assigned a class + // for our index.scss styles to apply to. + element.classList.add(CONTAINER_CLASSNAME); +}; diff --git a/x-pack/plugins/infra/public/apps/legacy_app.tsx b/x-pack/plugins/infra/public/apps/legacy_app.tsx new file mode 100644 index 0000000000000..195f252c6b60f --- /dev/null +++ b/x-pack/plugins/infra/public/apps/legacy_app.tsx @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiErrorBoundary } from '@elastic/eui'; +import { createBrowserHistory, History } from 'history'; +import { AppMountParameters } from 'kibana/public'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Route, RouteProps, Router, Switch } from 'react-router-dom'; +import url from 'url'; + +// This exists purely to facilitate legacy app/infra URL redirects. +// It will be removed in 8.0.0. +export async function renderApp({ element }: AppMountParameters) { + const history = createBrowserHistory(); + + ReactDOM.render(, element); + + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +} + +const LegacyApp: React.FunctionComponent<{ history: History }> = ({ history }) => { + return ( + + + + { + if (!location) { + return null; + } + + let nextPath = ''; + let nextBasePath = ''; + let nextSearch; + + if ( + location.hash.indexOf('#infrastructure') > -1 || + location.hash.indexOf('#/infrastructure') > -1 + ) { + nextPath = location.hash.replace( + new RegExp( + '#infrastructure/|#/infrastructure/|#/infrastructure|#infrastructure', + 'g' + ), + '' + ); + nextBasePath = location.pathname.replace('app/infra', 'app/metrics'); + } else if ( + location.hash.indexOf('#logs') > -1 || + location.hash.indexOf('#/logs') > -1 + ) { + nextPath = location.hash.replace( + new RegExp('#logs/|#/logs/|#/logs|#logs', 'g'), + '' + ); + nextBasePath = location.pathname.replace('app/infra', 'app/logs'); + } else { + // This covers /app/infra and /app/infra/home (both of which used to render + // the metrics inventory page) + nextPath = 'inventory'; + nextBasePath = location.pathname.replace('app/infra', 'app/metrics'); + nextSearch = undefined; + } + + // app/infra#infrastructure/metrics/:type/:node was changed to app/metrics/detail/:type/:node, this + // accounts for that edge case + nextPath = nextPath.replace('metrics/', 'detail/'); + + // Query parameters (location.search) will arrive as part of location.hash and not location.search + const nextPathParts = nextPath.split('?'); + nextPath = nextPathParts[0]; + nextSearch = nextPathParts[1] ? nextPathParts[1] : undefined; + + let nextUrl = url.format({ + pathname: `${nextBasePath}/${nextPath}`, + hash: undefined, + search: nextSearch, + }); + + nextUrl = nextUrl.replace('//', '/'); + + window.location.href = nextUrl; + + return null; + }} + /> + + + + ); +}; diff --git a/x-pack/plugins/infra/public/apps/logs_app.tsx b/x-pack/plugins/infra/public/apps/logs_app.tsx new file mode 100644 index 0000000000000..e0251522bb24c --- /dev/null +++ b/x-pack/plugins/infra/public/apps/logs_app.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ApolloClient } from 'apollo-client'; +import { History } from 'history'; +import { CoreStart } from 'kibana/public'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Route, Router, Switch } from 'react-router-dom'; +import { AppMountParameters } from '../../../../../src/core/public'; +import '../index.scss'; +import { NotFoundPage } from '../pages/404'; +import { LinkToLogsPage } from '../pages/link_to/link_to_logs'; +import { LogsPage } from '../pages/logs'; +import { ClientPluginDeps } from '../types'; +import { createApolloClient } from '../utils/apollo_client'; +import { CommonInfraProviders, CoreProviders } from './common_providers'; +import { prepareMountElement } from './common_styles'; + +export const renderApp = ( + core: CoreStart, + plugins: ClientPluginDeps, + { element, history }: AppMountParameters +) => { + const apolloClient = createApolloClient(core.http.fetch); + + prepareMountElement(element); + + ReactDOM.render( + , + element + ); + + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +}; + +const LogsApp: React.FC<{ + apolloClient: ApolloClient<{}>; + core: CoreStart; + history: History; + plugins: ClientPluginDeps; +}> = ({ apolloClient, core, history, plugins }) => { + const uiCapabilities = core.application.capabilities; + + return ( + + + + + + {uiCapabilities?.logs?.show && } + + + + + + ); +}; diff --git a/x-pack/plugins/infra/public/apps/metrics_app.tsx b/x-pack/plugins/infra/public/apps/metrics_app.tsx new file mode 100644 index 0000000000000..8713abe0510a6 --- /dev/null +++ b/x-pack/plugins/infra/public/apps/metrics_app.tsx @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ApolloClient } from 'apollo-client'; +import { History } from 'history'; +import { CoreStart } from 'kibana/public'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Route, Router, Switch } from 'react-router-dom'; +import { AppMountParameters } from '../../../../../src/core/public'; +import '../index.scss'; +import { NotFoundPage } from '../pages/404'; +import { LinkToMetricsPage } from '../pages/link_to/link_to_metrics'; +import { InfrastructurePage } from '../pages/metrics'; +import { MetricDetail } from '../pages/metrics/metric_detail'; +import { ClientPluginDeps } from '../types'; +import { createApolloClient } from '../utils/apollo_client'; +import { RedirectWithQueryParams } from '../utils/redirect_with_query_params'; +import { CommonInfraProviders, CoreProviders } from './common_providers'; +import { prepareMountElement } from './common_styles'; + +export const renderApp = ( + core: CoreStart, + plugins: ClientPluginDeps, + { element, history }: AppMountParameters +) => { + const apolloClient = createApolloClient(core.http.fetch); + + prepareMountElement(element); + + ReactDOM.render( + , + element + ); + + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +}; + +const MetricsApp: React.FC<{ + apolloClient: ApolloClient<{}>; + core: CoreStart; + history: History; + plugins: ClientPluginDeps; +}> = ({ apolloClient, core, history, plugins }) => { + const uiCapabilities = core.application.capabilities; + + return ( + + + + + + {uiCapabilities?.infrastructure?.show && ( + + )} + {uiCapabilities?.infrastructure?.show && ( + + )} + {uiCapabilities?.infrastructure?.show && ( + + )} + {uiCapabilities?.infrastructure?.show && ( + + )} + {uiCapabilities?.infrastructure?.show && ( + + )} + + + + + + ); +}; diff --git a/x-pack/plugins/infra/public/apps/start_app.tsx b/x-pack/plugins/infra/public/apps/start_app.tsx deleted file mode 100644 index 4c213700b62e6..0000000000000 --- a/x-pack/plugins/infra/public/apps/start_app.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import ReactDOM from 'react-dom'; -import { ApolloProvider } from 'react-apollo'; -import { CoreStart, AppMountParameters } from 'kibana/public'; - -// TODO use theme provided from parentApp when kibana supports it -import { EuiErrorBoundary } from '@elastic/eui'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { EuiThemeProvider } from '../../../observability/public/typings/eui_styled_components'; -import { InfraFrontendLibs } from '../lib/lib'; -import { ApolloClientContext } from '../utils/apollo_context'; -import { HistoryContext } from '../utils/history_context'; -import { - useUiSetting$, - KibanaContextProvider, -} from '../../../../../src/plugins/kibana_react/public'; -import { AppRouter } from '../routers'; -import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public'; -import { TriggersActionsProvider } from '../utils/triggers_actions_context'; -import '../index.scss'; -import { NavigationWarningPromptProvider } from '../utils/navigation_warning_prompt'; - -export const CONTAINER_CLASSNAME = 'infra-container-element'; - -export async function startApp( - libs: InfraFrontendLibs, - core: CoreStart, - plugins: object, - params: AppMountParameters, - Router: AppRouter, - triggersActionsUI: TriggersAndActionsUIPublicPluginSetup -) { - const { element, history } = params; - - const InfraPluginRoot: React.FunctionComponent = () => { - const [darkMode] = useUiSetting$('theme:darkMode'); - - return ( - - - - - - - - - - - - - - - - - - ); - }; - - const App: React.FunctionComponent = () => ( - - - - ); - - // Ensure the element we're handed from application mounting is assigned a class - // for our index.scss styles to apply to. - element.className += ` ${CONTAINER_CLASSNAME}`; - - ReactDOM.render(, element); - - return () => { - ReactDOM.unmountComponentAtNode(element); - }; -} diff --git a/x-pack/plugins/infra/public/apps/start_legacy_app.tsx b/x-pack/plugins/infra/public/apps/start_legacy_app.tsx deleted file mode 100644 index 6e5960ceb2081..0000000000000 --- a/x-pack/plugins/infra/public/apps/start_legacy_app.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { createBrowserHistory } from 'history'; -import React from 'react'; -import url from 'url'; -import ReactDOM from 'react-dom'; -import { AppMountParameters } from 'kibana/public'; -import { Route, Router, Switch, RouteProps } from 'react-router-dom'; -// TODO use theme provided from parentApp when kibana supports it -import { EuiErrorBoundary } from '@elastic/eui'; - -// This exists purely to facilitate legacy app/infra URL redirects. -// It will be removed in 8.0.0. -export async function startLegacyApp(params: AppMountParameters) { - const { element } = params; - const history = createBrowserHistory(); - - const App: React.FunctionComponent = () => { - return ( - - - - { - if (!location) { - return null; - } - - let nextPath = ''; - let nextBasePath = ''; - let nextSearch; - - if ( - location.hash.indexOf('#infrastructure') > -1 || - location.hash.indexOf('#/infrastructure') > -1 - ) { - nextPath = location.hash.replace( - new RegExp( - '#infrastructure/|#/infrastructure/|#/infrastructure|#infrastructure', - 'g' - ), - '' - ); - nextBasePath = location.pathname.replace('app/infra', 'app/metrics'); - } else if ( - location.hash.indexOf('#logs') > -1 || - location.hash.indexOf('#/logs') > -1 - ) { - nextPath = location.hash.replace( - new RegExp('#logs/|#/logs/|#/logs|#logs', 'g'), - '' - ); - nextBasePath = location.pathname.replace('app/infra', 'app/logs'); - } else { - // This covers /app/infra and /app/infra/home (both of which used to render - // the metrics inventory page) - nextPath = 'inventory'; - nextBasePath = location.pathname.replace('app/infra', 'app/metrics'); - nextSearch = undefined; - } - - // app/inra#infrastructure/metrics/:type/:node was changed to app/metrics/detail/:type/:node, this - // accounts for that edge case - nextPath = nextPath.replace('metrics/', 'detail/'); - - // Query parameters (location.search) will arrive as part of location.hash and not location.search - const nextPathParts = nextPath.split('?'); - nextPath = nextPathParts[0]; - nextSearch = nextPathParts[1] ? nextPathParts[1] : undefined; - - let nextUrl = url.format({ - pathname: `${nextBasePath}/${nextPath}`, - hash: undefined, - search: nextSearch, - }); - - nextUrl = nextUrl.replace('//', '/'); - - window.location.href = nextUrl; - - return null; - }} - /> - - - - ); - }; - - ReactDOM.render(, element); - - return () => { - ReactDOM.unmountComponentAtNode(element); - }; -} diff --git a/x-pack/plugins/infra/public/components/alerting/inventory/expression.tsx b/x-pack/plugins/infra/public/components/alerting/inventory/expression.tsx index 074464fb55414..ce14897991e60 100644 --- a/x-pack/plugins/infra/public/components/alerting/inventory/expression.tsx +++ b/x-pack/plugins/infra/public/components/alerting/inventory/expression.tsx @@ -336,6 +336,10 @@ export const Expressions: React.FC = (props) => { ); }; +// required for dynamic import +// eslint-disable-next-line import/no-default-export +export default Expressions; + interface ExpressionRowProps { nodeType: InventoryItemType; expressionId: number; diff --git a/x-pack/plugins/infra/public/components/alerting/inventory/metric_inventory_threshold_alert_type.ts b/x-pack/plugins/infra/public/components/alerting/inventory/metric_inventory_threshold_alert_type.ts index 9ede2d2a47727..0cb564ec2194e 100644 --- a/x-pack/plugins/infra/public/components/alerting/inventory/metric_inventory_threshold_alert_type.ts +++ b/x-pack/plugins/infra/public/components/alerting/inventory/metric_inventory_threshold_alert_type.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; +import React from 'react'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AlertTypeModel } from '../../../../../triggers_actions_ui/public/types'; -import { Expressions } from './expression'; import { validateMetricThreshold } from './validation'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID } from '../../../../server/lib/alerting/inventory_metric_threshold/types'; @@ -18,7 +18,7 @@ export function getInventoryMetricAlertType(): AlertTypeModel { defaultMessage: 'Inventory', }), iconClass: 'bell', - alertParamsExpression: Expressions, + alertParamsExpression: React.lazy(() => import('./expression')), validate: validateMetricThreshold, defaultActionMessage: i18n.translate( 'xpack.infra.metrics.alerting.inventory.threshold.defaultActionMessage', diff --git a/x-pack/plugins/infra/public/components/alerting/inventory/validation.tsx b/x-pack/plugins/infra/public/components/alerting/inventory/validation.tsx index 441adeec988c7..47ecd3c527fad 100644 --- a/x-pack/plugins/infra/public/components/alerting/inventory/validation.tsx +++ b/x-pack/plugins/infra/public/components/alerting/inventory/validation.tsx @@ -6,8 +6,6 @@ import { i18n } from '@kbn/i18n'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { isNumber } from 'lodash'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { MetricExpressionParams } from '../../../../server/lib/alerting/metric_threshold/types'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ValidationResult } from '../../../../../triggers_actions_ui/public/types'; @@ -95,3 +93,5 @@ export function validateMetricThreshold({ return validationResult; } + +const isNumber = (value: unknown): value is number => typeof value === 'number'; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx b/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx index 609f99805fe9c..a3a48d477425b 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx +++ b/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx @@ -236,3 +236,7 @@ export const Editor: React.FC = (props) => { ); }; + +// required for dynamic import +// eslint-disable-next-line import/no-default-export +export default Editor; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold_alert_type.ts b/x-pack/plugins/infra/public/components/alerting/logs/log_threshold_alert_type.ts index 9bba8bd804f80..4c7811f0d9666 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold_alert_type.ts +++ b/x-pack/plugins/infra/public/components/alerting/logs/log_threshold_alert_type.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; +import React from 'react'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AlertTypeModel } from '../../../../../triggers_actions_ui/public/types'; import { LOG_DOCUMENT_COUNT_ALERT_TYPE_ID } from '../../../../common/alerting/logs/types'; -import { ExpressionEditor } from './expression_editor'; import { validateExpression } from './validation'; export function getAlertType(): AlertTypeModel { @@ -17,7 +17,7 @@ export function getAlertType(): AlertTypeModel { defaultMessage: 'Log threshold', }), iconClass: 'bell', - alertParamsExpression: ExpressionEditor, + alertParamsExpression: React.lazy(() => import('./expression_editor/editor')), validate: validateExpression, defaultActionMessage: i18n.translate( 'xpack.infra.logs.alerting.threshold.defaultActionMessage', diff --git a/x-pack/plugins/infra/public/compose_libs.ts b/x-pack/plugins/infra/public/compose_libs.ts deleted file mode 100644 index f2060983e95eb..0000000000000 --- a/x-pack/plugins/infra/public/compose_libs.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'; -import ApolloClient from 'apollo-client'; -import { ApolloLink } from 'apollo-link'; -import { createHttpLink } from 'apollo-link-http'; -import { withClientState } from 'apollo-link-state'; -import { CoreStart, HttpFetchOptions } from 'src/core/public'; -import { InfraFrontendLibs } from './lib/lib'; -import introspectionQueryResultData from './graphql/introspection.json'; -import { InfraKibanaObservableApiAdapter } from './lib/adapters/observable_api/kibana_observable_api'; - -export function composeLibs(core: CoreStart) { - const cache = new InMemoryCache({ - addTypename: false, - fragmentMatcher: new IntrospectionFragmentMatcher({ - introspectionQueryResultData, - }), - }); - - const observableApi = new InfraKibanaObservableApiAdapter({ - basePath: core.http.basePath.get(), - }); - - const wrappedFetch = (path: string, options: HttpFetchOptions) => { - return new Promise(async (resolve, reject) => { - // core.http.fetch isn't 100% compatible with the Fetch API and will - // throw Errors on 401s. This top level try / catch handles those scenarios. - try { - core.http - .fetch(path, { - ...options, - // Set headers to undefined due to this bug: https://github.com/apollographql/apollo-link/issues/249, - // Apollo will try to set a "content-type" header which will conflict with the "Content-Type" header that - // core.http.fetch correctly sets. - headers: undefined, - asResponse: true, - }) - .then((res) => { - if (!res.response) { - return reject(); - } - // core.http.fetch will parse the Response and set a body before handing it back. As such .text() / .json() - // will have already been called on the Response instance. However, Apollo will also want to call - // .text() / .json() on the instance, as it expects the raw Response instance, rather than core's wrapper. - // .text() / .json() can only be called once, and an Error will be thrown if those methods are accessed again. - // This hacks around that by setting up a new .text() method that will restringify the JSON response we already have. - // This does result in an extra stringify / parse cycle, which isn't ideal, but as we only have a few endpoints left using - // GraphQL this shouldn't create excessive overhead. - // Ref: https://github.com/apollographql/apollo-link/blob/master/packages/apollo-link-http/src/httpLink.ts#L134 - // and - // https://github.com/apollographql/apollo-link/blob/master/packages/apollo-link-http-common/src/index.ts#L125 - return resolve({ - ...res.response, - text: () => { - return new Promise(async (resolveText, rejectText) => { - if (res.body) { - return resolveText(JSON.stringify(res.body)); - } else { - return rejectText(); - } - }); - }, - }); - }); - } catch (error) { - reject(error); - } - }); - }; - - const HttpLink = createHttpLink({ - fetch: wrappedFetch, - uri: `/api/infra/graphql`, - }); - - const graphQLOptions = { - cache, - link: ApolloLink.from([ - withClientState({ - cache, - resolvers: {}, - }), - HttpLink, - ]), - }; - - const apolloClient = new ApolloClient(graphQLOptions); - - const libs: InfraFrontendLibs = { - apolloClient, - observableApi, - }; - return libs; -} diff --git a/x-pack/plugins/infra/public/containers/with_state_from_location.tsx b/x-pack/plugins/infra/public/containers/with_state_from_location.tsx deleted file mode 100644 index 2a9676046d451..0000000000000 --- a/x-pack/plugins/infra/public/containers/with_state_from_location.tsx +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { parse, stringify } from 'query-string'; -import { Location } from 'history'; -import { omit } from 'lodash'; -import React from 'react'; -import { RouteComponentProps, withRouter } from 'react-router-dom'; -// eslint-disable-next-line @typescript-eslint/camelcase -import { decode_object, encode_object } from 'rison-node'; -import { Omit } from '../lib/lib'; - -interface AnyObject { - [key: string]: any; -} - -interface WithStateFromLocationOptions { - mapLocationToState: (location: Location) => StateInLocation; - mapStateToLocation: (state: StateInLocation, location: Location) => Location; -} - -type InjectedPropsFromLocation = Partial & { - pushStateInLocation?: (state: StateInLocation) => void; - replaceStateInLocation?: (state: StateInLocation) => void; -}; - -export const withStateFromLocation = ({ - mapLocationToState, - mapStateToLocation, -}: WithStateFromLocationOptions) => < - WrappedComponentProps extends InjectedPropsFromLocation ->( - WrappedComponent: React.ComponentType -) => { - const wrappedName = WrappedComponent.displayName || WrappedComponent.name; - - return withRouter( - class WithStateFromLocation extends React.PureComponent< - RouteComponentProps<{}> & - Omit> - > { - public static displayName = `WithStateFromLocation(${wrappedName})`; - - public render() { - const { location } = this.props; - const otherProps = omit(this.props, ['location', 'history', 'match', 'staticContext']); - - const stateFromLocation = mapLocationToState(location); - - return ( - // @ts-ignore - - ); - } - - private pushStateInLocation = (state: StateInLocation) => { - const { history, location } = this.props; - - const newLocation = mapStateToLocation(state, this.props.location); - - if (newLocation !== location) { - history.push(newLocation); - } - }; - - private replaceStateInLocation = (state: StateInLocation) => { - const { history, location } = this.props; - - const newLocation = mapStateToLocation(state, this.props.location); - - if (newLocation !== location) { - history.replace(newLocation); - } - }; - } - ); -}; - -const decodeRisonAppState = (queryValues: { _a?: string }): AnyObject => { - try { - return queryValues && queryValues._a ? decode_object(queryValues._a) : {}; - } catch (error) { - if (error instanceof Error && error.message.startsWith('rison decoder error')) { - return {}; - } - throw error; - } -}; - -const encodeRisonAppState = (state: AnyObject) => ({ - _a: encode_object(state), -}); - -export const mapRisonAppLocationToState = ( - mapState: (risonAppState: AnyObject) => State = (state: AnyObject) => state as State -) => (location: Location): State => { - const queryValues = parse(location.search.substring(1), { sort: false }); - const decodedState = decodeRisonAppState(queryValues); - return mapState(decodedState); -}; - -export const mapStateToRisonAppLocation = ( - mapState: (state: State) => AnyObject = (state: State) => state -) => (state: State, location: Location): Location => { - const previousQueryValues = parse(location.search.substring(1), { sort: false }); - const previousState = decodeRisonAppState(previousQueryValues); - - const encodedState = encodeRisonAppState({ - ...previousState, - ...mapState(state), - }); - const newQueryValues = stringify( - { - ...previousQueryValues, - ...encodedState, - }, - { sort: false } - ); - return { - ...location, - search: `?${newQueryValues}`, - }; -}; diff --git a/x-pack/plugins/infra/public/graphql/log_entries.gql_query.ts b/x-pack/plugins/infra/public/graphql/log_entries.gql_query.ts deleted file mode 100644 index 41ff3c293a713..0000000000000 --- a/x-pack/plugins/infra/public/graphql/log_entries.gql_query.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import gql from 'graphql-tag'; - -import { sharedFragments } from '../../common/graphql/shared'; - -export const logEntriesQuery = gql` - query LogEntries( - $sourceId: ID = "default" - $timeKey: InfraTimeKeyInput! - $countBefore: Int = 0 - $countAfter: Int = 0 - $filterQuery: String - ) { - source(id: $sourceId) { - id - logEntriesAround( - key: $timeKey - countBefore: $countBefore - countAfter: $countAfter - filterQuery: $filterQuery - ) { - start { - ...InfraTimeKeyFields - } - end { - ...InfraTimeKeyFields - } - hasMoreBefore - hasMoreAfter - entries { - ...InfraLogEntryFields - } - } - } - } - - ${sharedFragments.InfraTimeKey} - ${sharedFragments.InfraLogEntryFields} -`; diff --git a/x-pack/plugins/infra/public/hooks/use_link_props.test.tsx b/x-pack/plugins/infra/public/hooks/use_link_props.test.tsx index f9cfaf71036f6..d93cc44c45623 100644 --- a/x-pack/plugins/infra/public/hooks/use_link_props.test.tsx +++ b/x-pack/plugins/infra/public/hooks/use_link_props.test.tsx @@ -4,15 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { encode } from 'rison-node'; -import { createMemoryHistory } from 'history'; import { renderHook } from '@testing-library/react-hooks'; +import { createMemoryHistory } from 'history'; import React from 'react'; -import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; -import { HistoryContext } from '../utils/history_context'; +import { Router } from 'react-router-dom'; +import { encode } from 'rison-node'; import { coreMock } from 'src/core/public/mocks'; -import { useLinkProps, LinkDescriptor } from './use_link_props'; import { ScopedHistory } from '../../../../../src/core/public'; +import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { LinkDescriptor, useLinkProps } from './use_link_props'; const PREFIX = '/test-basepath/s/test-space/app/'; @@ -30,9 +30,9 @@ const scopedHistory = new ScopedHistory(history, `${PREFIX}${INTERNAL_APP}`); const ProviderWrapper: React.FC = ({ children }) => { return ( - + {children}; - + ); }; diff --git a/x-pack/plugins/infra/public/index.ts b/x-pack/plugins/infra/public/index.ts index 1dfdf827f203b..8f2d37fa1daa9 100644 --- a/x-pack/plugins/infra/public/index.ts +++ b/x-pack/plugins/infra/public/index.ts @@ -4,8 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializerContext, PluginInitializer } from 'kibana/public'; -import { Plugin, ClientSetup, ClientStart, ClientPluginsSetup, ClientPluginsStart } from './plugin'; +import { PluginInitializer, PluginInitializerContext } from 'kibana/public'; +import { ClientSetup, ClientStart, Plugin } from './plugin'; +import { ClientPluginsSetup, ClientPluginsStart } from './types'; export const plugin: PluginInitializer< ClientSetup, diff --git a/x-pack/plugins/infra/public/lib/adapters/observable_api/kibana_observable_api.ts b/x-pack/plugins/infra/public/lib/adapters/observable_api/kibana_observable_api.ts deleted file mode 100644 index 9ae21d96886f3..0000000000000 --- a/x-pack/plugins/infra/public/lib/adapters/observable_api/kibana_observable_api.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { ajax } from 'rxjs/ajax'; -import { map } from 'rxjs/operators'; - -import { - InfraObservableApi, - InfraObservableApiPostParams, - InfraObservableApiResponse, -} from '../../lib'; - -export class InfraKibanaObservableApiAdapter implements InfraObservableApi { - private basePath: string; - private defaultHeaders: { - [headerName: string]: boolean | string; - }; - - constructor({ basePath }: { basePath: string }) { - this.basePath = basePath; - this.defaultHeaders = { - 'kbn-xsrf': true, - }; - } - - public post = ({ - url, - body, - }: InfraObservableApiPostParams): InfraObservableApiResponse => - ajax({ - body: body ? JSON.stringify(body) : undefined, - headers: { - ...this.defaultHeaders, - 'Content-Type': 'application/json', - }, - method: 'POST', - responseType: 'json', - timeout: 30000, - url: `${this.basePath}/api/${url}`, - withCredentials: true, - }).pipe(map(({ response, status }) => ({ response, status }))); -} diff --git a/x-pack/plugins/infra/public/lib/lib.ts b/x-pack/plugins/infra/public/lib/lib.ts index d1ca62b747a24..93f7ef644f795 100644 --- a/x-pack/plugins/infra/public/lib/lib.ts +++ b/x-pack/plugins/infra/public/lib/lib.ts @@ -4,102 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IModule, IScope } from 'angular'; -import { NormalizedCacheObject } from 'apollo-cache-inmemory'; -import ApolloClient from 'apollo-client'; -import { AxiosRequestConfig } from 'axios'; -import React from 'react'; -import { Observable } from 'rxjs'; -import * as rt from 'io-ts'; import { i18n } from '@kbn/i18n'; -import { SourceQuery } from '../graphql/types'; +import * as rt from 'io-ts'; import { - SnapshotMetricInput, - SnapshotGroupBy, InfraTimerangeInput, + SnapshotGroupBy, + SnapshotMetricInput, SnapshotNodeMetric, SnapshotNodePath, } from '../../common/http_api/snapshot_api'; +import { SourceQuery } from '../graphql/types'; import { WaffleSortOption } from '../pages/metrics/inventory_view/hooks/use_waffle_options'; -export interface InfraFrontendLibs { - apolloClient: InfraApolloClient; - observableApi: InfraObservableApi; -} - -export type InfraTimezoneProvider = () => string; - -export type InfraApolloClient = ApolloClient; - -export interface InfraFrameworkAdapter { - // Insstance vars - appState?: object; - kbnVersion?: string; - timezone?: string; - - // Methods - setUISettings(key: string, value: any): void; - render(component: React.ReactElement): void; - renderBreadcrumbs(component: React.ReactElement): void; -} - -export type InfraFramworkAdapterConstructable = new ( - uiModule: IModule, - timezoneProvider: InfraTimezoneProvider -) => InfraFrameworkAdapter; - -// TODO: replace AxiosRequestConfig with something more defined -export type InfraRequestConfig = AxiosRequestConfig; - -export interface InfraApiAdapter { - get(url: string, config?: InfraRequestConfig | undefined): Promise; - post(url: string, data?: any, config?: AxiosRequestConfig | undefined): Promise; - delete(url: string, config?: InfraRequestConfig | undefined): Promise; - put(url: string, data?: any, config?: InfraRequestConfig | undefined): Promise; -} - -export interface InfraObservableApiPostParams { - url: string; - body?: RequestBody; -} - -export type InfraObservableApiResponse = Observable<{ - status: number; - response: BodyType; -}>; - -export interface InfraObservableApi { - post( - params: InfraObservableApiPostParams - ): InfraObservableApiResponse; -} - -export interface InfraUiKibanaAdapterScope extends IScope { - breadcrumbs: any[]; - topNavMenu: any[]; -} - -export interface InfraKibanaUIConfig { - get(key: string): any; - set(key: string, value: any): Promise; -} - -export interface InfraKibanaAdapterServiceRefs { - config: InfraKibanaUIConfig; - rootScope: IScope; -} - -export type InfraBufferedKibanaServiceCall = (serviceRefs: ServiceRefs) => void; - -export interface InfraField { - name: string; - type: string; - searchable: boolean; - aggregatable: boolean; -} - -export type InfraWaffleData = InfraWaffleMapGroup[]; - export interface InfraWaffleMapNode { pathId: string; id: string; @@ -221,8 +137,6 @@ export interface InfraOptions { wafflemap: InfraWaffleMapOptions; } -export type Omit = Pick>; - export interface InfraWaffleMapBounds { min: number; max: number; diff --git a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.test.tsx b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.test.tsx index 1394fc48107ef..e62b29974674a 100644 --- a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.test.tsx +++ b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.test.tsx @@ -35,7 +35,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -47,7 +47,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -59,7 +59,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -73,7 +73,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -89,7 +89,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -103,7 +103,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); diff --git a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx index d9aaa2da7bbc8..10320ebbe7609 100644 --- a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx +++ b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx @@ -71,7 +71,7 @@ export const RedirectToNodeLogs = ({ replaceSourceIdInQueryString(sourceId) )(''); - return ; + return ; }; export const getNodeLogsUrl = ({ diff --git a/x-pack/plugins/infra/public/pages/logs/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/page_content.tsx index 2974939a83215..14c53557ba2c7 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_content.tsx @@ -96,6 +96,7 @@ export const LogsPageContent: React.FunctionComponent = () => { + ); diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/table_view.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/table_view.tsx index 3b68ad314f7df..764eeb154d346 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/table_view.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/table_view.tsx @@ -15,7 +15,7 @@ import { fieldToName } from '../lib/field_to_display_name'; import { NodeContextMenu } from './waffle/node_context_menu'; import { InventoryItemType } from '../../../../../common/inventory_models/types'; import { SnapshotNode, SnapshotNodePath } from '../../../../../common/http_api/snapshot_api'; -import { CONTAINER_CLASSNAME } from '../../../../apps/start_app'; +import { CONTAINER_CLASSNAME } from '../../../../apps/common_styles'; interface Props { nodes: SnapshotNode[]; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_time.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_time.ts index 91cf405dcc759..9a1fbee421294 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_time.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_time.ts @@ -26,7 +26,9 @@ export const useWaffleTime = () => { const [state, setState] = useState(urlState); - useEffect(() => setUrlState(state), [setUrlState, state]); + useEffect(() => { + setUrlState(state); + }, [setUrlState, state]); const { currentTime, isAutoReloading } = urlState; diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/metrics_time.test.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/metrics_time.test.tsx index 17fcc05406470..d2076ad6df502 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/metrics_time.test.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/metrics_time.test.tsx @@ -4,14 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ +import { createMemoryHistory } from 'history'; +import React from 'react'; +import { Router } from 'react-router-dom'; import { mountHook } from 'test_utils/enzyme_helpers'; - +import { ScopedHistory } from '../../../../../../../../src/core/public'; import { useMetricsTime } from './use_metrics_time'; describe('useMetricsTime hook', () => { describe('timeRange state', () => { it('has a default value', () => { - const { getLastHookValue } = mountHook(() => useMetricsTime().timeRange); + const { getLastHookValue } = mountHook( + () => useMetricsTime().timeRange, + createProviderWrapper() + ); const hookValue = getLastHookValue(); expect(hookValue).toHaveProperty('from'); expect(hookValue).toHaveProperty('to'); @@ -19,7 +25,7 @@ describe('useMetricsTime hook', () => { }); it('can be updated', () => { - const { act, getLastHookValue } = mountHook(() => useMetricsTime()); + const { act, getLastHookValue } = mountHook(() => useMetricsTime(), createProviderWrapper()); const timeRange = { from: 'now-15m', @@ -37,12 +43,15 @@ describe('useMetricsTime hook', () => { describe('AutoReloading state', () => { it('has a default value', () => { - const { getLastHookValue } = mountHook(() => useMetricsTime().isAutoReloading); + const { getLastHookValue } = mountHook( + () => useMetricsTime().isAutoReloading, + createProviderWrapper() + ); expect(getLastHookValue()).toBe(false); }); it('can be updated', () => { - const { act, getLastHookValue } = mountHook(() => useMetricsTime()); + const { act, getLastHookValue } = mountHook(() => useMetricsTime(), createProviderWrapper()); act(({ setAutoReload }) => { setAutoReload(true); @@ -52,3 +61,17 @@ describe('useMetricsTime hook', () => { }); }); }); + +const createProviderWrapper = () => { + const INITIAL_URL = '/test-basepath/s/test-space/app/metrics'; + const history = createMemoryHistory(); + + history.push(INITIAL_URL); + const scopedHistory = new ScopedHistory(history, INITIAL_URL); + + const ProviderWrapper: React.FC = ({ children }) => { + return {children}; + }; + + return ProviderWrapper; +}; diff --git a/x-pack/plugins/infra/public/plugin.ts b/x-pack/plugins/infra/public/plugin.ts index deae78e22c6a1..b3765db43335a 100644 --- a/x-pack/plugins/infra/public/plugin.ts +++ b/x-pack/plugins/infra/public/plugin.ts @@ -4,54 +4,29 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; -import { merge } from 'lodash'; import { - Plugin as PluginClass, + AppMountParameters, CoreSetup, CoreStart, + Plugin as PluginClass, PluginInitializerContext, - AppMountParameters, } from 'kibana/public'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/public'; +import { createMetricThresholdAlertType } from './alerting/metric_threshold'; +import { getInventoryMetricAlertType } from './components/alerting/inventory/metric_inventory_threshold_alert_type'; +import { getAlertType as getLogsAlertType } from './components/alerting/logs/log_threshold_alert_type'; import { registerStartSingleton } from './legacy_singletons'; import { registerFeatures } from './register_feature'; -import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; -import { DataPublicPluginSetup, DataPublicPluginStart } from '../../../../src/plugins/data/public'; -import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/public'; -import { DataEnhancedSetup, DataEnhancedStart } from '../../data_enhanced/public'; - -import { TriggersAndActionsUIPublicPluginSetup } from '../../../plugins/triggers_actions_ui/public'; -import { getAlertType as getLogsAlertType } from './components/alerting/logs/log_threshold_alert_type'; -import { getInventoryMetricAlertType } from './components/alerting/inventory/metric_inventory_threshold_alert_type'; -import { createMetricThresholdAlertType } from './alerting/metric_threshold'; +import { ClientPluginsSetup, ClientPluginsStart } from './types'; export type ClientSetup = void; export type ClientStart = void; -export interface ClientPluginsSetup { - home: HomePublicPluginSetup; - data: DataPublicPluginSetup; - usageCollection: UsageCollectionSetup; - dataEnhanced: DataEnhancedSetup; - triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; -} - -export interface ClientPluginsStart { - data: DataPublicPluginStart; - dataEnhanced: DataEnhancedStart; -} - -export type InfraPlugins = ClientPluginsSetup & ClientPluginsStart; - -const getMergedPlugins = (setup: ClientPluginsSetup, start: ClientPluginsStart): InfraPlugins => { - return merge({}, setup, start); -}; - export class Plugin implements PluginClass { - constructor(context: PluginInitializerContext) {} + constructor(_context: PluginInitializerContext) {} - setup(core: CoreSetup, pluginsSetup: ClientPluginsSetup) { + setup(core: CoreSetup, pluginsSetup: ClientPluginsSetup) { registerFeatures(pluginsSetup.home); pluginsSetup.triggers_actions_ui.alertTypeRegistry.register(getInventoryMetricAlertType()); @@ -69,16 +44,18 @@ export class Plugin category: DEFAULT_APP_CATEGORIES.observability, mount: async (params: AppMountParameters) => { const [coreStart, pluginsStart] = await core.getStartServices(); - const plugins = getMergedPlugins(pluginsSetup, pluginsStart as ClientPluginsStart); - const { startApp, composeLibs, LogsRouter } = await this.downloadAssets(); + const { renderApp } = await import('./apps/logs_app'); - return startApp( - composeLibs(coreStart), + return renderApp( coreStart, - plugins, - params, - LogsRouter, - pluginsSetup.triggers_actions_ui + { + data: pluginsStart.data, + dataEnhanced: pluginsSetup.dataEnhanced, + home: pluginsSetup.home, + triggers_actions_ui: pluginsStart.triggers_actions_ui, + usageCollection: pluginsSetup.usageCollection, + }, + params ); }, }); @@ -94,16 +71,18 @@ export class Plugin category: DEFAULT_APP_CATEGORIES.observability, mount: async (params: AppMountParameters) => { const [coreStart, pluginsStart] = await core.getStartServices(); - const plugins = getMergedPlugins(pluginsSetup, pluginsStart as ClientPluginsStart); - const { startApp, composeLibs, MetricsRouter } = await this.downloadAssets(); + const { renderApp } = await import('./apps/metrics_app'); - return startApp( - composeLibs(coreStart), + return renderApp( coreStart, - plugins, - params, - MetricsRouter, - pluginsSetup.triggers_actions_ui + { + data: pluginsStart.data, + dataEnhanced: pluginsSetup.dataEnhanced, + home: pluginsSetup.home, + triggers_actions_ui: pluginsStart.triggers_actions_ui, + usageCollection: pluginsSetup.usageCollection, + }, + params ); }, }); @@ -116,28 +95,14 @@ export class Plugin title: 'infra', navLinkStatus: 3, mount: async (params: AppMountParameters) => { - const { startLegacyApp } = await import('./apps/start_legacy_app'); - return startLegacyApp(params); + const { renderApp } = await import('./apps/legacy_app'); + + return renderApp(params); }, }); } - start(core: CoreStart, plugins: ClientPluginsStart) { + start(core: CoreStart, _plugins: ClientPluginsStart) { registerStartSingleton(core); } - - private async downloadAssets() { - const [{ startApp }, { composeLibs }, { LogsRouter, MetricsRouter }] = await Promise.all([ - import('./apps/start_app'), - import('./compose_libs'), - import('./routers'), - ]); - - return { - startApp, - composeLibs, - LogsRouter, - MetricsRouter, - }; - } } diff --git a/x-pack/plugins/infra/public/routers/index.ts b/x-pack/plugins/infra/public/routers/index.ts deleted file mode 100644 index 71ab2613d8dc1..0000000000000 --- a/x-pack/plugins/infra/public/routers/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { History } from 'history'; - -export * from './logs_router'; -export * from './metrics_router'; - -interface RouterProps { - history: History; -} - -export type AppRouter = React.FC; diff --git a/x-pack/plugins/infra/public/routers/logs_router.tsx b/x-pack/plugins/infra/public/routers/logs_router.tsx deleted file mode 100644 index 8258f087b5872..0000000000000 --- a/x-pack/plugins/infra/public/routers/logs_router.tsx +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { Route, Router, Switch } from 'react-router-dom'; - -import { NotFoundPage } from '../pages/404'; -import { LinkToLogsPage } from '../pages/link_to'; -import { LogsPage } from '../pages/logs'; -import { RedirectWithQueryParams } from '../utils/redirect_with_query_params'; -import { useKibana } from '../../../../../src/plugins/kibana_react/public'; -import { AppRouter } from './index'; - -export const LogsRouter: AppRouter = ({ history }) => { - const uiCapabilities = useKibana().services.application?.capabilities; - return ( - - - - {uiCapabilities?.logs?.show && ( - - )} - {uiCapabilities?.logs?.show && } - - - - ); -}; diff --git a/x-pack/plugins/infra/public/routers/metrics_router.tsx b/x-pack/plugins/infra/public/routers/metrics_router.tsx deleted file mode 100644 index 0e427150a46cc..0000000000000 --- a/x-pack/plugins/infra/public/routers/metrics_router.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { Route, Router, Switch } from 'react-router-dom'; - -import { NotFoundPage } from '../pages/404'; -import { InfrastructurePage } from '../pages/metrics'; -import { MetricDetail } from '../pages/metrics/metric_detail'; -import { RedirectWithQueryParams } from '../utils/redirect_with_query_params'; -import { useKibana } from '../../../../../src/plugins/kibana_react/public'; -import { AppRouter } from './index'; -import { LinkToMetricsPage } from '../pages/link_to'; - -export const MetricsRouter: AppRouter = ({ history }) => { - const uiCapabilities = useKibana().services.application?.capabilities; - return ( - - - - {uiCapabilities?.infrastructure?.show && ( - - )} - {uiCapabilities?.infrastructure?.show && ( - - )} - {uiCapabilities?.infrastructure?.show && ( - - )} - {uiCapabilities?.infrastructure?.show && ( - - )} - {uiCapabilities?.infrastructure?.show && } - - - - ); -}; diff --git a/x-pack/plugins/infra/public/types.ts b/x-pack/plugins/infra/public/types.ts new file mode 100644 index 0000000000000..8181da3301c92 --- /dev/null +++ b/x-pack/plugins/infra/public/types.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DataPublicPluginStart } from '../../../../src/plugins/data/public'; +import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; +import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/public'; +import { TriggersAndActionsUIPublicPluginSetup } from '../../../plugins/triggers_actions_ui/public'; +import { DataEnhancedSetup } from '../../data_enhanced/public'; + +export interface ClientPluginsSetup { + dataEnhanced: DataEnhancedSetup; + home: HomePublicPluginSetup; + triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; + usageCollection: UsageCollectionSetup; +} + +export interface ClientPluginsStart { + data: DataPublicPluginStart; + triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; +} + +export type ClientPluginDeps = ClientPluginsSetup & ClientPluginsStart; diff --git a/x-pack/plugins/infra/public/utils/apollo_client.ts b/x-pack/plugins/infra/public/utils/apollo_client.ts new file mode 100644 index 0000000000000..3c69ef4c98fac --- /dev/null +++ b/x-pack/plugins/infra/public/utils/apollo_client.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'; +import ApolloClient from 'apollo-client'; +import { ApolloLink } from 'apollo-link'; +import { createHttpLink } from 'apollo-link-http'; +import { withClientState } from 'apollo-link-state'; +import { HttpFetchOptions, HttpHandler } from 'src/core/public'; +import introspectionQueryResultData from '../graphql/introspection.json'; + +export const createApolloClient = (fetch: HttpHandler) => { + const cache = new InMemoryCache({ + addTypename: false, + fragmentMatcher: new IntrospectionFragmentMatcher({ + introspectionQueryResultData, + }), + }); + + const wrappedFetch = (path: string, options: HttpFetchOptions) => { + return new Promise(async (resolve, reject) => { + // core.http.fetch isn't 100% compatible with the Fetch API and will + // throw Errors on 401s. This top level try / catch handles those scenarios. + try { + fetch(path, { + ...options, + // Set headers to undefined due to this bug: https://github.com/apollographql/apollo-link/issues/249, + // Apollo will try to set a "content-type" header which will conflict with the "Content-Type" header that + // core.http.fetch correctly sets. + headers: undefined, + asResponse: true, + }).then((res) => { + if (!res.response) { + return reject(); + } + // core.http.fetch will parse the Response and set a body before handing it back. As such .text() / .json() + // will have already been called on the Response instance. However, Apollo will also want to call + // .text() / .json() on the instance, as it expects the raw Response instance, rather than core's wrapper. + // .text() / .json() can only be called once, and an Error will be thrown if those methods are accessed again. + // This hacks around that by setting up a new .text() method that will restringify the JSON response we already have. + // This does result in an extra stringify / parse cycle, which isn't ideal, but as we only have a few endpoints left using + // GraphQL this shouldn't create excessive overhead. + // Ref: https://github.com/apollographql/apollo-link/blob/master/packages/apollo-link-http/src/httpLink.ts#L134 + // and + // https://github.com/apollographql/apollo-link/blob/master/packages/apollo-link-http-common/src/index.ts#L125 + return resolve({ + ...res.response, + text: () => { + return new Promise(async (resolveText, rejectText) => { + if (res.body) { + return resolveText(JSON.stringify(res.body)); + } else { + return rejectText(); + } + }); + }, + }); + }); + } catch (error) { + reject(error); + } + }); + }; + + const HttpLink = createHttpLink({ + fetch: wrappedFetch, + uri: `/api/infra/graphql`, + }); + + const graphQLOptions = { + cache, + link: ApolloLink.from([ + withClientState({ + cache, + resolvers: {}, + }), + HttpLink, + ]), + }; + + return new ApolloClient(graphQLOptions); +}; diff --git a/x-pack/plugins/infra/public/utils/triggers_actions_context.tsx b/x-pack/plugins/infra/public/utils/triggers_actions_context.tsx index 1cff3663280fd..6b51714893a6d 100644 --- a/x-pack/plugins/infra/public/utils/triggers_actions_context.tsx +++ b/x-pack/plugins/infra/public/utils/triggers_actions_context.tsx @@ -5,10 +5,10 @@ */ import * as React from 'react'; -import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public'; +import { TriggersAndActionsUIPublicPluginStart } from '../../../triggers_actions_ui/public'; interface ContextProps { - triggersActionsUI: TriggersAndActionsUIPublicPluginSetup | null; + triggersActionsUI: TriggersAndActionsUIPublicPluginStart | null; } export const TriggerActionsContext = React.createContext({ @@ -16,7 +16,7 @@ export const TriggerActionsContext = React.createContext({ }); interface Props { - triggersActionsUI: TriggersAndActionsUIPublicPluginSetup; + triggersActionsUI: TriggersAndActionsUIPublicPluginStart; } export const TriggersActionsProvider: React.FC = (props) => { diff --git a/x-pack/plugins/infra/public/utils/use_url_state.ts b/x-pack/plugins/infra/public/utils/use_url_state.ts index 7a63b48fa9a1a..ab0ca1311194f 100644 --- a/x-pack/plugins/infra/public/utils/use_url_state.ts +++ b/x-pack/plugins/infra/public/utils/use_url_state.ts @@ -8,10 +8,9 @@ import { parse, stringify } from 'query-string'; import { Location } from 'history'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { decode, encode, RisonValue } from 'rison-node'; +import { useHistory } from 'react-router-dom'; import { url } from '../../../../../src/plugins/kibana_utils/public'; -import { useHistory } from './history_context'; - export const useUrlState = ({ defaultState, decodeUrlState, From 4f2c199f0ed7cf461565cb021e7576046fd1573a Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Tue, 9 Jun 2020 15:05:50 -0700 Subject: [PATCH 63/91] Fix edit datasource not working following changes in #67234 (#68583) --- .../components/custom_configure_datasource.tsx | 3 ++- .../step_configure_datasource.tsx | 7 +++++-- .../agent_config/edit_datasource_page/index.tsx | 5 +++-- .../configure_datasource.tsx | 15 +++------------ 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/components/custom_configure_datasource.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/components/custom_configure_datasource.tsx index aff764cb8ba3e..4263feb7cd8c7 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/components/custom_configure_datasource.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/components/custom_configure_datasource.tsx @@ -12,7 +12,8 @@ import { CreateDatasourceFrom } from '../types'; export interface CustomConfigureDatasourceProps { packageName: string; from: CreateDatasourceFrom; - datasource: NewDatasource | (NewDatasource & { id: string }); + datasource: NewDatasource; + datasourceId?: string; } /** diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/step_configure_datasource.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/step_configure_datasource.tsx index d9cf0fbfb7987..5499ac287ff05 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/step_configure_datasource.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/step_configure_datasource.tsx @@ -16,7 +16,8 @@ import { CreateDatasourceFrom } from './types'; export const StepConfigureDatasource: React.FunctionComponent<{ from?: CreateDatasourceFrom; packageInfo: PackageInfo; - datasource: NewDatasource | (NewDatasource & { id: string }); + datasource: NewDatasource; + datasourceId?: string; updateDatasource: (fields: Partial) => void; validationResults: DatasourceValidationResults; submitAttempted: boolean; @@ -24,6 +25,7 @@ export const StepConfigureDatasource: React.FunctionComponent<{ from = 'config', packageInfo, datasource, + datasourceId, updateDatasource, validationResults, submitAttempted, @@ -70,9 +72,10 @@ export const StepConfigureDatasource: React.FunctionComponent<{ ) : ( ); diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_datasource_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_datasource_page/index.tsx index 4bb42faedf7f6..d47eea80da8b7 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_datasource_page/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_datasource_page/index.tsx @@ -69,8 +69,7 @@ export const EditDatasourcePage: React.FunctionComponent = () => { const [loadingError, setLoadingError] = useState(); const [agentConfig, setAgentConfig] = useState(); const [packageInfo, setPackageInfo] = useState(); - const [datasource, setDatasource] = useState({ - id: '', + const [datasource, setDatasource] = useState({ name: '', description: '', config_id: '', @@ -94,6 +93,7 @@ export const EditDatasourcePage: React.FunctionComponent = () => { } if (datasourceData?.item) { const { + id, revision, inputs, created_by, @@ -302,6 +302,7 @@ export const EditDatasourcePage: React.FunctionComponent = () => { from={'edit'} packageInfo={packageInfo} datasource={datasource} + datasourceId={datasourceId} updateDatasource={updateDatasource} validationResults={validationResults!} submitAttempted={formState === 'INVALID'} diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_datasource.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_datasource.tsx index ebcb46c3fb5b7..db5196bfc4eb4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_datasource.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_datasource.tsx @@ -12,30 +12,21 @@ import { LinkToApp } from '../../../../../common/components/endpoint/link_to_app import { CustomConfigureDatasourceContent, CustomConfigureDatasourceProps, - NewDatasource, } from '../../../../../../../ingest_manager/public'; import { getManagementUrl } from '../../../..'; -type DatasourceWithId = NewDatasource & { id: string }; - /** * Exports Endpoint-specific datasource configuration instructions * for use in the Ingest app create / edit datasource config */ export const ConfigureEndpointDatasource = memo( - ({ - from, - datasource, - }: { - from: string; - datasource: CustomConfigureDatasourceProps['datasource']; - }) => { + ({ from, datasourceId }: CustomConfigureDatasourceProps) => { const { services } = useKibana(); let policyUrl = ''; - if (from === 'edit') { + if (from === 'edit' && datasourceId) { policyUrl = getManagementUrl({ name: 'policyDetails', - policyId: (datasource as DatasourceWithId).id, + policyId: datasourceId, }); } From aec0b976151415bee54f94aefc1a6a803264d5f0 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Tue, 9 Jun 2020 16:05:48 -0700 Subject: [PATCH 64/91] Surface data streams in Index Management. (#67806) --- .../helpers/http_requests.ts | 9 ++ .../client_integration/helpers/index.ts | 42 +----- .../helpers/test_subjects.ts | 51 +++++++ .../home/data_streams_tab.helpers.ts | 101 +++++++++++++ .../home/data_streams_tab.test.ts | 137 +++++++++++++++++ .../home/indices_tab.helpers.ts | 27 +++- .../home/indices_tab.test.ts | 44 ++++++ .../common/lib/data_stream_serialization.ts | 21 +++ .../index_management/common/lib/index.ts | 3 + .../common/types/data_streams.ts | 29 ++++ .../index_management/common/types/index.ts | 2 + .../public/application/app.tsx | 6 +- .../data_stream_detail_panel.tsx | 104 +++++++++++++ .../data_stream_detail_panel/index.ts | 7 + .../data_stream_list/data_stream_list.tsx | 127 ++++++++++++++++ .../data_stream_table/data_stream_table.tsx | 139 ++++++++++++++++++ .../data_stream_table/index.ts | 7 + .../index.ts} | 2 +- .../public/application/sections/home/home.tsx | 23 ++- .../detail_panel/detail_panel.container.d.ts | 7 + .../detail_panel/{index.js => index.ts} | 0 .../{index_list.js => index_list.tsx} | 8 +- .../index_table/{index.js => index.ts} | 0 .../index_table/index_table.container.d.ts | 7 + .../index_list/index_table/index_table.js | 40 ++++- .../template_details/template_details.tsx | 4 +- .../template_table/template_table.tsx | 6 +- .../template_clone/template_clone.tsx | 4 +- .../sections/template_edit/template_edit.tsx | 4 +- .../public/application/services/api.ts | 21 ++- .../public/application/services/routing.ts | 19 ++- .../index_management/public/shared_imports.ts | 2 + .../server/client/elasticsearch.ts | 69 +++++++++ .../server/routes/api/data_streams/index.ts | 13 ++ .../api/data_streams/register_get_route.ts | 34 +++++ .../index_management/server/routes/index.ts | 2 + .../index_management/data_streams.ts | 89 +++++++++++ .../apis/management/index_management/index.js | 1 + .../index_management/lib/elasticsearch.js | 1 + .../apps/index_management/home_page.ts | 24 ++- .../page_objects/index_management_page.ts | 5 +- 41 files changed, 1161 insertions(+), 80 deletions(-) create mode 100644 x-pack/plugins/index_management/__jest__/client_integration/helpers/test_subjects.ts create mode 100644 x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts create mode 100644 x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts create mode 100644 x-pack/plugins/index_management/common/lib/data_stream_serialization.ts create mode 100644 x-pack/plugins/index_management/common/types/data_streams.ts create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/index.ts create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/index.ts rename x-pack/plugins/index_management/public/application/sections/home/{index_list/index_list.d.ts => data_stream_list/index.ts} (82%) create mode 100644 x-pack/plugins/index_management/public/application/sections/home/index_list/detail_panel/detail_panel.container.d.ts rename x-pack/plugins/index_management/public/application/sections/home/index_list/detail_panel/{index.js => index.ts} (100%) rename x-pack/plugins/index_management/public/application/sections/home/index_list/{index_list.js => index_list.tsx} (71%) rename x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/{index.js => index.ts} (100%) create mode 100644 x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.d.ts create mode 100644 x-pack/plugins/index_management/server/routes/api/data_streams/index.ts create mode 100644 x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts create mode 100644 x-pack/test/api_integration/apis/management/index_management/data_streams.ts diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts index 75d1b69eb6157..56d76da522ac2 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts @@ -27,6 +27,14 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { ]); }; + const setLoadDataStreamsResponse = (response: HttpResponse = []) => { + server.respondWith('GET', `${API_BASE_PATH}/data_streams`, [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(response), + ]); + }; + const setDeleteTemplateResponse = (response: HttpResponse = []) => { server.respondWith('POST', `${API_BASE_PATH}/delete_index_templates`, [ 200, @@ -71,6 +79,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { return { setLoadTemplatesResponse, setLoadIndicesResponse, + setLoadDataStreamsResponse, setDeleteTemplateResponse, setLoadTemplateResponse, setCreateTemplateResponse, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/index.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/index.ts index 8e7755a65af3c..f581083e28cc6 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/index.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/index.ts @@ -10,44 +10,4 @@ export { nextTick, getRandomString, findTestSubject, TestBed } from '../../../.. export { setupEnvironment, WithAppDependencies, services } from './setup_environment'; -export type TestSubjects = - | 'aliasesTab' - | 'appTitle' - | 'cell' - | 'closeDetailsButton' - | 'createTemplateButton' - | 'createLegacyTemplateButton' - | 'deleteSystemTemplateCallOut' - | 'deleteTemplateButton' - | 'deleteTemplatesConfirmation' - | 'documentationLink' - | 'emptyPrompt' - | 'manageTemplateButton' - | 'mappingsTab' - | 'noAliasesCallout' - | 'noMappingsCallout' - | 'noSettingsCallout' - | 'indicesList' - | 'indicesTab' - | 'indexTableIncludeHiddenIndicesToggle' - | 'indexTableIndexNameLink' - | 'reloadButton' - | 'reloadIndicesButton' - | 'row' - | 'sectionError' - | 'sectionLoading' - | 'settingsTab' - | 'summaryTab' - | 'summaryTitle' - | 'systemTemplatesSwitch' - | 'templateDetails' - | 'templateDetails.manageTemplateButton' - | 'templateDetails.sectionLoading' - | 'templateDetails.tab' - | 'templateDetails.title' - | 'templateList' - | 'templateTable' - | 'templatesTab' - | 'legacyTemplateTable' - | 'viewButton' - | 'filterList.filterItem'; +export { TestSubjects } from './test_subjects'; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/test_subjects.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/test_subjects.ts new file mode 100644 index 0000000000000..4e297118b0fdd --- /dev/null +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/test_subjects.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export type TestSubjects = + | 'aliasesTab' + | 'appTitle' + | 'cell' + | 'closeDetailsButton' + | 'createLegacyTemplateButton' + | 'createTemplateButton' + | 'dataStreamsEmptyPromptTemplateLink' + | 'dataStreamTable' + | 'dataStreamTable' + | 'deleteSystemTemplateCallOut' + | 'deleteTemplateButton' + | 'deleteTemplatesConfirmation' + | 'documentationLink' + | 'emptyPrompt' + | 'filterList.filterItem' + | 'indexTable' + | 'indexTableIncludeHiddenIndicesToggle' + | 'indexTableIndexNameLink' + | 'indicesList' + | 'indicesTab' + | 'legacyTemplateTable' + | 'manageTemplateButton' + | 'mappingsTab' + | 'noAliasesCallout' + | 'noMappingsCallout' + | 'noSettingsCallout' + | 'reloadButton' + | 'reloadIndicesButton' + | 'row' + | 'sectionError' + | 'sectionLoading' + | 'settingsTab' + | 'summaryTab' + | 'summaryTitle' + | 'systemTemplatesSwitch' + | 'templateDetails' + | 'templateDetails.manageTemplateButton' + | 'templateDetails.sectionLoading' + | 'templateDetails.tab' + | 'templateDetails.title' + | 'templateList' + | 'templatesTab' + | 'templateTable' + | 'viewButton'; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts new file mode 100644 index 0000000000000..ef6aca44a1754 --- /dev/null +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { + registerTestBed, + TestBed, + TestBedConfig, + findTestSubject, +} from '../../../../../test_utils'; +import { DataStream } from '../../../common'; +import { IndexManagementHome } from '../../../public/application/sections/home'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { indexManagementStore } from '../../../public/application/store'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { WithAppDependencies, services, TestSubjects } from '../helpers'; + +const testBedConfig: TestBedConfig = { + store: () => indexManagementStore(services as any), + memoryRouter: { + initialEntries: [`/indices`], + componentRoutePath: `/:section(indices|data_streams|templates)`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WithAppDependencies(IndexManagementHome), testBedConfig); + +export interface DataStreamsTabTestBed extends TestBed { + actions: { + goToDataStreamsList: () => void; + clickEmptyPromptIndexTemplateLink: () => void; + clickReloadButton: () => void; + clickIndicesAt: (index: number) => void; + }; +} + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + /** + * User Actions + */ + + const goToDataStreamsList = () => { + testBed.find('data_streamsTab').simulate('click'); + }; + + const clickEmptyPromptIndexTemplateLink = async () => { + const { find, component, router } = testBed; + + const templateLink = find('dataStreamsEmptyPromptTemplateLink'); + + await act(async () => { + router.navigateTo(templateLink.props().href!); + }); + + component.update(); + }; + + const clickReloadButton = () => { + const { find } = testBed; + find('reloadButton').simulate('click'); + }; + + const clickIndicesAt = async (index: number) => { + const { component, table, router } = testBed; + const { rows } = table.getMetaData('dataStreamTable'); + const indicesLink = findTestSubject(rows[index].reactWrapper, 'indicesLink'); + + await act(async () => { + router.navigateTo(indicesLink.props().href!); + }); + + component.update(); + }; + + return { + ...testBed, + actions: { + goToDataStreamsList, + clickEmptyPromptIndexTemplateLink, + clickReloadButton, + clickIndicesAt, + }, + }; +}; + +export const createDataStreamPayload = (name: string): DataStream => ({ + name, + timeStampField: '@timestamp', + indices: [ + { + name: 'indexName', + uuid: 'indexId', + }, + ], + generation: 1, +}); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts new file mode 100644 index 0000000000000..efe2e2d0c74ae --- /dev/null +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts @@ -0,0 +1,137 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { API_BASE_PATH } from '../../../common/constants'; +import { setupEnvironment } from '../helpers'; + +import { DataStreamsTabTestBed, setup, createDataStreamPayload } from './data_streams_tab.helpers'; + +describe('Data Streams tab', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: DataStreamsTabTestBed; + + afterAll(() => { + server.restore(); + }); + + beforeEach(async () => { + httpRequestsMockHelpers.setLoadIndicesResponse([ + { + health: '', + status: '', + primary: '', + replica: '', + documents: '', + documents_deleted: '', + size: '', + primary_size: '', + name: 'data-stream-index', + data_stream: 'dataStream1', + }, + { + health: 'green', + status: 'open', + primary: 1, + replica: 1, + documents: 10000, + documents_deleted: 100, + size: '156kb', + primary_size: '156kb', + name: 'non-data-stream-index', + }, + ]); + + await act(async () => { + testBed = await setup(); + }); + }); + + describe('when there are no data streams', () => { + beforeEach(async () => { + const { actions, component } = testBed; + + httpRequestsMockHelpers.setLoadDataStreamsResponse([]); + httpRequestsMockHelpers.setLoadTemplatesResponse({ templates: [], legacyTemplates: [] }); + + await act(async () => { + actions.goToDataStreamsList(); + }); + + component.update(); + }); + + test('displays an empty prompt', async () => { + const { exists } = testBed; + + expect(exists('sectionLoading')).toBe(false); + expect(exists('emptyPrompt')).toBe(true); + }); + + test('goes to index templates tab when "Get started" link is clicked', async () => { + const { actions, exists } = testBed; + + await act(async () => { + actions.clickEmptyPromptIndexTemplateLink(); + }); + + expect(exists('templateList')).toBe(true); + }); + }); + + describe('when there are data streams', () => { + beforeEach(async () => { + const { actions, component } = testBed; + + httpRequestsMockHelpers.setLoadDataStreamsResponse([ + createDataStreamPayload('dataStream1'), + createDataStreamPayload('dataStream2'), + ]); + + await act(async () => { + actions.goToDataStreamsList(); + }); + + component.update(); + }); + + test('lists them in the table', async () => { + const { table } = testBed; + + const { tableCellsValues } = table.getMetaData('dataStreamTable'); + + expect(tableCellsValues).toEqual([ + ['dataStream1', '1', '@timestamp', '1'], + ['dataStream2', '1', '@timestamp', '1'], + ]); + }); + + test('has a button to reload the data streams', async () => { + const { exists, actions } = testBed; + const totalRequests = server.requests.length; + + expect(exists('reloadButton')).toBe(true); + + await act(async () => { + actions.clickReloadButton(); + }); + + expect(server.requests.length).toBe(totalRequests + 1); + expect(server.requests[server.requests.length - 1].url).toBe(`${API_BASE_PATH}/data_streams`); + }); + + test('clicking the indices count navigates to the backing indices', async () => { + const { table, actions } = testBed; + + await actions.clickIndicesAt(0); + + expect(table.getMetaData('indexTable').tableCellsValues).toEqual([ + ['', '', '', '', '', '', '', 'dataStream1'], + ]); + }); + }); +}); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts index e995932dfa00d..f00348aacbf08 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts @@ -6,8 +6,13 @@ import { act } from 'react-dom/test-utils'; -import { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; -import { IndexList } from '../../../public/application/sections/home/index_list'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { + registerTestBed, + TestBed, + TestBedConfig, + findTestSubject, +} from '../../../../../test_utils'; +import { IndexManagementHome } from '../../../public/application/sections/home'; // eslint-disable-line @kbn/eslint/no-restricted-paths import { indexManagementStore } from '../../../public/application/store'; // eslint-disable-line @kbn/eslint/no-restricted-paths import { WithAppDependencies, services, TestSubjects } from '../helpers'; @@ -15,18 +20,19 @@ const testBedConfig: TestBedConfig = { store: () => indexManagementStore(services as any), memoryRouter: { initialEntries: [`/indices?includeHiddenIndices=true`], - componentRoutePath: `/:section(indices|templates)`, + componentRoutePath: `/:section(indices|data_streams)`, }, doMountAsync: true, }; -const initTestBed = registerTestBed(WithAppDependencies(IndexList), testBedConfig); +const initTestBed = registerTestBed(WithAppDependencies(IndexManagementHome), testBedConfig); export interface IndicesTestBed extends TestBed { actions: { selectIndexDetailsTab: (tab: 'settings' | 'mappings' | 'stats' | 'edit_settings') => void; getIncludeHiddenIndicesToggleStatus: () => boolean; clickIncludeHiddenIndicesToggle: () => void; + clickDataStreamAt: (index: number) => void; }; } @@ -59,12 +65,25 @@ export const setup = async (): Promise => { component.update(); }; + const clickDataStreamAt = async (index: number) => { + const { component, table, router } = testBed; + const { rows } = table.getMetaData('indexTable'); + const dataStreamLink = findTestSubject(rows[index].reactWrapper, 'dataStreamLink'); + + await act(async () => { + router.navigateTo(dataStreamLink.props().href!); + }); + + component.update(); + }; + return { ...testBed, actions: { selectIndexDetailsTab, getIncludeHiddenIndicesToggleStatus, clickIncludeHiddenIndicesToggle, + clickDataStreamAt, }, }; }; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts index 11c25ffbb590f..c2d955bb4dfce 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts @@ -9,6 +9,7 @@ import { act } from 'react-dom/test-utils'; import { API_BASE_PATH } from '../../../common/constants'; import { setupEnvironment, nextTick } from '../helpers'; import { IndicesTestBed, setup } from './indices_tab.helpers'; +import { createDataStreamPayload } from './data_streams_tab.helpers'; /** * The below import is required to avoid a console error warn from the "brace" package @@ -52,6 +53,49 @@ describe('', () => { }); }); + describe('data stream column', () => { + beforeEach(async () => { + httpRequestsMockHelpers.setLoadIndicesResponse([ + { + health: '', + status: '', + primary: '', + replica: '', + documents: '', + documents_deleted: '', + size: '', + primary_size: '', + name: 'data-stream-index', + data_stream: 'dataStream1', + }, + ]); + + httpRequestsMockHelpers.setLoadDataStreamsResponse([ + createDataStreamPayload('dataStream1'), + createDataStreamPayload('dataStream2'), + ]); + + testBed = await setup(); + + await act(async () => { + const { component } = testBed; + + await nextTick(); + component.update(); + }); + }); + + test('navigates to the data stream in the Data Streams tab', async () => { + const { table, actions } = testBed; + + await actions.clickDataStreamAt(0); + + expect(table.getMetaData('dataStreamTable').tableCellsValues).toEqual([ + ['dataStream1', '1', '@timestamp', '1'], + ]); + }); + }); + describe('index detail panel with % character in index name', () => { const indexName = 'test%'; beforeEach(async () => { diff --git a/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts b/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts new file mode 100644 index 0000000000000..9d267210a6b31 --- /dev/null +++ b/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DataStream, DataStreamFromEs } from '../types'; + +export function deserializeDataStreamList(dataStreamsFromEs: DataStreamFromEs[]): DataStream[] { + return dataStreamsFromEs.map(({ name, timestamp_field, indices, generation }) => ({ + name, + timeStampField: timestamp_field, + indices: indices.map( + ({ index_name, index_uuid }: { index_name: string; index_uuid: string }) => ({ + name: index_name, + uuid: index_uuid, + }) + ), + generation, + })); +} diff --git a/x-pack/plugins/index_management/common/lib/index.ts b/x-pack/plugins/index_management/common/lib/index.ts index c67d28da2c24b..fce4d8ccc2502 100644 --- a/x-pack/plugins/index_management/common/lib/index.ts +++ b/x-pack/plugins/index_management/common/lib/index.ts @@ -3,6 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + +export { deserializeDataStreamList } from './data_stream_serialization'; + export { deserializeLegacyTemplateList, deserializeTemplateList, diff --git a/x-pack/plugins/index_management/common/types/data_streams.ts b/x-pack/plugins/index_management/common/types/data_streams.ts new file mode 100644 index 0000000000000..5b743296d868b --- /dev/null +++ b/x-pack/plugins/index_management/common/types/data_streams.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export interface DataStreamFromEs { + name: string; + timestamp_field: string; + indices: DataStreamIndexFromEs[]; + generation: number; +} + +export interface DataStreamIndexFromEs { + index_name: string; + index_uuid: string; +} + +export interface DataStream { + name: string; + timeStampField: string; + indices: DataStreamIndex[]; + generation: number; +} + +export interface DataStreamIndex { + name: string; + uuid: string; +} diff --git a/x-pack/plugins/index_management/common/types/index.ts b/x-pack/plugins/index_management/common/types/index.ts index 81a06156dd291..c4ba60573d430 100644 --- a/x-pack/plugins/index_management/common/types/index.ts +++ b/x-pack/plugins/index_management/common/types/index.ts @@ -12,4 +12,6 @@ export * from './mappings'; export * from './templates'; +export { DataStreamFromEs, DataStream, DataStreamIndex } from './data_streams'; + export * from './component_templates'; diff --git a/x-pack/plugins/index_management/public/application/app.tsx b/x-pack/plugins/index_management/public/application/app.tsx index bfd99de6949e5..92197bee30c88 100644 --- a/x-pack/plugins/index_management/public/application/app.tsx +++ b/x-pack/plugins/index_management/public/application/app.tsx @@ -31,9 +31,9 @@ export const App = ({ history }: { history: ScopedHistory }) => { // Export this so we can test it with a different router. export const AppWithoutRouter = () => ( - - - + + + diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx new file mode 100644 index 0000000000000..a6c8b83a05f98 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { Fragment } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { + EuiFlyout, + EuiFlyoutHeader, + EuiTitle, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, +} from '@elastic/eui'; + +import { SectionLoading, SectionError, Error } from '../../../../components'; +import { useLoadDataStream } from '../../../../services/api'; + +interface Props { + dataStreamName: string; + onClose: () => void; +} + +/** + * NOTE: This currently isn't in use by data_stream_list.tsx because it doesn't contain any + * information that doesn't already exist in the table. We'll use it once we add additional + * info, e.g. storage size, docs count. + */ +export const DataStreamDetailPanel: React.FunctionComponent = ({ + dataStreamName, + onClose, +}) => { + const { error, data: dataStream, isLoading } = useLoadDataStream(dataStreamName); + + let content; + + if (isLoading) { + content = ( + + + + ); + } else if (error) { + content = ( + + } + error={error as Error} + data-test-subj="sectionError" + /> + ); + } else if (dataStream) { + content = {JSON.stringify(dataStream)}; + } + + return ( + + + +

+ {dataStreamName} +

+
+
+ + {content} + + + + + + + + + + +
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/index.ts b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/index.ts new file mode 100644 index 0000000000000..3f45267c032ed --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { DataStreamDetailPanel } from './data_stream_detail_panel'; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx new file mode 100644 index 0000000000000..951c4a0d7f3c3 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { RouteComponentProps } from 'react-router-dom'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; +import { EuiTitle, EuiText, EuiSpacer, EuiEmptyPrompt, EuiLink } from '@elastic/eui'; +import { ScopedHistory } from 'kibana/public'; + +import { reactRouterNavigate } from '../../../../shared_imports'; +import { SectionError, SectionLoading, Error } from '../../../components'; +import { useLoadDataStreams } from '../../../services/api'; +import { DataStreamTable } from './data_stream_table'; + +interface MatchParams { + dataStreamName?: string; +} + +export const DataStreamList: React.FunctionComponent> = ({ + match: { + params: { dataStreamName }, + }, + history, +}) => { + const { error, isLoading, data: dataStreams, sendRequest: reload } = useLoadDataStreams(); + + let content; + + if (isLoading) { + content = ( + + + + ); + } else if (error) { + content = ( + + } + error={error as Error} + /> + ); + } else if (Array.isArray(dataStreams) && dataStreams.length === 0) { + content = ( + + + + } + body={ +

+ + {i18n.translate('xpack.idxMgmt.dataStreamList.emptyPrompt.getStartedLink', { + defaultMessage: 'composable index template', + })} + + ), + }} + /> +

+ } + data-test-subj="emptyPrompt" + /> + ); + } else if (Array.isArray(dataStreams) && dataStreams.length > 0) { + content = ( + <> + {/* TODO: Add a switch for toggling on data streams created by Ingest Manager */} + + + + + + + + + + + {/* TODO: Implement this once we have something to put in here, e.g. storage size, docs count */} + {/* dataStreamName && ( + { + history.push('/data_streams'); + }} + /> + )*/} + + ); + } + + return
{content}
; +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx new file mode 100644 index 0000000000000..54b215e561b46 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx @@ -0,0 +1,139 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiInMemoryTable, EuiBasicTableColumn, EuiButton, EuiLink } from '@elastic/eui'; +import { ScopedHistory } from 'kibana/public'; + +import { DataStream } from '../../../../../../common/types'; +import { reactRouterNavigate } from '../../../../../shared_imports'; +import { encodePathForReactRouter } from '../../../../services/routing'; + +interface Props { + dataStreams?: DataStream[]; + reload: () => {}; + history: ScopedHistory; + filters?: string; +} + +export const DataStreamTable: React.FunctionComponent = ({ + dataStreams, + reload, + history, + filters, +}) => { + const columns: Array> = [ + { + field: 'name', + name: i18n.translate('xpack.idxMgmt.dataStreamList.table.nameColumnTitle', { + defaultMessage: 'Name', + }), + truncateText: true, + sortable: true, + // TODO: Render as a link to open the detail panel + }, + { + field: 'indices', + name: i18n.translate('xpack.idxMgmt.dataStreamList.table.indicesColumnTitle', { + defaultMessage: 'Indices', + }), + truncateText: true, + sortable: true, + render: (indices: DataStream['indices'], dataStream) => ( + + {indices.length} + + ), + }, + { + field: 'timeStampField', + name: i18n.translate('xpack.idxMgmt.dataStreamList.table.timeStampFieldColumnTitle', { + defaultMessage: 'Timestamp field', + }), + truncateText: true, + sortable: true, + }, + { + field: 'generation', + name: i18n.translate('xpack.idxMgmt.dataStreamList.table.generationFieldColumnTitle', { + defaultMessage: 'Generation', + }), + truncateText: true, + sortable: true, + }, + ]; + + const pagination = { + initialPageSize: 20, + pageSizeOptions: [10, 20, 50], + }; + + const sorting = { + sort: { + field: 'name', + direction: 'asc', + }, + } as const; + + const searchConfig = { + query: filters, + box: { + incremental: true, + }, + toolsLeft: undefined /* TODO: Actions menu */, + toolsRight: [ + + + , + ], + }; + + return ( + <> + ({ + 'data-test-subj': 'row', + })} + cellProps={() => ({ + 'data-test-subj': 'cell', + })} + data-test-subj="dataStreamTable" + message={ + + } + /> + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/index.ts b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/index.ts new file mode 100644 index 0000000000000..3922ca5c1d50c --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { DataStreamTable } from './data_stream_table'; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_list.d.ts b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/index.ts similarity index 82% rename from x-pack/plugins/index_management/public/application/sections/home/index_list/index_list.d.ts rename to x-pack/plugins/index_management/public/application/sections/home/data_stream_list/index.ts index f03f483c0e821..e2f588cc2a0fb 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_list.d.ts +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export declare function IndexList(match: any): any; +export { DataStreamList } from './data_stream_list'; diff --git a/x-pack/plugins/index_management/public/application/sections/home/home.tsx b/x-pack/plugins/index_management/public/application/sections/home/home.tsx index 0ddf4fefce466..51deaf42cc72c 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/home.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/home.tsx @@ -19,6 +19,7 @@ import { EuiTitle, } from '@elastic/eui'; import { documentationService } from '../../services/documentation'; +import { DataStreamList } from './data_stream_list'; import { IndexList } from './index_list'; import { TemplateList } from './template_list'; import { ComponentTemplateList } from '../../components/component_templates'; @@ -26,11 +27,17 @@ import { breadcrumbService } from '../../services/breadcrumbs'; export enum Section { Indices = 'indices', + DataStreams = 'data_streams', IndexTemplates = 'templates', ComponentTemplates = 'component_templates', } -export const homeSections = [Section.Indices, Section.IndexTemplates, Section.ComponentTemplates]; +export const homeSections = [ + Section.Indices, + Section.DataStreams, + Section.IndexTemplates, + Section.ComponentTemplates, +]; interface MatchParams { section: Section; @@ -47,6 +54,15 @@ export const IndexManagementHome: React.FunctionComponent, }, + { + id: Section.DataStreams, + name: ( + + ), + }, { id: Section.IndexTemplates, name: ( @@ -122,6 +138,11 @@ export const IndexManagementHome: React.FunctionComponent + = ({ history }) => { return (
- +
); -} +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index.js b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index.ts similarity index 100% rename from x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index.js rename to x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index.ts diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.d.ts b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.d.ts new file mode 100644 index 0000000000000..35ddfc4813617 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.d.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export declare function IndexTable(props: any): any; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js index f33d486520a29..c3acff087146a 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js @@ -37,8 +37,10 @@ import { } from '@elastic/eui'; import { UIM_SHOW_DETAILS_CLICK } from '../../../../../../common/constants'; +import { reactRouterNavigate } from '../../../../../shared_imports'; import { REFRESH_RATE_INDEX_LIST } from '../../../../constants'; import { healthToColor } from '../../../../services'; +import { encodePathForReactRouter } from '../../../../services/routing'; import { AppContextConsumer } from '../../../../app_context'; import { renderBadges } from '../../../../lib/render_badges'; import { NoMatch, PageErrorForbidden } from '../../../../components'; @@ -117,6 +119,7 @@ export class IndexTable extends Component { } } } + componentWillUnmount() { clearInterval(this.interval); } @@ -146,11 +149,14 @@ export class IndexTable extends Component { const newIsSortAscending = sortField === column ? !isSortAscending : true; sortChanged(column, newIsSortAscending); }; + renderFilterError() { const { filterError } = this.state; + if (!filterError) { return; } + return ( <> @@ -169,6 +175,7 @@ export class IndexTable extends Component { ); } + onFilterChanged = ({ query, error }) => { if (error) { this.setState({ filterError: error }); @@ -177,6 +184,7 @@ export class IndexTable extends Component { this.setState({ filterError: null }); } }; + getFilters = (extensionsService) => { const { allIndices } = this.props; return extensionsService.filters.reduce((accum, filterExtension) => { @@ -184,6 +192,7 @@ export class IndexTable extends Component { return [...accum, ...filtersToAdd]; }, []); }; + toggleAll = () => { const allSelected = this.areAllItemsSelected(); if (allSelected) { @@ -243,7 +252,8 @@ export class IndexTable extends Component { } buildRowCell(fieldName, value, index, appServices) { - const { openDetailPanel, filterChanged } = this.props; + const { openDetailPanel, filterChanged, history } = this.props; + if (fieldName === 'health') { return {value}; } else if (fieldName === 'name') { @@ -261,7 +271,19 @@ export class IndexTable extends Component { {renderBadges(index, filterChanged, appServices.extensionsService)} ); + } else if (fieldName === 'data_stream') { + return ( + + {value} + + ); } + return value; } @@ -480,12 +502,14 @@ export class IndexTable extends Component { + {(indicesLoading && allIndices.length === 0) || indicesError ? null : ( {extensionsService.toggles.map((toggle) => { return this.renderToggleControl(toggle); })} + + + {this.renderBanners(extensionsService)} + {indicesError && this.renderError()} + {atLeastOneItemSelected ? ( @@ -523,6 +551,7 @@ export class IndexTable extends Component { /> ) : null} + {(indicesLoading && allIndices.length === 0) || indicesError ? null : ( @@ -572,11 +601,14 @@ export class IndexTable extends Component { )} + {this.renderFilterError()} + + {indices.length > 0 ? (
- + + {this.buildHeader()} + {this.buildRows(services)}
) : ( emptyState )} + + {indices.length > 0 ? this.renderPager() : null} ); diff --git a/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_details/template_details.tsx b/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_details/template_details.tsx index ec2956973d4f6..807229fb36267 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_details/template_details.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_details/template_details.tsx @@ -38,7 +38,7 @@ import { Error, } from '../../../../../components'; import { useLoadIndexTemplate } from '../../../../../services/api'; -import { decodePath } from '../../../../../services/routing'; +import { decodePathFromReactRouter } from '../../../../../services/routing'; import { SendRequestResponse } from '../../../../../../shared_imports'; import { useServices } from '../../../../../app_context'; import { TabSummary, TabMappings, TabSettings, TabAliases } from '../../template_details/tabs'; @@ -107,7 +107,7 @@ export const LegacyTemplateDetails: React.FunctionComponent = ({ reload, }) => { const { uiMetricService } = useServices(); - const decodedTemplateName = decodePath(templateName); + const decodedTemplateName = decodePathFromReactRouter(templateName); const { error, data: templateDetails, isLoading } = useLoadIndexTemplate( decodedTemplateName, isLegacy diff --git a/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_table/template_table.tsx b/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_table/template_table.tsx index 92fedd5d68f00..edce05018ce39 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_table/template_table.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_table/template_table.tsx @@ -9,12 +9,12 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiInMemoryTable, EuiIcon, EuiButton, EuiLink, EuiBasicTableColumn } from '@elastic/eui'; import { ScopedHistory } from 'kibana/public'; -import { reactRouterNavigate } from '../../../../../../../../../../src/plugins/kibana_react/public'; +import { SendRequestResponse, reactRouterNavigate } from '../../../../../../shared_imports'; import { TemplateListItem } from '../../../../../../../common'; import { UIM_TEMPLATE_SHOW_DETAILS_CLICK } from '../../../../../../../common/constants'; import { TemplateDeleteModal } from '../../../../../components'; +import { encodePathForReactRouter } from '../../../../../services/routing'; import { useServices } from '../../../../../app_context'; -import { SendRequestResponse } from '../../../../../../shared_imports'; interface Props { templates: TemplateListItem[]; @@ -52,7 +52,7 @@ export const LegacyTemplateTable: React.FunctionComponent = ({ {...reactRouterNavigate( history, { - pathname: `/templates/${encodeURIComponent(encodeURIComponent(name))}`, + pathname: `/templates/${encodePathForReactRouter(name)}`, search: `legacy=${Boolean(item._kbnMeta.isLegacy)}`, }, () => uiMetricService.trackMetric('click', UIM_TEMPLATE_SHOW_DETAILS_CLICK) diff --git a/x-pack/plugins/index_management/public/application/sections/template_clone/template_clone.tsx b/x-pack/plugins/index_management/public/application/sections/template_clone/template_clone.tsx index 8bdd230f89952..82835c56a3877 100644 --- a/x-pack/plugins/index_management/public/application/sections/template_clone/template_clone.tsx +++ b/x-pack/plugins/index_management/public/application/sections/template_clone/template_clone.tsx @@ -11,7 +11,7 @@ import { EuiPageBody, EuiPageContent, EuiSpacer, EuiTitle } from '@elastic/eui'; import { TemplateDeserialized } from '../../../../common'; import { TemplateForm, SectionLoading, SectionError, Error } from '../../components'; import { breadcrumbService } from '../../services/breadcrumbs'; -import { decodePath, getTemplateDetailsLink } from '../../services/routing'; +import { decodePathFromReactRouter, getTemplateDetailsLink } from '../../services/routing'; import { saveTemplate, useLoadIndexTemplate } from '../../services/api'; import { getIsLegacyFromQueryParams } from '../../lib/index_templates'; @@ -26,7 +26,7 @@ export const TemplateClone: React.FunctionComponent { - const decodedTemplateName = decodePath(name); + const decodedTemplateName = decodePathFromReactRouter(name); const isLegacy = getIsLegacyFromQueryParams(location); const [isSaving, setIsSaving] = useState(false); diff --git a/x-pack/plugins/index_management/public/application/sections/template_edit/template_edit.tsx b/x-pack/plugins/index_management/public/application/sections/template_edit/template_edit.tsx index d3e539989bc96..7cacb5ee97a60 100644 --- a/x-pack/plugins/index_management/public/application/sections/template_edit/template_edit.tsx +++ b/x-pack/plugins/index_management/public/application/sections/template_edit/template_edit.tsx @@ -11,7 +11,7 @@ import { EuiPageBody, EuiPageContent, EuiTitle, EuiSpacer, EuiCallOut } from '@e import { TemplateDeserialized } from '../../../../common'; import { breadcrumbService } from '../../services/breadcrumbs'; import { useLoadIndexTemplate, updateTemplate } from '../../services/api'; -import { decodePath, getTemplateDetailsLink } from '../../services/routing'; +import { decodePathFromReactRouter, getTemplateDetailsLink } from '../../services/routing'; import { SectionLoading, SectionError, TemplateForm, Error } from '../../components'; import { getIsLegacyFromQueryParams } from '../../lib/index_templates'; @@ -26,7 +26,7 @@ export const TemplateEdit: React.FunctionComponent { - const decodedTemplateName = decodePath(name); + const decodedTemplateName = decodePathFromReactRouter(name); const isLegacy = getIsLegacyFromQueryParams(location); const [isSaving, setIsSaving] = useState(false); diff --git a/x-pack/plugins/index_management/public/application/services/api.ts b/x-pack/plugins/index_management/public/application/services/api.ts index d1950ae714550..5ad84395d24c2 100644 --- a/x-pack/plugins/index_management/public/application/services/api.ts +++ b/x-pack/plugins/index_management/public/application/services/api.ts @@ -31,14 +31,12 @@ import { UIM_TEMPLATE_UPDATE, UIM_TEMPLATE_CLONE, } from '../../../common/constants'; - +import { TemplateDeserialized, TemplateListItem, DataStream } from '../../../common'; +import { IndexMgmtMetricsType } from '../../types'; import { TAB_SETTINGS, TAB_MAPPING, TAB_STATS } from '../constants'; - import { useRequest, sendRequest } from './use_request'; import { httpService } from './http'; import { UiMetricService } from './ui_metric'; -import { TemplateDeserialized, TemplateListItem } from '../../../common'; -import { IndexMgmtMetricsType } from '../../types'; // Temporary hack to provide the uiMetricService instance to this file. // TODO: Refactor and export an ApiService instance through the app dependencies context @@ -48,6 +46,21 @@ export const setUiMetricService = (_uiMetricService: UiMetricService({ + path: `${API_BASE_PATH}/data_streams`, + method: 'get', + }); +} + +// TODO: Implement this API endpoint once we have content to surface in the detail panel. +export function useLoadDataStream(name: string) { + return useRequest({ + path: `${API_BASE_PATH}/data_stream/${encodeURIComponent(name)}`, + method: 'get', + }); +} + export async function loadIndices() { const response = await httpService.httpClient.get(`${API_BASE_PATH}/indices`); return response.data ? response.data : response; diff --git a/x-pack/plugins/index_management/public/application/services/routing.ts b/x-pack/plugins/index_management/public/application/services/routing.ts index a999c58f5bb42..2a895196189d0 100644 --- a/x-pack/plugins/index_management/public/application/services/routing.ts +++ b/x-pack/plugins/index_management/public/application/services/routing.ts @@ -6,10 +6,8 @@ export const getTemplateListLink = () => `/templates`; -// Need to add some additonal encoding/decoding logic to work with React Router -// For background, see: https://github.com/ReactTraining/history/issues/505 export const getTemplateDetailsLink = (name: string, isLegacy?: boolean, withHash = false) => { - const baseUrl = `/templates/${encodeURIComponent(encodeURIComponent(name))}`; + const baseUrl = `/templates/${encodePathForReactRouter(name)}`; let url = withHash ? `#${baseUrl}` : baseUrl; if (isLegacy) { url = `${url}?legacy=${isLegacy}`; @@ -18,18 +16,14 @@ export const getTemplateDetailsLink = (name: string, isLegacy?: boolean, withHas }; export const getTemplateEditLink = (name: string, isLegacy?: boolean) => { - return encodeURI( - `/edit_template/${encodeURIComponent(encodeURIComponent(name))}?legacy=${isLegacy === true}` - ); + return encodeURI(`/edit_template/${encodePathForReactRouter(name)}?legacy=${isLegacy === true}`); }; export const getTemplateCloneLink = (name: string, isLegacy?: boolean) => { - return encodeURI( - `/clone_template/${encodeURIComponent(encodeURIComponent(name))}?legacy=${isLegacy === true}` - ); + return encodeURI(`/clone_template/${encodePathForReactRouter(name)}?legacy=${isLegacy === true}`); }; -export const decodePath = (pathname: string): string => { +export const decodePathFromReactRouter = (pathname: string): string => { let decodedPath; try { decodedPath = decodeURI(pathname); @@ -39,3 +33,8 @@ export const decodePath = (pathname: string): string => { } return decodeURIComponent(decodedPath); }; + +// Need to add some additonal encoding/decoding logic to work with React Router +// For background, see: https://github.com/ReactTraining/history/issues/505 +export const encodePathForReactRouter = (pathname: string): string => + encodeURIComponent(encodeURIComponent(pathname)); diff --git a/x-pack/plugins/index_management/public/shared_imports.ts b/x-pack/plugins/index_management/public/shared_imports.ts index 8942367261511..afd5a5cf650e1 100644 --- a/x-pack/plugins/index_management/public/shared_imports.ts +++ b/x-pack/plugins/index_management/public/shared_imports.ts @@ -31,3 +31,5 @@ export { export { getFormRow, Field } from '../../../../src/plugins/es_ui_shared/static/forms/components'; export { isJSON } from '../../../../src/plugins/es_ui_shared/static/validators/string'; + +export { reactRouterNavigate } from '../../../../src/plugins/kibana_react/public'; diff --git a/x-pack/plugins/index_management/server/client/elasticsearch.ts b/x-pack/plugins/index_management/server/client/elasticsearch.ts index b51f7d924dba7..6b1bf47512b21 100644 --- a/x-pack/plugins/index_management/server/client/elasticsearch.ts +++ b/x-pack/plugins/index_management/server/client/elasticsearch.ts @@ -10,6 +10,46 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) Client.prototype.dataManagement = components.clientAction.namespaceFactory(); const dataManagement = Client.prototype.dataManagement.prototype; + // Data streams + dataManagement.getDataStreams = ca({ + urls: [ + { + fmt: '/_data_stream', + }, + ], + method: 'GET', + }); + + // We don't allow the user to create a data stream in the UI or API. We're just adding this here + // to enable the API integration tests. + dataManagement.createDataStream = ca({ + urls: [ + { + fmt: '/_data_stream/<%=name%>', + req: { + name: { + type: 'string', + }, + }, + }, + ], + method: 'PUT', + }); + + dataManagement.deleteDataStream = ca({ + urls: [ + { + fmt: '/_data_stream/<%=name%>', + req: { + name: { + type: 'string', + }, + }, + }, + ], + method: 'DELETE', + }); + // Component templates dataManagement.getComponentTemplates = ca({ urls: [ @@ -71,4 +111,33 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) ], method: 'GET', }); + + dataManagement.saveComposableIndexTemplate = ca({ + urls: [ + { + fmt: '/_index_template/<%=name%>', + req: { + name: { + type: 'string', + }, + }, + }, + ], + needBody: true, + method: 'PUT', + }); + + dataManagement.deleteComposableIndexTemplate = ca({ + urls: [ + { + fmt: '/_index_template/<%=name%>', + req: { + name: { + type: 'string', + }, + }, + }, + ], + method: 'DELETE', + }); }; diff --git a/x-pack/plugins/index_management/server/routes/api/data_streams/index.ts b/x-pack/plugins/index_management/server/routes/api/data_streams/index.ts new file mode 100644 index 0000000000000..56c514e30f242 --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/data_streams/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RouteDependencies } from '../../../types'; + +import { registerGetAllRoute } from './register_get_route'; + +export function registerDataStreamRoutes(dependencies: RouteDependencies) { + registerGetAllRoute(dependencies); +} diff --git a/x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts b/x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts new file mode 100644 index 0000000000000..9128556130bf4 --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { deserializeDataStreamList } from '../../../../common/lib'; +import { RouteDependencies } from '../../../types'; +import { addBasePath } from '../index'; + +export function registerGetAllRoute({ router, license, lib: { isEsError } }: RouteDependencies) { + router.get( + { path: addBasePath('/data_streams'), validate: false }, + license.guardApiRoute(async (ctx, req, res) => { + const { callAsCurrentUser } = ctx.dataManagement!.client; + + try { + const dataStreams = await callAsCurrentUser('dataManagement.getDataStreams'); + const body = deserializeDataStreamList(dataStreams); + + return res.ok({ body }); + } catch (error) { + if (isEsError(error)) { + return res.customError({ + statusCode: error.statusCode, + body: error, + }); + } + + return res.internalError({ body: error }); + } + }) + ); +} diff --git a/x-pack/plugins/index_management/server/routes/index.ts b/x-pack/plugins/index_management/server/routes/index.ts index 1e5aaf8087624..202e6919f7b13 100644 --- a/x-pack/plugins/index_management/server/routes/index.ts +++ b/x-pack/plugins/index_management/server/routes/index.ts @@ -6,6 +6,7 @@ import { RouteDependencies } from '../types'; +import { registerDataStreamRoutes } from './api/data_streams'; import { registerIndicesRoutes } from './api/indices'; import { registerTemplateRoutes } from './api/templates'; import { registerMappingRoute } from './api/mapping'; @@ -15,6 +16,7 @@ import { registerComponentTemplateRoutes } from './api/component_templates'; export class ApiRoutes { setup(dependencies: RouteDependencies) { + registerDataStreamRoutes(dependencies); registerIndicesRoutes(dependencies); registerTemplateRoutes(dependencies); registerSettingsRoutes(dependencies); diff --git a/x-pack/test/api_integration/apis/management/index_management/data_streams.ts b/x-pack/test/api_integration/apis/management/index_management/data_streams.ts new file mode 100644 index 0000000000000..9a8511b4331ea --- /dev/null +++ b/x-pack/test/api_integration/apis/management/index_management/data_streams.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../../ftr_provider_context'; +// @ts-ignore +import { API_BASE_PATH } from './constants'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const es = getService('legacyEs'); + + const createDataStream = (name: string) => { + // A data stream requires an index template before it can be created. + return es.dataManagement + .saveComposableIndexTemplate({ + name, + body: { + index_patterns: ['*'], + template: { + settings: {}, + }, + data_stream: { + timestamp_field: '@timestamp', + }, + }, + }) + .then(() => + es.dataManagement.createDataStream({ + name, + }) + ); + }; + + const deleteDataStream = (name: string) => { + return es.dataManagement + .deleteComposableIndexTemplate({ + name, + }) + .then(() => + es.dataManagement.deleteDataStream({ + name, + }) + ); + }; + + describe('Data streams', function () { + const testDataStreamName = 'test-data-stream'; + + describe('Get', () => { + before(async () => await createDataStream(testDataStreamName)); + after(async () => await deleteDataStream(testDataStreamName)); + + describe('all data streams', () => { + it('returns an array of data streams', async () => { + const { body: dataStreams } = await supertest + .get(`${API_BASE_PATH}/data_streams`) + .set('kbn-xsrf', 'xxx') + .expect(200); + + // ES determines these values so we'll just echo them back. + const { name: indexName, uuid } = dataStreams[0].indices[0]; + expect(dataStreams).to.eql([ + { + name: testDataStreamName, + timeStampField: '@timestamp', + indices: [ + { + name: indexName, + uuid, + }, + ], + generation: 1, + }, + ]); + }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/apis/management/index_management/index.js b/x-pack/test/api_integration/apis/management/index_management/index.js index fdee325938ff4..93e8a4a8d6130 100644 --- a/x-pack/test/api_integration/apis/management/index_management/index.js +++ b/x-pack/test/api_integration/apis/management/index_management/index.js @@ -10,6 +10,7 @@ export default function ({ loadTestFile }) { loadTestFile(require.resolve('./mapping')); loadTestFile(require.resolve('./settings')); loadTestFile(require.resolve('./stats')); + loadTestFile(require.resolve('./data_streams')); loadTestFile(require.resolve('./templates')); loadTestFile(require.resolve('./component_templates')); }); diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js b/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js index b950a56a913db..1a1517567eaed 100644 --- a/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js +++ b/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js @@ -3,6 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + import { getRandomString } from './random'; /** diff --git a/x-pack/test/functional/apps/index_management/home_page.ts b/x-pack/test/functional/apps/index_management/home_page.ts index cca0a5d1ad1bd..90bc3603c1613 100644 --- a/x-pack/test/functional/apps/index_management/home_page.ts +++ b/x-pack/test/functional/apps/index_management/home_page.ts @@ -18,12 +18,17 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.common.navigateToApp('indexManagement'); }); - it('Loads the app', async () => { + it('Loads the app and renders the indices tab by default', async () => { await log.debug('Checking for section heading to say Index Management.'); const headingText = await pageObjects.indexManagement.sectionHeadingText(); expect(headingText).to.be('Index Management'); + // Verify url + const url = await browser.getCurrentUrl(); + expect(url).to.contain(`/indices`); + + // Verify content const indicesList = await testSubjects.exists('indicesList'); expect(indicesList).to.be(true); @@ -31,6 +36,23 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(await reloadIndicesButton.isDisplayed()).to.be(true); }); + describe('Data streams', () => { + it('renders the data streams tab', async () => { + // Navigate to the data streams tab + await pageObjects.indexManagement.changeTabs('data_streamsTab'); + + await pageObjects.header.waitUntilLoadingHasFinished(); + + // Verify url + const url = await browser.getCurrentUrl(); + expect(url).to.contain(`/data_streams`); + + // Verify content + const dataStreamList = await testSubjects.exists('dataStreamList'); + expect(dataStreamList).to.be(true); + }); + }); + describe('Index templates', () => { it('renders the index templates tab', async () => { // Navigate to the index templates tab diff --git a/x-pack/test/functional/page_objects/index_management_page.ts b/x-pack/test/functional/page_objects/index_management_page.ts index 9bfcd79671b4d..5e5d0e7583450 100644 --- a/x-pack/test/functional/page_objects/index_management_page.ts +++ b/x-pack/test/functional/page_objects/index_management_page.ts @@ -44,7 +44,10 @@ export function IndexManagementPageProvider({ getService }: FtrProviderContext) }; }); }, - async changeTabs(tab: 'indicesTab' | 'templatesTab' | 'component_templatesTab') { + + async changeTabs( + tab: 'indicesTab' | 'data_streamsTab' | 'templatesTab' | 'component_templatesTab' + ) { await testSubjects.click(tab); }, }; From 80958568e75577e3b35f5307e6b88fab2fc16ac8 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Tue, 9 Jun 2020 21:37:37 -0400 Subject: [PATCH 65/91] [SIEM][Exceptions] - ExceptionsViewer UI component part 2 (#68294) ### Summary This PR is a follow up to #68027 . It brings it all together to complete the exceptions viewer component. This component is meant to display all exception items and allow a user to create, edit, delete, and search these exception items. - Moves ExceptionItem (from part 1) into its own folder - Adds exceptions_viewer_header component that includes the search, list toggle, and add exception buttons - Adds actual ExceptionViewer component - Updates the useExceptionList hook refresh function logic. Noticed that the previous version was creating some issues --- .../lists/public/exceptions/hooks/use_api.tsx | 111 +++++ .../hooks/use_exception_list.test.tsx | 79 ++-- .../exceptions/hooks/use_exception_list.tsx | 120 +++-- .../plugins/lists/public/exceptions/types.ts | 40 +- x-pack/plugins/lists/public/index.tsx | 2 + .../new/exception_list_detection.json | 9 + .../new/exception_list_item_auto_id.json | 1 + ...exception_list_item_detection_auto_id.json | 26 + .../detection_engine/rules/details/index.tsx | 20 + .../rules/details/translations.ts | 7 + ...stories.tsx => exception_item.stories.tsx} | 25 +- .../exceptions_search.stories.tsx | 70 +++ .../components/exceptions/helpers.test.tsx | 6 +- .../common/components/exceptions/mocks.ts | 21 +- .../components/exceptions/translations.ts | 90 ++++ .../common/components/exceptions/types.ts | 49 +- .../exception_details.test.tsx | 6 +- .../exception_details.tsx | 15 +- .../exception_entries.test.tsx | 10 +- .../exception_entries.tsx | 12 +- .../viewer/exception_item/index.test.tsx | 121 +++++ .../viewer/exception_item/index.tsx | 112 +++++ .../viewer/exceptions_pagination.test.tsx | 158 +++++++ .../viewer/exceptions_pagination.tsx | 123 +++++ .../viewer/exceptions_viewer_header.test.tsx | 337 +++++++++++++ .../viewer/exceptions_viewer_header.tsx | 204 ++++++++ .../exceptions/viewer/index.test.tsx | 168 ++++--- .../components/exceptions/viewer/index.tsx | 446 +++++++++++++++--- .../components/exceptions/viewer/reducer.ts | 122 +++++ .../public/lists_plugin_deps.ts | 10 +- 30 files changed, 2266 insertions(+), 254 deletions(-) create mode 100644 x-pack/plugins/lists/public/exceptions/hooks/use_api.tsx create mode 100644 x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_detection.json create mode 100644 x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_detection_auto_id.json rename x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/{index.stories.tsx => exception_item.stories.tsx} (86%) create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exceptions_search.stories.tsx rename x-pack/plugins/security_solution/public/common/components/exceptions/viewer/{ => exception_item}/exception_details.test.tsx (98%) rename x-pack/plugins/security_solution/public/common/components/exceptions/viewer/{ => exception_item}/exception_details.tsx (85%) rename x-pack/plugins/security_solution/public/common/components/exceptions/viewer/{ => exception_item}/exception_entries.test.tsx (94%) rename x-pack/plugins/security_solution/public/common/components/exceptions/viewer/{ => exception_item}/exception_entries.tsx (93%) create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/reducer.ts diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_api.tsx b/x-pack/plugins/lists/public/exceptions/hooks/use_api.tsx new file mode 100644 index 0000000000000..45e180d9d617c --- /dev/null +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_api.tsx @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useMemo } from 'react'; + +import * as Api from '../api'; +import { HttpStart } from '../../../../../../src/core/public'; +import { ExceptionListItemSchema, ExceptionListSchema } from '../../../common/schemas'; +import { ApiCallMemoProps } from '../types'; + +export interface ExceptionsApi { + deleteExceptionItem: (arg: ApiCallMemoProps) => Promise; + deleteExceptionList: (arg: ApiCallMemoProps) => Promise; + getExceptionItem: ( + arg: ApiCallMemoProps & { onSuccess: (arg: ExceptionListItemSchema) => void } + ) => Promise; + getExceptionList: ( + arg: ApiCallMemoProps & { onSuccess: (arg: ExceptionListSchema) => void } + ) => Promise; +} + +export const useApi = (http: HttpStart): ExceptionsApi => { + return useMemo( + (): ExceptionsApi => ({ + async deleteExceptionItem({ + id, + namespaceType, + onSuccess, + onError, + }: ApiCallMemoProps): Promise { + const abortCtrl = new AbortController(); + + try { + await Api.deleteExceptionListItemById({ + http, + id, + namespaceType, + signal: abortCtrl.signal, + }); + onSuccess(); + } catch (error) { + onError(error); + } + }, + async deleteExceptionList({ + id, + namespaceType, + onSuccess, + onError, + }: ApiCallMemoProps): Promise { + const abortCtrl = new AbortController(); + + try { + await Api.deleteExceptionListById({ + http, + id, + namespaceType, + signal: abortCtrl.signal, + }); + onSuccess(); + } catch (error) { + onError(error); + } + }, + async getExceptionItem({ + id, + namespaceType, + onSuccess, + onError, + }: ApiCallMemoProps & { onSuccess: (arg: ExceptionListItemSchema) => void }): Promise { + const abortCtrl = new AbortController(); + + try { + const item = await Api.fetchExceptionListItemById({ + http, + id, + namespaceType, + signal: abortCtrl.signal, + }); + onSuccess(item); + } catch (error) { + onError(error); + } + }, + async getExceptionList({ + id, + namespaceType, + onSuccess, + onError, + }: ApiCallMemoProps & { onSuccess: (arg: ExceptionListSchema) => void }): Promise { + const abortCtrl = new AbortController(); + + try { + const list = await Api.fetchExceptionListById({ + http, + id, + namespaceType, + signal: abortCtrl.signal, + }); + onSuccess(list); + } catch (error) { + onError(error); + } + }, + }), + [http] + ); +}; diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.tsx b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.tsx index a6a25ab4d4e9d..fbd43787a822e 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.tsx +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.tsx @@ -10,7 +10,8 @@ import * as api from '../api'; import { createKibanaCoreStartMock } from '../../common/mocks/kibana_core'; import { getExceptionListSchemaMock } from '../../../common/schemas/response/exception_list_schema.mock'; import { getExceptionListItemSchemaMock } from '../../../common/schemas/response/exception_list_item_schema.mock'; -import { ExceptionListAndItems, UseExceptionListProps } from '../types'; +import { ExceptionListItemSchema } from '../../../common/schemas'; +import { ExceptionList, UseExceptionListProps } from '../types'; import { ReturnExceptionListAndItems, useExceptionList } from './use_exception_list'; @@ -34,15 +35,23 @@ describe('useExceptionList', () => { >(() => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); await waitForNextUpdate(); - expect(result.current).toEqual([true, null, result.current[2]]); - expect(typeof result.current[2]).toEqual('function'); + expect(result.current).toEqual([ + true, + [], + [], + { + page: 1, + perPage: 20, + total: 0, + }, + null, + ]); }); }); @@ -54,27 +63,32 @@ describe('useExceptionList', () => { >(() => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); await waitForNextUpdate(); await waitForNextUpdate(); - const expectedResult: ExceptionListAndItems = { - ...getExceptionListSchemaMock(), - exceptionItems: { - items: [{ ...getExceptionListItemSchemaMock() }], - pagination: { - page: 1, - perPage: 20, - total: 1, - }, - }, - }; + const expectedListResult: ExceptionList[] = [ + { ...getExceptionListSchemaMock(), totalItems: 1 }, + ]; + + const expectedListItemsResult: ExceptionListItemSchema[] = [ + { ...getExceptionListItemSchemaMock() }, + ]; - expect(result.current).toEqual([false, expectedResult, result.current[2]]); + expect(result.current).toEqual([ + false, + expectedListResult, + expectedListItemsResult, + { + page: 1, + perPage: 20, + total: 1, + }, + result.current[4], + ]); }); }); @@ -86,13 +100,12 @@ describe('useExceptionList', () => { UseExceptionListProps, ReturnExceptionListAndItems >( - ({ filterOptions, http, id, namespaceType, pagination, onError }) => - useExceptionList({ filterOptions, http, id, namespaceType, onError, pagination }), + ({ filterOptions, http, lists, pagination, onError }) => + useExceptionList({ filterOptions, http, lists, onError, pagination }), { initialProps: { http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }, } @@ -100,8 +113,7 @@ describe('useExceptionList', () => { await waitForNextUpdate(); rerender({ http: mockKibanaHttpService, - id: 'newListId', - namespaceType: 'single', + lists: [{ id: 'newListId', namespaceType: 'single' }], onError: onErrorMock, }); await waitForNextUpdate(); @@ -121,14 +133,19 @@ describe('useExceptionList', () => { >(() => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); await waitForNextUpdate(); await waitForNextUpdate(); - result.current[2](); + + expect(typeof result.current[4]).toEqual('function'); + + if (result.current[4] != null) { + result.current[4](); + } + await waitForNextUpdate(); expect(spyOnfetchExceptionListById).toHaveBeenCalledTimes(2); @@ -147,8 +164,7 @@ describe('useExceptionList', () => { () => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); @@ -170,8 +186,7 @@ describe('useExceptionList', () => { () => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.tsx b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.tsx index 116233cd89348..1d7a63ba880bf 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.tsx +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.tsx @@ -4,12 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useCallback, useEffect, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { fetchExceptionListById, fetchExceptionListItemsByListId } from '../api'; -import { ExceptionListAndItems, UseExceptionListProps } from '../types'; +import { ExceptionIdentifiers, ExceptionList, Pagination, UseExceptionListProps } from '../types'; +import { ExceptionListItemSchema } from '../../../common/schemas'; -export type ReturnExceptionListAndItems = [boolean, ExceptionListAndItems | null, () => void]; +type Func = () => void; +export type ReturnExceptionListAndItems = [ + boolean, + ExceptionList[], + ExceptionListItemSchema[], + Pagination, + Func | null +]; /** * Hook for using to get an ExceptionList and it's ExceptionListItems @@ -24,8 +32,7 @@ export type ReturnExceptionListAndItems = [boolean, ExceptionListAndItems | null */ export const useExceptionList = ({ http, - id, - namespaceType, + lists, pagination = { page: 1, perPage: 20, @@ -36,20 +43,37 @@ export const useExceptionList = ({ tags: [], }, onError, + dispatchListsInReducer, }: UseExceptionListProps): ReturnExceptionListAndItems => { - const [exceptionListAndItems, setExceptionList] = useState(null); - const [shouldRefresh, setRefresh] = useState(true); - const refreshExceptionList = useCallback(() => setRefresh(true), [setRefresh]); + const [exceptionLists, setExceptionLists] = useState([]); + const [exceptionItems, setExceptionListItems] = useState([]); + const [paginationInfo, setPagination] = useState(pagination); + const fetchExceptionList = useRef(null); const [loading, setLoading] = useState(true); - const tags = filterOptions.tags.sort().join(); + const tags = useMemo(() => filterOptions.tags.sort().join(), [filterOptions.tags]); + const listIds = useMemo( + () => + lists + .map((t) => t.id) + .sort() + .join(), + [lists] + ); useEffect( () => { - let isSubscribed = true; - const abortCtrl = new AbortController(); + let isSubscribed = false; + let abortCtrl: AbortController; + + const fetchLists = async (): Promise => { + isSubscribed = true; + abortCtrl = new AbortController(); - const fetchData = async (idToFetch: string): Promise => { - if (shouldRefresh) { + // TODO: workaround until api updated, will be cleaned up + let exceptions: ExceptionListItemSchema[] = []; + let exceptionListsReturned: ExceptionList[] = []; + + const fetchData = async ({ id, namespaceType }: ExceptionIdentifiers): Promise => { try { setLoading(true); @@ -59,7 +83,7 @@ export const useExceptionList = ({ ...restOfExceptionList } = await fetchExceptionListById({ http, - id: idToFetch, + id, namespaceType, signal: abortCtrl.signal, }); @@ -72,40 +96,68 @@ export const useExceptionList = ({ signal: abortCtrl.signal, }); - setRefresh(false); - if (isSubscribed) { - setExceptionList({ - list_id, - namespace_type, - ...restOfExceptionList, - exceptionItems: { - items: [...fetchListItemsResult.data], + exceptionListsReturned = [ + ...exceptionListsReturned, + { + list_id, + namespace_type, + ...restOfExceptionList, + totalItems: fetchListItemsResult.total, + }, + ]; + setExceptionLists(exceptionListsReturned); + setPagination({ + page: fetchListItemsResult.page, + perPage: fetchListItemsResult.per_page, + total: fetchListItemsResult.total, + }); + + exceptions = [...exceptions, ...fetchListItemsResult.data]; + setExceptionListItems(exceptions); + + if (dispatchListsInReducer != null) { + dispatchListsInReducer({ + exceptions, + lists: exceptionListsReturned, pagination: { page: fetchListItemsResult.page, perPage: fetchListItemsResult.per_page, total: fetchListItemsResult.total, }, - }, - }); + }); + } } } catch (error) { - setRefresh(false); if (isSubscribed) { - setExceptionList(null); + setExceptionLists([]); + setExceptionListItems([]); + setPagination({ + page: 1, + perPage: 20, + total: 0, + }); onError(error); } } - } + }; + + // TODO: Workaround for now. Once api updated, we can pass in array of lists to fetch + await Promise.all( + lists.map( + ({ id, namespaceType }: ExceptionIdentifiers): Promise => + fetchData({ id, namespaceType }) + ) + ); if (isSubscribed) { setLoading(false); } }; - if (id != null) { - fetchData(id); - } + fetchLists(); + + fetchExceptionList.current = fetchLists; return (): void => { isSubscribed = false; abortCtrl.abort(); @@ -113,9 +165,9 @@ export const useExceptionList = ({ }, // eslint-disable-next-line react-hooks/exhaustive-deps [ http, - id, - onError, - shouldRefresh, + listIds, + setExceptionLists, + setExceptionListItems, pagination.page, pagination.perPage, filterOptions.filter, @@ -123,5 +175,5 @@ export const useExceptionList = ({ ] ); - return [loading, exceptionListAndItems, refreshExceptionList]; + return [loading, exceptionLists, exceptionItems, paginationInfo, fetchExceptionList.current]; }; diff --git a/x-pack/plugins/lists/public/exceptions/types.ts b/x-pack/plugins/lists/public/exceptions/types.ts index cf6b6c3ec1c59..286eb0570ebb8 100644 --- a/x-pack/plugins/lists/public/exceptions/types.ts +++ b/x-pack/plugins/lists/public/exceptions/types.ts @@ -24,15 +24,6 @@ export interface Pagination { total: number; } -export interface ExceptionItemsAndPagination { - items: ExceptionListItemSchema[]; - pagination: Pagination; -} - -export interface ExceptionListAndItems extends ExceptionListSchema { - exceptionItems: ExceptionItemsAndPagination; -} - export type AddExceptionList = ExceptionListSchema | CreateExceptionListSchemaPartial; export type AddExceptionListItem = CreateExceptionListItemSchemaPartial | ExceptionListItemSchema; @@ -42,13 +33,31 @@ export interface PersistHookProps { onError: (arg: Error) => void; } +export interface ExceptionList extends ExceptionListSchema { + totalItems: number; +} + export interface UseExceptionListProps { - filterOptions?: FilterExceptionsOptions; http: HttpStart; - id: string | undefined; - namespaceType: NamespaceType; + lists: ExceptionIdentifiers[]; onError: (arg: Error) => void; + filterOptions?: FilterExceptionsOptions; pagination?: Pagination; + dispatchListsInReducer?: ({ + lists, + exceptions, + pagination, + }: { + lists: ExceptionList[]; + exceptions: ExceptionListItemSchema[]; + pagination: Pagination; + }) => void; +} + +export interface ExceptionIdentifiers { + id: string; + namespaceType: NamespaceType; + type?: string; } export interface ApiCallByListIdProps { @@ -67,6 +76,13 @@ export interface ApiCallByIdProps { signal: AbortSignal; } +export interface ApiCallMemoProps { + id: string; + namespaceType: NamespaceType; + onError: (arg: Error) => void; + onSuccess: () => void; +} + export interface AddExceptionListProps { http: HttpStart; list: AddExceptionList; diff --git a/x-pack/plugins/lists/public/index.tsx b/x-pack/plugins/lists/public/index.tsx index fb4d5de06ae54..1e25275a0d38b 100644 --- a/x-pack/plugins/lists/public/index.tsx +++ b/x-pack/plugins/lists/public/index.tsx @@ -4,7 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ // Exports to be shared with plugins +export { useApi } from './exceptions/hooks/use_api'; export { usePersistExceptionItem } from './exceptions/hooks/persist_exception_item'; export { usePersistExceptionList } from './exceptions/hooks/persist_exception_list'; export { useExceptionList } from './exceptions/hooks/use_exception_list'; +export { ExceptionList, ExceptionIdentifiers } from './exceptions/types'; export { mockNewExceptionItem, mockNewExceptionList } from './exceptions/mock'; diff --git a/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_detection.json b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_detection.json new file mode 100644 index 0000000000000..306195f4226e3 --- /dev/null +++ b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_detection.json @@ -0,0 +1,9 @@ +{ + "list_id": "detection_list", + "_tags": ["detection"], + "tags": ["detection", "sample_tag"], + "type": "detection", + "description": "This is a sample detection type exception list", + "name": "Sample Detection Exception List", + "namespace_type": "single" +} diff --git a/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_auto_id.json b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_auto_id.json index d68a26eb8ffe2..c89c7a8f080cf 100644 --- a/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_auto_id.json +++ b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_auto_id.json @@ -5,6 +5,7 @@ "type": "simple", "description": "This is a sample endpoint type exception that has no item_id so it creates a new id each time", "name": "Sample Endpoint Exception List", + "comment": [], "entries": [ { "field": "actingProcess.file.signer", diff --git a/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_detection_auto_id.json b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_detection_auto_id.json new file mode 100644 index 0000000000000..3fe4458a73769 --- /dev/null +++ b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_detection_auto_id.json @@ -0,0 +1,26 @@ +{ + "list_id": "detection_list", + "_tags": ["detection"], + "tags": ["test_tag", "detection", "no_more_bad_guys"], + "type": "simple", + "description": "This is a sample detection type exception that has no item_id so it creates a new id each time", + "name": "Sample Detection Exception List Item", + "comment": [], + "entries": [ + { + "field": "host.name", + "operator": "included", + "match": "sampleHostName" + }, + { + "field": "event.category", + "operator": "included", + "match_any": ["process", "malware"] + }, + { + "field": "event.action", + "operator": "included", + "match": "user-password-change" + } + ] +} diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx index 43792e8bd19f4..0e527bf4dfc72 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx @@ -5,6 +5,7 @@ */ /* eslint-disable react-hooks/rules-of-hooks */ +/* eslint-disable complexity */ import { EuiButton, @@ -70,10 +71,13 @@ import { FailureHistory } from './failure_history'; import { RuleStatus } from '../../../../components/rules//rule_status'; import { useMlCapabilities } from '../../../../../common/components/ml_popover/hooks/use_ml_capabilities'; import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions'; +import { ExceptionsViewer } from '../../../../../common/components/exceptions/viewer'; +import { ExceptionListType } from '../../../../../common/components/exceptions/types'; enum RuleDetailTabs { alerts = 'alerts', failures = 'failures', + exceptions = 'exceptions', } const ruleDetailTabs = [ @@ -82,6 +86,11 @@ const ruleDetailTabs = [ name: detectionI18n.ALERT, disabled: false, }, + { + id: RuleDetailTabs.exceptions, + name: i18n.EXCEPTIONS_TAB, + disabled: false, + }, { id: RuleDetailTabs.failures, name: i18n.FAILURE_HISTORY_TAB, @@ -387,6 +396,17 @@ export const RuleDetailsPageComponent: FC = ({ )} )} + {ruleDetailTab === RuleDetailTabs.exceptions && ( + + )} {ruleDetailTab === RuleDetailTabs.failures && } diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/translations.ts b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/translations.ts index 9cf510f4a9b5d..94dfdc3e9daa0 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/translations.ts +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/translations.ts @@ -89,3 +89,10 @@ export const TYPE_FAILED = i18n.translate( defaultMessage: 'Failed', } ); + +export const EXCEPTIONS_TAB = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.exceptionsTab', + { + defaultMessage: 'Exceptions', + } +); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/index.stories.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx similarity index 86% rename from x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/index.stories.tsx rename to x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx index b6620ed103bc8..8942832798a5e 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/index.stories.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx @@ -8,15 +8,15 @@ import React from 'react'; import { ThemeProvider } from 'styled-components'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; -import { ExceptionItem } from '../viewer'; +import { ExceptionItem } from '../viewer/exception_item'; import { Operator } from '../types'; import { getExceptionItemMock } from '../mocks'; -storiesOf('components/exceptions', module) - .add('ExceptionItem/with os', () => { +storiesOf('ExceptionItem', module) + .add('with os', () => { const payload = getExceptionItemMock(); payload.description = ''; - payload.comments = []; + payload.comment = []; payload.entries = [ { field: 'actingProcess.file.signer', @@ -29,6 +29,7 @@ storiesOf('components/exceptions', module) return ( ({ eui: euiLightVars, darkMode: false })}> {}} @@ -37,10 +38,10 @@ storiesOf('components/exceptions', module) ); }) - .add('ExceptionItem/with description', () => { + .add('with description', () => { const payload = getExceptionItemMock(); payload._tags = []; - payload.comments = []; + payload.comment = []; payload.entries = [ { field: 'actingProcess.file.signer', @@ -53,6 +54,7 @@ storiesOf('components/exceptions', module) return ( ({ eui: euiLightVars, darkMode: false })}> {}} @@ -61,7 +63,7 @@ storiesOf('components/exceptions', module) ); }) - .add('ExceptionItem/with comments', () => { + .add('with comments', () => { const payload = getExceptionItemMock(); payload._tags = []; payload.description = ''; @@ -77,6 +79,7 @@ storiesOf('components/exceptions', module) return ( ({ eui: euiLightVars, darkMode: false })}> {}} @@ -85,15 +88,16 @@ storiesOf('components/exceptions', module) ); }) - .add('ExceptionItem/with nested entries', () => { + .add('with nested entries', () => { const payload = getExceptionItemMock(); payload._tags = []; payload.description = ''; - payload.comments = []; + payload.comment = []; return ( ({ eui: euiLightVars, darkMode: false })}> {}} @@ -102,12 +106,13 @@ storiesOf('components/exceptions', module) ); }) - .add('ExceptionItem/with everything', () => { + .add('with everything', () => { const payload = getExceptionItemMock(); return ( ({ eui: euiLightVars, darkMode: false })}> {}} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exceptions_search.stories.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exceptions_search.stories.tsx new file mode 100644 index 0000000000000..29cded8f69165 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exceptions_search.stories.tsx @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { storiesOf } from '@storybook/react'; +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { ExceptionsViewerHeader } from '../viewer/exceptions_viewer_header'; +import { ExceptionListType } from '../types'; + +storiesOf('ExceptionsViewerHeader', module) + .add('loading', () => { + return ( + ({ eui: euiLightVars, darkMode: false })}> + {}} + onAddExceptionClick={() => {}} + /> + + ); + }) + .add('all lists', () => { + return ( + ({ eui: euiLightVars, darkMode: false })}> + {}} + onAddExceptionClick={() => {}} + /> + + ); + }) + .add('endpoint only', () => { + return ( + ({ eui: euiLightVars, darkMode: false })}> + {}} + onAddExceptionClick={() => {}} + /> + + ); + }) + .add('detections only', () => { + return ( + ({ eui: euiLightVars, darkMode: false })}> + {}} + onAddExceptionClick={() => {}} + /> + + ); + }); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx index 223eabb0ea4ee..7698605588e76 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx @@ -439,7 +439,7 @@ describe('Exception helpers', () => { describe('#getFormattedComments', () => { test('it returns formatted comment object with username and timestamp', () => { - const payload = getExceptionItemMock().comments; + const payload = getExceptionItemMock().comment; const result = getFormattedComments(payload); expect(result[0].username).toEqual('user_name'); @@ -447,7 +447,7 @@ describe('Exception helpers', () => { }); test('it returns formatted timeline icon with comment users initial', () => { - const payload = getExceptionItemMock().comments; + const payload = getExceptionItemMock().comment; const result = getFormattedComments(payload); const wrapper = mount(result[0].timelineIcon as React.ReactElement); @@ -456,7 +456,7 @@ describe('Exception helpers', () => { }); test('it returns comment text', () => { - const payload = getExceptionItemMock().comments; + const payload = getExceptionItemMock().comment; const result = getFormattedComments(payload); const wrapper = mount(result[0].children as React.ReactElement); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/mocks.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/mocks.ts index 15aec3533b325..0dba3fd26c487 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/mocks.ts +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/mocks.ts @@ -11,6 +11,25 @@ import { NestedExceptionEntry, FormattedEntry, } from './types'; +import { ExceptionList } from '../../../lists_plugin_deps'; + +export const getExceptionListMock = (): ExceptionList => ({ + id: '5b543420', + created_at: '2020-04-23T00:19:13.289Z', + created_by: 'user_name', + list_id: 'test-exception', + tie_breaker_id: '77fd1909-6786-428a-a671-30229a719c1f', + updated_at: '2020-04-23T00:19:13.289Z', + updated_by: 'user_name', + namespace_type: 'single', + name: '', + description: 'This is a description', + _tags: ['os:windows'], + tags: [], + type: 'endpoint', + meta: {}, + totalItems: 0, +}); export const getExceptionItemEntryMock = (): ExceptionEntry => ({ field: 'actingProcess.file.signer', @@ -44,7 +63,7 @@ export const getExceptionItemMock = (): ExceptionListItemSchema => ({ namespace_type: 'single', name: '', description: 'This is a description', - comments: [ + comment: [ { user: 'user_name', timestamp: '2020-04-23T00:19:13.289Z', diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/translations.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/translations.ts index 704849430daf9..23e9f64caf695 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/translations.ts @@ -5,6 +5,17 @@ */ import { i18n } from '@kbn/i18n'; +export const DETECTION_LIST = i18n.translate( + 'xpack.securitySolution.exceptions.detectionListLabel', + { + defaultMessage: 'Detection list', + } +); + +export const ENDPOINT_LIST = i18n.translate('xpack.securitySolution.exceptions.endpointListLabel', { + defaultMessage: 'Endpoint list', +}); + export const EDIT = i18n.translate('xpack.securitySolution.exceptions.editButtonLabel', { defaultMessage: 'Edit', }); @@ -47,3 +58,82 @@ export const OPERATING_SYSTEM = i18n.translate( defaultMessage: 'OS', } ); + +export const SEARCH_DEFAULT = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.searchDefaultPlaceholder', + { + defaultMessage: 'Search field (ex: host.name)', + } +); + +export const ADD_EXCEPTION_LABEL = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.addExceptionLabel', + { + defaultMessage: 'Add new exception', + } +); + +export const ADD_TO_ENDPOINT_LIST = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.addToEndpointListLabel', + { + defaultMessage: 'Add to endpoint list', + } +); + +export const ADD_TO_DETECTIONS_LIST = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.addToDetectionsListLabel', + { + defaultMessage: 'Add to detections list', + } +); + +export const EXCEPTION_EMPTY_PROMPT_TITLE = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.emptyPromptTitle', + { + defaultMessage: 'You have no exceptions', + } +); + +export const EXCEPTION_EMPTY_PROMPT_BODY = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.emptyPromptBody', + { + defaultMessage: + 'You can add an exception to fine tune the rule so that it suppresses alerts that meet specified conditions. Exceptions leverage detection accuracy, which can help reduce the number of false positives.', + } +); + +export const FETCH_LIST_ERROR = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.fetchingListError', + { + defaultMessage: 'Error fetching exceptions', + } +); + +export const DELETE_EXCEPTION_ERROR = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.deleteExceptionError', + { + defaultMessage: 'Error deleting exception', + } +); + +export const ITEMS_PER_PAGE = (items: number) => + i18n.translate('xpack.securitySolution.exceptions.exceptionsPaginationLabel', { + values: { items }, + defaultMessage: 'Items per page: {items}', + }); + +export const NUMBER_OF_ITEMS = (items: number) => + i18n.translate('xpack.securitySolution.exceptions.paginationNumberOfItemsLabel', { + values: { items }, + defaultMessage: '{items} items', + }); + +export const REFRESH = i18n.translate('xpack.securitySolution.exceptions.utilityRefreshLabel', { + defaultMessage: 'Refresh', +}); + +export const SHOWING_EXCEPTIONS = (items: number) => + i18n.translate('xpack.securitySolution.exceptions.utilityNumberExceptionsLabel', { + values: { items }, + defaultMessage: 'Showing {items} exceptions', + }); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/types.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/types.ts index e8393610e459d..d60d1ef71e502 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/types.ts @@ -5,6 +5,12 @@ */ import { ReactNode } from 'react'; +import { + NamespaceType, + ExceptionList, + ExceptionListItemSchema as ExceptionItem, +} from '../../../lists_plugin_deps'; + export interface OperatorOption { message: string; value: string; @@ -56,10 +62,51 @@ export interface Comment { comment: string; } +export enum ExceptionListType { + DETECTION_ENGINE = 'detection', + ENDPOINT = 'endpoint', +} + +export interface FilterOptions { + filter: string; + showDetectionsList: boolean; + showEndpointList: boolean; + tags: string[]; +} + +export interface Filter { + filter: Partial; + pagination: Partial; +} + +export interface SetExceptionsProps { + lists: ExceptionList[]; + exceptions: ExceptionItem[]; + pagination: Pagination; +} + +export interface ApiProps { + id: string; + namespaceType: NamespaceType; +} + +export interface Pagination { + page: number; + perPage: number; + total: number; +} + +export interface ExceptionsPagination { + pageIndex: number; + pageSize: number; + totalItemCount: number; + pageSizeOptions: number[]; +} + // TODO: Delete once types are updated export interface ExceptionListItemSchema { _tags: string[]; - comments: Comment[]; + comment: Comment[]; created_at: string; created_by: string; description?: string; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx similarity index 98% rename from x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.test.tsx rename to x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx index 536d005c57b6e..c5d2ffc7ac2bf 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx @@ -11,7 +11,7 @@ import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import moment from 'moment-timezone'; import { ExceptionDetails } from './exception_details'; -import { getExceptionItemMock } from '../mocks'; +import { getExceptionItemMock } from '../../mocks'; describe('ExceptionDetails', () => { beforeEach(() => { @@ -24,7 +24,7 @@ describe('ExceptionDetails', () => { test('it renders no comments button if no comments exist', () => { const exceptionItem = getExceptionItemMock(); - exceptionItem.comments = []; + exceptionItem.comment = []; const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> @@ -77,7 +77,7 @@ describe('ExceptionDetails', () => { test('it renders comments plural if more than one', () => { const exceptionItem = getExceptionItemMock(); - exceptionItem.comments = [ + exceptionItem.comment = [ { user: 'user_1', timestamp: '2020-04-23T00:19:13.289Z', diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.tsx rename to x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx index 8745e80a21548..6f418808b239a 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx @@ -9,9 +9,9 @@ import React, { useMemo } from 'react'; import styled, { css } from 'styled-components'; import { transparentize } from 'polished'; -import { ExceptionListItemSchema } from '../types'; -import { getDescriptionListContent } from '../helpers'; -import * as i18n from '../translations'; +import { ExceptionListItemSchema } from '../../types'; +import { getDescriptionListContent } from '../../helpers'; +import * as i18n from '../../translations'; const StyledExceptionDetails = styled(EuiFlexItem)` ${({ theme }) => css` @@ -40,8 +40,9 @@ const ExceptionDetailsComponent = ({ const descriptionList = useMemo(() => getDescriptionListContent(exceptionItem), [exceptionItem]); const commentsSection = useMemo((): JSX.Element => { - const { comments } = exceptionItem; - if (comments.length > 0) { + // TODO: return back to exceptionItem.comments once updated + const { comment } = exceptionItem; + if (comment.length > 0) { return ( - {!showComments - ? i18n.COMMENTS_SHOW(comments.length) - : i18n.COMMENTS_HIDE(comments.length)} + {!showComments ? i18n.COMMENTS_SHOW(comment.length) : i18n.COMMENTS_HIDE(comment.length)} ); } else { diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx similarity index 94% rename from x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.test.tsx rename to x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx index e0c62f51d032a..10f11231ace01 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx @@ -10,14 +10,15 @@ import { mount } from 'enzyme'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { ExceptionEntries } from './exception_entries'; -import { getFormattedEntryMock } from '../mocks'; -import { getEmptyValue } from '../../empty_value'; +import { getFormattedEntryMock } from '../../mocks'; +import { getEmptyValue } from '../../../empty_value'; describe('ExceptionEntries', () => { test('it does NOT render the and badge if only one exception item entry exists', () => { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> theme.eui.euiSize}; @@ -47,12 +47,14 @@ const AndOrBadgeContainer = styled(EuiFlexItem)` interface ExceptionEntriesComponentProps { entries: FormattedEntry[]; + disableDelete: boolean; handleDelete: () => void; handleEdit: () => void; } const ExceptionEntriesComponent = ({ entries, + disableDelete, handleDelete, handleEdit, }: ExceptionEntriesComponentProps): JSX.Element => { @@ -141,6 +143,7 @@ const ExceptionEntriesComponent = ({ size="s" color="primary" onClick={handleEdit} + isDisabled={disableDelete} data-test-subj="exceptionsViewerEditBtn" > {i18n.EDIT} @@ -151,6 +154,7 @@ const ExceptionEntriesComponent = ({ size="s" color="danger" onClick={handleDelete} + isLoading={disableDelete} data-test-subj="exceptionsViewerDeleteBtn" > {i18n.REMOVE} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx new file mode 100644 index 0000000000000..784fc4336a5ff --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { mount } from 'enzyme'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { ExceptionItem } from './'; +import { getExceptionItemMock } from '../../mocks'; + +describe('ExceptionItem', () => { + it('it renders ExceptionDetails and ExceptionEntries', () => { + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('ExceptionDetails')).toHaveLength(1); + expect(wrapper.find('ExceptionEntries')).toHaveLength(1); + }); + + it('it invokes "handleEdit" when edit button clicked', () => { + const mockHandleEdit = jest.fn(); + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + const editBtn = wrapper.find('[data-test-subj="exceptionsViewerEditBtn"] button').at(0); + editBtn.simulate('click'); + + expect(mockHandleEdit).toHaveBeenCalledTimes(1); + }); + + it('it invokes "handleDelete" when delete button clicked', () => { + const mockHandleDelete = jest.fn(); + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + const editBtn = wrapper.find('[data-test-subj="exceptionsViewerDeleteBtn"] button').at(0); + editBtn.simulate('click'); + + expect(mockHandleDelete).toHaveBeenCalledTimes(1); + }); + + it('it renders comment accordion closed to begin with', () => { + const mockHandleDelete = jest.fn(); + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('.euiAccordion-isOpen')).toHaveLength(0); + }); + + it('it renders comment accordion open when showComments is true', () => { + const mockHandleDelete = jest.fn(); + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + const commentsBtn = wrapper + .find('.euiButtonEmpty[data-test-subj="exceptionsViewerItemCommentsBtn"]') + .at(0); + commentsBtn.simulate('click'); + + expect(wrapper.find('.euiAccordion-isOpen')).toHaveLength(1); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx new file mode 100644 index 0000000000000..386ab6f3c3c7c --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + EuiPanel, + EuiFlexGroup, + EuiCommentProps, + EuiCommentList, + EuiAccordion, + EuiFlexItem, +} from '@elastic/eui'; +import React, { useEffect, useState, useMemo, useCallback } from 'react'; +import styled from 'styled-components'; + +import { ExceptionDetails } from './exception_details'; +import { ExceptionEntries } from './exception_entries'; +import { getFormattedEntries, getFormattedComments } from '../../helpers'; +import { FormattedEntry, ExceptionListItemSchema, ApiProps } from '../../types'; + +const MyFlexItem = styled(EuiFlexItem)` + &.comments--show { + padding: ${({ theme }) => theme.eui.euiSize}; + border-top: ${({ theme }) => `${theme.eui.euiBorderThin}`} + +`; + +interface ExceptionItemProps { + loadingItemIds: ApiProps[]; + exceptionItem: ExceptionListItemSchema; + commentsAccordionId: string; + handleDelete: (arg: ApiProps) => void; + handleEdit: (item: ExceptionListItemSchema) => void; +} + +const ExceptionItemComponent = ({ + loadingItemIds, + exceptionItem, + commentsAccordionId, + handleDelete, + handleEdit, +}: ExceptionItemProps): JSX.Element => { + const [entryItems, setEntryItems] = useState([]); + const [showComments, setShowComments] = useState(false); + + useEffect((): void => { + const formattedEntries = getFormattedEntries(exceptionItem.entries); + setEntryItems(formattedEntries); + }, [exceptionItem.entries]); + + const onDelete = useCallback((): void => { + handleDelete({ id: exceptionItem.id, namespaceType: exceptionItem.namespace_type }); + }, [handleDelete, exceptionItem]); + + const onEdit = useCallback((): void => { + handleEdit(exceptionItem); + }, [handleEdit, exceptionItem]); + + const onCommentsClick = useCallback((): void => { + setShowComments(!showComments); + }, [setShowComments, showComments]); + + const formattedComments = useMemo((): EuiCommentProps[] => { + // TODO: return back to exceptionItem.comments once updated + return getFormattedComments(exceptionItem.comment); + }, [exceptionItem]); + + const disableDelete = useMemo((): boolean => { + const foundItems = loadingItemIds.filter((t) => t.id === exceptionItem.id); + return foundItems.length > 0; + }, [loadingItemIds, exceptionItem.id]); + + return ( + + + + + + + + + + + + + + + + ); +}; + +ExceptionItemComponent.displayName = 'ExceptionItemComponent'; + +export const ExceptionItem = React.memo(ExceptionItemComponent); + +ExceptionItem.displayName = 'ExceptionItem'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.test.tsx new file mode 100644 index 0000000000000..dcc8611cd7298 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.test.tsx @@ -0,0 +1,158 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { mount } from 'enzyme'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { ExceptionsViewerPagination } from './exceptions_pagination'; + +describe('ExceptionsViewerPagination', () => { + it('it renders passed in "pageSize" as selected option', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="exceptionsPerPageBtn"]').at(0).text()).toEqual( + 'Items per page: 50' + ); + }); + + it('it renders all passed in page size options when per page button clicked', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsPerPageBtn"] button').simulate('click'); + + expect(wrapper.find('button[data-test-subj="exceptionsPerPageItem"]').at(0).text()).toEqual( + '20 items' + ); + expect(wrapper.find('button[data-test-subj="exceptionsPerPageItem"]').at(1).text()).toEqual( + '50 items' + ); + expect(wrapper.find('button[data-test-subj="exceptionsPerPageItem"]').at(2).text()).toEqual( + '100 items' + ); + }); + + it('it invokes "onPaginationChange" when per page item is clicked', () => { + const mockOnPaginationChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsPerPageBtn"] button').simulate('click'); + wrapper.find('button[data-test-subj="exceptionsPerPageItem"]').at(0).simulate('click'); + + expect(mockOnPaginationChange).toHaveBeenCalledWith({ + filter: {}, + pagination: { pageIndex: 0, pageSize: 20, totalItemCount: 1 }, + }); + }); + + it('it renders correct total page count', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="exceptionsPagination"]').at(0).prop('pageCount')).toEqual( + 4 + ); + expect( + wrapper.find('[data-test-subj="exceptionsPagination"]').at(0).prop('activePage') + ).toEqual(0); + }); + + it('it invokes "onPaginationChange" when next clicked', () => { + const mockOnPaginationChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="pagination-button-next"]').at(1).simulate('click'); + + expect(mockOnPaginationChange).toHaveBeenCalledWith({ + filter: {}, + pagination: { pageIndex: 2, pageSize: 50, totalItemCount: 160 }, + }); + }); + + it('it invokes "onPaginationChange" when page clicked', () => { + const mockOnPaginationChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('button[data-test-subj="pagination-button-3"]').simulate('click'); + + expect(mockOnPaginationChange).toHaveBeenCalledWith({ + filter: {}, + pagination: { pageIndex: 4, pageSize: 50, totalItemCount: 160 }, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.tsx new file mode 100644 index 0000000000000..0953a5c666c5d --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.tsx @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { ReactElement, useCallback, useState, useMemo } from 'react'; +import { + EuiContextMenuItem, + EuiButtonEmpty, + EuiPagination, + EuiFlexItem, + EuiFlexGroup, + EuiPopover, + EuiContextMenuPanel, +} from '@elastic/eui'; + +import * as i18n from '../translations'; +import { ExceptionsPagination, Filter } from '../types'; + +interface ExceptionsViewerPaginationProps { + pagination: ExceptionsPagination; + onPaginationChange: (arg: Filter) => void; +} + +const ExceptionsViewerPaginationComponent = ({ + pagination, + onPaginationChange, +}: ExceptionsViewerPaginationProps): JSX.Element => { + const [isOpen, setIsOpen] = useState(false); + + const closePerPageMenu = useCallback((): void => setIsOpen(false), [setIsOpen]); + + const onPerPageMenuClick = useCallback((): void => setIsOpen((isPopoverOpen) => !isPopoverOpen), [ + setIsOpen, + ]); + + const onPageClick = useCallback( + (pageIndex: number): void => { + onPaginationChange({ + filter: {}, + pagination: { + pageIndex: pageIndex + 1, + pageSize: pagination.pageSize, + totalItemCount: pagination.totalItemCount, + }, + }); + }, + [pagination, onPaginationChange] + ); + + const items = useMemo((): ReactElement[] => { + return pagination.pageSizeOptions.map((rows) => ( + { + onPaginationChange({ + filter: {}, + pagination: { + pageIndex: pagination.pageIndex, + pageSize: rows, + totalItemCount: pagination.totalItemCount, + }, + }); + closePerPageMenu(); + }} + data-test-subj="exceptionsPerPageItem" + > + {i18n.NUMBER_OF_ITEMS(rows)} + + )); + }, [pagination, onPaginationChange, closePerPageMenu]); + + const totalPages = useMemo((): number => { + if (pagination.totalItemCount > 0) { + return Math.ceil(pagination.totalItemCount / pagination.pageSize); + } else { + return 1; + } + }, [pagination]); + + return ( + + + + {i18n.ITEMS_PER_PAGE(pagination.pageSize)} + + } + isOpen={isOpen} + closePopover={closePerPageMenu} + panelPaddingSize="none" + > + + + + + + + + + ); +}; + +ExceptionsViewerPaginationComponent.displayName = 'ExceptionsViewerPaginationComponent'; + +export const ExceptionsViewerPagination = React.memo(ExceptionsViewerPaginationComponent); + +ExceptionsViewerPagination.displayName = 'ExceptionsViewerPagination'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.test.tsx new file mode 100644 index 0000000000000..bdc99370a6293 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.test.tsx @@ -0,0 +1,337 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { mount } from 'enzyme'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { ExceptionsViewerHeader } from './exceptions_viewer_header'; +import { ExceptionListType } from '../types'; + +describe('ExceptionsViewerHeader', () => { + it('it renders all disabled if "isInitLoading" is true', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect( + wrapper.find('input[data-test-subj="exceptionsHeaderSearch"]').at(0).prop('disabled') + ).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="exceptionsDetectionFilterBtn"] button').at(0).prop('disabled') + ).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="exceptionsEndpointFilterBtn"] button').at(0).prop('disabled') + ).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"] button') + .at(0) + .prop('disabled') + ).toBeTruthy(); + }); + + it('it displays toggles and add exception popover when more than one list type available', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="exceptionsFilterGroupBtns"]').exists()).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"]').exists() + ).toBeTruthy(); + }); + + it('it does not display toggles and add exception popover if only one list type is available', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="exceptionsFilterGroupBtns"]')).toHaveLength(0); + expect(wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"]')).toHaveLength( + 0 + ); + }); + + it('it displays add exception button without popover if only one list type is available', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect( + wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionBtn"]').exists() + ).toBeTruthy(); + }); + + it('it renders detections filter toggle selected when clicked', () => { + const mockOnFilterChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsDetectionFilterBtn"] button').simulate('click'); + + expect( + wrapper + .find('EuiFilterButton[data-test-subj="exceptionsDetectionFilterBtn"]') + .at(0) + .prop('hasActiveFilters') + ).toBeTruthy(); + expect( + wrapper + .find('EuiFilterButton[data-test-subj="exceptionsEndpointFilterBtn"]') + .at(0) + .prop('hasActiveFilters') + ).toBeFalsy(); + expect(mockOnFilterChange).toHaveBeenCalledWith({ + filter: { + filter: '', + showDetectionsList: true, + showEndpointList: false, + tags: [], + }, + pagination: {}, + }); + }); + + it('it renders endpoint filter toggle selected and invokes "onFilterChange" when clicked', () => { + const mockOnFilterChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsEndpointFilterBtn"] button').simulate('click'); + + expect( + wrapper + .find('EuiFilterButton[data-test-subj="exceptionsEndpointFilterBtn"]') + .at(0) + .prop('hasActiveFilters') + ).toBeTruthy(); + expect( + wrapper + .find('EuiFilterButton[data-test-subj="exceptionsDetectionFilterBtn"]') + .at(0) + .prop('hasActiveFilters') + ).toBeFalsy(); + expect(mockOnFilterChange).toHaveBeenCalledWith({ + filter: { + filter: '', + showDetectionsList: false, + showEndpointList: true, + tags: [], + }, + pagination: {}, + }); + }); + + it('it invokes "onAddExceptionClick" when user selects to add an exception item and only endpoint exception lists are available', () => { + const mockOnAddExceptionClick = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionBtn"] button').simulate('click'); + + expect(mockOnAddExceptionClick).toHaveBeenCalledTimes(1); + }); + + it('it invokes "onAddDetectionsExceptionClick" when user selects to add an exception item and only endpoint detections lists are available', () => { + const mockOnAddExceptionClick = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionBtn"] button').simulate('click'); + + expect(mockOnAddExceptionClick).toHaveBeenCalledTimes(1); + }); + + it('it invokes "onAddEndpointExceptionClick" when user selects to add an exception item to endpoint list from popover', () => { + const mockOnAddExceptionClick = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper + .find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"] button') + .simulate('click'); + wrapper.find('[data-test-subj="addEndpointExceptionBtn"] button').simulate('click'); + + expect(mockOnAddExceptionClick).toHaveBeenCalledTimes(1); + }); + + it('it invokes "onAddDetectionsExceptionClick" when user selects to add an exception item to endpoint list from popover', () => { + const mockOnAddExceptionClick = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper + .find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"] button') + .simulate('click'); + wrapper.find('[data-test-subj="addDetectionsExceptionBtn"] button').simulate('click'); + + expect(mockOnAddExceptionClick).toHaveBeenCalledTimes(1); + }); + + it('it invokes "onFilterChange" with filter value when search used', () => { + const mockOnFilterChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper + .find('input[data-test-subj="exceptionsHeaderSearch"]') + .at(0) + .simulate('change', { + target: { value: 'host' }, + }); + + expect(mockOnFilterChange).toHaveBeenCalledWith({ + filter: { + filter: 'host', + showDetectionsList: false, + showEndpointList: false, + tags: [], + }, + pagination: {}, + }); + }); + + it('it invokes "onFilterChange" with tags values when search value includes "tags:..."', () => { + const mockOnFilterChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper + .find('input[data-test-subj="exceptionsHeaderSearch"]') + .at(0) + .simulate('change', { + target: { value: 'tags:malware' }, + }); + + expect(mockOnFilterChange).toHaveBeenCalledWith({ + filter: { + filter: '', + showDetectionsList: false, + showEndpointList: false, + tags: ['malware'], + }, + pagination: {}, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.tsx new file mode 100644 index 0000000000000..92a8830310b51 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.tsx @@ -0,0 +1,204 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + EuiFieldSearch, + EuiFlexGroup, + EuiFlexItem, + EuiPopover, + EuiContextMenu, + EuiButton, + EuiFilterGroup, + EuiFilterButton, + EuiContextMenuPanelDescriptor, +} from '@elastic/eui'; +import React, { useEffect, useState, useCallback, useMemo } from 'react'; + +import * as i18n from '../translations'; +import { ExceptionListType, Filter } from '../types'; + +interface ExceptionsViewerHeaderProps { + isInitLoading: boolean; + supportedListTypes: ExceptionListType[]; + detectionsListItems: number; + endpointListItems: number; + onFilterChange: (arg: Filter) => void; + onAddExceptionClick: (type: ExceptionListType) => void; +} + +/** + * Collection of filters and toggles for filtering exception items. + */ +const ExceptionsViewerHeaderComponent = ({ + isInitLoading, + supportedListTypes, + detectionsListItems, + endpointListItems, + onFilterChange, + onAddExceptionClick, +}: ExceptionsViewerHeaderProps): JSX.Element => { + const [filter, setFilter] = useState(''); + const [tags, setTags] = useState([]); + const [showDetectionsList, setShowDetectionsList] = useState(false); + const [showEndpointList, setShowEndpointList] = useState(false); + const [isAddExceptionMenuOpen, setAddExceptionMenuOpen] = useState(false); + + useEffect((): void => { + onFilterChange({ + filter: { filter, showDetectionsList, showEndpointList, tags }, + pagination: {}, + }); + }, [filter, tags, showDetectionsList, showEndpointList, onFilterChange]); + + const onAddExceptionDropdownClick = useCallback( + (): void => setAddExceptionMenuOpen(!isAddExceptionMenuOpen), + [setAddExceptionMenuOpen, isAddExceptionMenuOpen] + ); + + const handleDetectionsListClick = useCallback((): void => { + setShowDetectionsList(!showDetectionsList); + setShowEndpointList(false); + }, [showDetectionsList, setShowDetectionsList, setShowEndpointList]); + + const handleEndpointListClick = useCallback((): void => { + setShowEndpointList(!showEndpointList); + setShowDetectionsList(false); + }, [showEndpointList, setShowEndpointList, setShowDetectionsList]); + + const handleOnSearch = useCallback( + (event: React.ChangeEvent): void => { + const searchValue = event.target.value; + const tagsRegex = /(tags:[^\s]*)/i; + const tagsMatch = searchValue.match(tagsRegex); + const foundTags: string = tagsMatch != null ? tagsMatch[0].split(':')[1] : ''; + const filterString = tagsMatch != null ? searchValue.replace(tagsRegex, '') : searchValue; + + if (foundTags.length > 0) { + setTags(foundTags.split(',')); + } + + setFilter(filterString.trim()); + }, + [setTags, setFilter] + ); + + const onAddException = useCallback( + (type: ExceptionListType): void => { + onAddExceptionClick(type); + setAddExceptionMenuOpen(false); + }, + [onAddExceptionClick, setAddExceptionMenuOpen] + ); + + const addExceptionButtonOptions = useMemo( + (): EuiContextMenuPanelDescriptor[] => [ + { + id: 0, + items: [ + { + name: i18n.ADD_TO_ENDPOINT_LIST, + onClick: () => onAddException(ExceptionListType.ENDPOINT), + 'data-test-subj': 'addEndpointExceptionBtn', + }, + { + name: i18n.ADD_TO_DETECTIONS_LIST, + onClick: () => onAddException(ExceptionListType.DETECTION_ENGINE), + 'data-test-subj': 'addDetectionsExceptionBtn', + }, + ], + }, + ], + [onAddException] + ); + + return ( + + + + + + {supportedListTypes.length < 2 && ( + + onAddException(supportedListTypes[0])} + isDisabled={isInitLoading} + fill + > + {i18n.ADD_EXCEPTION_LABEL} + + + )} + + {supportedListTypes.length > 1 && ( + + + + + + {i18n.DETECTION_LIST} + {detectionsListItems != null ? ` (${detectionsListItems})` : ''} + + + {i18n.ENDPOINT_LIST} + {endpointListItems != null ? ` (${endpointListItems})` : ''} + + + + + + + {i18n.ADD_EXCEPTION_LABEL} + + } + isOpen={isAddExceptionMenuOpen} + closePopover={onAddExceptionDropdownClick} + anchorPosition="downCenter" + panelPaddingSize="none" + repositionOnScroll + > + + + + + + )} + + ); +}; + +ExceptionsViewerHeaderComponent.displayName = 'ExceptionsViewerHeaderComponent'; + +export const ExceptionsViewerHeader = React.memo(ExceptionsViewerHeaderComponent); + +ExceptionsViewerHeader.displayName = 'ExceptionsViewerHeader'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx index 7d3b7195def80..cc8e8111064bc 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx @@ -9,108 +9,120 @@ import { ThemeProvider } from 'styled-components'; import { mount } from 'enzyme'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; -import { ExceptionItem } from './'; -import { getExceptionItemMock } from '../mocks'; - -describe('ExceptionItem', () => { - it('it renders ExceptionDetails and ExceptionEntries', () => { - const exceptionItem = getExceptionItemMock(); - - const wrapper = mount( - ({ eui: euiLightVars, darkMode: false })}> - - - ); - - expect(wrapper.find('ExceptionDetails')).toHaveLength(1); - expect(wrapper.find('ExceptionEntries')).toHaveLength(1); - }); - - it('it invokes "handleEdit" when edit button clicked', () => { - const mockHandleEdit = jest.fn(); - const exceptionItem = getExceptionItemMock(); - - const wrapper = mount( - ({ eui: euiLightVars, darkMode: false })}> - - - ); - - const editBtn = wrapper.find('[data-test-subj="exceptionsViewerEditBtn"] button').at(0); - editBtn.simulate('click'); - - expect(mockHandleEdit).toHaveBeenCalledTimes(1); +import { ExceptionsViewer } from './'; +import { ExceptionListType } from '../types'; +import { useKibana } from '../../../../common/lib/kibana'; +import { useExceptionList, useApi } from '../../../../../public/lists_plugin_deps'; +import { getExceptionListMock } from '../mocks'; + +jest.mock('../../../../common/lib/kibana'); +jest.mock('../../../../../public/lists_plugin_deps'); + +describe('ExceptionsViewer', () => { + beforeEach(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + http: {}, + application: { + getUrlForApp: () => 'some/url', + }, + }, + }); + + (useApi as jest.Mock).mockReturnValue({ + deleteExceptionItem: jest.fn().mockResolvedValue(true), + }); + + (useExceptionList as jest.Mock).mockReturnValue([ + false, + [], + [], + { + page: 1, + perPage: 20, + total: 0, + }, + jest.fn(), + ]); }); - it('it invokes "handleDelete" when delete button clicked', () => { - const mockHandleDelete = jest.fn(); - const exceptionItem = getExceptionItemMock(); - + it('it renders loader if "initLoading" is true', () => { + (useExceptionList as jest.Mock).mockReturnValue([ + true, + [], + [], + { + page: 1, + perPage: 20, + total: 0, + }, + jest.fn(), + ]); const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> - ); - const editBtn = wrapper.find('[data-test-subj="exceptionsViewerDeleteBtn"] button').at(0); - editBtn.simulate('click'); - - expect(mockHandleDelete).toHaveBeenCalledTimes(1); + expect(wrapper.find('[data-test-subj="loadingPanelAllRulesTable"]').exists()).toBeTruthy(); }); - it('it renders comment accordion closed to begin with', () => { - const mockHandleDelete = jest.fn(); - const exceptionItem = getExceptionItemMock(); - + it('it renders empty prompt if no "exceptionListMeta" passed in', () => { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> - ); - expect(wrapper.find('.euiAccordion-isOpen')).toHaveLength(0); + expect(wrapper.find('[data-test-subj="exceptionsEmptyPrompt"]').exists()).toBeTruthy(); }); - it('it renders comment accordion open when showComments is true', () => { - const mockHandleDelete = jest.fn(); - const exceptionItem = getExceptionItemMock(); + it('it renders empty prompt if no exception items exist', () => { + (useExceptionList as jest.Mock).mockReturnValue([ + false, + [getExceptionListMock()], + [], + { + page: 1, + perPage: 20, + total: 0, + }, + jest.fn(), + ]); const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> - ); - const commentsBtn = wrapper - .find('.euiButtonEmpty[data-test-subj="exceptionsViewerItemCommentsBtn"]') - .at(0); - commentsBtn.simulate('click'); - - expect(wrapper.find('.euiAccordion-isOpen')).toHaveLength(1); + expect(wrapper.find('[data-test-subj="exceptionsEmptyPrompt"]').exists()).toBeTruthy(); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx index f4cdce62f56b3..ff52e395c3b1e 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx @@ -4,96 +4,412 @@ * you may not use this file except in compliance with the Elastic License. */ +import React, { useCallback, useState, useMemo, useEffect, useReducer } from 'react'; import { - EuiPanel, + EuiEmptyPrompt, + EuiText, + EuiLink, + EuiOverlayMask, + EuiModal, + EuiModalBody, + EuiCodeBlock, EuiFlexGroup, - EuiCommentProps, - EuiCommentList, - EuiAccordion, EuiFlexItem, + EuiSpacer, } from '@elastic/eui'; -import React, { useEffect, useState, useMemo, useCallback } from 'react'; +import { FormattedMessage } from 'react-intl'; import styled from 'styled-components'; +import uuid from 'uuid'; -import { ExceptionDetails } from './exception_details'; -import { ExceptionEntries } from './exception_entries'; -import { getFormattedEntries, getFormattedComments } from '../helpers'; -import { FormattedEntry, ExceptionListItemSchema } from '../types'; +import * as i18n from '../translations'; +import { useStateToaster } from '../../toasters'; +import { useKibana } from '../../../../common/lib/kibana'; +import { Panel } from '../../../../common/components/panel'; +import { Loader } from '../../../../common/components/loader'; +import { ExceptionsViewerHeader } from './exceptions_viewer_header'; +import { + ExceptionListType, + ExceptionListItemSchema, + ApiProps, + Filter, + SetExceptionsProps, +} from '../types'; +import { allExceptionItemsReducer, State } from './reducer'; +import { + useExceptionList, + ExceptionIdentifiers, + useApi, +} from '../../../../../public/lists_plugin_deps'; +import { ExceptionItem } from './exception_item'; +import { AndOrBadge } from '../../and_or_badge'; +import { ExceptionsViewerPagination } from './exceptions_pagination'; +import { + UtilityBar, + UtilityBarSection, + UtilityBarGroup, + UtilityBarText, + UtilityBarAction, +} from '../../utility_bar'; -const MyFlexItem = styled(EuiFlexItem)` - &.comments--show { - padding: ${({ theme }) => theme.eui.euiSize}; - border-top: ${({ theme }) => `${theme.eui.euiBorderThin}`} +const StyledText = styled(EuiText)` + font-style: italic; +`; +const MyExceptionsContainer = styled.div` + height: 600px; + overflow: hidden; `; -interface ExceptionItemProps { - exceptionItem: ExceptionListItemSchema; +const initialState: State = { + filterOptions: { filter: '', showEndpointList: false, showDetectionsList: false, tags: [] }, + pagination: { + pageIndex: 0, + pageSize: 20, + totalItemCount: 0, + pageSizeOptions: [5, 10, 20, 50, 100, 200, 300], + }, + endpointList: null, + detectionsList: null, + allExceptions: [], + exceptions: [], + exceptionToEdit: null, + loadingItemIds: [], + isModalOpen: false, +}; + +enum ModalAction { + CREATE = 'CREATE', + EDIT = 'EDIT', +} + +interface ExceptionsViewerProps { + ruleId: string; + exceptionListsMeta: ExceptionIdentifiers[]; + availableListTypes: ExceptionListType[]; commentsAccordionId: string; - handleDelete: ({ id }: { id: string }) => void; - handleEdit: (item: ExceptionListItemSchema) => void; + onAssociateList?: (listId: string) => void; } -const ExceptionItemComponent = ({ - exceptionItem, +const ExceptionsViewerComponent = ({ + ruleId, + exceptionListsMeta, + availableListTypes, + onAssociateList, commentsAccordionId, - handleDelete, - handleEdit, -}: ExceptionItemProps): JSX.Element => { - const [entryItems, setEntryItems] = useState([]); - const [showComments, setShowComments] = useState(false); +}: ExceptionsViewerProps): JSX.Element => { + const { services } = useKibana(); + const [, dispatchToaster] = useStateToaster(); + const [initLoading, setInitLoading] = useState(true); + const onDispatchToaster = useCallback( + ({ title, color, iconType }) => (): void => { + dispatchToaster({ + type: 'addToaster', + toast: { + id: uuid.v4(), + title, + color, + iconType, + }, + }); + }, + [dispatchToaster] + ); + const { deleteExceptionItem } = useApi(services.http); + const [ + { + endpointList, + detectionsList, + exceptions, + filterOptions, + pagination, + loadingItemIds, + isModalOpen, + }, + dispatch, + ] = useReducer(allExceptionItemsReducer(), initialState); - useEffect((): void => { - const formattedEntries = getFormattedEntries(exceptionItem.entries); - setEntryItems(formattedEntries); - }, [exceptionItem.entries]); + // TODO: Update icky typing once api updated + const setExceptions = useCallback( + ({ + lists: newLists, + exceptions: newExceptions, + pagination: newPagination, + }: SetExceptionsProps) => { + dispatch({ + type: 'setExceptions', + lists: newLists, + exceptions: (newExceptions as unknown) as ExceptionListItemSchema[], + pagination: newPagination, + }); + }, + [dispatch] + ); + const [loadingList, , , , fetchList] = useExceptionList({ + http: services.http, + lists: exceptionListsMeta, + filterOptions, + pagination: { + page: pagination.pageIndex + 1, + perPage: pagination.pageSize, + total: pagination.totalItemCount, + }, + dispatchListsInReducer: setExceptions, + onError: onDispatchToaster({ + color: 'danger', + title: i18n.FETCH_LIST_ERROR, + iconType: 'alert', + }), + }); - const onDelete = useCallback((): void => { - handleDelete({ id: exceptionItem.id }); - }, [handleDelete, exceptionItem]); + const setIsModalOpen = useCallback( + (isOpen: boolean): void => { + dispatch({ + type: 'updateModalOpen', + isOpen, + }); + }, + [dispatch] + ); + + const onFetchList = useCallback((): void => { + if (fetchList != null) { + fetchList(); + } + }, [fetchList]); + + const onFiltersChange = useCallback( + ({ filter, pagination: pag }: Filter): void => { + dispatch({ + type: 'updateFilterOptions', + filterOptions: filter, + pagination: pag, + }); + }, + [dispatch] + ); + + const onAddException = useCallback( + (type: ExceptionListType): void => { + setIsModalOpen(true); + }, + [setIsModalOpen] + ); + + const onEditExceptionItem = useCallback( + (exception: ExceptionListItemSchema): void => { + // TODO: Added this just for testing. Update + // modal state logic as needed once ready + dispatch({ + type: 'updateExceptionToEdit', + exception, + }); - const onEdit = useCallback((): void => { - handleEdit(exceptionItem); - }, [handleEdit, exceptionItem]); + setIsModalOpen(true); + }, + [setIsModalOpen] + ); - const onCommentsClick = useCallback((): void => { - setShowComments(!showComments); - }, [setShowComments, showComments]); + const onCloseExceptionModal = useCallback( + ({ actionType, listId }): void => { + setIsModalOpen(false); - const formattedComments = useMemo((): EuiCommentProps[] => { - return getFormattedComments(exceptionItem.comments); - }, [exceptionItem]); + // TODO: This callback along with fetchList can probably get + // passed to the modal for it to call itself maybe + if (actionType === ModalAction.CREATE && listId != null && onAssociateList != null) { + onAssociateList(listId); + } + + onFetchList(); + }, + [setIsModalOpen, onFetchList, onAssociateList] + ); + + const setLoadingItemIds = useCallback( + (items: ApiProps[]): void => { + dispatch({ + type: 'updateLoadingItemIds', + items, + }); + }, + [dispatch] + ); + + const onDeleteException = useCallback( + ({ id, namespaceType }: ApiProps) => { + deleteExceptionItem({ + id, + namespaceType, + onSuccess: () => { + setLoadingItemIds(loadingItemIds.filter((t) => t.id !== id)); + onFetchList(); + }, + onError: () => { + const dispatchToasterError = onDispatchToaster({ + color: 'danger', + title: i18n.DELETE_EXCEPTION_ERROR, + iconType: 'alert', + }); + + dispatchToasterError(); + setLoadingItemIds(loadingItemIds.filter((t) => t.id !== id)); + }, + }); + }, + [setLoadingItemIds, deleteExceptionItem, loadingItemIds, onFetchList, onDispatchToaster] + ); + + // Logic for initial render + useEffect((): void => { + if (initLoading && !loadingList && (exceptions.length === 0 || exceptions != null)) { + setInitLoading(false); + } + }, [initLoading, exceptions, loadingList]); + + const ruleSettingsUrl = useMemo((): string => { + return services.application.getUrlForApp( + `security#/detections/rules/id/${encodeURI(ruleId)}/edit` + ); + }, [ruleId, services.application]); + + const exceptionsSubtext = useMemo((): JSX.Element => { + if (filterOptions.showEndpointList) { + return ( + + + + ), + }} + /> + ); + } else if (filterOptions.showDetectionsList) { + return ( + + + + ), + }} + /> + ); + } else { + return <>; + } + }, [filterOptions.showEndpointList, filterOptions.showDetectionsList, ruleSettingsUrl]); + + const showEmpty = useMemo((): boolean => { + return !initLoading && !loadingList && exceptions.length === 0; + }, [initLoading, exceptions.length, loadingList]); return ( - - - - - + {isModalOpen && ( + + + + + {`Modal goes here`} + + + + + )} + + + {initLoading && } + + + + {(filterOptions.showEndpointList || filterOptions.showDetectionsList) && ( + <> + + {exceptionsSubtext} + + )} + + + + + + + + {i18n.SHOWING_EXCEPTIONS(pagination.totalItemCount ?? 0)} + + + + + + {i18n.REFRESH} + + + + + + + + + {showEmpty && ( + {i18n.EXCEPTION_EMPTY_PROMPT_TITLE}} + body={

{i18n.EXCEPTION_EMPTY_PROMPT_BODY}

} + data-test-subj="exceptionsEmptyPrompt" /> - + )} + + + + + {!initLoading && + exceptions.length > 0 && + exceptions.map((exception, index) => ( + + {index !== 0 && ( + <> + + + + )} + + + ))} -
- - - - - -
-
+ + + + ); }; -ExceptionItemComponent.displayName = 'ExceptionItemComponent'; +ExceptionsViewerComponent.displayName = 'ExceptionsViewerComponent'; -export const ExceptionItem = React.memo(ExceptionItemComponent); +export const ExceptionsViewer = React.memo(ExceptionsViewerComponent); -ExceptionItem.displayName = 'ExceptionItem'; +ExceptionsViewer.displayName = 'ExceptionsViewer'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/reducer.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/reducer.ts new file mode 100644 index 0000000000000..40d5bb5f0a297 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/reducer.ts @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { + ApiProps, + FilterOptions, + ExceptionsPagination, + ExceptionListItemSchema, + Pagination, +} from '../types'; +import { ExceptionList } from '../../../../../public/lists_plugin_deps'; + +export interface State { + filterOptions: FilterOptions; + pagination: ExceptionsPagination; + endpointList: ExceptionList | null; + detectionsList: ExceptionList | null; + allExceptions: ExceptionListItemSchema[]; + exceptions: ExceptionListItemSchema[]; + exceptionToEdit: ExceptionListItemSchema | null; + loadingItemIds: ApiProps[]; + isModalOpen: boolean; +} + +export type Action = + | { + type: 'setExceptions'; + lists: ExceptionList[]; + exceptions: ExceptionListItemSchema[]; + pagination: Pagination; + } + | { + type: 'updateFilterOptions'; + filterOptions: Partial; + pagination: Partial; + } + | { type: 'updateModalOpen'; isOpen: boolean } + | { type: 'updateExceptionToEdit'; exception: ExceptionListItemSchema } + | { type: 'updateLoadingItemIds'; items: ApiProps[] }; + +export const allExceptionItemsReducer = () => (state: State, action: Action): State => { + switch (action.type) { + case 'setExceptions': { + const endpointList = action.lists.filter((t) => t.type === 'endpoint'); + const detectionsList = action.lists.filter((t) => t.type === 'detection'); + + return { + ...state, + endpointList: state.filterOptions.showDetectionsList + ? state.endpointList + : endpointList[0] ?? null, + detectionsList: state.filterOptions.showEndpointList + ? state.detectionsList + : detectionsList[0] ?? null, + pagination: { + ...state.pagination, + pageIndex: action.pagination.page - 1, + pageSize: action.pagination.perPage, + totalItemCount: action.pagination.total, + }, + allExceptions: action.exceptions, + exceptions: action.exceptions, + }; + } + case 'updateFilterOptions': { + const returnState = { + ...state, + filterOptions: { + ...state.filterOptions, + ...action.filterOptions, + }, + pagination: { + ...state.pagination, + ...action.pagination, + }, + }; + + if (action.filterOptions.showEndpointList) { + const exceptions = state.allExceptions.filter((t) => t._tags.includes('endpoint')); + + return { + ...returnState, + exceptions, + }; + } else if (action.filterOptions.showDetectionsList) { + const exceptions = state.allExceptions.filter((t) => t._tags.includes('detection')); + + return { + ...returnState, + exceptions, + }; + } else { + return { + ...returnState, + exceptions: state.allExceptions, + }; + } + } + case 'updateLoadingItemIds': { + return { + ...state, + loadingItemIds: [...state.loadingItemIds, ...action.items], + }; + } + case 'updateExceptionToEdit': { + return { + ...state, + exceptionToEdit: action.exception, + }; + } + case 'updateModalOpen': { + return { + ...state, + isModalOpen: action.isOpen, + }; + } + default: + return state; + } +}; diff --git a/x-pack/plugins/security_solution/public/lists_plugin_deps.ts b/x-pack/plugins/security_solution/public/lists_plugin_deps.ts index 350b53ef52f4e..113bfaa860f00 100644 --- a/x-pack/plugins/security_solution/public/lists_plugin_deps.ts +++ b/x-pack/plugins/security_solution/public/lists_plugin_deps.ts @@ -5,10 +5,18 @@ */ export { + useApi, useExceptionList, usePersistExceptionItem, usePersistExceptionList, + ExceptionIdentifiers, + ExceptionList, mockNewExceptionItem, mockNewExceptionList, } from '../../lists/public'; -export { ExceptionListItemSchema, Entries } from '../../lists/common/schemas'; +export { + ExceptionListSchema, + ExceptionListItemSchema, + Entries, + NamespaceType, +} from '../../lists/common/schemas'; From d00e91a2e551363d94cfe402b0da199a1681e01c Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 9 Jun 2020 20:06:50 -0700 Subject: [PATCH 66/91] [skip test] apis Kerberos security Kerberos authentication finishing SPNEGO should properly set cookie and authenticate user https://github.com/elastic/kibana/issues/68720 Signed-off-by: Tyler Smalley --- .../kerberos_api_integration/apis/security/kerberos_login.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts b/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts index 926dcc95b5513..6a93b94920d6d 100644 --- a/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts +++ b/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts @@ -98,7 +98,8 @@ export default function ({ getService }: FtrProviderContext) { }); describe('finishing SPNEGO', () => { - it('should properly set cookie and authenticate user', async () => { + // Skipped: https://github.com/elastic/kibana/issues/68720 + it.skip('should properly set cookie and authenticate user', async () => { const response = await supertest .get('/internal/security/me') .set('Authorization', `Negotiate ${spnegoToken}`) From cac9018f81a30212ab06ef5195dd5b4f8a4de9b4 Mon Sep 17 00:00:00 2001 From: Oliver Gupte Date: Tue, 9 Jun 2020 20:58:46 -0700 Subject: [PATCH 67/91] [APM] Service maps - Fix missing ML status for services with jobs but no anomalies (#68486) * Closes #68485 by: - use the ML plugin to query for all APM jobs - inspect the ml job groups to find all jobs related to a particular service - use the mlAnomalySearch client to get ml job buckets with the max anomaly score - query for the model_plot buckets to obtain actual/median values for the ML description - return the relevant ML job with the max anomaly score for a service - indicate to the user that no anomalies were found for a service with an ml job * - Use the anomalyDetectorsProvider jobs API rather than the search endpoint directly - Defines a specific return type for the ml jobs api - Update the empty anomaly data message * Code and types cleanup * Return to using record result type on anomaly queries. These are the same values used in the anomaly explorer and it includes actual & typical values which greatly improve performance of the previous query. * - If anomaly data is missing show a gray border around node * - moved AnomalyDetection out of service map Contents into own component Co-authored-by: Elastic Machine --- x-pack/plugins/apm/common/ml_job_constants.ts | 2 + x-pack/plugins/apm/common/service_map.ts | 10 ++ x-pack/plugins/apm/common/utils/left_join.ts | 21 +++ x-pack/plugins/apm/kibana.json | 3 +- .../app/ServiceMap/Popover/Contents.tsx | 133 +-------------- .../ServiceMap/Popover/anomaly_detection.tsx | 156 ++++++++++++++++++ .../app/ServiceMap/cytoscapeOptions.ts | 25 +-- x-pack/plugins/apm/public/services/rest/ml.ts | 3 +- .../server/lib/helpers/setup_request.test.ts | 3 + .../apm/server/lib/helpers/setup_request.ts | 15 ++ .../lib/service_map/get_service_anomalies.ts | 129 +++++++++++++++ .../server/lib/service_map/get_service_map.ts | 63 +++---- .../server/lib/service_map/ml_helpers.test.ts | 76 +++------ .../apm/server/lib/service_map/ml_helpers.ts | 94 +++++------ .../transform_service_map_responses.test.ts | 14 +- .../transform_service_map_responses.ts | 32 +++- x-pack/plugins/apm/server/plugin.ts | 5 +- x-pack/plugins/apm/server/routes/typings.ts | 3 + x-pack/plugins/ml/server/shared.ts | 1 + .../providers/anomaly_detectors.ts | 3 +- 20 files changed, 488 insertions(+), 303 deletions(-) create mode 100644 x-pack/plugins/apm/common/utils/left_join.ts create mode 100644 x-pack/plugins/apm/public/components/app/ServiceMap/Popover/anomaly_detection.tsx create mode 100644 x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts diff --git a/x-pack/plugins/apm/common/ml_job_constants.ts b/x-pack/plugins/apm/common/ml_job_constants.ts index 6df0d324981a1..0f0add7c4226b 100644 --- a/x-pack/plugins/apm/common/ml_job_constants.ts +++ b/x-pack/plugins/apm/common/ml_job_constants.ts @@ -11,6 +11,8 @@ export enum severity { warning = 'warning', } +export const APM_ML_JOB_GROUP_NAME = 'apm'; + export function getMlPrefix(serviceName: string, transactionType?: string) { const maybeTransactionType = transactionType ? `${transactionType}-` : ''; return encodeForMlApi(`${serviceName}-${maybeTransactionType}`); diff --git a/x-pack/plugins/apm/common/service_map.ts b/x-pack/plugins/apm/common/service_map.ts index 43f3585d0ebb2..7d7a7811eeba2 100644 --- a/x-pack/plugins/apm/common/service_map.ts +++ b/x-pack/plugins/apm/common/service_map.ts @@ -34,6 +34,16 @@ export interface Connection { destination: ConnectionNode; } +export interface ServiceAnomaly { + anomaly_score: number; + anomaly_severity: string; + actual_value: number; + typical_value: number; + ml_job_id: string; +} + +export type ServiceNode = ConnectionNode & Partial; + export interface ServiceNodeMetrics { avgMemoryUsage: number | null; avgCpuUsage: number | null; diff --git a/x-pack/plugins/apm/common/utils/left_join.ts b/x-pack/plugins/apm/common/utils/left_join.ts new file mode 100644 index 0000000000000..f3c4e48df755b --- /dev/null +++ b/x-pack/plugins/apm/common/utils/left_join.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { Assign, Omit } from 'utility-types'; + +export function leftJoin< + TL extends object, + K extends keyof TL, + TR extends Pick +>(leftRecords: TL[], matchKey: K, rightRecords: TR[]) { + const rightLookup = new Map( + rightRecords.map((record) => [record[matchKey], record]) + ); + return leftRecords.map((record) => { + const matchProp = (record[matchKey] as unknown) as TR[K]; + const matchingRightRecord = rightLookup.get(matchProp); + return { ...record, ...matchingRightRecord }; + }) as Array>>>; +} diff --git a/x-pack/plugins/apm/kibana.json b/x-pack/plugins/apm/kibana.json index 2de3c9c97065d..1b8e7c4dc5431 100644 --- a/x-pack/plugins/apm/kibana.json +++ b/x-pack/plugins/apm/kibana.json @@ -17,7 +17,8 @@ "actions", "alerts", "observability", - "security" + "security", + "ml" ], "server": true, "ui": true, diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx index d9254b487d037..ff68288916af4 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx @@ -9,24 +9,15 @@ import { EuiFlexItem, EuiHorizontalRule, EuiTitle, - EuiIconTip, - EuiHealth, } from '@elastic/eui'; -import theme from '@elastic/eui/dist/eui_theme_light.json'; -import { i18n } from '@kbn/i18n'; import cytoscape from 'cytoscape'; import React, { MouseEvent } from 'react'; -import styled from 'styled-components'; -import { fontSize, px } from '../../../../style/variables'; import { Buttons } from './Buttons'; import { Info } from './Info'; import { ServiceMetricFetcher } from './ServiceMetricFetcher'; -import { MLJobLink } from '../../../shared/Links/MachineLearningLinks/MLJobLink'; -import { getSeverityColor } from '../cytoscapeOptions'; -import { asInteger } from '../../../../utils/formatters'; -import { getMetricChangeDescription } from '../../../../../../ml/public'; - -const popoverMinWidth = 280; +import { AnomalyDetection } from './anomaly_detection'; +import { ServiceNode } from '../../../../../common/service_map'; +import { popoverMinWidth } from '../cytoscapeOptions'; interface ContentsProps { isService: boolean; @@ -36,31 +27,6 @@ interface ContentsProps { selectedNodeServiceName: string; } -const HealthStatusTitle = styled(EuiTitle)` - display: inline; - text-transform: uppercase; -`; - -const VerticallyCentered = styled.div` - display: flex; - align-items: center; -`; - -const SubduedText = styled.span` - color: ${theme.euiTextSubduedColor}; -`; - -const EnableText = styled.section` - color: ${theme.euiTextSubduedColor}; - line-height: 1.4; - font-size: ${fontSize}; - width: ${px(popoverMinWidth)}; -`; - -export const ContentLine = styled.section` - line-height: 2; -`; - // IE 11 does not handle flex properties as expected. With browser detection, // we can use regular div elements to render contents that are almost identical. // @@ -85,37 +51,6 @@ const FlexColumnGroup = (props: { const FlexColumnItem = (props: { children: React.ReactNode }) => isIE11 ?
: ; -const ANOMALY_DETECTION_TITLE = i18n.translate( - 'xpack.apm.serviceMap.anomalyDetectionPopoverTitle', - { defaultMessage: 'Anomaly Detection' } -); - -const ANOMALY_DETECTION_TOOLTIP = i18n.translate( - 'xpack.apm.serviceMap.anomalyDetectionPopoverTooltip', - { - defaultMessage: - 'Service health indicators are powered by the anomaly detection feature in machine learning', - } -); - -const ANOMALY_DETECTION_SCORE_METRIC = i18n.translate( - 'xpack.apm.serviceMap.anomalyDetectionPopoverScoreMetric', - { defaultMessage: 'Score (max.)' } -); - -const ANOMALY_DETECTION_LINK = i18n.translate( - 'xpack.apm.serviceMap.anomalyDetectionPopoverLink', - { defaultMessage: 'View anomalies' } -); - -const ANOMALY_DETECTION_DISABLED_TEXT = i18n.translate( - 'xpack.apm.serviceMap.anomalyDetectionPopoverDisabled', - { - defaultMessage: - 'Display service health indicators by enabling anomaly detection from the Integrations menu in the Service details view.', - } -); - export function Contents({ selectedNodeData, isService, @@ -123,23 +58,6 @@ export function Contents({ onFocusClick, selectedNodeServiceName, }: ContentsProps) { - // Anomaly Detection - const severity = selectedNodeData.severity; - const maxScore = selectedNodeData.max_score; - const actualValue = selectedNodeData.actual_value; - const typicalValue = selectedNodeData.typical_value; - const jobId = selectedNodeData.job_id; - const hasAnomalyDetection = [ - severity, - maxScore, - actualValue, - typicalValue, - jobId, - ].every((value) => value !== undefined); - const anomalyDescription = hasAnomalyDetection - ? getMetricChangeDescription(actualValue, typicalValue).message - : null; - return ( {isService && ( - {hasAnomalyDetection ? ( - <> -
- -

{ANOMALY_DETECTION_TITLE}

-
-   - -
- - - - - - - {ANOMALY_DETECTION_SCORE_METRIC} - - - - -
- {asInteger(maxScore)} -  ({anomalyDescription}) -
-
-
-
- - - {ANOMALY_DETECTION_LINK} - - - - ) : ( - <> - -

{ANOMALY_DETECTION_TITLE}

-
- {ANOMALY_DETECTION_DISABLED_TEXT} - - )} +
)} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/anomaly_detection.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/anomaly_detection.tsx new file mode 100644 index 0000000000000..ad4dc2ced2bfb --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/anomaly_detection.tsx @@ -0,0 +1,156 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import styled from 'styled-components'; +import theme from '@elastic/eui/dist/eui_theme_light.json'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiTitle, + EuiIconTip, + EuiHealth, +} from '@elastic/eui'; +import { fontSize, px } from '../../../../style/variables'; +import { asInteger } from '../../../../utils/formatters'; +import { MLJobLink } from '../../../shared/Links/MachineLearningLinks/MLJobLink'; +import { getSeverityColor, popoverMinWidth } from '../cytoscapeOptions'; +import { getMetricChangeDescription } from '../../../../../../ml/public'; +import { ServiceNode } from '../../../../../common/service_map'; + +const HealthStatusTitle = styled(EuiTitle)` + display: inline; + text-transform: uppercase; +`; + +const VerticallyCentered = styled.div` + display: flex; + align-items: center; +`; + +const SubduedText = styled.span` + color: ${theme.euiTextSubduedColor}; +`; + +const EnableText = styled.section` + color: ${theme.euiTextSubduedColor}; + line-height: 1.4; + font-size: ${fontSize}; + width: ${px(popoverMinWidth)}; +`; + +export const ContentLine = styled.section` + line-height: 2; +`; + +interface AnomalyDetectionProps { + serviceNodeData: cytoscape.NodeDataDefinition & ServiceNode; +} + +export function AnomalyDetection({ serviceNodeData }: AnomalyDetectionProps) { + const anomalySeverity = serviceNodeData.anomaly_severity; + const anomalyScore = serviceNodeData.anomaly_score; + const actualValue = serviceNodeData.actual_value; + const typicalValue = serviceNodeData.typical_value; + const mlJobId = serviceNodeData.ml_job_id; + const hasAnomalyDetectionScore = + anomalySeverity !== undefined && anomalyScore !== undefined; + const anomalyDescription = + hasAnomalyDetectionScore && + actualValue !== undefined && + typicalValue !== undefined + ? getMetricChangeDescription(actualValue, typicalValue).message + : null; + + return ( + <> +
+ +

{ANOMALY_DETECTION_TITLE}

+
+   + + {!mlJobId && {ANOMALY_DETECTION_DISABLED_TEXT}} +
+ {hasAnomalyDetectionScore && ( + + + + + + {ANOMALY_DETECTION_SCORE_METRIC} + + + +
+ {getDisplayedAnomalyScore(anomalyScore as number)} + {anomalyDescription && ( +  ({anomalyDescription}) + )} +
+
+
+
+ )} + {mlJobId && !hasAnomalyDetectionScore && ( + {ANOMALY_DETECTION_NO_DATA_TEXT} + )} + {mlJobId && ( + + + {ANOMALY_DETECTION_LINK} + + + )} + + ); +} + +function getDisplayedAnomalyScore(score: number) { + if (score > 0 && score < 1) { + return '< 1'; + } + return asInteger(score); +} + +const ANOMALY_DETECTION_TITLE = i18n.translate( + 'xpack.apm.serviceMap.anomalyDetectionPopoverTitle', + { defaultMessage: 'Anomaly Detection' } +); + +const ANOMALY_DETECTION_TOOLTIP = i18n.translate( + 'xpack.apm.serviceMap.anomalyDetectionPopoverTooltip', + { + defaultMessage: + 'Service health indicators are powered by the anomaly detection feature in machine learning', + } +); + +const ANOMALY_DETECTION_SCORE_METRIC = i18n.translate( + 'xpack.apm.serviceMap.anomalyDetectionPopoverScoreMetric', + { defaultMessage: 'Score (max.)' } +); + +const ANOMALY_DETECTION_LINK = i18n.translate( + 'xpack.apm.serviceMap.anomalyDetectionPopoverLink', + { defaultMessage: 'View anomalies' } +); + +const ANOMALY_DETECTION_DISABLED_TEXT = i18n.translate( + 'xpack.apm.serviceMap.anomalyDetectionPopoverDisabled', + { + defaultMessage: + 'Display service health indicators by enabling anomaly detection from the Integrations menu in the Service details view.', + } +); + +const ANOMALY_DETECTION_NO_DATA_TEXT = i18n.translate( + 'xpack.apm.serviceMap.anomalyDetectionPopoverNoData', + { + defaultMessage: `We couldn't find an anomaly score within the selected time range. See details in the anomaly explorer.`, + } +); diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts b/x-pack/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts index 0e4666b7bff17..9b35b0b33a70d 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts @@ -13,7 +13,9 @@ import { import { severity } from '../../../../common/ml_job_constants'; import { defaultIcon, iconForNode } from './icons'; -export const getSeverityColor = (nodeSeverity: string) => { +export const popoverMinWidth = 280; + +export const getSeverityColor = (nodeSeverity?: string) => { switch (nodeSeverity) { case severity.warning: return theme.euiColorVis0; @@ -27,24 +29,26 @@ export const getSeverityColor = (nodeSeverity: string) => { } }; -const getBorderColor = (el: cytoscape.NodeSingular) => { - const nodeSeverity = el.data('severity'); - const severityColor = getSeverityColor(nodeSeverity); - if (severityColor) { - return severityColor; +const getBorderColor: cytoscape.Css.MapperFunction< + cytoscape.NodeSingular, + string +> = (el: cytoscape.NodeSingular) => { + const hasAnomalyDetectionJob = el.data('ml_job_id') !== undefined; + const nodeSeverity = el.data('anomaly_severity'); + if (hasAnomalyDetectionJob) { + return getSeverityColor(nodeSeverity) || theme.euiColorMediumShade; } if (el.hasClass('primary') || el.selected()) { return theme.euiColorPrimary; - } else { - return theme.euiColorMediumShade; } + return theme.euiColorMediumShade; }; const getBorderStyle: cytoscape.Css.MapperFunction< cytoscape.NodeSingular, cytoscape.Css.LineStyle > = (el: cytoscape.NodeSingular) => { - const nodeSeverity = el.data('severity'); + const nodeSeverity = el.data('anomaly_severity'); if (nodeSeverity === severity.critical) { return 'double'; } else { @@ -53,7 +57,7 @@ const getBorderStyle: cytoscape.Css.MapperFunction< }; const getBorderWidth = (el: cytoscape.NodeSingular) => { - const nodeSeverity = el.data('severity'); + const nodeSeverity = el.data('anomaly_severity'); if (nodeSeverity === severity.minor || nodeSeverity === severity.major) { return 4; @@ -183,6 +187,7 @@ const style: cytoscape.Stylesheet[] = [ // actually "hidden" { selector: 'edge[isInverseEdge]', + // @ts-ignore style: { visibility: 'hidden' }, }, { diff --git a/x-pack/plugins/apm/public/services/rest/ml.ts b/x-pack/plugins/apm/public/services/rest/ml.ts index 99c162bde02da..47032501d9fbe 100644 --- a/x-pack/plugins/apm/public/services/rest/ml.ts +++ b/x-pack/plugins/apm/public/services/rest/ml.ts @@ -11,6 +11,7 @@ import { TRANSACTION_TYPE, } from '../../../common/elasticsearch_fieldnames'; import { + APM_ML_JOB_GROUP_NAME, getMlJobId, getMlPrefix, encodeForMlApi, @@ -55,7 +56,7 @@ export async function startMLJob({ }) { const transactionIndices = await getTransactionIndices(); const groups = [ - 'apm', + APM_ML_JOB_GROUP_NAME, encodeForMlApi(serviceName), encodeForMlApi(transactionType), ]; diff --git a/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts b/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts index e529f4d4ab1ed..5a4bc62b87486 100644 --- a/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts +++ b/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts @@ -59,6 +59,9 @@ function getMockRequest() { }, }, }, + plugins: { + ml: undefined, + }, } as unknown) as APMRequestHandlerContext & { core: { elasticsearch: { diff --git a/x-pack/plugins/apm/server/lib/helpers/setup_request.ts b/x-pack/plugins/apm/server/lib/helpers/setup_request.ts index 34f3fd9b40bb0..c41dff79a916a 100644 --- a/x-pack/plugins/apm/server/lib/helpers/setup_request.ts +++ b/x-pack/plugins/apm/server/lib/helpers/setup_request.ts @@ -36,6 +36,7 @@ function decodeUiFilters( export interface Setup { client: ESClient; internalClient: ESClient; + ml?: ReturnType; config: APMConfig; indices: ApmIndicesConfig; dynamicIndexPattern?: IIndexPattern; @@ -93,6 +94,7 @@ export async function setupRequest( internalClient: getESClient(context, request, { clientAsInternalUser: true, }), + ml: getMlSetup(context, request), config, dynamicIndexPattern, }; @@ -104,3 +106,16 @@ export async function setupRequest( ...coreSetupRequest, } as InferSetup; } + +function getMlSetup(context: APMRequestHandlerContext, request: KibanaRequest) { + if (!context.plugins.ml) { + return; + } + const ml = context.plugins.ml; + const mlClient = ml.mlClient.asScoped(request).callAsCurrentUser; + return { + mlSystem: ml.mlSystemProvider(mlClient, request), + anomalyDetectors: ml.anomalyDetectorsProvider(mlClient), + mlClient, + }; +} diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts new file mode 100644 index 0000000000000..7b26078d5ffbf --- /dev/null +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts @@ -0,0 +1,129 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { intersection } from 'lodash'; +import { leftJoin } from '../../../common/utils/left_join'; +import { Job as AnomalyDetectionJob } from '../../../../ml/server'; +import { PromiseReturnType } from '../../../typings/common'; +import { IEnvOptions } from './get_service_map'; +import { APM_ML_JOB_GROUP_NAME } from '../../../common/ml_job_constants'; + +type ApmMlJobCategory = NonNullable>; +const getApmMlJobCategory = ( + mlJob: AnomalyDetectionJob, + serviceNames: string[] +) => { + const apmJobGroups = mlJob.groups.filter( + (groupName) => groupName !== APM_ML_JOB_GROUP_NAME + ); + if (apmJobGroups.length === mlJob.groups.length) { + // ML job missing "apm" group name + return; + } + const [serviceName] = intersection(apmJobGroups, serviceNames); + if (!serviceName) { + // APM ML job service was not found + return; + } + const [transactionType] = apmJobGroups.filter( + (groupName) => groupName !== serviceName + ); + if (!transactionType) { + // APM ML job transaction type was not found. + return; + } + return { jobId: mlJob.job_id, serviceName, transactionType }; +}; + +export type ServiceAnomalies = PromiseReturnType; + +export async function getServiceAnomalies( + options: IEnvOptions, + serviceNames: string[] +) { + const { start, end, ml } = options.setup; + + if (!ml || serviceNames.length === 0) { + return []; + } + + const { jobs: apmMlJobs } = await ml.anomalyDetectors.jobs('apm'); + const apmMlJobCategories = apmMlJobs + .map((job) => getApmMlJobCategory(job, serviceNames)) + .filter( + (apmJobCategory) => apmJobCategory !== undefined + ) as ApmMlJobCategory[]; + const apmJobIds = apmMlJobs.map((job) => job.job_id); + const params = { + body: { + size: 0, + query: { + bool: { + filter: [ + { term: { result_type: 'record' } }, + { + terms: { + job_id: apmJobIds, + }, + }, + { + range: { + timestamp: { gte: start, lte: end, format: 'epoch_millis' }, + }, + }, + ], + }, + }, + aggs: { + jobs: { + terms: { field: 'job_id', size: apmJobIds.length }, + aggs: { + top_score_hits: { + top_hits: { + sort: [{ record_score: { order: 'desc' as const } }], + _source: ['record_score', 'timestamp', 'typical', 'actual'], + size: 1, + }, + }, + }, + }, + }, + }, + }; + + const response = (await ml.mlSystem.mlAnomalySearch(params)) as { + aggregations: { + jobs: { + buckets: Array<{ + key: string; + top_score_hits: { + hits: { + hits: Array<{ + _source: { + record_score: number; + timestamp: number; + typical: number[]; + actual: number[]; + }; + }>; + }; + }; + }>; + }; + }; + }; + const anomalyScores = response.aggregations.jobs.buckets.map((jobBucket) => { + const jobId = jobBucket.key; + const bucketSource = jobBucket.top_score_hits.hits.hits?.[0]?._source; + return { + jobId, + anomalyScore: bucketSource.record_score, + timestamp: bucketSource.timestamp, + typical: bucketSource.typical[0], + actual: bucketSource.actual[0], + }; + }); + return leftJoin(apmMlJobCategories, 'jobId', anomalyScores); +} diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts index 47ba9ecc78ffc..9f3ded82d7cbd 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts @@ -9,15 +9,18 @@ import { SERVICE_ENVIRONMENT, SERVICE_NAME, } from '../../../common/elasticsearch_fieldnames'; -import { getMlIndex } from '../../../common/ml_job_constants'; import { getServicesProjection } from '../../../common/projections/services'; import { mergeProjection } from '../../../common/projections/util/merge_projection'; import { PromiseReturnType } from '../../../typings/common'; -import { rangeFilter } from '../helpers/range_filter'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; -import { transformServiceMapResponses } from './transform_service_map_responses'; +import { + transformServiceMapResponses, + getAllNodes, + getServiceNodes, +} from './transform_service_map_responses'; import { getServiceMapFromTraceIds } from './get_service_map_from_trace_ids'; import { getTraceSampleIds } from './get_trace_sample_ids'; +import { getServiceAnomalies, ServiceAnomalies } from './get_service_anomalies'; export interface IEnvOptions { setup: Setup & SetupTimeRange; @@ -129,58 +132,30 @@ async function getServicesData(options: IEnvOptions) { ); } -function getAnomaliesData(options: IEnvOptions) { - const { start, end, client } = options.setup; - const rangeQuery = { range: rangeFilter(start, end, 'timestamp') }; - - const params = { - index: getMlIndex('*'), - body: { - size: 0, - query: { - bool: { filter: [{ term: { result_type: 'record' } }, rangeQuery] }, - }, - aggs: { - jobs: { - terms: { field: 'job_id', size: 10 }, - aggs: { - top_score_hits: { - top_hits: { - sort: [{ record_score: { order: 'desc' as const } }], - _source: ['job_id', 'record_score', 'typical', 'actual'], - size: 1, - }, - }, - }, - }, - }, - }, - }; - - return client.search(params); -} - -export type AnomaliesResponse = PromiseReturnType; +export { ServiceAnomalies }; export type ConnectionsResponse = PromiseReturnType; export type ServicesResponse = PromiseReturnType; export type ServiceMapAPIResponse = PromiseReturnType; export async function getServiceMap(options: IEnvOptions) { - const [connectionData, servicesData, anomaliesData]: [ - // explicit types to avoid TS "excessively deep" error - ConnectionsResponse, - ServicesResponse, - AnomaliesResponse - // @ts-ignore - ] = await Promise.all([ + const [connectionData, servicesData] = await Promise.all([ getConnectionData(options), getServicesData(options), - getAnomaliesData(options), ]); + // Derive all related service names from connection and service data + const allNodes = getAllNodes(servicesData, connectionData.connections); + const serviceNodes = getServiceNodes(allNodes); + const serviceNames = serviceNodes.map( + (serviceData) => serviceData[SERVICE_NAME] + ); + + // Get related service anomalies + const serviceAnomalies = await getServiceAnomalies(options, serviceNames); + return transformServiceMapResponses({ ...connectionData, - anomalies: anomaliesData, + anomalies: serviceAnomalies, services: servicesData, }); } diff --git a/x-pack/plugins/apm/server/lib/service_map/ml_helpers.test.ts b/x-pack/plugins/apm/server/lib/service_map/ml_helpers.test.ts index 6d2bd783e9cde..f07b575cc0a35 100644 --- a/x-pack/plugins/apm/server/lib/service_map/ml_helpers.test.ts +++ b/x-pack/plugins/apm/server/lib/service_map/ml_helpers.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AnomaliesResponse } from './get_service_map'; +import { ServiceAnomalies } from './get_service_map'; import { addAnomaliesDataToNodes } from './ml_helpers'; describe('addAnomaliesDataToNodes', () => { @@ -22,76 +22,54 @@ describe('addAnomaliesDataToNodes', () => { }, ]; - const anomaliesResponse = { - aggregations: { - jobs: { - buckets: [ - { - key: 'opbeans-ruby-request-high_mean_response_time', - top_score_hits: { - hits: { - hits: [ - { - _source: { - record_score: 50, - actual: [2000], - typical: [1000], - job_id: 'opbeans-ruby-request-high_mean_response_time', - }, - }, - ], - }, - }, - }, - { - key: 'opbeans-java-request-high_mean_response_time', - top_score_hits: { - hits: { - hits: [ - { - _source: { - record_score: 100, - actual: [9000], - typical: [3000], - job_id: 'opbeans-java-request-high_mean_response_time', - }, - }, - ], - }, - }, - }, - ], - }, + const serviceAnomalies: ServiceAnomalies = [ + { + jobId: 'opbeans-ruby-request-high_mean_response_time', + serviceName: 'opbeans-ruby', + transactionType: 'request', + anomalyScore: 50, + timestamp: 1591351200000, + actual: 2000, + typical: 1000, + }, + { + jobId: 'opbeans-java-request-high_mean_response_time', + serviceName: 'opbeans-java', + transactionType: 'request', + anomalyScore: 100, + timestamp: 1591351200000, + actual: 9000, + typical: 3000, }, - }; + ]; const result = [ { 'service.name': 'opbeans-ruby', 'agent.name': 'ruby', 'service.environment': null, - max_score: 50, - severity: 'major', + anomaly_score: 50, + anomaly_severity: 'major', actual_value: 2000, typical_value: 1000, - job_id: 'opbeans-ruby-request-high_mean_response_time', + ml_job_id: 'opbeans-ruby-request-high_mean_response_time', }, { 'service.name': 'opbeans-java', 'agent.name': 'java', 'service.environment': null, - max_score: 100, - severity: 'critical', + anomaly_score: 100, + anomaly_severity: 'critical', actual_value: 9000, typical_value: 3000, - job_id: 'opbeans-java-request-high_mean_response_time', + ml_job_id: 'opbeans-java-request-high_mean_response_time', }, ]; expect( addAnomaliesDataToNodes( nodes, - (anomaliesResponse as unknown) as AnomaliesResponse + (serviceAnomalies as unknown) as ServiceAnomalies ) ).toEqual(result); }); diff --git a/x-pack/plugins/apm/server/lib/service_map/ml_helpers.ts b/x-pack/plugins/apm/server/lib/service_map/ml_helpers.ts index 3289958733b2b..8162417616b6c 100644 --- a/x-pack/plugins/apm/server/lib/service_map/ml_helpers.ts +++ b/x-pack/plugins/apm/server/lib/service_map/ml_helpers.ts @@ -5,65 +5,59 @@ */ import { SERVICE_NAME } from '../../../common/elasticsearch_fieldnames'; -import { - getMlJobServiceName, - getSeverity, -} from '../../../common/ml_job_constants'; -import { ConnectionNode } from '../../../common/service_map'; -import { AnomaliesResponse } from './get_service_map'; +import { getSeverity } from '../../../common/ml_job_constants'; +import { ConnectionNode, ServiceNode } from '../../../common/service_map'; +import { ServiceAnomalies } from './get_service_map'; export function addAnomaliesDataToNodes( nodes: ConnectionNode[], - anomaliesResponse: AnomaliesResponse + serviceAnomalies: ServiceAnomalies ) { - const anomaliesMap = ( - anomaliesResponse.aggregations?.jobs.buckets ?? [] - ).reduce<{ - [key: string]: { - max_score?: number; - actual_value?: number; - typical_value?: number; - job_id?: string; - }; - }>((previousValue, currentValue) => { - const key = getMlJobServiceName(currentValue.key.toString()); - const hitSource = currentValue.top_score_hits.hits.hits[0]._source as { - record_score: number; - actual: [number]; - typical: [number]; - job_id: string; - }; - const maxScore = hitSource.record_score; - const actualValue = hitSource.actual[0]; - const typicalValue = hitSource.typical[0]; - const jobId = hitSource.job_id; + const anomaliesMap = serviceAnomalies.reduce( + (acc, anomalyJob) => { + const serviceAnomaly: typeof acc[string] | undefined = + acc[anomalyJob.serviceName]; + const hasAnomalyJob = serviceAnomaly !== undefined; + const hasAnomalyScore = serviceAnomaly?.anomaly_score !== undefined; + const hasNewAnomalyScore = anomalyJob.anomalyScore !== undefined; + const hasNewMaxAnomalyScore = + hasNewAnomalyScore && + (!hasAnomalyScore || + (anomalyJob?.anomalyScore ?? 0) > + (serviceAnomaly?.anomaly_score ?? 0)); - if ((previousValue[key]?.max_score ?? 0) > maxScore) { - return previousValue; - } + if (!hasAnomalyJob || hasNewMaxAnomalyScore) { + acc[anomalyJob.serviceName] = { + anomaly_score: anomalyJob.anomalyScore, + actual_value: anomalyJob.actual, + typical_value: anomalyJob.typical, + ml_job_id: anomalyJob.jobId, + }; + } - return { - ...previousValue, - [key]: { - max_score: maxScore, - actual_value: actualValue, - typical_value: typicalValue, - job_id: jobId, - }, - }; - }, {}); + return acc; + }, + {} as { + [serviceName: string]: { + anomaly_score?: number; + actual_value?: number; + typical_value?: number; + ml_job_id: string; + }; + } + ); - const servicesDataWithAnomalies = nodes.map((service) => { - const serviceAnomalies = anomaliesMap[service[SERVICE_NAME]]; - if (serviceAnomalies) { - const maxScore = serviceAnomalies.max_score; + const servicesDataWithAnomalies: ServiceNode[] = nodes.map((service) => { + const serviceAnomaly = anomaliesMap[service[SERVICE_NAME]]; + if (serviceAnomaly) { + const anomalyScore = serviceAnomaly.anomaly_score; return { ...service, - max_score: maxScore, - severity: getSeverity(maxScore), - actual_value: serviceAnomalies.actual_value, - typical_value: serviceAnomalies.typical_value, - job_id: serviceAnomalies.job_id, + anomaly_score: anomalyScore, + anomaly_severity: getSeverity(anomalyScore), + actual_value: serviceAnomaly.actual_value, + typical_value: serviceAnomaly.typical_value, + ml_job_id: serviceAnomaly.ml_job_id, }; } return service; diff --git a/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.test.ts b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.test.ts index 0aa3f13b9b90c..6c9880c2dc4df 100644 --- a/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.test.ts +++ b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.test.ts @@ -12,7 +12,7 @@ import { SPAN_SUBTYPE, SPAN_TYPE, } from '../../../common/elasticsearch_fieldnames'; -import { AnomaliesResponse } from './get_service_map'; +import { ServiceAnomalies } from './get_service_map'; import { transformServiceMapResponses, ServiceMapResponse, @@ -36,14 +36,12 @@ const javaService = { [AGENT_NAME]: 'java', }; -const anomalies = ({ - aggregations: { jobs: { buckets: [] } }, -} as unknown) as AnomaliesResponse; +const serviceAnomalies: ServiceAnomalies = []; describe('transformServiceMapResponses', () => { it('maps external destinations to internal services', () => { const response: ServiceMapResponse = { - anomalies, + anomalies: serviceAnomalies, services: [nodejsService, javaService], discoveredServices: [ { @@ -75,7 +73,7 @@ describe('transformServiceMapResponses', () => { it('collapses external destinations based on span.destination.resource.name', () => { const response: ServiceMapResponse = { - anomalies, + anomalies: serviceAnomalies, services: [nodejsService, javaService], discoveredServices: [ { @@ -111,7 +109,7 @@ describe('transformServiceMapResponses', () => { it('picks the first span.type/subtype in an alphabetically sorted list', () => { const response: ServiceMapResponse = { - anomalies, + anomalies: serviceAnomalies, services: [javaService], discoveredServices: [], connections: [ @@ -150,7 +148,7 @@ describe('transformServiceMapResponses', () => { it('processes connections without a matching "service" aggregation', () => { const response: ServiceMapResponse = { - anomalies, + anomalies: serviceAnomalies, services: [javaService], discoveredServices: [], connections: [ diff --git a/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts index 8580fed587567..53abf54cbcf31 100644 --- a/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts +++ b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts @@ -20,7 +20,7 @@ import { import { ConnectionsResponse, ServicesResponse, - AnomaliesResponse, + ServiceAnomalies, } from './get_service_map'; import { addAnomaliesDataToNodes } from './ml_helpers'; @@ -38,14 +38,10 @@ function getConnectionId(connection: Connection) { )}`; } -export type ServiceMapResponse = ConnectionsResponse & { - anomalies: AnomaliesResponse; - services: ServicesResponse; -}; - -export function transformServiceMapResponses(response: ServiceMapResponse) { - const { anomalies, discoveredServices, services, connections } = response; - +export function getAllNodes( + services: ServiceMapResponse['services'], + connections: ServiceMapResponse['connections'] +) { // Derive the rest of the map nodes from the connections and add the services // from the services data query const allNodes: ConnectionNode[] = connections @@ -58,11 +54,29 @@ export function transformServiceMapResponses(response: ServiceMapResponse) { })) ); + return allNodes; +} + +export function getServiceNodes(allNodes: ConnectionNode[]) { // List of nodes that are services const serviceNodes = allNodes.filter( (node) => SERVICE_NAME in node ) as ServiceConnectionNode[]; + return serviceNodes; +} + +export type ServiceMapResponse = ConnectionsResponse & { + anomalies: ServiceAnomalies; + services: ServicesResponse; +}; + +export function transformServiceMapResponses(response: ServiceMapResponse) { + const { anomalies, discoveredServices, services, connections } = response; + + const allNodes = getAllNodes(services, connections); + const serviceNodes = getServiceNodes(allNodes); + // List of nodes that are externals const externalNodes = allNodes.filter( (node) => SPAN_DESTINATION_SERVICE_RESOURCE in node diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index d32d16d4c3cc8..f0a05dfc0df30 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -31,10 +31,11 @@ import { getInternalSavedObjectsClient } from './lib/helpers/get_internal_saved_ import { LicensingPluginSetup } from '../../licensing/public'; import { registerApmAlerts } from './lib/alerts/register_apm_alerts'; import { createApmTelemetry } from './lib/apm_telemetry'; -import { PluginSetupContract as FeaturesPluginSetup } from '../../../plugins/features/server'; +import { PluginSetupContract as FeaturesPluginSetup } from '../../features/server'; import { APM_FEATURE } from './feature'; import { apmIndices, apmTelemetry } from './saved_objects'; import { createElasticCloudInstructions } from './tutorial/elastic_cloud'; +import { MlPluginSetup } from '../../ml/server'; export interface APMPluginSetup { config$: Observable; @@ -62,6 +63,7 @@ export class APMPlugin implements Plugin { observability?: ObservabilityPluginSetup; features: FeaturesPluginSetup; security?: SecurityPluginSetup; + ml?: MlPluginSetup; } ) { this.logger = this.initContext.logger.get(); @@ -126,6 +128,7 @@ export class APMPlugin implements Plugin { plugins: { observability: plugins.observability, security: plugins.security, + ml: plugins.ml, }, }); diff --git a/x-pack/plugins/apm/server/routes/typings.ts b/x-pack/plugins/apm/server/routes/typings.ts index 05f52f1732c98..bc31cb7a582af 100644 --- a/x-pack/plugins/apm/server/routes/typings.ts +++ b/x-pack/plugins/apm/server/routes/typings.ts @@ -18,6 +18,7 @@ import { ObservabilityPluginSetup } from '../../../observability/server'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { FetchOptions } from '../../public/services/rest/callApi'; import { SecurityPluginSetup } from '../../../security/public'; +import { MlPluginSetup } from '../../../ml/server'; import { APMConfig } from '..'; export interface Params { @@ -67,6 +68,7 @@ export type APMRequestHandlerContext< plugins: { observability?: ObservabilityPluginSetup; security?: SecurityPluginSetup; + ml?: MlPluginSetup; }; }; @@ -114,6 +116,7 @@ export interface ServerAPI { plugins: { observability?: ObservabilityPluginSetup; security?: SecurityPluginSetup; + ml?: MlPluginSetup; }; } ) => void; diff --git a/x-pack/plugins/ml/server/shared.ts b/x-pack/plugins/ml/server/shared.ts index 1e50950bc3bce..be27ee2d44a82 100644 --- a/x-pack/plugins/ml/server/shared.ts +++ b/x-pack/plugins/ml/server/shared.ts @@ -5,3 +5,4 @@ */ export * from '../common/types/anomalies'; +export * from '../common/types/anomaly_detection_jobs'; diff --git a/x-pack/plugins/ml/server/shared_services/providers/anomaly_detectors.ts b/x-pack/plugins/ml/server/shared_services/providers/anomaly_detectors.ts index 73696dfdeef86..880aebfde409c 100644 --- a/x-pack/plugins/ml/server/shared_services/providers/anomaly_detectors.ts +++ b/x-pack/plugins/ml/server/shared_services/providers/anomaly_detectors.ts @@ -6,12 +6,13 @@ import { APICaller } from 'kibana/server'; import { LicenseCheck } from '../license_checks'; +import { Job } from '../../../common/types/anomaly_detection_jobs'; export interface AnomalyDetectorsProvider { anomalyDetectorsProvider( callAsCurrentUser: APICaller ): { - jobs(jobId?: string): Promise; + jobs(jobId?: string): Promise<{ count: number; jobs: Job[] }>; }; } From 50d47a2ed5388795166e7f2555cb216448d99ba1 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Wed, 10 Jun 2020 08:01:01 +0200 Subject: [PATCH 68/91] adapt some snapshot test (#68489) --- .../saved_objects_table.test.tsx.snap | 132 ------------------ .../saved_objects_table.test.tsx | 4 +- 2 files changed, 2 insertions(+), 134 deletions(-) diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap b/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap index 707e65d60870c..f7d5cc760f1bb 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap @@ -197,138 +197,6 @@ exports[`SavedObjectsTable export should allow the user to choose when exporting `; -exports[`SavedObjectsTable import should show the flyout 1`] = ` - -`; - -exports[`SavedObjectsTable relationships should show the flyout 1`] = ` - -`; - exports[`SavedObjectsTable should render normally 1`] = ` { component.instance().showImportFlyout(); component.update(); - expect(component.find(Flyout)).toMatchSnapshot(); + expect(component.find(Flyout).length).toBe(1); }); it('should hide the flyout', async () => { @@ -450,7 +450,7 @@ describe('SavedObjectsTable', () => { } as SavedObjectWithMetadata); component.update(); - expect(component.find(Relationships)).toMatchSnapshot(); + expect(component.find(Relationships).length).toBe(1); expect(component.state('relationshipObject')).toEqual({ id: '2', type: 'search', From 204977c6ce9f64ccf524a4cde5b89dce5c921d7e Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Wed, 10 Jun 2020 09:10:23 +0200 Subject: [PATCH 69/91] Partial revert of "Sync Kerberos + Anonymous access tests with the latest `security/_authenticate` API (user roles now include roles of anonymous user)." (#68624) --- .../apis/security/kerberos_login.ts | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts b/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts index 6a93b94920d6d..8d2e575fad313 100644 --- a/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts +++ b/x-pack/test/kerberos_api_integration/apis/security/kerberos_login.ts @@ -98,8 +98,7 @@ export default function ({ getService }: FtrProviderContext) { }); describe('finishing SPNEGO', () => { - // Skipped: https://github.com/elastic/kibana/issues/68720 - it.skip('should properly set cookie and authenticate user', async () => { + it('should properly set cookie and authenticate user', async () => { const response = await supertest .get('/internal/security/me') .set('Authorization', `Negotiate ${spnegoToken}`) @@ -116,14 +115,7 @@ export default function ({ getService }: FtrProviderContext) { const sessionCookie = request.cookie(cookies[0])!; checkCookieIsSet(sessionCookie); - const isAnonymousAccessEnabled = (config.get( - 'esTestCluster.serverArgs' - ) as string[]).some((setting) => setting.startsWith('xpack.security.authc.anonymous')); - - // `superuser_anonymous` role is derived from the enabled anonymous access. - const expectedUserRoles = isAnonymousAccessEnabled - ? ['kibana_admin', 'superuser_anonymous'] - : ['kibana_admin']; + const expectedUserRoles = ['kibana_admin']; await supertest .get('/internal/security/me') From 028c19e7b4ddf3deb2127795c878637f2d7dc5ab Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Wed, 10 Jun 2020 12:00:40 +0200 Subject: [PATCH 70/91] [SIEM] Cypress renaming (#68659) * updates naming in integration * updates naming in objects * updates naming in screens * updates naming in support * updates naming in tasks * fixes failing test Co-authored-by: Elastic Machine --- .../cypress/integration/events_viewer.spec.ts | 2 +- .../cypress/integration/fields_browser.spec.ts | 2 +- .../cypress/integration/inspect.spec.ts | 10 +++++----- .../cypress/integration/ml_conditional_links.spec.ts | 2 +- .../cypress/integration/navigation.spec.ts | 6 +++--- .../cypress/integration/overview.spec.ts | 2 +- .../cypress/integration/pagination.spec.ts | 2 +- .../integration/timeline_data_providers.spec.ts | 2 +- .../cypress/integration/timeline_flyout_button.spec.ts | 2 +- .../integration/timeline_search_or_filter.spec.ts | 2 +- .../cypress/integration/timeline_toggle_column.spec.ts | 2 +- .../cypress/integration/url_state.spec.ts | 8 ++++---- .../security_solution/cypress/screens/inspect.ts | 4 ++-- .../screens/{siem_header.ts => security_header.ts} | 0 .../cypress/screens/{siem_main.ts => security_main.ts} | 0 .../security_solution/cypress/support/commands.js | 2 +- .../security_solution/cypress/support/index.d.ts | 2 +- .../security_solution/cypress/tasks/configure_cases.ts | 2 +- .../security_solution/cypress/tasks/detections.ts | 2 +- .../cypress/tasks/hosts/authentications.ts | 2 +- .../cypress/tasks/hosts/uncommon_processes.ts | 2 +- .../tasks/{siem_header.ts => security_header.ts} | 2 +- .../cypress/tasks/{siem_main.ts => security_main.ts} | 2 +- 23 files changed, 31 insertions(+), 31 deletions(-) rename x-pack/plugins/security_solution/cypress/screens/{siem_header.ts => security_header.ts} (100%) rename x-pack/plugins/security_solution/cypress/screens/{siem_main.ts => security_main.ts} (100%) rename x-pack/plugins/security_solution/cypress/tasks/{siem_header.ts => security_header.ts} (90%) rename x-pack/plugins/security_solution/cypress/tasks/{siem_main.ts => security_main.ts} (86%) diff --git a/x-pack/plugins/security_solution/cypress/integration/events_viewer.spec.ts b/x-pack/plugins/security_solution/cypress/integration/events_viewer.spec.ts index 82b4f4f0fbe34..82395de91abfa 100644 --- a/x-pack/plugins/security_solution/cypress/integration/events_viewer.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/events_viewer.spec.ts @@ -32,7 +32,7 @@ import { resetFields, waitsForEventsToBeLoaded, } from '../tasks/hosts/events'; -import { clearSearchBar, kqlSearch } from '../tasks/siem_header'; +import { clearSearchBar, kqlSearch } from '../tasks/security_header'; import { HOSTS_PAGE } from '../urls/navigation'; diff --git a/x-pack/plugins/security_solution/cypress/integration/fields_browser.spec.ts b/x-pack/plugins/security_solution/cypress/integration/fields_browser.spec.ts index b058c9fb51fd1..b0dbf94c0efb9 100644 --- a/x-pack/plugins/security_solution/cypress/integration/fields_browser.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/fields_browser.spec.ts @@ -28,7 +28,7 @@ import { resetFields, } from '../tasks/fields_browser'; import { loginAndWaitForPage } from '../tasks/login'; -import { openTimeline } from '../tasks/siem_main'; +import { openTimeline } from '../tasks/security_main'; import { openTimelineFieldsBrowser, populateTimeline } from '../tasks/timeline'; import { HOSTS_PAGE } from '../urls/navigation'; diff --git a/x-pack/plugins/security_solution/cypress/integration/inspect.spec.ts b/x-pack/plugins/security_solution/cypress/integration/inspect.spec.ts index d770eb6c761cf..0529c797ee07a 100644 --- a/x-pack/plugins/security_solution/cypress/integration/inspect.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/inspect.spec.ts @@ -5,14 +5,14 @@ */ import { - INSPECT_HOSTS_BUTTONS_IN_SIEM, + INSPECT_HOSTS_BUTTONS_IN_SECURITY, INSPECT_MODAL, - INSPECT_NETWORK_BUTTONS_IN_SIEM, + INSPECT_NETWORK_BUTTONS_IN_SECURITY, } from '../screens/inspect'; import { closesModal, openStatsAndTables } from '../tasks/inspect'; import { loginAndWaitForPage } from '../tasks/login'; -import { openTimeline } from '../tasks/siem_main'; +import { openTimeline } from '../tasks/security_main'; import { executeTimelineKQL, openTimelineInspectButton, @@ -30,7 +30,7 @@ describe('Inspect', () => { closesModal(); }); - INSPECT_HOSTS_BUTTONS_IN_SIEM.forEach((table) => + INSPECT_HOSTS_BUTTONS_IN_SECURITY.forEach((table) => it(`inspects the ${table.title}`, () => { openStatsAndTables(table); cy.get(INSPECT_MODAL).should('be.visible'); @@ -46,7 +46,7 @@ describe('Inspect', () => { closesModal(); }); - INSPECT_NETWORK_BUTTONS_IN_SIEM.forEach((table) => + INSPECT_NETWORK_BUTTONS_IN_SECURITY.forEach((table) => it(`inspects the ${table.title}`, () => { openStatsAndTables(table); cy.get(INSPECT_MODAL).should('be.visible'); diff --git a/x-pack/plugins/security_solution/cypress/integration/ml_conditional_links.spec.ts b/x-pack/plugins/security_solution/cypress/integration/ml_conditional_links.spec.ts index e96c1fe691966..785df4a0c2f9e 100644 --- a/x-pack/plugins/security_solution/cypress/integration/ml_conditional_links.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/ml_conditional_links.spec.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KQL_INPUT } from '../screens/siem_header'; +import { KQL_INPUT } from '../screens/security_header'; import { loginAndWaitForPageWithoutDateRange } from '../tasks/login'; diff --git a/x-pack/plugins/security_solution/cypress/integration/navigation.spec.ts b/x-pack/plugins/security_solution/cypress/integration/navigation.spec.ts index a9e5a848d54a8..2014e34c11886 100644 --- a/x-pack/plugins/security_solution/cypress/integration/navigation.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/navigation.spec.ts @@ -3,14 +3,14 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { DETECTIONS, HOSTS, NETWORK, OVERVIEW, TIMELINES } from '../screens/siem_header'; +import { DETECTIONS, HOSTS, NETWORK, OVERVIEW, TIMELINES } from '../screens/security_header'; import { loginAndWaitForPage } from '../tasks/login'; -import { navigateFromHeaderTo } from '../tasks/siem_header'; +import { navigateFromHeaderTo } from '../tasks/security_header'; import { TIMELINES_PAGE } from '../urls/navigation'; -describe('top-level navigation common to all pages in the SIEM app', () => { +describe('top-level navigation common to all pages in the Security app', () => { before(() => { loginAndWaitForPage(TIMELINES_PAGE); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/overview.spec.ts b/x-pack/plugins/security_solution/cypress/integration/overview.spec.ts index 55bcbfafaa092..284deb67e1386 100644 --- a/x-pack/plugins/security_solution/cypress/integration/overview.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/overview.spec.ts @@ -13,7 +13,7 @@ import { OVERVIEW_PAGE } from '../urls/navigation'; describe('Overview Page', () => { before(() => { - cy.stubSIEMapi('overview'); + cy.stubSecurityApi('overview'); loginAndWaitForPage(OVERVIEW_PAGE); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/pagination.spec.ts b/x-pack/plugins/security_solution/cypress/integration/pagination.spec.ts index e430520fe1dc4..5dc3182cd9f83 100644 --- a/x-pack/plugins/security_solution/cypress/integration/pagination.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/pagination.spec.ts @@ -12,7 +12,7 @@ import { openAuthentications, openUncommonProcesses } from '../tasks/hosts/main' import { waitForUncommonProcessesToBeLoaded } from '../tasks/hosts/uncommon_processes'; import { loginAndWaitForPage } from '../tasks/login'; import { goToFirstPage, goToThirdPage } from '../tasks/pagination'; -import { refreshPage } from '../tasks/siem_header'; +import { refreshPage } from '../tasks/security_header'; import { HOSTS_PAGE_TAB_URLS } from '../urls/navigation'; diff --git a/x-pack/plugins/security_solution/cypress/integration/timeline_data_providers.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timeline_data_providers.spec.ts index 243886752706d..33394760c4da9 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timeline_data_providers.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timeline_data_providers.spec.ts @@ -19,7 +19,7 @@ import { } from '../tasks/hosts/all_hosts'; import { loginAndWaitForPage } from '../tasks/login'; -import { openTimeline } from '../tasks/siem_main'; +import { openTimeline } from '../tasks/security_main'; import { createNewTimeline } from '../tasks/timeline'; import { HOSTS_PAGE } from '../urls/navigation'; diff --git a/x-pack/plugins/security_solution/cypress/integration/timeline_flyout_button.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timeline_flyout_button.spec.ts index 02da7cbc28462..fe420ae9dccbb 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timeline_flyout_button.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timeline_flyout_button.spec.ts @@ -8,7 +8,7 @@ import { TIMELINE_FLYOUT_HEADER, TIMELINE_NOT_READY_TO_DROP_BUTTON } from '../sc import { dragFirstHostToTimeline, waitForAllHostsToBeLoaded } from '../tasks/hosts/all_hosts'; import { loginAndWaitForPage } from '../tasks/login'; -import { openTimeline, openTimelineIfClosed } from '../tasks/siem_main'; +import { openTimeline, openTimelineIfClosed } from '../tasks/security_main'; import { createNewTimeline } from '../tasks/timeline'; import { HOSTS_PAGE } from '../urls/navigation'; diff --git a/x-pack/plugins/security_solution/cypress/integration/timeline_search_or_filter.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timeline_search_or_filter.spec.ts index 0668b91ca4fc1..00994f7a87a7b 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timeline_search_or_filter.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timeline_search_or_filter.spec.ts @@ -7,7 +7,7 @@ import { SERVER_SIDE_EVENT_COUNT } from '../screens/timeline'; import { loginAndWaitForPage } from '../tasks/login'; -import { openTimeline } from '../tasks/siem_main'; +import { openTimeline } from '../tasks/security_main'; import { executeTimelineKQL } from '../tasks/timeline'; import { HOSTS_PAGE } from '../urls/navigation'; diff --git a/x-pack/plugins/security_solution/cypress/integration/timeline_toggle_column.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timeline_toggle_column.spec.ts index 7b2c6f3b55b2e..841d41782b350 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timeline_toggle_column.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timeline_toggle_column.spec.ts @@ -12,7 +12,7 @@ import { } from '../screens/timeline'; import { loginAndWaitForPage } from '../tasks/login'; -import { openTimeline } from '../tasks/siem_main'; +import { openTimeline } from '../tasks/security_main'; import { checkIdToggleField, createNewTimeline, diff --git a/x-pack/plugins/security_solution/cypress/integration/url_state.spec.ts b/x-pack/plugins/security_solution/cypress/integration/url_state.spec.ts index cf69a83dbf951..425ed23bdafec 100644 --- a/x-pack/plugins/security_solution/cypress/integration/url_state.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/url_state.spec.ts @@ -13,7 +13,7 @@ import { } from '../screens/date_picker'; import { HOSTS_NAMES } from '../screens/hosts/all_hosts'; import { ANOMALIES_TAB } from '../screens/hosts/main'; -import { BREADCRUMBS, HOSTS, KQL_INPUT, NETWORK } from '../screens/siem_header'; +import { BREADCRUMBS, HOSTS, KQL_INPUT, NETWORK } from '../screens/security_header'; import { SERVER_SIDE_EVENT_COUNT, TIMELINE_TITLE } from '../screens/timeline'; import { loginAndWaitForPage, loginAndWaitForPageWithoutDateRange } from '../tasks/login'; @@ -29,8 +29,8 @@ import { openFirstHostDetails, waitForAllHostsToBeLoaded } from '../tasks/hosts/ import { openAllHosts } from '../tasks/hosts/main'; import { waitForIpsTableToBeLoaded } from '../tasks/network/flows'; -import { clearSearchBar, kqlSearch, navigateFromHeaderTo } from '../tasks/siem_header'; -import { openTimeline } from '../tasks/siem_main'; +import { clearSearchBar, kqlSearch, navigateFromHeaderTo } from '../tasks/security_header'; +import { openTimeline } from '../tasks/security_main'; import { addDescriptionToTimeline, addNameToTimeline, @@ -243,7 +243,7 @@ describe('url state', () => { cy.wrap(intCount).should('be.above', 0); }); - const timelineName = 'SIEM'; + const timelineName = 'Security'; addNameToTimeline(timelineName); addDescriptionToTimeline('This is the best timeline of the world'); cy.wait(5000); diff --git a/x-pack/plugins/security_solution/cypress/screens/inspect.ts b/x-pack/plugins/security_solution/cypress/screens/inspect.ts index 8f2ff4ef401e7..f472509bda6b5 100644 --- a/x-pack/plugins/security_solution/cypress/screens/inspect.ts +++ b/x-pack/plugins/security_solution/cypress/screens/inspect.ts @@ -14,7 +14,7 @@ export interface InspectButtonMetadata { tabId?: string; } -export const INSPECT_HOSTS_BUTTONS_IN_SIEM: InspectButtonMetadata[] = [ +export const INSPECT_HOSTS_BUTTONS_IN_SECURITY: InspectButtonMetadata[] = [ { id: '[data-test-subj="stat-hosts"]', title: 'Hosts Stat', @@ -50,7 +50,7 @@ export const INSPECT_HOSTS_BUTTONS_IN_SIEM: InspectButtonMetadata[] = [ }, ]; -export const INSPECT_NETWORK_BUTTONS_IN_SIEM: InspectButtonMetadata[] = [ +export const INSPECT_NETWORK_BUTTONS_IN_SECURITY: InspectButtonMetadata[] = [ { id: '[data-test-subj="stat-networkEvents"]', title: 'Network events Stat', diff --git a/x-pack/plugins/security_solution/cypress/screens/siem_header.ts b/x-pack/plugins/security_solution/cypress/screens/security_header.ts similarity index 100% rename from x-pack/plugins/security_solution/cypress/screens/siem_header.ts rename to x-pack/plugins/security_solution/cypress/screens/security_header.ts diff --git a/x-pack/plugins/security_solution/cypress/screens/siem_main.ts b/x-pack/plugins/security_solution/cypress/screens/security_main.ts similarity index 100% rename from x-pack/plugins/security_solution/cypress/screens/siem_main.ts rename to x-pack/plugins/security_solution/cypress/screens/security_main.ts diff --git a/x-pack/plugins/security_solution/cypress/support/commands.js b/x-pack/plugins/security_solution/cypress/support/commands.js index d086981cb98f7..8b75f068a53da 100644 --- a/x-pack/plugins/security_solution/cypress/support/commands.js +++ b/x-pack/plugins/security_solution/cypress/support/commands.js @@ -30,7 +30,7 @@ // -- This is will overwrite an existing command -- // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) -Cypress.Commands.add('stubSIEMapi', function (dataFileName) { +Cypress.Commands.add('stubSecurityApi', function (dataFileName) { cy.on('window:before:load', (win) => { // @ts-ignore no null, this is a temp hack see issue above win.fetch = null; diff --git a/x-pack/plugins/security_solution/cypress/support/index.d.ts b/x-pack/plugins/security_solution/cypress/support/index.d.ts index 5d5173170a9f9..12c11ffd27750 100644 --- a/x-pack/plugins/security_solution/cypress/support/index.d.ts +++ b/x-pack/plugins/security_solution/cypress/support/index.d.ts @@ -6,6 +6,6 @@ declare namespace Cypress { interface Chainable { - stubSIEMapi(dataFileName: string): Chainable; + stubSecurityApi(dataFileName: string): Chainable; } } diff --git a/x-pack/plugins/security_solution/cypress/tasks/configure_cases.ts b/x-pack/plugins/security_solution/cypress/tasks/configure_cases.ts index 8ff8fbf4b0cb7..b39cbeba7b85e 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/configure_cases.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/configure_cases.ts @@ -15,7 +15,7 @@ import { URL, USERNAME, } from '../screens/configure_cases'; -import { MAIN_PAGE } from '../screens/siem_main'; +import { MAIN_PAGE } from '../screens/security_main'; import { Connector } from '../objects/case'; diff --git a/x-pack/plugins/security_solution/cypress/tasks/detections.ts b/x-pack/plugins/security_solution/cypress/tasks/detections.ts index f53dd83635d85..a6596bfbcc3e9 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/detections.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/detections.ts @@ -16,7 +16,7 @@ import { ALERTS, ALERT_CHECKBOX, } from '../screens/detections'; -import { REFRESH_BUTTON } from '../screens/siem_header'; +import { REFRESH_BUTTON } from '../screens/security_header'; export const closeFirstAlert = () => { cy.get(OPEN_CLOSE_ALERT_BTN).first().click({ force: true }); diff --git a/x-pack/plugins/security_solution/cypress/tasks/hosts/authentications.ts b/x-pack/plugins/security_solution/cypress/tasks/hosts/authentications.ts index 7ba7f227964ab..cd64fe4ff1726 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/hosts/authentications.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/hosts/authentications.ts @@ -5,7 +5,7 @@ */ import { AUTHENTICATIONS_TABLE } from '../../screens/hosts/authentications'; -import { REFRESH_BUTTON } from '../../screens/siem_header'; +import { REFRESH_BUTTON } from '../../screens/security_header'; export const waitForAuthenticationsToBeLoaded = () => { cy.get(AUTHENTICATIONS_TABLE).should('exist'); diff --git a/x-pack/plugins/security_solution/cypress/tasks/hosts/uncommon_processes.ts b/x-pack/plugins/security_solution/cypress/tasks/hosts/uncommon_processes.ts index c86b169d60a13..598def9ed41d0 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/hosts/uncommon_processes.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/hosts/uncommon_processes.ts @@ -5,7 +5,7 @@ */ import { UNCOMMON_PROCESSES_TABLE } from '../../screens/hosts/uncommon_processes'; -import { REFRESH_BUTTON } from '../../screens/siem_header'; +import { REFRESH_BUTTON } from '../../screens/security_header'; export const waitForUncommonProcessesToBeLoaded = () => { cy.get(UNCOMMON_PROCESSES_TABLE).should('exist'); diff --git a/x-pack/plugins/security_solution/cypress/tasks/siem_header.ts b/x-pack/plugins/security_solution/cypress/tasks/security_header.ts similarity index 90% rename from x-pack/plugins/security_solution/cypress/tasks/siem_header.ts rename to x-pack/plugins/security_solution/cypress/tasks/security_header.ts index 2cc9199a42bbb..7427104a9d889 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/siem_header.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/security_header.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KQL_INPUT, REFRESH_BUTTON } from '../screens/siem_header'; +import { KQL_INPUT, REFRESH_BUTTON } from '../screens/security_header'; export const clearSearchBar = () => { cy.get(KQL_INPUT).clear().type('{enter}'); diff --git a/x-pack/plugins/security_solution/cypress/tasks/siem_main.ts b/x-pack/plugins/security_solution/cypress/tasks/security_main.ts similarity index 86% rename from x-pack/plugins/security_solution/cypress/tasks/siem_main.ts rename to x-pack/plugins/security_solution/cypress/tasks/security_main.ts index eece7edcb2b44..47b73db8b96df 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/siem_main.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/security_main.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MAIN_PAGE, TIMELINE_TOGGLE_BUTTON } from '../screens/siem_main'; +import { MAIN_PAGE, TIMELINE_TOGGLE_BUTTON } from '../screens/security_main'; export const openTimeline = () => { cy.get(TIMELINE_TOGGLE_BUTTON).click(); From 3eced03bb180c43b00300416bb575b6bea399173 Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Wed, 10 Jun 2020 12:01:13 +0200 Subject: [PATCH 71/91] [SIEM] Fixes flyout flaky test (#68683) * fixes flaky test * Update x-pack/plugins/security_solution/cypress/integration/timeline_flyout_button.spec.ts Co-authored-by: patrykkopycinski Co-authored-by: patrykkopycinski --- .../cypress/integration/timeline_flyout_button.spec.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/timeline_flyout_button.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timeline_flyout_button.spec.ts index fe420ae9dccbb..e462d6ade5dc4 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timeline_flyout_button.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timeline_flyout_button.spec.ts @@ -29,14 +29,13 @@ describe('timeline flyout button', () => { cy.get(TIMELINE_FLYOUT_HEADER).should('have.css', 'visibility', 'visible'); }); - // FLAKY: https://github.com/elastic/kibana/issues/60369 - it.skip('sets the flyout button background to euiColorSuccess with a 10% alpha channel when the user starts dragging a host, but is not hovering over the flyout button', () => { + it('sets the flyout button background to euiColorSuccess with a 20% alpha channel when the user starts dragging a host, but is not hovering over the flyout button', () => { dragFirstHostToTimeline(); cy.get(TIMELINE_NOT_READY_TO_DROP_BUTTON).should( 'have.css', 'background', - 'rgba(1, 125, 115, 0.1) none repeat scroll 0% 0% / auto padding-box border-box' + 'rgba(1, 125, 115, 0.2) none repeat scroll 0% 0% / auto padding-box border-box' ); }); }); From 83771811e05dc9cb427353eca8b96517ad9a2a68 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Wed, 10 Jun 2020 08:08:57 -0400 Subject: [PATCH 72/91] [SIEM][Detections Engine] - Exceptions viewer cleanup (#68651) ### Summary This PR is a follow up to #68027 where some feedback didn't make it in. It cleans up the and_or_badge component, updates some css, and cleans up stories. --- .../__examples__/index.stories.tsx | 37 ++++---- .../components/and_or_badge/index.test.tsx | 18 +++- .../common/components/and_or_badge/index.tsx | 93 +------------------ .../and_or_badge/rounded_badge.test.tsx | 34 +++++++ .../components/and_or_badge/rounded_badge.tsx | 42 +++++++++ .../rounded_badge_antenna.test.tsx | 46 +++++++++ .../and_or_badge/rounded_badge_antenna.tsx | 62 +++++++++++++ .../__examples__/exception_item.stories.tsx | 89 +++++++++--------- .../components/exceptions/helpers.test.tsx | 8 +- .../common/components/exceptions/helpers.tsx | 4 +- .../exception_item/exception_details.tsx | 51 +++++----- .../exception_item/exception_entries.test.tsx | 34 +++---- .../exception_item/exception_entries.tsx | 28 ++++-- .../viewer/exception_item/index.test.tsx | 36 +++---- .../viewer/exception_item/index.tsx | 32 +++---- .../components/exceptions/viewer/index.tsx | 8 +- .../security_solution/public/graphql/types.ts | 2 + .../security_solution/scripts/storybook.js | 2 +- 18 files changed, 371 insertions(+), 255 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge_antenna.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge_antenna.tsx diff --git a/x-pack/plugins/security_solution/public/common/components/and_or_badge/__examples__/index.stories.tsx b/x-pack/plugins/security_solution/public/common/components/and_or_badge/__examples__/index.stories.tsx index f939cf81d1bd3..7465d3ca1e63a 100644 --- a/x-pack/plugins/security_solution/public/common/components/and_or_badge/__examples__/index.stories.tsx +++ b/x-pack/plugins/security_solution/public/common/components/and_or_badge/__examples__/index.stories.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { storiesOf } from '@storybook/react'; -import React from 'react'; +import React, { ReactNode } from 'react'; import { ThemeProvider } from 'styled-components'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; @@ -14,26 +14,21 @@ import { AndOrBadge } from '..'; const sampleText = 'Doggo ipsum i am bekom fat snoot wow such tempt waggy wags floofs, ruff heckin good boys and girls mlem. Ruff heckin good boys and girls mlem stop it fren borkf borking doggo very hand that feed shibe, you are doing me the shock big ol heck smol borking doggo with a long snoot for pats heckin good boys. You are doing me the shock smol borking doggo with a long snoot for pats wow very biscit, length boy. Doggo ipsum i am bekom fat snoot wow such tempt waggy wags floofs, ruff heckin good boys and girls mlem. Ruff heckin good boys and girls mlem stop it fren borkf borking doggo very hand that feed shibe, you are doing me the shock big ol heck smol borking doggo with a long snoot for pats heckin good boys.'; +const withTheme = (storyFn: () => ReactNode) => ( + ({ eui: euiLightVars, darkMode: true })}>{storyFn()} +); + storiesOf('components/AndOrBadge', module) - .add('and', () => ( - ({ eui: euiLightVars, darkMode: true })}> - - - )) - .add('or', () => ( - ({ eui: euiLightVars, darkMode: true })}> - - - )) + .addDecorator(withTheme) + .add('and', () => ) + .add('or', () => ) .add('antennas', () => ( - ({ eui: euiLightVars, darkMode: true })}> - - - - - -

{sampleText}

-
-
-
+ + + + + +

{sampleText}

+
+
)); diff --git a/x-pack/plugins/security_solution/public/common/components/and_or_badge/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/and_or_badge/index.test.tsx index ed918a59a514a..f2c7d6884bae3 100644 --- a/x-pack/plugins/security_solution/public/common/components/and_or_badge/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/and_or_badge/index.test.tsx @@ -20,8 +20,20 @@ describe('AndOrBadge', () => { ); expect(wrapper.find('[data-test-subj="and-or-badge"]').at(0).text()).toEqual('AND'); - expect(wrapper.find('EuiFlexItem[data-test-subj="andOrBadgeBarTop"]')).toHaveLength(1); - expect(wrapper.find('EuiFlexItem[data-test-subj="andOrBadgeBarBottom"]')).toHaveLength(1); + expect(wrapper.find('[data-test-subj="andOrBadgeBarTop"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="andOrBadgeBarBottom"]').exists()).toBeTruthy(); + }); + + test('it does not render top and bottom antenna bars when "includeAntennas" is false', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="and-or-badge"]').at(0).text()).toEqual('OR'); + expect(wrapper.find('[data-test-subj="andOrBadgeBarTop"]').exists()).toBeFalsy(); + expect(wrapper.find('[data-test-subj="andOrBadgeBarBottom"]').exists()).toBeFalsy(); }); test('it renders "and" when "type" is "and"', () => { @@ -32,7 +44,6 @@ describe('AndOrBadge', () => { ); expect(wrapper.find('[data-test-subj="and-or-badge"]').at(0).text()).toEqual('AND'); - expect(wrapper.find('EuiFlexItem[data-test-subj="and-or-badge-bar"]')).toHaveLength(0); }); test('it renders "or" when "type" is "or"', () => { @@ -43,6 +54,5 @@ describe('AndOrBadge', () => { ); expect(wrapper.find('[data-test-subj="and-or-badge"]').at(0).text()).toEqual('OR'); - expect(wrapper.find('EuiFlexItem[data-test-subj="and-or-badge-bar"]')).toHaveLength(0); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/and_or_badge/index.tsx b/x-pack/plugins/security_solution/public/common/components/and_or_badge/index.tsx index ba3f880d9757e..e427e57a2c616 100644 --- a/x-pack/plugins/security_solution/public/common/components/and_or_badge/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/and_or_badge/index.tsx @@ -3,70 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - -import { EuiFlexGroup, EuiBadge, EuiFlexItem } from '@elastic/eui'; import React from 'react'; -import styled, { css } from 'styled-components'; - -import * as i18n from './translations'; - -const AndOrBadgeAntenna = styled(EuiFlexItem)` - ${({ theme }) => css` - background: ${theme.eui.euiColorLightShade}; - position: relative; - width: 2px; - &:after { - background: ${theme.eui.euiColorLightShade}; - content: ''; - height: 8px; - right: -4px; - position: absolute; - width: 9px; - clip-path: circle(); - } - &.topAndOrBadgeAntenna { - &:after { - top: -1px; - } - } - &.bottomAndOrBadgeAntenna { - &:after { - bottom: -1px; - } - } - &.euiFlexItem { - margin: 0 12px 0 0; - } - `} -`; - -const EuiFlexItemWrapper = styled(EuiFlexItem)` - &.euiFlexItem { - margin: 0 12px 0 0; - } -`; -const RoundedBadge = (styled(EuiBadge)` - align-items: center; - border-radius: 100%; - display: inline-flex; - font-size: 9px; - height: 34px; - justify-content: center; - margin: 0 5px 0 5px; - padding: 7px 6px 4px 6px; - user-select: none; - width: 34px; - .euiBadge__content { - position: relative; - top: -1px; - } - .euiBadge__text { - text-overflow: clip; - } -` as unknown) as typeof EuiBadge; - -RoundedBadge.displayName = 'RoundedBadge'; +import { RoundedBadge } from './rounded_badge'; +import { RoundedBadgeAntenna } from './rounded_badge_antenna'; export type AndOr = 'and' | 'or'; @@ -74,34 +14,7 @@ export type AndOr = 'and' | 'or'; // Ref: https://github.com/elastic/eui/issues/1655 export const AndOrBadge = React.memo<{ type: AndOr; includeAntennas?: boolean }>( ({ type, includeAntennas = false }) => { - const getBadge = () => ( - - {type === 'and' ? i18n.AND : i18n.OR} - - ); - - const getBadgeWithAntennas = () => ( - - - {getBadge()} - - - ); - - return includeAntennas ? getBadgeWithAntennas() : getBadge(); + return includeAntennas ? : ; } ); diff --git a/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge.test.tsx b/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge.test.tsx new file mode 100644 index 0000000000000..14d9627d48ad7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge.test.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { mount } from 'enzyme'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { RoundedBadge } from './rounded_badge'; + +describe('RoundedBadge', () => { + test('it renders "and" when "type" is "and"', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="and-or-badge"]').at(0).text()).toEqual('AND'); + }); + + test('it renders "or" when "type" is "or"', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="and-or-badge"]').at(0).text()).toEqual('OR'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge.tsx b/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge.tsx new file mode 100644 index 0000000000000..1a03e8c73f252 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiBadge } from '@elastic/eui'; +import React from 'react'; +import styled from 'styled-components'; + +import * as i18n from './translations'; +import { AndOr } from '.'; + +const RoundBadge = (styled(EuiBadge)` + align-items: center; + border-radius: 100%; + display: inline-flex; + font-size: 9px; + height: 34px; + justify-content: center; + margin: 0 5px 0 5px; + padding: 7px 6px 4px 6px; + user-select: none; + width: 34px; + .euiBadge__content { + position: relative; + top: -1px; + } + .euiBadge__text { + text-overflow: clip; + } +` as unknown) as typeof EuiBadge; + +RoundBadge.displayName = 'RoundBadge'; + +export const RoundedBadge: React.FC<{ type: AndOr }> = ({ type }) => ( + + {type === 'and' ? i18n.AND : i18n.OR} + +); + +RoundedBadge.displayName = 'RoundedBadge'; diff --git a/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge_antenna.test.tsx b/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge_antenna.test.tsx new file mode 100644 index 0000000000000..e6362f8798fa6 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge_antenna.test.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { mount } from 'enzyme'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { RoundedBadgeAntenna } from './rounded_badge_antenna'; + +describe('RoundedBadgeAntenna', () => { + test('it renders top and bottom antenna bars', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="and-or-badge"]').at(0).text()).toEqual('AND'); + expect(wrapper.find('[data-test-subj="andOrBadgeBarTop"]').exists()).toBeTruthy(); + expect(wrapper.find('[data-test-subj="andOrBadgeBarBottom"]').exists()).toBeTruthy(); + }); + + test('it renders "and" when "type" is "and"', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="and-or-badge"]').at(0).text()).toEqual('AND'); + }); + + test('it renders "or" when "type" is "or"', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="and-or-badge"]').at(0).text()).toEqual('OR'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge_antenna.tsx b/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge_antenna.tsx new file mode 100644 index 0000000000000..1076d8b41b955 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/and_or_badge/rounded_badge_antenna.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import React from 'react'; +import styled, { css } from 'styled-components'; + +import { RoundedBadge } from './rounded_badge'; +import { AndOr } from '.'; + +const antennaStyles = css` + background: ${({ theme }) => theme.eui.euiColorLightShade}; + position: relative; + width: 2px; + margin: 0 12px 0 0; + &:after { + background: ${({ theme }) => theme.eui.euiColorLightShade}; + content: ''; + height: 8px; + right: -4px; + position: absolute; + width: 10px; + clip-path: circle(); + } +`; + +const TopAntenna = styled(EuiFlexItem)` + ${antennaStyles} + &:after { + top: 0; + } +`; +const BottomAntenna = styled(EuiFlexItem)` + ${antennaStyles} + &:after { + bottom: 0; + } +`; + +const EuiFlexItemWrapper = styled(EuiFlexItem)` + margin: 0 12px 0 0; +`; + +export const RoundedBadgeAntenna: React.FC<{ type: AndOr }> = ({ type }) => ( + + + + + + + +); + +RoundedBadgeAntenna.displayName = 'RoundedBadgeAntenna'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx index 8942832798a5e..5f2b0b93e9df0 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { storiesOf } from '@storybook/react'; -import React from 'react'; +import React, { ReactNode } from 'react'; import { ThemeProvider } from 'styled-components'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; @@ -12,8 +12,13 @@ import { ExceptionItem } from '../viewer/exception_item'; import { Operator } from '../types'; import { getExceptionItemMock } from '../mocks'; +const withTheme = (storyFn: () => ReactNode) => ( + ({ eui: euiLightVars, darkMode: false })}>{storyFn()} +); + storiesOf('ExceptionItem', module) - .add('with os', () => { + .addDecorator(withTheme) + .add('ExceptionItem/with os', () => { const payload = getExceptionItemMock(); payload.description = ''; payload.comment = []; @@ -27,15 +32,13 @@ storiesOf('ExceptionItem', module) ]; return ( - ({ eui: euiLightVars, darkMode: false })}> - {}} - handleEdit={() => {}} - /> - + {}} + onEditException={() => {}} + /> ); }) .add('with description', () => { @@ -52,15 +55,13 @@ storiesOf('ExceptionItem', module) ]; return ( - ({ eui: euiLightVars, darkMode: false })}> - {}} - handleEdit={() => {}} - /> - + {}} + onEditException={() => {}} + /> ); }) .add('with comments', () => { @@ -77,15 +78,13 @@ storiesOf('ExceptionItem', module) ]; return ( - ({ eui: euiLightVars, darkMode: false })}> - {}} - handleEdit={() => {}} - /> - + {}} + onEditException={() => {}} + /> ); }) .add('with nested entries', () => { @@ -95,29 +94,25 @@ storiesOf('ExceptionItem', module) payload.comment = []; return ( - ({ eui: euiLightVars, darkMode: false })}> - {}} - handleEdit={() => {}} - /> - + {}} + onEditException={() => {}} + /> ); }) .add('with everything', () => { const payload = getExceptionItemMock(); return ( - ({ eui: euiLightVars, darkMode: false })}> - {}} - handleEdit={() => {}} - /> - + {}} + onEditException={() => {}} + /> ); }); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx index 7698605588e76..2893c7dc961f2 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx @@ -10,7 +10,7 @@ import moment from 'moment-timezone'; import { getOperatorType, getExceptionOperatorSelect, - determineIfIsNested, + isEntryNested, getFormattedEntries, formatEntry, getOperatingSystems, @@ -159,21 +159,21 @@ describe('Exception helpers', () => { }); }); - describe('#determineIfIsNested', () => { + describe('#isEntryNested', () => { test('it returns true if type NestedExceptionEntry', () => { const payload: NestedExceptionEntry = { field: 'actingProcess.file.signer', type: 'nested', entries: [], }; - const result = determineIfIsNested(payload); + const result = isEntryNested(payload); expect(result).toBeTruthy(); }); test('it returns false if NOT type NestedExceptionEntry', () => { const payload = getExceptionItemEntryMock(); - const result = determineIfIsNested(payload); + const result = isEntryNested(payload); expect(result).toBeFalsy(); }); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx index bd22de636bf6c..155c8a3e2926c 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx @@ -56,7 +56,7 @@ export const getExceptionOperatorSelect = (entry: ExceptionEntry): OperatorOptio return foundOperator ?? isOperator; }; -export const determineIfIsNested = ( +export const isEntryNested = ( tbd: ExceptionEntry | NestedExceptionEntry ): tbd is NestedExceptionEntry => { if (tbd.type === 'nested') { @@ -75,7 +75,7 @@ export const getFormattedEntries = ( entries: Array ): FormattedEntry[] => { const formattedEntries = entries.map((entry) => { - if (determineIfIsNested(entry)) { + if (isEntryNested(entry)) { const parent = { fieldName: entry.field, operator: null, value: null, isNested: false }; return entry.entries.reduce( (acc, nestedEntry) => { diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx index 6f418808b239a..12287f7cd0fa9 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx @@ -4,28 +4,34 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiFlexItem, EuiFlexGroup, EuiDescriptionList, EuiButtonEmpty } from '@elastic/eui'; -import React, { useMemo } from 'react'; +import { + EuiFlexItem, + EuiFlexGroup, + EuiDescriptionList, + EuiButtonEmpty, + EuiDescriptionListTitle, + EuiDescriptionListDescription, +} from '@elastic/eui'; +import React, { useMemo, Fragment } from 'react'; import styled, { css } from 'styled-components'; -import { transparentize } from 'polished'; -import { ExceptionListItemSchema } from '../../types'; +import { DescriptionListItem, ExceptionListItemSchema } from '../../types'; import { getDescriptionListContent } from '../../helpers'; import * as i18n from '../../translations'; const StyledExceptionDetails = styled(EuiFlexItem)` ${({ theme }) => css` - background-color: ${transparentize(0.95, theme.eui.euiColorPrimary)}; + background-color: ${theme.eui.euiColorLightestShade}; padding: ${theme.eui.euiSize}; + `} +`; - .euiDescriptionList__title.listTitle--width { - width: 40%; - } +const MyDescriptionListTitle = styled(EuiDescriptionListTitle)` + width: 40%; +`; - .euiDescriptionList__description.listDescription--width { - width: 60%; - } - `} +const MyDescriptionListDescription = styled(EuiDescriptionListDescription)` + width: 60%; `; const ExceptionDetailsComponent = ({ @@ -37,7 +43,10 @@ const ExceptionDetailsComponent = ({ exceptionItem: ExceptionListItemSchema; onCommentsClick: () => void; }): JSX.Element => { - const descriptionList = useMemo(() => getDescriptionListContent(exceptionItem), [exceptionItem]); + const descriptionListItems = useMemo( + (): DescriptionListItem[] => getDescriptionListContent(exceptionItem), + [exceptionItem] + ); const commentsSection = useMemo((): JSX.Element => { // TODO: return back to exceptionItem.comments once updated @@ -62,14 +71,14 @@ const ExceptionDetailsComponent = ({ - + + {descriptionListItems.map((item) => ( + + {item.title} + {item.description} + + ))} + {commentsSection} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx index 10f11231ace01..b2408a654b1c6 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx @@ -20,8 +20,8 @@ describe('ExceptionEntries', () => { ); @@ -35,8 +35,8 @@ describe('ExceptionEntries', () => { ); @@ -45,39 +45,39 @@ describe('ExceptionEntries', () => { }); test('it invokes "handlEdit" when edit button clicked', () => { - const mockHandleEdit = jest.fn(); + const mockOnEdit = jest.fn(); const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> ); const editBtn = wrapper.find('[data-test-subj="exceptionsViewerEditBtn"] button').at(0); editBtn.simulate('click'); - expect(mockHandleEdit).toHaveBeenCalledTimes(1); + expect(mockOnEdit).toHaveBeenCalledTimes(1); }); - test('it invokes "handleDelete" when delete button clicked', () => { - const mockHandleDelete = jest.fn(); + test('it invokes "onDelete" when delete button clicked', () => { + const mockOnDelete = jest.fn(); const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> ); const deleteBtn = wrapper.find('[data-test-subj="exceptionsViewerDeleteBtn"] button').at(0); deleteBtn.simulate('click'); - expect(mockHandleDelete).toHaveBeenCalledTimes(1); + expect(mockOnDelete).toHaveBeenCalledTimes(1); }); test('it renders nested entry', () => { @@ -90,8 +90,8 @@ describe('ExceptionEntries', () => { ); @@ -132,8 +132,8 @@ describe('ExceptionEntries', () => { ); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.tsx index 6f29875784e61..8c758e3b84f42 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.tsx @@ -11,6 +11,7 @@ import { EuiFlexGroup, EuiButton, EuiTableFieldDataColumnType, + EuiHideFor, } from '@elastic/eui'; import React, { useMemo } from 'react'; import styled, { css } from 'styled-components'; @@ -48,15 +49,15 @@ const AndOrBadgeContainer = styled(EuiFlexItem)` interface ExceptionEntriesComponentProps { entries: FormattedEntry[]; disableDelete: boolean; - handleDelete: () => void; - handleEdit: () => void; + onDelete: () => void; + onEdit: () => void; } const ExceptionEntriesComponent = ({ entries, disableDelete, - handleDelete, - handleEdit, + onDelete, + onEdit, }: ExceptionEntriesComponentProps): JSX.Element => { const columns = useMemo( (): Array> => [ @@ -65,6 +66,7 @@ const ExceptionEntriesComponent = ({ name: 'Field', sortable: false, truncateText: true, + textOnly: true, 'data-test-subj': 'exceptionFieldNameCell', width: '30%', render: (value: string | null, data: FormattedEntry) => { @@ -121,9 +123,15 @@ const ExceptionEntriesComponent = ({ {entries.length > 1 && ( - - - + + + + + )} - + @@ -153,7 +161,7 @@ const ExceptionEntriesComponent = ({ diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx index 784fc4336a5ff..dca3afe4f9069 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx @@ -21,8 +21,8 @@ describe('ExceptionItem', () => { @@ -32,8 +32,8 @@ describe('ExceptionItem', () => { expect(wrapper.find('ExceptionEntries')).toHaveLength(1); }); - it('it invokes "handleEdit" when edit button clicked', () => { - const mockHandleEdit = jest.fn(); + it('it invokes "onEditException" when edit button clicked', () => { + const mockOnEditException = jest.fn(); const exceptionItem = getExceptionItemMock(); const wrapper = mount( @@ -41,8 +41,8 @@ describe('ExceptionItem', () => { @@ -51,11 +51,11 @@ describe('ExceptionItem', () => { const editBtn = wrapper.find('[data-test-subj="exceptionsViewerEditBtn"] button').at(0); editBtn.simulate('click'); - expect(mockHandleEdit).toHaveBeenCalledTimes(1); + expect(mockOnEditException).toHaveBeenCalledTimes(1); }); - it('it invokes "handleDelete" when delete button clicked', () => { - const mockHandleDelete = jest.fn(); + it('it invokes "onDeleteException" when delete button clicked', () => { + const mockOnDeleteException = jest.fn(); const exceptionItem = getExceptionItemMock(); const wrapper = mount( @@ -63,8 +63,8 @@ describe('ExceptionItem', () => { @@ -73,11 +73,11 @@ describe('ExceptionItem', () => { const editBtn = wrapper.find('[data-test-subj="exceptionsViewerDeleteBtn"] button').at(0); editBtn.simulate('click'); - expect(mockHandleDelete).toHaveBeenCalledTimes(1); + expect(mockOnDeleteException).toHaveBeenCalledTimes(1); }); it('it renders comment accordion closed to begin with', () => { - const mockHandleDelete = jest.fn(); + const mockOnDeleteException = jest.fn(); const exceptionItem = getExceptionItemMock(); const wrapper = mount( @@ -85,8 +85,8 @@ describe('ExceptionItem', () => { @@ -96,7 +96,7 @@ describe('ExceptionItem', () => { }); it('it renders comment accordion open when showComments is true', () => { - const mockHandleDelete = jest.fn(); + const mockOnDeleteException = jest.fn(); const exceptionItem = getExceptionItemMock(); const wrapper = mount( @@ -104,8 +104,8 @@ describe('ExceptionItem', () => { diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx index 386ab6f3c3c7c..ba6ffb109be04 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx @@ -21,26 +21,26 @@ import { getFormattedEntries, getFormattedComments } from '../../helpers'; import { FormattedEntry, ExceptionListItemSchema, ApiProps } from '../../types'; const MyFlexItem = styled(EuiFlexItem)` - &.comments--show { - padding: ${({ theme }) => theme.eui.euiSize}; - border-top: ${({ theme }) => `${theme.eui.euiBorderThin}`} - + &.comments--show { + padding: ${({ theme }) => theme.eui.euiSize}; + border-top: ${({ theme }) => `${theme.eui.euiBorderThin}`}; + } `; interface ExceptionItemProps { loadingItemIds: ApiProps[]; exceptionItem: ExceptionListItemSchema; commentsAccordionId: string; - handleDelete: (arg: ApiProps) => void; - handleEdit: (item: ExceptionListItemSchema) => void; + onDeleteException: (arg: ApiProps) => void; + onEditException: (item: ExceptionListItemSchema) => void; } const ExceptionItemComponent = ({ loadingItemIds, exceptionItem, commentsAccordionId, - handleDelete, - handleEdit, + onDeleteException, + onEditException, }: ExceptionItemProps): JSX.Element => { const [entryItems, setEntryItems] = useState([]); const [showComments, setShowComments] = useState(false); @@ -50,13 +50,13 @@ const ExceptionItemComponent = ({ setEntryItems(formattedEntries); }, [exceptionItem.entries]); - const onDelete = useCallback((): void => { - handleDelete({ id: exceptionItem.id, namespaceType: exceptionItem.namespace_type }); - }, [handleDelete, exceptionItem]); + const handleDelete = useCallback((): void => { + onDeleteException({ id: exceptionItem.id, namespaceType: exceptionItem.namespace_type }); + }, [onDeleteException, exceptionItem]); - const onEdit = useCallback((): void => { - handleEdit(exceptionItem); - }, [handleEdit, exceptionItem]); + const handleEdit = useCallback((): void => { + onEditException(exceptionItem); + }, [onEditException, exceptionItem]); const onCommentsClick = useCallback((): void => { setShowComments(!showComments); @@ -85,8 +85,8 @@ const ExceptionItemComponent = ({ diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx index ff52e395c3b1e..3cf59c7dda023 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx @@ -195,7 +195,7 @@ const ExceptionsViewerComponent = ({ [setIsModalOpen] ); - const onEditExceptionItem = useCallback( + const handleEditException = useCallback( (exception: ExceptionListItemSchema): void => { // TODO: Added this just for testing. Update // modal state logic as needed once ready @@ -234,7 +234,7 @@ const ExceptionsViewerComponent = ({ [dispatch] ); - const onDeleteException = useCallback( + const handleDeleteException = useCallback( ({ id, namespaceType }: ApiProps) => { deleteExceptionItem({ id, @@ -395,8 +395,8 @@ const ExceptionsViewerComponent = ({ loadingItemIds={loadingItemIds} commentsAccordionId={commentsAccordionId} exceptionItem={exception} - handleDelete={onDeleteException} - handleEdit={onEditExceptionItem} + onDeleteException={handleDeleteException} + onEditException={handleEditException} /> ))} diff --git a/x-pack/plugins/security_solution/public/graphql/types.ts b/x-pack/plugins/security_solution/public/graphql/types.ts index 628d56ebb647c..dc4a8ae78bf46 100644 --- a/x-pack/plugins/security_solution/public/graphql/types.ts +++ b/x-pack/plugins/security_solution/public/graphql/types.ts @@ -4340,6 +4340,8 @@ export namespace GetAllTimeline { pinnedEventIds: Maybe; + status: Maybe; + title: Maybe; timelineType: Maybe; diff --git a/x-pack/plugins/security_solution/scripts/storybook.js b/x-pack/plugins/security_solution/scripts/storybook.js index 5f06f2a4ebb12..cd4d16d89c48d 100644 --- a/x-pack/plugins/security_solution/scripts/storybook.js +++ b/x-pack/plugins/security_solution/scripts/storybook.js @@ -9,5 +9,5 @@ import { join } from 'path'; // eslint-disable-next-line require('@kbn/storybook').runStorybookCli({ name: 'siem', - storyGlobs: [join(__dirname, '..', 'public', '**', 'components', '**', '*.stories.tsx')], + storyGlobs: [join(__dirname, '..', 'public', '**', '*.stories.tsx')], }); From 951114d66b66d3af8edb31c10693e2f9b8314a38 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 10 Jun 2020 05:47:04 -0700 Subject: [PATCH 73/91] [Metrics UI] Fix fatal error when no data is available for Metric Threshold Alerts (#68678) * [Metrics UI] Fix fatal error when no data is available for Metric Threshold Alerts * Adding i18n support for error message * Adding test --- .../components/expression_chart.test.tsx | 119 ++++++++++++++++++ .../components/expression_chart.tsx | 9 +- 2 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.test.tsx diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.test.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.test.tsx new file mode 100644 index 0000000000000..0b43883728a6f --- /dev/null +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.test.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; +import { actionTypeRegistryMock } from '../../../../../triggers_actions_ui/public/application/action_type_registry.mock'; +import { alertTypeRegistryMock } from '../../../../../triggers_actions_ui/public/application/alert_type_registry.mock'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; +import { AlertsContextValue } from '../../../../../triggers_actions_ui/public/application/context/alerts_context'; +import { AlertContextMeta, MetricExpression } from '../types'; +import { IIndexPattern } from 'src/plugins/data/public'; +import { InfraSource } from '../../../../common/http_api/source_api'; +import React from 'react'; +import { ExpressionChart } from './expression_chart'; +import { act } from 'react-dom/test-utils'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { Aggregators, Comparator } from '../../../../server/lib/alerting/metric_threshold/types'; +import { MetricsExplorerResponse } from '../../../../common/http_api'; + +describe('ExpressionChart', () => { + async function setup( + expression: MetricExpression, + response: MetricsExplorerResponse | null, + filterQuery?: string, + groupBy?: string + ) { + const mocks = coreMock.createSetup(); + const [ + { + application: { capabilities }, + }, + ] = await mocks.getStartServices(); + + const context: AlertsContextValue = { + http: mocks.http, + toastNotifications: mocks.notifications.toasts, + actionTypeRegistry: actionTypeRegistryMock.create() as any, + alertTypeRegistry: alertTypeRegistryMock.create() as any, + docLinks: mocks.docLinks, + capabilities: { + ...capabilities, + actions: { + delete: true, + save: true, + show: true, + }, + }, + }; + const derivedIndexPattern: IIndexPattern = { + title: 'metricbeat-*', + fields: [], + }; + + const source: InfraSource = { + id: 'default', + origin: 'fallback', + configuration: { + name: 'default', + description: 'The default configuration', + logColumns: [], + metricAlias: 'metricbeat-*', + logAlias: 'filebeat-*', + fields: { + timestamp: '@timestamp', + message: ['message'], + container: 'container.id', + host: 'host.name', + pod: 'kubernetes.pod.uid', + tiebreaker: '_doc', + }, + }, + }; + + mocks.http.fetch.mockImplementation(() => Promise.resolve(response)); + + const wrapper = mountWithIntl( + + ); + + const update = async () => + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + await update(); + + return { wrapper, update, fetchMock: mocks.http.fetch }; + } + + it('should display no data message', async () => { + const expression: MetricExpression = { + aggType: Aggregators.AVERAGE, + timeSize: 1, + timeUnit: 'm', + sourceId: 'default', + threshold: [1], + comparator: Comparator.GT_OR_EQ, + }; + const response = { + pageInfo: { + afterKey: null, + total: 0, + }, + series: [{ id: 'Everything', rows: [], columns: [] }], + }; + const { wrapper } = await setup(expression, response); + expect(wrapper.find('[data-test-subj~="noChartData"]').exists()).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx index a886dccf105cf..64a9d27961499 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx @@ -111,10 +111,15 @@ export const ExpressionChart: React.FC = ({ // Creating a custom series where the ID is changed to 0 // so that we can get a proper domian const firstSeries = first(data.series); - if (!firstSeries) { + if (!firstSeries || !firstSeries.rows || firstSeries.rows.length === 0) { return ( - Oops, no chart data available + + + ); } From 08ca314faf095325ef18f985472c6d4e8246a609 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Wed, 10 Jun 2020 08:51:43 -0400 Subject: [PATCH 74/91] [Ingest Manager] Document fleet configuration flags (#66736) --- .../settings/ingest-manager-settings.asciidoc | 65 +++++++++++++++++++ docs/settings/settings-xkb.asciidoc | 1 + docs/setup/settings.asciidoc | 1 + 3 files changed, 67 insertions(+) create mode 100644 docs/settings/ingest-manager-settings.asciidoc diff --git a/docs/settings/ingest-manager-settings.asciidoc b/docs/settings/ingest-manager-settings.asciidoc new file mode 100644 index 0000000000000..15f64e344d7c6 --- /dev/null +++ b/docs/settings/ingest-manager-settings.asciidoc @@ -0,0 +1,65 @@ +[role="xpack"] +[[ingest-manager-settings-kb]] +=== {ingest-manager} settings in {kib} +++++ +{ingest-manager} settings +++++ + +You can configure `xpack.ingestManager` settings in your `kibana.yml`. +By default, {ingest-manager} is not enabled. You need to enable it. To use {fleet}, you also need to configure {kib} and {es} hosts. + +[[general-ingest-manager-settings-kb]] +==== General {ingest-manager} settings + +[cols="2*<"] +|=== +| `xpack.ingestManager.enabled` {ess-icon} + | Set to `true` to enable {ingest-manager}. +|=== + +[cols="2*<"] +|=== +| `xpack.ingestManager.epm.enabled` {ess-icon} + | Set to `true` (default) to enable {package-manager}. +|=== + +[cols="2*<"] +|=== +| `xpack.ingestManager.fleet.enabled` {ess-icon} + | Set to `true` (default) to enable {fleet}. +|=== + +[[ingest-manager-data-visualizer-settings]] + +==== {package-manager} settings + +[cols="2*<"] +|=== +| `xpack.ingestManager.epm.registryUrl` + | The address to use to reach {package-manager} registry. +|=== + +==== {fleet} settings + +[cols="2*<"] +|=== +| `xpack.ingestManager.fleet.kibana.host` + | The hostname used by {agent} for accessing {kib}. +|=== + +[cols="2*<"] +|=== +| `xpack.ingestManager.fleet.elasticsearch.host` + | The hostname used by {agent} for accessing {es}. +|=== + +[cols="2*<"] +|=== +| `xpack.ingestManager.fleet.tlsCheckDisabled` + | Set to `true` to allow {fleet} to run on a {kib} instance without TLS enabled. +|=== + +[NOTE] +==== +In {ecloud}, {fleet} flags are already configured. +==== diff --git a/docs/settings/settings-xkb.asciidoc b/docs/settings/settings-xkb.asciidoc index 4d594b4113e69..04fed0d6204b7 100644 --- a/docs/settings/settings-xkb.asciidoc +++ b/docs/settings/settings-xkb.asciidoc @@ -20,3 +20,4 @@ include::ml-settings.asciidoc[] include::reporting-settings.asciidoc[] include::spaces-settings.asciidoc[] include::i18n-settings.asciidoc[] +include::ingest-manager-settings.asciidoc[] diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index c4f5439e25489..62f4a615a86c7 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -643,3 +643,4 @@ include::secure-settings.asciidoc[] include::{kib-repo-dir}/settings/security-settings.asciidoc[] include::{kib-repo-dir}/settings/spaces-settings.asciidoc[] include::{kib-repo-dir}/settings/telemetry-settings.asciidoc[] +include::{docdir}/settings/ingest-manager-settings.asciidoc[] From dab193fa46722d3e043b2b741299c4adf5c5d5b9 Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Wed, 10 Jun 2020 15:08:16 +0200 Subject: [PATCH 75/91] Renames detections missing parts (#68408) * renames SIEM for Security * changes from 'Security advanced settings' to 'Security Solution advanced settings' Co-authored-by: Elastic Machine --- .../components/rules/pre_packaged_rules/translations.ts | 2 +- .../alerts/components/rules/step_define_rule/translations.tsx | 4 ++-- .../detection_engine_user_unauthenticated.tsx | 2 +- .../alerts/pages/detection_engine/rules/translations.ts | 2 +- .../public/alerts/pages/detection_engine/translations.ts | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/pre_packaged_rules/translations.ts b/x-pack/plugins/security_solution/public/alerts/components/rules/pre_packaged_rules/translations.ts index b43ef8c615003..4d2ba8b861cce 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/pre_packaged_rules/translations.ts +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/pre_packaged_rules/translations.ts @@ -17,7 +17,7 @@ export const PRE_BUILT_MSG = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.prePackagedRules.emptyPromptMessage', { defaultMessage: - 'Elastic SIEM comes with prebuilt detection rules that run in the background and create alerts when their conditions are met. By default, all prebuilt rules are disabled and you select which rules you want to activate.', + 'Elastic Security comes with prebuilt detection rules that run in the background and create alerts when their conditions are met. By default, all prebuilt rules are disabled and you select which rules you want to activate.', } ); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/translations.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/translations.tsx index a371db72d2ee1..860ed1831fdc6 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/translations.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/translations.tsx @@ -23,7 +23,7 @@ export const INVALID_CUSTOM_QUERY = i18n.translate( export const CONFIG_INDICES = i18n.translate( 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.indicesFromConfigDescription', { - defaultMessage: 'Use Elasticsearch indices from SIEM advanced settings', + defaultMessage: 'Use Elasticsearch indices from Security Solution advanced settings', } ); @@ -38,7 +38,7 @@ export const INDEX_HELPER_TEXT = i18n.translate( 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.indicesHelperDescription', { defaultMessage: - 'Enter the pattern of Elasticsearch indices where you would like this rule to run. By default, these will include index patterns defined in SIEM advanced settings.', + 'Enter the pattern of Elasticsearch indices where you would like this rule to run. By default, these will include index patterns defined in Security Solution advanced settings.', } ); diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.tsx index fc1fee1077bd6..a353be80c7239 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.tsx @@ -17,7 +17,7 @@ export const DetectionEngineUserUnauthenticated = React.memo(() => { Date: Wed, 10 Jun 2020 07:09:58 -0600 Subject: [PATCH 76/91] [Security] [Timeline] Fix filter manager bug (#68708) --- .../draggable_wrapper_hover_content.tsx | 16 +++++++--------- .../components/manage_timeline/index.tsx | 4 ++-- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx index 4eeefdbe2fca0..f916f42fe41cd 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx @@ -13,7 +13,7 @@ import { useAddToTimeline } from '../../hooks/use_add_to_timeline'; import { WithCopyToClipboard } from '../../lib/clipboard/with_copy_to_clipboard'; import { useKibana } from '../../lib/kibana'; import { createFilter } from '../add_filter_to_global_search_bar'; -import { StatefulTopN } from '../top_n'; +import { ACTIVE_TIMELINE_REDUX_ID, StatefulTopN } from '../top_n'; import { allowTopN } from './helpers'; import * as i18n from './translations'; @@ -34,7 +34,7 @@ const DraggableWrapperHoverContentComponent: React.FC = ({ field, onFilterAdded, showTopN, - timelineId, + timelineId = ACTIVE_TIMELINE_REDUX_ID, toggleTopN, value, }) => { @@ -44,13 +44,11 @@ const DraggableWrapperHoverContentComponent: React.FC = ({ kibana.services.data.query.filterManager, ]); const { getTimelineFilterManager } = useManageTimeline(); - const filterManager = useMemo( - () => - timelineId - ? getTimelineFilterManager(timelineId) ?? filterManagerBackup - : filterManagerBackup, - [timelineId, getTimelineFilterManager, filterManagerBackup] - ); + const filterManager = useMemo(() => getTimelineFilterManager(timelineId) ?? filterManagerBackup, [ + timelineId, + getTimelineFilterManager, + filterManagerBackup, + ]); const filterForValue = useCallback(() => { const filter = value?.length === 0 ? createFilter(field, undefined) : createFilter(field, value); diff --git a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx index 8856805e6b660..44d4ff3ec1980 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx @@ -61,7 +61,7 @@ type ActionManageTimeline = | { type: 'SET_TIMELINE_FILTER_MANAGER'; id: string; - payload: FilterManager; + payload: { filterManager: FilterManager }; }; export const timelineDefaults = { @@ -161,7 +161,7 @@ const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseT dispatch({ type: 'SET_TIMELINE_FILTER_MANAGER', id, - payload: filterManager, + payload: { filterManager }, }); }, [] From d7d9544a6f7c9c98e55e3a474a3fba07207551e0 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Wed, 10 Jun 2020 09:25:49 -0400 Subject: [PATCH 77/91] [IM] Refactor component templates API integration tests (#68282) Co-authored-by: Elastic Machine --- .../index_management/component_templates.ts | 100 +++++++++++++----- .../index_management/lib/elasticsearch.js | 18 +++- 2 files changed, 88 insertions(+), 30 deletions(-) diff --git a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts index 64bf03a043b55..10ab35714b1ce 100644 --- a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts +++ b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts @@ -16,11 +16,19 @@ export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const es = getService('legacyEs'); - const { createComponentTemplate, deleteComponentTemplate } = initElasticsearchHelpers(es); + const { + createComponentTemplate, + cleanUpComponentTemplates, + deleteComponentTemplate, + } = initElasticsearchHelpers(es); describe('Component templates', function () { + after(async () => { + await cleanUpComponentTemplates(); + }); + describe('Get', () => { - const COMPONENT_NAME = 'test_component_template'; + const COMPONENT_NAME = 'test_get_component_template'; const COMPONENT = { template: { settings: { @@ -45,8 +53,16 @@ export default function ({ getService }: FtrProviderContext) { }, }; - before(() => createComponentTemplate({ body: COMPONENT, name: COMPONENT_NAME })); - after(() => deleteComponentTemplate(COMPONENT_NAME)); + // Create component template to verify GET requests + before(async () => { + try { + await createComponentTemplate({ body: COMPONENT, name: COMPONENT_NAME }, true); + } catch (err) { + // eslint-disable-next-line no-console + console.log('[Setup error] Error creating component template'); + throw err; + } + }); describe('all component templates', () => { it('should return an array of component templates', async () => { @@ -90,9 +106,15 @@ export default function ({ getService }: FtrProviderContext) { const COMPONENT_NAME = 'test_create_component_template'; const REQUIRED_FIELDS_COMPONENT_NAME = 'test_create_required_fields_component_template'; - after(() => { - deleteComponentTemplate(COMPONENT_NAME); - deleteComponentTemplate(REQUIRED_FIELDS_COMPONENT_NAME); + after(async () => { + // Clean up any component templates created in test cases + await Promise.all( + [COMPONENT_NAME, REQUIRED_FIELDS_COMPONENT_NAME].map(deleteComponentTemplate) + ).catch((err) => { + // eslint-disable-next-line no-console + console.log(`[Cleanup error] Error deleting component templates: ${err.message}`); + throw err; + }); }); it('should create a component template', async () => { @@ -167,7 +189,7 @@ export default function ({ getService }: FtrProviderContext) { }); describe('Update', () => { - const COMPONENT_NAME = 'test_component_template'; + const COMPONENT_NAME = 'test_update_component_template'; const COMPONENT = { template: { settings: { @@ -192,8 +214,16 @@ export default function ({ getService }: FtrProviderContext) { }, }; - before(() => createComponentTemplate({ body: COMPONENT, name: COMPONENT_NAME })); - after(() => deleteComponentTemplate(COMPONENT_NAME)); + before(async () => { + // Create component template that can be used to test PUT request + try { + await createComponentTemplate({ body: COMPONENT, name: COMPONENT_NAME }, true); + } catch (err) { + // eslint-disable-next-line no-console + console.log('[Setup error] Error creating component template'); + throw err; + } + }); it('should allow an existing component template to be updated', async () => { const uri = `${API_BASE_PATH}/component_templates/${COMPONENT_NAME}`; @@ -244,29 +274,44 @@ export default function ({ getService }: FtrProviderContext) { }, }; - it('should delete a component template', async () => { - // Create component template to be deleted - const COMPONENT_NAME = 'test_delete_component_template'; - createComponentTemplate({ body: COMPONENT, name: COMPONENT_NAME }); + const componentTemplateA = { body: COMPONENT, name: 'test_delete_component_template_a' }; + const componentTemplateB = { body: COMPONENT, name: 'test_delete_component_template_b' }; + const componentTemplateC = { body: COMPONENT, name: 'test_delete_component_template_c' }; + const componentTemplateD = { body: COMPONENT, name: 'test_delete_component_template_d' }; + + before(async () => { + // Create several component templates that can be used to test deletion + await Promise.all( + [ + componentTemplateA, + componentTemplateB, + componentTemplateC, + componentTemplateD, + ].map((template) => createComponentTemplate(template, false)) + ).catch((err) => { + // eslint-disable-next-line no-console + console.log(`[Setup error] Error creating component templates: ${err.message}`); + throw err; + }); + }); - const uri = `${API_BASE_PATH}/component_templates/${COMPONENT_NAME}`; + it('should delete a component template', async () => { + const { name } = componentTemplateA; + const uri = `${API_BASE_PATH}/component_templates/${name}`; const { body } = await supertest.delete(uri).set('kbn-xsrf', 'xxx').expect(200); expect(body).to.eql({ - itemsDeleted: [COMPONENT_NAME], + itemsDeleted: [name], errors: [], }); }); it('should delete multiple component templates', async () => { - // Create component templates to be deleted - const COMPONENT_ONE_NAME = 'test_delete_component_1'; - const COMPONENT_TWO_NAME = 'test_delete_component_2'; - createComponentTemplate({ body: COMPONENT, name: COMPONENT_ONE_NAME }); - createComponentTemplate({ body: COMPONENT, name: COMPONENT_TWO_NAME }); + const { name: componentTemplate1Name } = componentTemplateB; + const { name: componentTemplate2Name } = componentTemplateC; - const uri = `${API_BASE_PATH}/component_templates/${COMPONENT_ONE_NAME},${COMPONENT_TWO_NAME}`; + const uri = `${API_BASE_PATH}/component_templates/${componentTemplate1Name},${componentTemplate2Name}`; const { body: { itemsDeleted, errors }, @@ -275,23 +320,20 @@ export default function ({ getService }: FtrProviderContext) { expect(errors).to.eql([]); // The itemsDeleted array order isn't guaranteed, so we assert against each name instead - [COMPONENT_ONE_NAME, COMPONENT_TWO_NAME].forEach((componentName) => { + [componentTemplate1Name, componentTemplate2Name].forEach((componentName) => { expect(itemsDeleted.includes(componentName)).to.be(true); }); }); it('should return an error for any component templates not sucessfully deleted', async () => { const COMPONENT_DOES_NOT_EXIST = 'component_does_not_exist'; + const { name: componentTemplateName } = componentTemplateD; - // Create component template to be deleted - const COMPONENT_ONE_NAME = 'test_delete_component_1'; - createComponentTemplate({ body: COMPONENT, name: COMPONENT_ONE_NAME }); - - const uri = `${API_BASE_PATH}/component_templates/${COMPONENT_ONE_NAME},${COMPONENT_DOES_NOT_EXIST}`; + const uri = `${API_BASE_PATH}/component_templates/${componentTemplateName},${COMPONENT_DOES_NOT_EXIST}`; const { body } = await supertest.delete(uri).set('kbn-xsrf', 'xxx').expect(200); - expect(body.itemsDeleted).to.eql([COMPONENT_ONE_NAME]); + expect(body.itemsDeleted).to.eql([componentTemplateName]); expect(body.errors[0].name).to.eql(COMPONENT_DOES_NOT_EXIST); expect(body.errors[0].error.msg).to.contain('index_template_missing_exception'); }); diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js b/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js index 1a1517567eaed..6dcfbecb6bd0d 100644 --- a/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js +++ b/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js @@ -13,6 +13,7 @@ import { getRandomString } from './random'; */ export const initElasticsearchHelpers = (es) => { let indicesCreated = []; + let componentTemplatesCreated = []; const createIndex = (index = getRandomString(), body) => { indicesCreated.push(index); @@ -35,7 +36,11 @@ export const initElasticsearchHelpers = (es) => { const catTemplate = (name) => es.cat.templates({ name, format: 'json' }); - const createComponentTemplate = (componentTemplate) => { + const createComponentTemplate = (componentTemplate, shouldCacheTemplate) => { + if (shouldCacheTemplate) { + componentTemplatesCreated.push(componentTemplate.name); + } + return es.dataManagement.saveComponentTemplate(componentTemplate); }; @@ -43,6 +48,16 @@ export const initElasticsearchHelpers = (es) => { return es.dataManagement.deleteComponentTemplate({ name: componentTemplateName }); }; + const cleanUpComponentTemplates = () => + Promise.all(componentTemplatesCreated.map(deleteComponentTemplate)) + .then(() => { + componentTemplatesCreated = []; + }) + .catch((err) => { + // eslint-disable-next-line no-console + console.log(`[Cleanup error] Error deleting ES resources: ${err.message}`); + }); + return { createIndex, deleteIndex, @@ -53,5 +68,6 @@ export const initElasticsearchHelpers = (es) => { catTemplate, createComponentTemplate, deleteComponentTemplate, + cleanUpComponentTemplates, }; }; From 324393db36952c42d92ab9cbbd7a3f0f36d40d70 Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Wed, 10 Jun 2020 15:28:08 +0200 Subject: [PATCH 78/91] =?UTF-8?q?docs:=20=E2=9C=8F=EF=B8=8F=20update=20Dri?= =?UTF-8?q?lldown=20description=20in=20docs=20(#68762)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/drilldowns/drilldowns.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/drilldowns/drilldowns.asciidoc b/docs/drilldowns/drilldowns.asciidoc index 2687441c99340..e2dfaa5af39ce 100644 --- a/docs/drilldowns/drilldowns.asciidoc +++ b/docs/drilldowns/drilldowns.asciidoc @@ -15,8 +15,8 @@ that shows a single data center or server. [[how-drilldowns-work]] === How drilldowns work -Drilldowns are {kib} actions that you configure and store -in the dashboard saved object. Drilldowns are specific to the dashboard panel +Drilldowns are user-configurable {kib} actions that are stored with the +dashboard metadata. Drilldowns are specific to the dashboard panel for which you create them—they are not shared across panels. A panel can have multiple drilldowns. From a462e2c7b0505613e5aef28e4c69259ba8c3e8c6 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 10 Jun 2020 15:44:59 +0200 Subject: [PATCH 79/91] [Lens] Keep global filters, time range and refresh interval on refresh (#68075) --- .../lens/public/app_plugin/app.test.tsx | 10 ++++ x-pack/plugins/lens/public/app_plugin/app.tsx | 24 +++++++- .../lens/public/app_plugin/mounter.tsx | 1 + x-pack/test/functional/apps/lens/index.ts | 1 + .../apps/lens/persistent_context.ts | 60 +++++++++++++++++++ 5 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 x-pack/test/functional/apps/lens/persistent_context.ts diff --git a/x-pack/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx index 33f4f46681a28..811f42590f07b 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -13,6 +13,7 @@ import { AppMountParameters } from 'kibana/public'; import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { Document, SavedObjectStore } from '../persistence'; import { mount } from 'enzyme'; +import { createMemoryHistory, History } from 'history'; import { SavedObjectSaveModal } from '../../../../../src/plugins/saved_objects/public'; import { esFilters, @@ -27,6 +28,7 @@ const dataStartMock = dataPluginMock.createStartContract(); import { navigationPluginMock } from '../../../../../src/plugins/navigation/public/mocks'; import { TopNavMenuData } from '../../../../../src/plugins/navigation/public'; import { coreMock } from 'src/core/public/mocks'; +import { Observable } from 'rxjs'; jest.mock('../persistence'); jest.mock('src/core/public'); @@ -90,6 +92,8 @@ function createMockTimefilter() { return unsubscribe; }, }), + getRefreshInterval: () => {}, + getRefreshIntervalDefaults: () => {}, }; } @@ -114,6 +118,7 @@ describe('Lens App', () => { ) => void; originatingApp: string | undefined; onAppLeave: AppMountParameters['onAppLeave']; + history: History; }> { return ({ navigation: navigationStartMock, @@ -134,6 +139,7 @@ describe('Lens App', () => { timefilter: { timefilter: createMockTimefilter(), }, + state$: new Observable(), }, indexPatterns: { get: jest.fn((id) => { @@ -157,6 +163,7 @@ describe('Lens App', () => { ) => {} ), onAppLeave: jest.fn(), + history: createMemoryHistory(), } as unknown) as jest.Mocked<{ navigation: typeof navigationStartMock; editorFrame: EditorFrameInstance; @@ -173,6 +180,7 @@ describe('Lens App', () => { ) => void; originatingApp: string | undefined; onAppLeave: AppMountParameters['onAppLeave']; + history: History; }>; } @@ -186,6 +194,8 @@ describe('Lens App', () => { return { from: 'now-7d', to: 'now' }; } else if (type === UI_SETTINGS.SEARCH_QUERY_LANGUAGE) { return 'kuery'; + } else if (type === 'state:storeInSessionStorage') { + return false; } else { return []; } diff --git a/x-pack/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx index 1349d33983fcd..f88c1c5aca31d 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -8,10 +8,18 @@ import _ from 'lodash'; import React, { useState, useEffect, useCallback } from 'react'; import { I18nProvider } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { Query, DataPublicPluginStart } from 'src/plugins/data/public'; import { NavigationPublicPluginStart } from 'src/plugins/navigation/public'; import { AppMountContext, AppMountParameters, NotificationsStart } from 'kibana/public'; -import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; +import { History } from 'history'; +import { + Query, + DataPublicPluginStart, + syncQueryStateWithUrl, +} from '../../../../../src/plugins/data/public'; +import { + createKbnUrlStateStorage, + IStorageWrapper, +} from '../../../../../src/plugins/kibana_utils/public'; import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; import { SavedObjectSaveModalOrigin, @@ -59,6 +67,7 @@ export function App({ originatingAppFromUrl, navigation, onAppLeave, + history, }: { editorFrame: EditorFrameInstance; data: DataPublicPluginStart; @@ -75,6 +84,7 @@ export function App({ ) => void; originatingAppFromUrl?: string | undefined; onAppLeave: AppMountParameters['onAppLeave']; + history: History; }) { const language = storage.get('kibana.userQueryLanguage') || @@ -129,7 +139,17 @@ export function App({ }, }); + const kbnUrlStateStorage = createKbnUrlStateStorage({ + history, + useHash: core.uiSettings.get('state:storeInSessionStorage'), + }); + const { stop: stopSyncingQueryServiceStateWithUrl } = syncQueryStateWithUrl( + data.query, + kbnUrlStateStorage + ); + return () => { + stopSyncingQueryServiceStateWithUrl(); filterSubscription.unsubscribe(); timeSubscription.unsubscribe(); }; diff --git a/x-pack/plugins/lens/public/app_plugin/mounter.tsx b/x-pack/plugins/lens/public/app_plugin/mounter.tsx index 032ce8325dca1..e6a9119ad4306 100644 --- a/x-pack/plugins/lens/public/app_plugin/mounter.tsx +++ b/x-pack/plugins/lens/public/app_plugin/mounter.tsx @@ -93,6 +93,7 @@ export async function mountApp( } originatingAppFromUrl={originatingAppFromUrl} onAppLeave={params.onAppLeave} + history={routeProps.history} /> ); }; diff --git a/x-pack/test/functional/apps/lens/index.ts b/x-pack/test/functional/apps/lens/index.ts index ff40cde070416..9e04f6e9df22b 100644 --- a/x-pack/test/functional/apps/lens/index.ts +++ b/x-pack/test/functional/apps/lens/index.ts @@ -29,6 +29,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { this.tags(['ciGroup4', 'skipFirefox']); loadTestFile(require.resolve('./smokescreen')); + loadTestFile(require.resolve('./persistent_context')); loadTestFile(require.resolve('./lens_reporting')); }); }); diff --git a/x-pack/test/functional/apps/lens/persistent_context.ts b/x-pack/test/functional/apps/lens/persistent_context.ts new file mode 100644 index 0000000000000..00d9208772798 --- /dev/null +++ b/x-pack/test/functional/apps/lens/persistent_context.ts @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import _ from 'lodash'; +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['visualize', 'header', 'timePicker']); + const browser = getService('browser'); + const filterBar = getService('filterBar'); + const appsMenu = getService('appsMenu'); + + describe('lens query context', () => { + it('should carry over time range and pinned filters to discover', async () => { + await PageObjects.visualize.navigateToNewVisualization(); + await PageObjects.visualize.clickVisType('lens'); + await PageObjects.timePicker.setAbsoluteRange( + 'Sep 06, 2015 @ 06:31:44.000', + 'Sep 18, 2025 @ 06:31:44.000' + ); + await filterBar.addFilter('ip', 'is', '97.220.3.248'); + await filterBar.toggleFilterPinned('ip'); + await PageObjects.header.clickDiscover(); + const timeRange = await PageObjects.timePicker.getTimeConfig(); + expect(timeRange.start).to.equal('Sep 6, 2015 @ 06:31:44.000'); + expect(timeRange.end).to.equal('Sep 18, 2025 @ 06:31:44.000'); + await filterBar.hasFilter('ip', '97.220.3.248', true, true); + }); + + it('should remember time range and pinned filters from discover', async () => { + await PageObjects.timePicker.setAbsoluteRange( + 'Sep 07, 2015 @ 06:31:44.000', + 'Sep 19, 2025 @ 06:31:44.000' + ); + await filterBar.toggleFilterEnabled('ip'); + await appsMenu.clickLink('Visualize', { category: 'kibana' }); + await PageObjects.visualize.clickNewVisualization(); + await PageObjects.visualize.waitForVisualizationSelectPage(); + await PageObjects.visualize.clickVisType('lens'); + const timeRange = await PageObjects.timePicker.getTimeConfig(); + expect(timeRange.start).to.equal('Sep 7, 2015 @ 06:31:44.000'); + expect(timeRange.end).to.equal('Sep 19, 2025 @ 06:31:44.000'); + await filterBar.hasFilter('ip', '97.220.3.248', false, true); + }); + + it('keep time range and pinned filters after refresh', async () => { + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + const timeRange = await PageObjects.timePicker.getTimeConfig(); + expect(timeRange.start).to.equal('Sep 7, 2015 @ 06:31:44.000'); + expect(timeRange.end).to.equal('Sep 19, 2025 @ 06:31:44.000'); + await filterBar.hasFilter('ip', '97.220.3.248', false, true); + }); + }); +} From 4b620616bcd383ef3cbb22cf5b151e829246ff33 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Wed, 10 Jun 2020 07:20:55 -0700 Subject: [PATCH 80/91] [DOCS] Fixes titles in Discover, Graph, & Install for consistency (#68685) * [DOCS] Fixes titles in Discover, Graph, & Install for consistency * [DOCS] More docs tweaks for consistency --- docs/discover/context.asciidoc | 2 +- docs/discover/document-data.asciidoc | 2 +- docs/discover/field-filter.asciidoc | 2 +- docs/discover/kuery.asciidoc | 4 ++-- docs/discover/search.asciidoc | 10 ++++---- docs/discover/set-time-filter.asciidoc | 27 +++++++++++----------- docs/discover/viewing-field-stats.asciidoc | 2 +- docs/management/index-patterns.asciidoc | 2 +- docs/setup/docker.asciidoc | 6 ++++- docs/setup/install/brew.asciidoc | 5 +++- docs/setup/install/deb.asciidoc | 3 +++ docs/setup/install/rpm.asciidoc | 4 ++++ docs/setup/install/targz.asciidoc | 3 +++ docs/setup/install/windows.asciidoc | 3 +++ docs/user/graph/configuring-graph.asciidoc | 6 ++--- docs/user/graph/getting-started.asciidoc | 4 ++-- docs/user/graph/index.asciidoc | 2 +- docs/user/graph/troubleshooting.asciidoc | 2 +- 18 files changed, 54 insertions(+), 35 deletions(-) diff --git a/docs/discover/context.asciidoc b/docs/discover/context.asciidoc index c402a734a16fa..17ed78a163571 100644 --- a/docs/discover/context.asciidoc +++ b/docs/discover/context.asciidoc @@ -1,5 +1,5 @@ [[document-context]] -== Viewing a document in context +== View a document in context Once you've narrowed your search to a specific event, you might want to inspect the documents that occurred diff --git a/docs/discover/document-data.asciidoc b/docs/discover/document-data.asciidoc index 477c2ec90e95c..ee130e8405483 100644 --- a/docs/discover/document-data.asciidoc +++ b/docs/discover/document-data.asciidoc @@ -1,5 +1,5 @@ [[document-data]] -== Viewing document data +== View document data When you submit a search query in *Discover*, the most recent documents that match the query are listed in the documents table. diff --git a/docs/discover/field-filter.asciidoc b/docs/discover/field-filter.asciidoc index 49bb6078cdc58..949cab2c2f976 100644 --- a/docs/discover/field-filter.asciidoc +++ b/docs/discover/field-filter.asciidoc @@ -1,5 +1,5 @@ [[field-filter]] -== Filtering by field +== Filter by field *Discover* offers various types of filters, so you can restrict your documents to the exact data you want. diff --git a/docs/discover/kuery.asciidoc b/docs/discover/kuery.asciidoc index 48a7c65bdbf15..1a481c46b3816 100644 --- a/docs/discover/kuery.asciidoc +++ b/docs/discover/kuery.asciidoc @@ -5,7 +5,7 @@ In Kibana 6.3, we introduced a number of exciting experimental query language en features are now available by default in 7.0. Out of the box, Kibana's query language now includes scripted field support and a simplified, easier to use syntax. If you have a Basic license or above, autocomplete functionality will also be enabled. -==== Language Syntax +==== Language syntax If you're familiar with Kibana's old Lucene query syntax, you should feel right at home with the new syntax. The basics stay the same, we've simply refined things to make the query language easier to use. @@ -72,7 +72,7 @@ set these terms will be matched against all fields. For example, a query for `re in the response field, but a query for just `200` will search for 200 across all fields in your index. ============ -==== Nested Field Support +==== Nested field support KQL supports querying on {ref}/nested.html[nested fields] through a special syntax. You can query nested fields in subtly different ways, depending on the results you want, so crafting nested queries requires extra thought. diff --git a/docs/discover/search.asciidoc b/docs/discover/search.asciidoc index 9fe35f0302760..c6e1daee9b072 100644 --- a/docs/discover/search.asciidoc +++ b/docs/discover/search.asciidoc @@ -1,5 +1,5 @@ [[search]] -== Searching your data +== Search data Many Kibana apps embed a query bar for real-time search, including *Discover*, *Visualize*, and *Dashboard*. @@ -83,14 +83,14 @@ query language you can also submit queries using the {ref}/query-dsl.html[Elasti [[save-open-search]] -=== Saving searches +=== Save a search A saved search persists your current view of Discover for later retrieval and reuse. You can reload a saved search into Discover, add it to a dashboard, and use it as the basis for a <>. A saved search includes the query text, filters, and optionally, the time filter. A saved search also includes the selected columns in the document table, the sort order, and the current index pattern. [role="xpack"] [[discover-read-only-access]] -==== Read only access +==== Read-only access When you have insufficient privileges to save searches, the following indicator in Kibana will be displayed and the *Save* button won't be visible. For more information on granting access to Kibana see <>. @@ -117,7 +117,7 @@ selected, opening the saved search changes the selected index pattern. The query used for the saved search will also be automatically selected. [[save-load-delete-query]] -=== Saving queries +=== Save a query A saved query is a portable collection of query text and filters that you can reuse in <>, <>, and <>. Save a query when you want to: * Retrieve results from the same query at a later time without having to reenter the query text, add the filters or set the time filter @@ -127,7 +127,7 @@ A saved query is a portable collection of query text and filters that you can re Saved queries don't include information specific to Discover, such as the currently selected columns in the document table, the sort order, and the index pattern. If you want to save your current view of Discover for later retrieval and reuse, create a <> instead. [role="xpack"] -==== Read only access +==== Read-only access If you have insufficient privileges to save queries, the *Save current query* button isn't visible in the saved query management popover. For more information, see <> ==== Save a query diff --git a/docs/discover/set-time-filter.asciidoc b/docs/discover/set-time-filter.asciidoc index c53850b38a2b0..a5b81b0fa461c 100644 --- a/docs/discover/set-time-filter.asciidoc +++ b/docs/discover/set-time-filter.asciidoc @@ -1,39 +1,39 @@ [[set-time-filter]] -== Setting the time filter -If your index contains time-based events, and a time-field is configured for the +== Set the time filter +If your index contains time-based events, and a time-field is configured for the selected <>, set a time filter that displays only the data within the specified time range. -You can use the time filter to change the time range, or select a specific time +You can use the time filter to change the time range, or select a specific time range in the histogram. [float] [[use-time-filter]] === Use the time filter -Use the time filter to change the time range. By default, the time filter is set +Use the time filter to change the time range. By default, the time filter is set to the last 15 minutes. -. Click image:images/time-filter-calendar.png[]. +. Click image:images/time-filter-calendar.png[]. . Choose one of the following: -* *Quick select* to use a recent time range, then use the back and forward +* *Quick select* to use a recent time range, then use the back and forward arrows to move through the time ranges. - -* *Commonly used* to use a time range from options such as *Last 15 minutes*, + +* *Commonly used* to use a time range from options such as *Last 15 minutes*, *Today*, and *Week to date*. - -* *Recently used date ranges* to use a previously selected data range that + +* *Recently used date ranges* to use a previously selected data range that you recently used. - + * *Refresh every* to specify an automatic refresh rate. + [role="screenshot"] image::images/Timepicker-View.png[Time filter menu] -. To set the start and end times, click the bar next to the time filter. -In the popup, select *Absolute*, *Relative* or *Now*, then specify the required +. To set the start and end times, click the bar next to the time filter. +In the popup, select *Absolute*, *Relative* or *Now*, then specify the required options. + [role="screenshot"] @@ -54,4 +54,3 @@ when you hover over a valid start point. [role="screenshot"] image::images/Histogram-Time.png[Time range selector in Histogram] - diff --git a/docs/discover/viewing-field-stats.asciidoc b/docs/discover/viewing-field-stats.asciidoc index 3631aba73fb20..5ada5839fd344 100644 --- a/docs/discover/viewing-field-stats.asciidoc +++ b/docs/discover/viewing-field-stats.asciidoc @@ -1,5 +1,5 @@ [[viewing-field-stats]] -== Viewing Field Data Statistics +== View field data statistics From the fields list, you can see how many of the documents in the documents table contain a particular field, what the top 5 values are, and what diff --git a/docs/management/index-patterns.asciidoc b/docs/management/index-patterns.asciidoc index bb16faab7fe5a..37980e2b15c6b 100644 --- a/docs/management/index-patterns.asciidoc +++ b/docs/management/index-patterns.asciidoc @@ -1,5 +1,5 @@ [[index-patterns]] -== Creating an index pattern +== Create an index pattern To explore and visualize data in {kib}, you must create an index pattern. An index pattern tells {kib} which {es} indices contain the data that diff --git a/docs/setup/docker.asciidoc b/docs/setup/docker.asciidoc index fb4cbbada9a33..1a0b13edf8086 100644 --- a/docs/setup/docker.asciidoc +++ b/docs/setup/docker.asciidoc @@ -1,5 +1,9 @@ [[docker]] -=== Install Kibana with Docker +=== Install {kib} with Docker +++++ +Install with Docker +++++ + Docker images for Kibana are available from the Elastic Docker registry. The base image is https://hub.docker.com/_/centos/[centos:7]. diff --git a/docs/setup/install/brew.asciidoc b/docs/setup/install/brew.asciidoc index 3fe104bd04794..07d740361d505 100644 --- a/docs/setup/install/brew.asciidoc +++ b/docs/setup/install/brew.asciidoc @@ -1,5 +1,8 @@ [[brew]] === Install {kib} on macOS with Homebrew +++++ +Install on macOS with Homebrew +++++ Elastic publishes Homebrew formulae so you can install {kib} with the https://brew.sh/[Homebrew] package manager. @@ -44,7 +47,7 @@ and data directory are stored in the following locations. | conf | Configuration files including `kibana.yml` | /usr/local/etc/kibana - d| + d| | data | The location of the data files of each index / shard allocated diff --git a/docs/setup/install/deb.asciidoc b/docs/setup/install/deb.asciidoc index 8193a088c8b7e..dfa1e3a37fd05 100644 --- a/docs/setup/install/deb.asciidoc +++ b/docs/setup/install/deb.asciidoc @@ -1,5 +1,8 @@ [[deb]] === Install {kib} with Debian package +++++ +Install with Debian package +++++ The Debian package for Kibana can be <> or from our <>. It can be used to install diff --git a/docs/setup/install/rpm.asciidoc b/docs/setup/install/rpm.asciidoc index c3922ffba1efa..ccc38c2696158 100644 --- a/docs/setup/install/rpm.asciidoc +++ b/docs/setup/install/rpm.asciidoc @@ -1,5 +1,9 @@ [[rpm]] === Install {kib} with RPM +++++ +Install with RPM +++++ + The RPM for Kibana can be <> or from our <>. It can be used to install diff --git a/docs/setup/install/targz.asciidoc b/docs/setup/install/targz.asciidoc index a53360900657e..c8bff5d58889d 100644 --- a/docs/setup/install/targz.asciidoc +++ b/docs/setup/install/targz.asciidoc @@ -1,5 +1,8 @@ [[targz]] === Install {kib} from archive on Linux or macOS +++++ +Install from archive on Linux or macOS +++++ Kibana is provided for Linux and Darwin as a `.tar.gz` package. These packages are the easiest formats to use when trying out Kibana. diff --git a/docs/setup/install/windows.asciidoc b/docs/setup/install/windows.asciidoc index 1cfbaaa0eda2f..24bf74f607fef 100644 --- a/docs/setup/install/windows.asciidoc +++ b/docs/setup/install/windows.asciidoc @@ -1,5 +1,8 @@ [[windows]] === Install {kib} on Windows +++++ +Install on Windows +++++ Kibana can be installed on Windows using the `.zip` package. diff --git a/docs/user/graph/configuring-graph.asciidoc b/docs/user/graph/configuring-graph.asciidoc index 5427bdee79ecb..4eb8939b004ba 100644 --- a/docs/user/graph/configuring-graph.asciidoc +++ b/docs/user/graph/configuring-graph.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[graph-configuration]] -== Configuring Graph +== Configure Graph When a user saves a graph workspace in Kibana, it is stored in the `.kibana` index along with other saved objects like visualizations and dashboards. @@ -48,7 +48,7 @@ Only the configuration is saved unless the user explicitly selects the include data option. [float] -=== Using Security to grant access +=== Use Security to grant access You can also use security to grant read only or all access to different roles. When security is used to grant read only access, the following indicator in Kibana is displayed. For more information on granting access to Kibana, see @@ -59,7 +59,7 @@ image::user/graph/images/graph-read-only-badge.png[Example of Graph's read only [discrete] [[disable-drill-down]] -=== Disabling drilldown configuration +=== Disable drilldown configuration By default, users can configure _drilldown_ URLs to display additional information about a selected vertex in a new browser window. For example, diff --git a/docs/user/graph/getting-started.asciidoc b/docs/user/graph/getting-started.asciidoc index a155017f1bb22..4f61b62da5cce 100644 --- a/docs/user/graph/getting-started.asciidoc +++ b/docs/user/graph/getting-started.asciidoc @@ -1,13 +1,13 @@ [role="xpack"] [[graph-getting-started]] -== Using Graph +== Create a graph You must index data into {es} before you can create a graph. <> or get started with a <>. [float] [[exploring-connections]] -=== Graph connections in your data +=== Graph a data connection . From the side navigation, open *Graph*. + diff --git a/docs/user/graph/index.asciidoc b/docs/user/graph/index.asciidoc index f9094f5b594b1..40c75c868e237 100644 --- a/docs/user/graph/index.asciidoc +++ b/docs/user/graph/index.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[xpack-graph]] -= Graph data connections += Graph [partintro] -- diff --git a/docs/user/graph/troubleshooting.asciidoc b/docs/user/graph/troubleshooting.asciidoc index 4ce287396f809..3819d99036f98 100644 --- a/docs/user/graph/troubleshooting.asciidoc +++ b/docs/user/graph/troubleshooting.asciidoc @@ -2,7 +2,7 @@ [[graph-troubleshooting]] == Graph troubleshooting ++++ -Troubleshooting +Troubleshoot ++++ [discrete] From 8118b13ff7993feea5a7c1ef67bf930a4e1477a6 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Wed, 10 Jun 2020 08:54:27 -0600 Subject: [PATCH 81/91] [SIEM][Detection Engine] Follow up issues from PR 68127 (#68612) ## Summary * Smaller follow ups and bug fixes from: https://github.com/elastic/kibana/pull/68127 * Added unknown to `findDifferencesRecursive` * Added linter rule to catch NodeJS code in the common folders for both `lists` and `security_solution` * Removed the Hapi server type from the common folder of lists ### Checklist * Added unknown to the correct locations - [x] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios --- .eslintrc.js | 24 ++- .../request/import_list_item_schema.ts | 17 -- .../server/routes/import_list_item_route.ts | 22 ++- .../services/items/buffer_lines.test.ts | 3 +- .../services/items}/test_readable.mock.ts | 0 .../write_lines_to_bulk_list_items.mock.ts | 3 +- .../schemas/common/schemas.ts | 22 ++- .../request/create_rules_schema.mock.ts | 19 +- .../request/import_rules_schema.mock.ts | 35 +++- .../schemas/response/error_schema.mocks.ts | 17 ++ .../schemas/response/error_schema.test.ts | 12 +- .../response/find_rules_schema.mocks.ts | 15 ++ .../response/find_rules_schema.test.ts | 29 +-- .../response/rules_bulk_schema.mocks.ts | 10 ++ .../response/rules_bulk_schema.test.ts | 32 ++-- .../utils.ts => rules_schema.mocks.ts} | 56 +++--- .../schemas/response/rules_schema.test.ts | 102 +++++------ .../security_solution/common/exact_check.ts | 2 +- .../test_files/expected_rules_export.ndjson | 2 +- .../rules_notification_alert_type.ts | 3 +- .../routes/__mocks__/request_responses.ts | 48 ++--- .../routes/__mocks__/utils.ts | 66 +------ .../rules/create_rules_bulk_route.test.ts | 11 +- .../routes/rules/create_rules_route.test.ts | 8 +- .../routes/rules/import_rules_route.test.ts | 22 ++- .../rules/patch_rules_bulk_route.test.ts | 8 +- .../routes/rules/patch_rules_route.test.ts | 8 +- .../rules/update_rules_bulk_route.test.ts | 8 +- .../routes/rules/update_rules_route.test.ts | 8 +- .../routes/rules/utils.test.ts | 27 ++- .../detection_engine/routes/rules/utils.ts | 36 ++-- .../detection_engine/routes/rules/validate.ts | 3 +- .../rules/get_export_by_object_ids.ts | 12 +- .../rules/get_export_details_ndjson.test.ts | 10 +- .../rules/get_export_details_ndjson.ts | 4 +- .../lib/detection_engine/rules/patch_rules.ts | 3 +- .../lib/detection_engine/rules/types.ts | 28 ++- .../detection_engine/rules/update_rules.ts | 4 +- .../lib/detection_engine/rules/utils.test.ts | 103 +++++++++-- .../lib/detection_engine/rules/utils.ts | 64 ++++++- .../signals/__mocks__/es_results.ts | 30 +--- .../signals/build_bulk_body.test.ts | 12 +- .../signals/build_exceptions_query.test.ts | 29 --- .../signals/build_exceptions_query.ts | 14 +- .../signals/build_rule.test.ts | 11 +- .../detection_engine/signals/build_rule.ts | 13 +- .../signals/build_signal.test.ts | 33 ++-- .../detection_engine/signals/build_signal.ts | 17 +- .../signals/filter_events_with_list.test.ts | 4 +- .../signals/filter_events_with_list.ts | 4 +- .../signals/get_filter.test.ts | 14 -- .../detection_engine/signals/get_filter.ts | 37 ++-- .../signals/rule_status_service.ts | 5 +- .../signals/search_after_bulk_create.ts | 5 +- .../signals/signal_params_schema.ts | 63 +++---- .../signals/signal_rule_alert_type.test.ts | 18 +- .../signals/signal_rule_alert_type.ts | 2 +- .../lib/detection_engine/signals/types.ts | 24 +-- .../server/lib/detection_engine/types.ts | 170 ++++++------------ .../create_stream_from_ndjson.test.ts | 12 +- .../basic/tests/update_rules.ts | 34 ++-- .../basic/tests/update_rules_bulk.ts | 56 +++--- .../security_and_spaces/tests/update_rules.ts | 31 ++-- .../tests/update_rules_bulk.ts | 56 +++--- .../detection_engine_api_integration/utils.ts | 64 +++++-- 65 files changed, 867 insertions(+), 797 deletions(-) rename x-pack/plugins/lists/{common => server/services/items}/test_readable.mock.ts (100%) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.mocks.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/response/find_rules_schema.mocks.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_bulk_schema.mocks.ts rename x-pack/plugins/security_solution/common/detection_engine/schemas/response/{__mocks__/utils.ts => rules_schema.mocks.ts} (65%) diff --git a/.eslintrc.js b/.eslintrc.js index 3cac46e7d2605..b5f8d106392d5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -589,8 +589,11 @@ module.exports = { * Security Solution overrides */ { - // front end typescript and javascript files only - files: ['x-pack/plugins/security_solution/public/**/*.{js,ts,tsx}'], + // front end and common typescript and javascript files only + files: [ + 'x-pack/plugins/security_solution/public/**/*.{js,ts,tsx}', + 'x-pack/plugins/security_solution/common/**/*.{js,ts,tsx}', + ], rules: { 'import/no-nodejs-modules': 'error', 'no-restricted-imports': [ @@ -766,6 +769,23 @@ module.exports = { /** * Lists overrides */ + { + // front end and common typescript and javascript files only + files: [ + 'x-pack/plugins/lists/public/**/*.{js,ts,tsx}', + 'x-pack/plugins/lists/common/**/*.{js,ts,tsx}', + ], + rules: { + 'import/no-nodejs-modules': 'error', + 'no-restricted-imports': [ + 'error', + { + // prevents UI code from importing server side code and then webpack including it when doing builds + patterns: ['**/server/*'], + }, + ], + }, + }, { // typescript and javascript for front and back end files: ['x-pack/plugins/lists/**/*.{js,ts,tsx}'], diff --git a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts index 0a5e861d84483..ee6a2aa0b339a 100644 --- a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts @@ -6,9 +6,6 @@ /* eslint-disable @typescript-eslint/camelcase */ -// TODO: You cannot import a stream from common into the front end code! CHANGE THIS -import { Readable } from 'stream'; - import * as t from 'io-ts'; import { file } from '../common/schemas'; @@ -20,17 +17,3 @@ export const importListItemSchema = t.exact( ); export type ImportListItemSchema = t.TypeOf; - -// TODO: You cannot import a stream from common into the front end code! CHANGE THIS -export interface HapiReadableStream extends Readable { - hapi: { - filename: string; - }; -} - -/** - * Special interface since we are streaming in a file through a reader - */ -export interface ImportListItemHapiFileSchema { - file: HapiReadableStream; -} diff --git a/x-pack/plugins/lists/server/routes/import_list_item_route.ts b/x-pack/plugins/lists/server/routes/import_list_item_route.ts index 36cf9bac373eb..c951c9b337131 100644 --- a/x-pack/plugins/lists/server/routes/import_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/import_list_item_route.ts @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Readable } from 'stream'; + import { IRouter } from 'kibana/server'; import { LIST_ITEM_URL } from '../../common/constants'; @@ -13,15 +15,23 @@ import { transformError, validate, } from '../siem_server_deps'; -import { - ImportListItemHapiFileSchema, - importListItemQuerySchema, - importListItemSchema, - listSchema, -} from '../../common/schemas'; +import { importListItemQuerySchema, importListItemSchema, listSchema } from '../../common/schemas'; import { getListClient } from '.'; +export interface HapiReadableStream extends Readable { + hapi: { + filename: string; + }; +} + +/** + * Special interface since we are streaming in a file through a reader + */ +export interface ImportListItemHapiFileSchema { + file: HapiReadableStream; +} + export const importListItemRoute = (router: IRouter): void => { router.post( { diff --git a/x-pack/plugins/lists/server/services/items/buffer_lines.test.ts b/x-pack/plugins/lists/server/services/items/buffer_lines.test.ts index 9413bf9a3d84e..a283269271bd0 100644 --- a/x-pack/plugins/lists/server/services/items/buffer_lines.test.ts +++ b/x-pack/plugins/lists/server/services/items/buffer_lines.test.ts @@ -4,9 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TestReadable } from '../../../common/test_readable.mock'; - import { BufferLines } from './buffer_lines'; +import { TestReadable } from './test_readable.mock'; describe('buffer_lines', () => { test('it can read a single line', (done) => { diff --git a/x-pack/plugins/lists/common/test_readable.mock.ts b/x-pack/plugins/lists/server/services/items/test_readable.mock.ts similarity index 100% rename from x-pack/plugins/lists/common/test_readable.mock.ts rename to x-pack/plugins/lists/server/services/items/test_readable.mock.ts diff --git a/x-pack/plugins/lists/server/services/items/write_lines_to_bulk_list_items.mock.ts b/x-pack/plugins/lists/server/services/items/write_lines_to_bulk_list_items.mock.ts index 3d9902e1d43dd..ccacdfbb5ff65 100644 --- a/x-pack/plugins/lists/server/services/items/write_lines_to_bulk_list_items.mock.ts +++ b/x-pack/plugins/lists/server/services/items/write_lines_to_bulk_list_items.mock.ts @@ -3,11 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { TestReadable } from '../../../common/test_readable.mock'; import { getCallClusterMock } from '../../../common/get_call_cluster.mock'; import { ImportListItemsToStreamOptions, WriteBufferToItemsOptions } from '../items'; import { LIST_ID, LIST_ITEM_INDEX, META, TYPE, USER } from '../../../common/constants.mock'; +import { TestReadable } from './test_readable.mock'; + export const getImportListItemsToStreamOptionsMock = (): ImportListItemsToStreamOptions => ({ callCluster: getCallClusterMock(), listId: LIST_ID, diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts index 7db8e57421d02..b0b9d70a76c32 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts @@ -143,6 +143,9 @@ export type Throttle = t.TypeOf; export const throttleOrNull = t.union([throttle, t.null]); export type ThrottleOrNull = t.TypeOf; +export const throttleOrNullOrUndefined = t.union([throttle, t.null, t.undefined]); +export type ThrottleOrUndefinedOrNull = t.TypeOf; + export const anomaly_threshold = PositiveInteger; export type AnomalyThreshold = t.TypeOf; @@ -156,11 +159,8 @@ export const machineLearningJobIdOrUndefined = t.union([machine_learning_job_id, export type MachineLearningJobIdOrUndefined = t.TypeOf; /** - * Note that this is a plain unknown object because we allow the UI - * to send us extra additional information as "meta" which can be anything. - * - * TODO: Strip away extra information and possibly even "freeze" this object - * so we have tighter control over 3rd party data structures. + * Note that this is a non-exact io-ts type as we allow extra meta information + * to be added to the meta object */ export const meta = t.object; export type Meta = t.TypeOf; @@ -192,8 +192,10 @@ export const severityOrUndefined = t.union([severity, t.undefined]); export type SeverityOrUndefined = t.TypeOf; export const status = t.keyof({ open: null, closed: null }); +export type Status = t.TypeOf; export const job_status = t.keyof({ succeeded: null, failed: null, 'going to run': null }); +export type JobStatus = t.TypeOf; // TODO: Create a regular expression type or custom date math part type here export const to = t.string; @@ -307,10 +309,20 @@ export const versionOrUndefined = t.union([version, t.undefined]); export type VersionOrUndefined = t.TypeOf; export const last_success_at = IsoDateString; +export type LastSuccessAt = t.TypeOf; + export const last_success_message = t.string; +export type LastSuccessMessage = t.TypeOf; + export const last_failure_at = IsoDateString; +export type LastFailureAt = t.TypeOf; + export const last_failure_message = t.string; +export type LastFailureMessage = t.TypeOf; + export const status_date = IsoDateString; +export type StatusDate = t.TypeOf; + export const rules_installed = PositiveInteger; export const rules_updated = PositiveInteger; export const status_code = PositiveInteger; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts index a9ab6f8959e24..2847bd32df514 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts @@ -7,19 +7,30 @@ import { CreateRulesSchema, CreateRulesSchemaDecoded } from './create_rules_schema'; import { DEFAULT_MAX_SIGNALS } from '../../../constants'; -export const getCreateRulesSchemaMock = (): CreateRulesSchema => ({ - description: 'some description', +export const getCreateRulesSchemaMock = (ruleId = 'rule-1'): CreateRulesSchema => ({ + description: 'Detecting root and admin users', name: 'Query with a rule id', query: 'user.name: root or user.name: admin', severity: 'high', type: 'query', risk_score: 55, language: 'kuery', - rule_id: 'rule-1', + rule_id: ruleId, }); +export const getCreateMlRulesSchemaMock = (ruleId = 'rule-1') => { + const { query, language, index, ...mlParams } = getCreateRulesSchemaMock(ruleId); + + return { + ...mlParams, + type: 'machine_learning', + anomaly_threshold: 58, + machine_learning_job_id: 'typical-ml-job-id', + }; +}; + export const getCreateRulesSchemaDecodedMock = (): CreateRulesSchemaDecoded => ({ - description: 'some description', + description: 'Detecting root and admin users', name: 'Query with a rule id', query: 'user.name: root or user.name: admin', severity: 'high', diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts index 92fab202c9ddc..aaeb90ffc5bcf 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts @@ -7,7 +7,7 @@ import { ImportRulesSchema, ImportRulesSchemaDecoded } from './import_rules_schema'; import { DEFAULT_MAX_SIGNALS } from '../../../constants'; -export const getImportRulesSchemaMock = (): ImportRulesSchema => ({ +export const getImportRulesSchemaMock = (ruleId = 'rule-1'): ImportRulesSchema => ({ description: 'some description', name: 'Query with a rule id', query: 'user.name: root or user.name: admin', @@ -15,7 +15,19 @@ export const getImportRulesSchemaMock = (): ImportRulesSchema => ({ type: 'query', risk_score: 55, language: 'kuery', - rule_id: 'rule-1', + rule_id: ruleId, +}); + +export const getImportRulesWithIdSchemaMock = (ruleId = 'rule-1'): ImportRulesSchema => ({ + id: '6afb8ce1-ea94-4790-8653-fd0b021d2113', + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: ruleId, }); export const getImportRulesSchemaDecodedMock = (): ImportRulesSchemaDecoded => ({ @@ -42,3 +54,22 @@ export const getImportRulesSchemaDecodedMock = (): ImportRulesSchemaDecoded => ( rule_id: 'rule-1', immutable: false, }); + +/** + * Given an array of rules, builds an NDJSON string of rules + * as we might import/export + * @param rules Array of rule objects with which to generate rule JSON + */ +export const rulesToNdJsonString = (rules: ImportRulesSchema[]) => { + return rules.map((rule) => JSON.stringify(rule)).join('\r\n'); +}; + +/** + * Given an array of rule IDs, builds an NDJSON string of rules + * as we might import + * @param ruleIds Array of ruleIds with which to generate rule JSON + */ +export const ruleIdsToNdJsonString = (ruleIds: string[]) => { + const rules = ruleIds.map((ruleId) => getImportRulesSchemaMock(ruleId)); + return rulesToNdJsonString(rules); +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.mocks.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.mocks.ts new file mode 100644 index 0000000000000..52b2de316ddd5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.mocks.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ErrorSchema } from './error_schema'; + +export const getErrorSchemaMock = ( + id: string = '819eded6-e9c8-445b-a647-519aea39e063' +): ErrorSchema => ({ + id, + error: { + status_code: 404, + message: 'id: "819eded6-e9c8-445b-a647-519aea39e063" not found', + }, +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.test.ts index 2a4d75522d010..d9e16105351bd 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.test.ts @@ -7,15 +7,15 @@ import { left } from 'fp-ts/lib/Either'; import { pipe } from 'fp-ts/lib/pipeable'; -import { getErrorPayload } from './__mocks__/utils'; import { errorSchema, ErrorSchema } from './error_schema'; import { exactCheck } from '../../../exact_check'; import { foldLeftRight, getPaths } from '../../../test_utils'; +import { getErrorSchemaMock } from './error_schema.mocks'; describe('error_schema', () => { test('it should validate an error with a UUID given for id', () => { - const error = getErrorPayload(); - const decoded = errorSchema.decode(getErrorPayload()); + const error = getErrorSchemaMock(); + const decoded = errorSchema.decode(getErrorSchemaMock()); const checked = exactCheck(error, decoded); const message = pipe(checked, foldLeftRight); @@ -24,7 +24,7 @@ describe('error_schema', () => { }); test('it should validate an error with a plain string given for id since sometimes we echo the user id which might not be a UUID back out to them', () => { - const error = getErrorPayload('fake id'); + const error = getErrorSchemaMock('fake id'); const decoded = errorSchema.decode(error); const checked = exactCheck(error, decoded); const message = pipe(checked, foldLeftRight); @@ -35,7 +35,7 @@ describe('error_schema', () => { test('it should NOT validate an error when it has extra data next to a valid payload element', () => { type InvalidError = ErrorSchema & { invalid_extra_data?: string }; - const error: InvalidError = getErrorPayload(); + const error: InvalidError = getErrorSchemaMock(); error.invalid_extra_data = 'invalid_extra_data'; const decoded = errorSchema.decode(error); const checked = exactCheck(error, decoded); @@ -46,7 +46,7 @@ describe('error_schema', () => { }); test('it should NOT validate an error when it has required elements deleted from it', () => { - const error = getErrorPayload(); + const error = getErrorSchemaMock(); delete error.error; const decoded = errorSchema.decode(error); const checked = exactCheck(error, decoded); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/find_rules_schema.mocks.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/find_rules_schema.mocks.ts new file mode 100644 index 0000000000000..28c3eea761b40 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/find_rules_schema.mocks.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FindRulesSchema } from './find_rules_schema'; +import { getRulesSchemaMock } from './rules_schema.mocks'; + +export const getFindRulesSchemaMock = (): FindRulesSchema => ({ + page: 1, + perPage: 1, + total: 1, + data: [getRulesSchemaMock()], +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/find_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/find_rules_schema.test.ts index 51163c3d76ed6..fc1ab9b87795d 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/find_rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/find_rules_schema.test.ts @@ -6,31 +6,32 @@ import { findRulesSchema, FindRulesSchema } from './find_rules_schema'; import { pipe } from 'fp-ts/lib/pipeable'; -import { getFindResponseSingle, getBaseResponsePayload } from './__mocks__/utils'; import { left } from 'fp-ts/lib/Either'; import { RulesSchema } from './rules_schema'; import { exactCheck } from '../../../exact_check'; import { foldLeftRight, getPaths } from '../../../test_utils'; +import { getRulesSchemaMock } from './rules_schema.mocks'; +import { getFindRulesSchemaMock } from './find_rules_schema.mocks'; describe('find_rules_schema', () => { test('it should validate a typical single find rules response', () => { - const payload = getFindResponseSingle(); + const payload = getFindRulesSchemaMock(); const decoded = findRulesSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); - expect(message.schema).toEqual(getFindResponseSingle()); + expect(message.schema).toEqual(getFindRulesSchemaMock()); }); test('it should validate an empty find rules response', () => { - const payload = getFindResponseSingle(); + const payload = getFindRulesSchemaMock(); payload.data = []; const decoded = findRulesSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getFindResponseSingle(); + const expected = getFindRulesSchemaMock(); expected.data = []; expect(getPaths(left(message.errors))).toEqual([]); @@ -38,7 +39,7 @@ describe('find_rules_schema', () => { }); test('it should invalidate a typical single find rules response if it is has an extra property on it', () => { - const payload: FindRulesSchema & { invalid_data?: 'invalid' } = getFindResponseSingle(); + const payload: FindRulesSchema & { invalid_data?: 'invalid' } = getFindRulesSchemaMock(); payload.invalid_data = 'invalid'; const decoded = findRulesSchema.decode(payload); const checked = exactCheck(payload, decoded); @@ -49,8 +50,8 @@ describe('find_rules_schema', () => { }); test('it should invalidate a typical single find rules response if the rules are invalid within it', () => { - const payload = getFindResponseSingle(); - const invalidRule: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const payload = getFindRulesSchemaMock(); + const invalidRule: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); invalidRule.invalid_extra_data = 'invalid_data'; payload.data = [invalidRule]; const decoded = findRulesSchema.decode(payload); @@ -62,8 +63,8 @@ describe('find_rules_schema', () => { }); test('it should invalidate a typical single find rules response if the rule is missing a required field such as name', () => { - const payload = getFindResponseSingle(); - const invalidRule = getBaseResponsePayload(); + const payload = getFindRulesSchemaMock(); + const invalidRule = getRulesSchemaMock(); delete invalidRule.name; payload.data = [invalidRule]; const decoded = findRulesSchema.decode(payload); @@ -77,7 +78,7 @@ describe('find_rules_schema', () => { }); test('it should invalidate a typical single find rules response if it is missing perPage', () => { - const payload = getFindResponseSingle(); + const payload = getFindRulesSchemaMock(); delete payload.perPage; const decoded = findRulesSchema.decode(payload); const checked = exactCheck(payload, decoded); @@ -90,7 +91,7 @@ describe('find_rules_schema', () => { }); test('it should invalidate a typical single find rules response if it has a negative perPage number', () => { - const payload = getFindResponseSingle(); + const payload = getFindRulesSchemaMock(); payload.perPage = -1; const decoded = findRulesSchema.decode(payload); const checked = exactCheck(payload, decoded); @@ -101,7 +102,7 @@ describe('find_rules_schema', () => { }); test('it should invalidate a typical single find rules response if it has a negative page number', () => { - const payload = getFindResponseSingle(); + const payload = getFindRulesSchemaMock(); payload.page = -1; const decoded = findRulesSchema.decode(payload); const checked = exactCheck(payload, decoded); @@ -112,7 +113,7 @@ describe('find_rules_schema', () => { }); test('it should invalidate a typical single find rules response if it has a negative total', () => { - const payload = getFindResponseSingle(); + const payload = getFindRulesSchemaMock(); payload.total = -1; const decoded = findRulesSchema.decode(payload); const checked = exactCheck(payload, decoded); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_bulk_schema.mocks.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_bulk_schema.mocks.ts new file mode 100644 index 0000000000000..b55809e6b27ea --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_bulk_schema.mocks.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RulesBulkSchema } from './rules_bulk_schema'; +import { getRulesSchemaMock } from './rules_schema.mocks'; + +export const getRulesBulkSchemaMock = (): RulesBulkSchema => [getRulesSchemaMock()]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_bulk_schema.test.ts index 04cf012f36dba..a169ac3deb9b9 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_bulk_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_bulk_schema.test.ts @@ -7,46 +7,48 @@ import { left } from 'fp-ts/lib/Either'; import { pipe } from 'fp-ts/lib/pipeable'; -import { getBaseResponsePayload, getErrorPayload } from './__mocks__/utils'; import { RulesBulkSchema, rulesBulkSchema } from './rules_bulk_schema'; import { RulesSchema } from './rules_schema'; import { ErrorSchema } from './error_schema'; import { exactCheck } from '../../../exact_check'; import { foldLeftRight, getPaths } from '../../../test_utils'; +import { getRulesSchemaMock } from './rules_schema.mocks'; +import { getErrorSchemaMock } from './error_schema.mocks'; + describe('prepackaged_rule_schema', () => { test('it should validate a regular message and and error together with a uuid', () => { - const payload: RulesBulkSchema = [getBaseResponsePayload(), getErrorPayload()]; + const payload: RulesBulkSchema = [getRulesSchemaMock(), getErrorSchemaMock()]; const decoded = rulesBulkSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); - expect(message.schema).toEqual([getBaseResponsePayload(), getErrorPayload()]); + expect(message.schema).toEqual([getRulesSchemaMock(), getErrorSchemaMock()]); }); test('it should validate a regular message and and error together when the error has a non UUID', () => { - const payload: RulesBulkSchema = [getBaseResponsePayload(), getErrorPayload('fake id')]; + const payload: RulesBulkSchema = [getRulesSchemaMock(), getErrorSchemaMock('fake id')]; const decoded = rulesBulkSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); - expect(message.schema).toEqual([getBaseResponsePayload(), getErrorPayload('fake id')]); + expect(message.schema).toEqual([getRulesSchemaMock(), getErrorSchemaMock('fake id')]); }); test('it should validate an error', () => { - const payload: RulesBulkSchema = [getErrorPayload('fake id')]; + const payload: RulesBulkSchema = [getErrorSchemaMock('fake id')]; const decoded = rulesBulkSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); - expect(message.schema).toEqual([getErrorPayload('fake id')]); + expect(message.schema).toEqual([getErrorSchemaMock('fake id')]); }); test('it should NOT validate a rule with a deleted value', () => { - const rule = getBaseResponsePayload(); + const rule = getRulesSchemaMock(); delete rule.name; const payload: RulesBulkSchema = [rule]; const decoded = rulesBulkSchema.decode(payload); @@ -61,7 +63,7 @@ describe('prepackaged_rule_schema', () => { }); test('it should NOT validate an invalid error message with a deleted value', () => { - const error = getErrorPayload('fake id'); + const error = getErrorSchemaMock('fake id'); delete error.error; const payload: RulesBulkSchema = [error]; const decoded = rulesBulkSchema.decode(payload); @@ -76,7 +78,7 @@ describe('prepackaged_rule_schema', () => { }); test('it should NOT validate a type of "query" when it has extra data', () => { - const rule: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const rule: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); rule.invalid_extra_data = 'invalid_extra_data'; const payload: RulesBulkSchema = [rule]; const decoded = rulesBulkSchema.decode(payload); @@ -88,9 +90,9 @@ describe('prepackaged_rule_schema', () => { }); test('it should NOT validate a type of "query" when it has extra data next to a valid error', () => { - const rule: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const rule: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); rule.invalid_extra_data = 'invalid_extra_data'; - const payload: RulesBulkSchema = [getErrorPayload(), rule]; + const payload: RulesBulkSchema = [getErrorSchemaMock(), rule]; const decoded = rulesBulkSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); @@ -101,7 +103,7 @@ describe('prepackaged_rule_schema', () => { test('it should NOT validate an error when it has extra data', () => { type InvalidError = ErrorSchema & { invalid_extra_data?: string }; - const error: InvalidError = getErrorPayload(); + const error: InvalidError = getErrorSchemaMock(); error.invalid_extra_data = 'invalid'; const payload: RulesBulkSchema = [error]; const decoded = rulesBulkSchema.decode(payload); @@ -114,9 +116,9 @@ describe('prepackaged_rule_schema', () => { test('it should NOT validate an error when it has extra data next to a valid payload element', () => { type InvalidError = ErrorSchema & { invalid_extra_data?: string }; - const error: InvalidError = getErrorPayload(); + const error: InvalidError = getErrorSchemaMock(); error.invalid_extra_data = 'invalid'; - const payload: RulesBulkSchema = [getBaseResponsePayload(), error]; + const payload: RulesBulkSchema = [getRulesSchemaMock(), error]; const decoded = rulesBulkSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/__mocks__/utils.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.mocks.ts similarity index 65% rename from x-pack/plugins/security_solution/common/detection_engine/schemas/response/__mocks__/utils.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.mocks.ts index fef6bcf42e49f..ecbf0321cdc67 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/__mocks__/utils.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.mocks.ts @@ -4,14 +4,37 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RulesSchema } from '../rules_schema'; -import { RulesBulkSchema } from '../rules_bulk_schema'; -import { ErrorSchema } from '../error_schema'; -import { FindRulesSchema } from '../find_rules_schema'; +import { RulesSchema } from './rules_schema'; export const ANCHOR_DATE = '2020-02-20T03:57:54.037Z'; -export const getBaseResponsePayload = (anchorDate: string = ANCHOR_DATE): RulesSchema => ({ +export const getPartialRulesSchemaMock = (): Partial => ({ + created_by: 'elastic', + description: 'Detecting root and admin users', + enabled: true, + false_positives: [], + from: 'now-6m', + id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + immutable: false, + index: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], + interval: '5m', + risk_score: 50, + rule_id: 'rule-1', + language: 'kuery', + max_signals: 100, + name: 'Detect Root/Admin Users', + output_index: '.siem-signals', + query: 'user.name: root or user.name: admin', + references: ['http://www.example.com', 'https://ww.example.com'], + severity: 'high', + updated_by: 'elastic', + tags: ['some fake tag 1', 'some fake tag 2'], + to: 'now', + type: 'query', + note: '', +}); + +export const getRulesSchemaMock = (anchorDate: string = ANCHOR_DATE): RulesSchema => ({ id: '7a7065d7-6e8b-4aae-8d20-c93613dec9f9', created_at: new Date(anchorDate).toISOString(), updated_at: new Date(anchorDate).toISOString(), @@ -75,10 +98,8 @@ export const getBaseResponsePayload = (anchorDate: string = ANCHOR_DATE): RulesS ], }); -export const getRulesBulkPayload = (): RulesBulkSchema => [getBaseResponsePayload()]; - -export const getMlRuleResponsePayload = (anchorDate: string = ANCHOR_DATE): RulesSchema => { - const basePayload = getBaseResponsePayload(anchorDate); +export const getRulesMlSchemaMock = (anchorDate: string = ANCHOR_DATE): RulesSchema => { + const basePayload = getRulesSchemaMock(anchorDate); const { filters, index, query, language, ...rest } = basePayload; return { @@ -88,20 +109,3 @@ export const getMlRuleResponsePayload = (anchorDate: string = ANCHOR_DATE): Rule machine_learning_job_id: 'some_machine_learning_job_id', }; }; - -export const getErrorPayload = ( - id: string = '819eded6-e9c8-445b-a647-519aea39e063' -): ErrorSchema => ({ - id, - error: { - status_code: 404, - message: 'id: "819eded6-e9c8-445b-a647-519aea39e063" not found', - }, -}); - -export const getFindResponseSingle = (): FindRulesSchema => ({ - page: 1, - perPage: 1, - total: 1, - data: [getBaseResponsePayload()], -}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.test.ts index 8ed9c30507f4f..90aef656db369 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.test.ts @@ -18,28 +18,28 @@ import { addTimelineTitle, addMlFields, } from './rules_schema'; -import { getBaseResponsePayload, getMlRuleResponsePayload } from './__mocks__/utils'; import { exactCheck } from '../../../exact_check'; import { foldLeftRight, getPaths } from '../../../test_utils'; import { TypeAndTimelineOnly } from './type_timeline_only_schema'; +import { getRulesSchemaMock, getRulesMlSchemaMock } from './rules_schema.mocks'; export const ANCHOR_DATE = '2020-02-20T03:57:54.037Z'; describe('rules_schema', () => { test('it should validate a type of "query" without anything extra', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); const decoded = rulesSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getBaseResponsePayload(); + const expected = getRulesSchemaMock(); expect(getPaths(left(message.errors))).toEqual([]); expect(message.schema).toEqual(expected); }); test('it should NOT validate a type of "query" when it has extra data', () => { - const payload: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const payload: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); payload.invalid_extra_data = 'invalid_extra_data'; const decoded = rulesSchema.decode(payload); @@ -51,7 +51,7 @@ describe('rules_schema', () => { }); test('it should NOT validate invalid_data for the type', () => { - const payload: Omit & { type: string } = getBaseResponsePayload(); + const payload: Omit & { type: string } = getRulesSchemaMock(); payload.type = 'invalid_data'; const decoded = rulesSchema.decode(payload); @@ -65,7 +65,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "query" with a saved_id together', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.type = 'query'; payload.saved_id = 'save id 123'; @@ -78,14 +78,14 @@ describe('rules_schema', () => { }); test('it should validate a type of "saved_query" with a "saved_id" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.type = 'saved_query'; payload.saved_id = 'save id 123'; const decoded = rulesSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getBaseResponsePayload(); + const expected = getRulesSchemaMock(); expected.type = 'saved_query'; expected.saved_id = 'save id 123'; @@ -95,7 +95,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" without a "saved_id" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.type = 'saved_query'; delete payload.saved_id; @@ -110,7 +110,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" when it has extra data', () => { - const payload: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const payload: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); payload.type = 'saved_query'; payload.saved_id = 'save id 123'; payload.invalid_extra_data = 'invalid_extra_data'; @@ -124,14 +124,14 @@ describe('rules_schema', () => { }); test('it should validate a type of "timeline_id" if there is a "timeline_title" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.timeline_id = 'some timeline id'; payload.timeline_title = 'some timeline title'; const decoded = rulesSchema.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getBaseResponsePayload(); + const expected = getRulesSchemaMock(); expected.timeline_id = 'some timeline id'; expected.timeline_title = 'some timeline title'; @@ -140,7 +140,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "timeline_id" if there is "timeline_title" dependent when it has extra invalid data', () => { - const payload: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const payload: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); payload.timeline_id = 'some timeline id'; payload.timeline_title = 'some timeline title'; payload.invalid_extra_data = 'invalid_extra_data'; @@ -154,7 +154,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "timeline_id" if there is NOT a "timeline_title" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.timeline_id = 'some timeline id'; const decoded = rulesSchema.decode(payload); @@ -168,7 +168,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "timeline_title" if there is NOT a "timeline_id" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.timeline_title = 'some timeline title'; const decoded = rulesSchema.decode(payload); @@ -180,7 +180,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" with a "saved_id" dependent and a "timeline_title" but there is NOT a "timeline_id"', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.saved_id = 'some saved id'; payload.type = 'saved_query'; payload.timeline_title = 'some timeline title'; @@ -194,7 +194,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" with a "saved_id" dependent and a "timeline_id" but there is NOT a "timeline_title"', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.saved_id = 'some saved id'; payload.type = 'saved_query'; payload.timeline_id = 'some timeline id'; @@ -211,19 +211,19 @@ describe('rules_schema', () => { describe('checkTypeDependents', () => { test('it should validate a type of "query" without anything extra', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); const decoded = checkTypeDependents(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getBaseResponsePayload(); + const expected = getRulesSchemaMock(); expect(getPaths(left(message.errors))).toEqual([]); expect(message.schema).toEqual(expected); }); test('it should NOT validate invalid_data for the type', () => { - const payload: Omit & { type: string } = getBaseResponsePayload(); + const payload: Omit & { type: string } = getRulesSchemaMock(); payload.type = 'invalid_data'; const decoded = checkTypeDependents(payload); @@ -237,7 +237,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "query" with a saved_id together', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.type = 'query'; payload.saved_id = 'save id 123'; @@ -250,14 +250,14 @@ describe('rules_schema', () => { }); test('it should validate a type of "saved_query" with a "saved_id" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.type = 'saved_query'; payload.saved_id = 'save id 123'; const decoded = checkTypeDependents(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getBaseResponsePayload(); + const expected = getRulesSchemaMock(); expected.type = 'saved_query'; expected.saved_id = 'save id 123'; @@ -267,7 +267,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" without a "saved_id" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.type = 'saved_query'; delete payload.saved_id; @@ -282,7 +282,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" when it has extra data', () => { - const payload: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const payload: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); payload.type = 'saved_query'; payload.saved_id = 'save id 123'; payload.invalid_extra_data = 'invalid_extra_data'; @@ -296,14 +296,14 @@ describe('rules_schema', () => { }); test('it should validate a type of "timeline_id" if there is a "timeline_title" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.timeline_id = 'some timeline id'; payload.timeline_title = 'some timeline title'; const decoded = checkTypeDependents(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getBaseResponsePayload(); + const expected = getRulesSchemaMock(); expected.timeline_id = 'some timeline id'; expected.timeline_title = 'some timeline title'; @@ -312,7 +312,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "timeline_id" if there is "timeline_title" dependent when it has extra invalid data', () => { - const payload: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const payload: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); payload.timeline_id = 'some timeline id'; payload.timeline_title = 'some timeline title'; payload.invalid_extra_data = 'invalid_extra_data'; @@ -326,7 +326,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "timeline_id" if there is NOT a "timeline_title" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.timeline_id = 'some timeline id'; const decoded = checkTypeDependents(payload); @@ -340,7 +340,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "timeline_title" if there is NOT a "timeline_id" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.timeline_title = 'some timeline title'; const decoded = checkTypeDependents(payload); @@ -352,7 +352,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" with a "saved_id" dependent and a "timeline_title" but there is NOT a "timeline_id"', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.saved_id = 'some saved id'; payload.type = 'saved_query'; payload.timeline_title = 'some timeline title'; @@ -366,7 +366,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" with a "saved_id" dependent and a "timeline_id" but there is NOT a "timeline_title"', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.saved_id = 'some saved id'; payload.type = 'saved_query'; payload.timeline_id = 'some timeline id'; @@ -384,20 +384,20 @@ describe('rules_schema', () => { describe('getDependents', () => { test('it should validate a type of "query" without anything extra', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); const dependents = getDependents(payload); const decoded = dependents.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getBaseResponsePayload(); + const expected = getRulesSchemaMock(); expect(getPaths(left(message.errors))).toEqual([]); expect(message.schema).toEqual(expected); }); test('it should NOT validate invalid_data for the type', () => { - const payload: Omit & { type: string } = getBaseResponsePayload(); + const payload: Omit & { type: string } = getRulesSchemaMock(); payload.type = 'invalid_data'; const dependents = getDependents((payload as unknown) as TypeAndTimelineOnly); @@ -412,7 +412,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "query" with a saved_id together', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.type = 'query'; payload.saved_id = 'save id 123'; @@ -426,7 +426,7 @@ describe('rules_schema', () => { }); test('it should validate a type of "saved_query" with a "saved_id" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.type = 'saved_query'; payload.saved_id = 'save id 123'; @@ -434,7 +434,7 @@ describe('rules_schema', () => { const decoded = dependents.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getBaseResponsePayload(); + const expected = getRulesSchemaMock(); expected.type = 'saved_query'; expected.saved_id = 'save id 123'; @@ -444,7 +444,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" without a "saved_id" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.type = 'saved_query'; delete payload.saved_id; @@ -460,7 +460,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" when it has extra data', () => { - const payload: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const payload: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); payload.type = 'saved_query'; payload.saved_id = 'save id 123'; payload.invalid_extra_data = 'invalid_extra_data'; @@ -475,7 +475,7 @@ describe('rules_schema', () => { }); test('it should validate a type of "timeline_id" if there is a "timeline_title" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.timeline_id = 'some timeline id'; payload.timeline_title = 'some timeline title'; @@ -483,7 +483,7 @@ describe('rules_schema', () => { const decoded = dependents.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getBaseResponsePayload(); + const expected = getRulesSchemaMock(); expected.timeline_id = 'some timeline id'; expected.timeline_title = 'some timeline title'; @@ -492,7 +492,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "timeline_id" if there is "timeline_title" dependent when it has extra invalid data', () => { - const payload: RulesSchema & { invalid_extra_data?: string } = getBaseResponsePayload(); + const payload: RulesSchema & { invalid_extra_data?: string } = getRulesSchemaMock(); payload.timeline_id = 'some timeline id'; payload.timeline_title = 'some timeline title'; payload.invalid_extra_data = 'invalid_extra_data'; @@ -507,7 +507,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "timeline_id" if there is NOT a "timeline_title" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.timeline_id = 'some timeline id'; const dependents = getDependents(payload); @@ -522,7 +522,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "timeline_title" if there is NOT a "timeline_id" dependent', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.timeline_title = 'some timeline title'; const dependents = getDependents(payload); @@ -535,7 +535,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" with a "saved_id" dependent and a "timeline_title" but there is NOT a "timeline_id"', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.saved_id = 'some saved id'; payload.type = 'saved_query'; payload.timeline_title = 'some timeline title'; @@ -549,7 +549,7 @@ describe('rules_schema', () => { }); test('it should NOT validate a type of "saved_query" with a "saved_id" dependent and a "timeline_id" but there is NOT a "timeline_title"', () => { - const payload = getBaseResponsePayload(); + const payload = getRulesSchemaMock(); payload.saved_id = 'some saved id'; payload.type = 'saved_query'; payload.timeline_id = 'some timeline id'; @@ -566,13 +566,13 @@ describe('rules_schema', () => { }); test('it validates an ML rule response', () => { - const payload = getMlRuleResponsePayload(); + const payload = getRulesMlSchemaMock(); const dependents = getDependents(payload); const decoded = dependents.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); - const expected = getMlRuleResponsePayload(); + const expected = getRulesMlSchemaMock(); expect(getPaths(left(message.errors))).toEqual([]); expect(message.schema).toEqual(expected); @@ -580,8 +580,8 @@ describe('rules_schema', () => { test('it rejects a response with both ML and query properties', () => { const payload = { - ...getBaseResponsePayload(), - ...getMlRuleResponsePayload(), + ...getRulesSchemaMock(), + ...getRulesMlSchemaMock(), }; const dependents = getDependents(payload); diff --git a/x-pack/plugins/security_solution/common/exact_check.ts b/x-pack/plugins/security_solution/common/exact_check.ts index 48afc35b56ba1..041d0fb324df7 100644 --- a/x-pack/plugins/security_solution/common/exact_check.ts +++ b/x-pack/plugins/security_solution/common/exact_check.ts @@ -47,7 +47,7 @@ export const exactCheck = ( return pipe(decoded, fold(onLeft, onRight)); }; -export const findDifferencesRecursive = (original: T, decodedValue: T): string[] => { +export const findDifferencesRecursive = (original: unknown, decodedValue: T): string[] => { if (decodedValue === null && original === null) { // both the decodedValue and the original are null which indicates that they are equal // so do not report differences diff --git a/x-pack/plugins/security_solution/cypress/test_files/expected_rules_export.ndjson b/x-pack/plugins/security_solution/cypress/test_files/expected_rules_export.ndjson index c2e779feeca77..dcbfa9d0dd16e 100644 --- a/x-pack/plugins/security_solution/cypress/test_files/expected_rules_export.ndjson +++ b/x-pack/plugins/security_solution/cypress/test_files/expected_rules_export.ndjson @@ -1,2 +1,2 @@ -{"actions":[],"created_at":"2020-03-26T10:09:07.569Z","updated_at":"2020-03-26T10:09:08.021Z","created_by":"elastic","description":"Rule 1","enabled":true,"false_positives":[],"filters":[],"from":"now-360s","id":"49db5bd1-bdd5-4821-be26-bb70a815dedb","immutable":false,"index":["apm-*-transaction*","auditbeat-*","endgame-*","filebeat-*","packetbeat-*","winlogbeat-*"],"interval":"5m","rule_id":"0cea4194-03f2-4072-b281-d31b72221d9d","language":"kuery","output_index":".siem-signals-default","max_signals":100,"risk_score":50,"name":"Rule 1","query":"host.name:*","references":[],"meta":{"from":"1m","throttle":"no_actions"},"severity":"low","updated_by":"elastic","tags":["rule1"],"to":"now","type":"query","threat":[],"throttle":"no_actions","version":1} +{"actions":[],"created_at":"2020-03-26T10:09:07.569Z","updated_at":"2020-03-26T10:09:08.021Z","created_by":"elastic","description":"Rule 1","enabled":true,"false_positives":[],"filters":[],"from":"now-360s","id":"49db5bd1-bdd5-4821-be26-bb70a815dedb","immutable":false,"index":["apm-*-transaction*","auditbeat-*","endgame-*","filebeat-*","packetbeat-*","winlogbeat-*"],"interval":"5m","rule_id":"0cea4194-03f2-4072-b281-d31b72221d9d","language":"kuery","output_index":".siem-signals-default","max_signals":100,"risk_score":50,"name":"Rule 1","query":"host.name:*","references":[],"meta":{"from":"1m","throttle":"no_actions"},"severity":"low","updated_by":"elastic","tags":["rule1"],"to":"now","type":"query","threat":[],"throttle":"no_actions","version":1,"exceptions_list":[]} {"exported_count":1,"missing_rules":[],"missing_rules_count":0} diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/rules_notification_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/rules_notification_alert_type.ts index 5a2a950f21bcf..cf5a6aa01f29e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/rules_notification_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/rules_notification_alert_type.ts @@ -64,7 +64,8 @@ export const rulesNotificationAlertType = ({ from: fromInMs, to: toInMs, id: ruleAlertSavedObject.id, - kibanaSiemAppUrl: ruleAlertParams.meta?.kibana_siem_app_url, + kibanaSiemAppUrl: (ruleAlertParams.meta as { kibana_siem_app_url?: string }) + .kibana_siem_app_url, }); logger.info( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts index 23d5d7eb8d385..fe66496f70dcd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts @@ -22,34 +22,11 @@ import { IRuleSavedAttributesSavedObjectAttributes, HapiReadableStream, } from '../../rules/types'; -import { RuleAlertParamsRest } from '../../types'; import { requestMock } from './request'; import { RuleNotificationAlertType } from '../../notifications/types'; import { QuerySignalsSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/query_signals_index_schema'; import { SetSignalsStatusSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/set_signal_status_schema'; - -export const typicalPayload = (): Partial => ({ - rule_id: 'rule-1', - description: 'Detecting root and admin users', - index: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], - interval: '5m', - name: 'Detect Root/Admin Users', - output_index: '.siem-signals', - risk_score: 50, - type: 'query', - from: 'now-6m', - to: 'now', - severity: 'high', - query: 'user.name: root or user.name: admin', - language: 'kuery', - threat: [ - { - framework: 'fake', - tactic: { id: 'fakeId', name: 'fakeName', reference: 'fakeRef' }, - technique: [{ id: 'techniqueId', name: 'techniqueName', reference: 'techniqueRef' }], - }, - ], -}); +import { getCreateRulesSchemaMock } from '../../../../../common/detection_engine/schemas/request/create_rules_schema.mock'; export const typicalSetStatusSignalByIdsPayload = (): SetSignalsStatusSchemaDecoded => ({ signal_ids: ['somefakeid1', 'somefakeid2'], @@ -77,14 +54,14 @@ export const getUpdateRequest = () => requestMock.create({ method: 'put', path: DETECTION_ENGINE_RULES_URL, - body: typicalPayload(), + body: getCreateRulesSchemaMock(), }); export const getPatchRequest = () => requestMock.create({ method: 'patch', path: DETECTION_ENGINE_RULES_URL, - body: typicalPayload(), + body: getCreateRulesSchemaMock(), }); export const getReadRequest = () => @@ -104,21 +81,21 @@ export const getReadBulkRequest = () => requestMock.create({ method: 'post', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, - body: [typicalPayload()], + body: [getCreateRulesSchemaMock()], }); export const getUpdateBulkRequest = () => requestMock.create({ method: 'put', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, - body: [typicalPayload()], + body: [getCreateRulesSchemaMock()], }); export const getPatchBulkRequest = () => requestMock.create({ method: 'patch', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, - body: [typicalPayload()], + body: [getCreateRulesSchemaMock()], }); export const getDeleteBulkRequest = () => @@ -254,11 +231,12 @@ export const getCreateRequest = () => requestMock.create({ method: 'post', path: DETECTION_ENGINE_RULES_URL, - body: typicalPayload(), + body: getCreateRulesSchemaMock(), }); +// TODO: Replace this with the mocks version from the mocks file export const typicalMlRulePayload = () => { - const { query, language, index, ...mlParams } = typicalPayload(); + const { query, language, index, ...mlParams } = getCreateRulesSchemaMock(); return { ...mlParams, @@ -284,8 +262,9 @@ export const createBulkMlRuleRequest = () => { }); }; +// TODO: Replace this with a mocks file version export const createRuleWithActionsRequest = () => { - const payload = typicalPayload(); + const payload = getCreateRulesSchemaMock(); return requestMock.create({ method: 'post', @@ -369,6 +348,7 @@ export const getResult = (): RuleAlertType => ({ falsePositives: [], from: 'now-6m', immutable: false, + savedId: undefined, query: 'user.name: root or user.name: admin', language: 'kuery', machineLearningJobId: undefined, @@ -560,9 +540,9 @@ export const getFindResultStatus = (): SavedObjectsFindResponse< alertId: '1ea5a820-4da1-4e82-92a1-2b43a7bece08', statusDate: '2020-02-18T15:26:49.783Z', status: 'succeeded', - lastFailureAt: null, + lastFailureAt: undefined, lastSuccessAt: '2020-02-18T15:26:49.783Z', - lastFailureMessage: null, + lastFailureMessage: undefined, lastSuccessMessage: 'succeeded', lastLookBackDate: new Date('2020-02-18T15:14:58.806Z').toISOString(), gap: '500.32', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/utils.ts index 41a28bfe8967d..063c9dffd66dd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/utils.ts @@ -6,70 +6,8 @@ import { Readable } from 'stream'; -import { OutputRuleAlertRest } from '../../types'; import { HapiReadableStream } from '../../rules/types'; - -/** - * This is a typical simple rule for testing that is easy for most basic testing - * @param ruleId - */ -export const getSimpleRule = (ruleId = 'rule-1'): Partial => ({ - name: 'Simple Rule Query', - description: 'Simple Rule Query', - risk_score: 1, - rule_id: ruleId, - severity: 'high', - type: 'query', - query: 'user.name: root or user.name: admin', -}); - -/** - * This is a typical ML rule for testing - * @param ruleId - */ -export const getSimpleMlRule = (ruleId = 'rule-1'): Partial => ({ - name: 'Simple Rule Query', - description: 'Simple Rule Query', - risk_score: 1, - rule_id: ruleId, - severity: 'high', - type: 'machine_learning', - anomaly_threshold: 44, - machine_learning_job_id: 'some_job_id', -}); - -/** - * This is a typical simple rule for testing that is easy for most basic testing - * @param ruleId - */ -export const getSimpleRuleWithId = (id = 'rule-1'): Partial => ({ - name: 'Simple Rule Query', - description: 'Simple Rule Query', - risk_score: 1, - id, - severity: 'high', - type: 'query', - query: 'user.name: root or user.name: admin', -}); - -/** - * Given an array of rules, builds an NDJSON string of rules - * as we might import/export - * @param rules Array of rule objects with which to generate rule JSON - */ -export const rulesToNdJsonString = (rules: Array>) => { - return rules.map((rule) => JSON.stringify(rule)).join('\r\n'); -}; - -/** - * Given an array of rule IDs, builds an NDJSON string of rules - * as we might import/export - * @param ruleIds Array of ruleIds with which to generate rule JSON - */ -export const ruleIdsToNdJsonString = (ruleIds: string[]) => { - const rules = ruleIds.map((ruleId) => getSimpleRule(ruleId)); - return rulesToNdJsonString(rules); -}; +import { RulesSchema } from '../../../../../common/detection_engine/schemas/response/rules_schema'; /** * Given a string, builds a hapi stream as our @@ -94,7 +32,7 @@ export const buildHapiStream = (string: string, filename = 'file.ndjson'): HapiR }; export const getOutputRuleAlertForRest = (): Omit< - OutputRuleAlertRest, + RulesSchema, 'machine_learning_job_id' | 'anomaly_threshold' > => ({ actions: [], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts index 1df6070bc33a6..11a4543e2fa12 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts @@ -8,7 +8,6 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { mlServicesMock, mlAuthzMock as mockMlAuthzFactory } from '../../../machine_learning/mocks'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { - typicalPayload, getReadBulkRequest, getEmptyIndex, getNonEmptyIndex, @@ -20,6 +19,7 @@ import { import { requestContextMock, serverMock, requestMock } from '../__mocks__'; import { createRulesBulkRoute } from './create_rules_bulk_route'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { getCreateRulesSchemaMock } from '../../../../../common/detection_engine/schemas/request/create_rules_schema.mock'; jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); @@ -98,8 +98,7 @@ describe('create_rules_bulk', () => { expect(response.body).toEqual([ { error: { - message: - 'To create a rule, the index must exist first. Index .siem-signals does not exist', + message: 'To create a rule, the index must exist first. Index undefined does not exist', status_code: 400, }, rule_id: 'rule-1', @@ -143,7 +142,7 @@ describe('create_rules_bulk', () => { const request = requestMock.create({ method: 'post', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, - body: [typicalPayload(), typicalPayload()], + body: [getCreateRulesSchemaMock(), getCreateRulesSchemaMock()], }); const response = await server.inject(request, context); @@ -164,7 +163,7 @@ describe('create_rules_bulk', () => { const request = requestMock.create({ method: 'post', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, - body: [{ ...typicalPayload(), type: 'query' }], + body: [{ ...getCreateRulesSchemaMock(), type: 'query' }], }); const result = server.validate(request); @@ -175,7 +174,7 @@ describe('create_rules_bulk', () => { const request = requestMock.create({ method: 'post', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, - body: [{ ...typicalPayload(), type: 'unexpected_type' }], + body: [{ ...getCreateRulesSchemaMock(), type: 'unexpected_type' }], }); const result = server.validate(request); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts index 5abd7b1e76a76..37500572d1386 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts @@ -9,7 +9,6 @@ import { getEmptyFindResult, getResult, getCreateRequest, - typicalPayload, getFindResultStatus, getNonEmptyIndex, getEmptyIndex, @@ -22,6 +21,7 @@ import { requestContextMock, serverMock, requestMock } from '../__mocks__'; import { createRulesRoute } from './create_rules_route'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { getCreateRulesSchemaMock } from '../../../../../common/detection_engine/schemas/request/create_rules_schema.mock'; jest.mock('../../rules/update_rules_notifications'); jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); @@ -114,7 +114,7 @@ describe('create_rules', () => { expect(response.status).toEqual(400); expect(response.body).toEqual({ - message: 'To create a rule, the index must exist first. Index .siem-signals does not exist', + message: 'To create a rule, the index must exist first. Index undefined does not exist', status_code: 400, }); }); @@ -149,7 +149,7 @@ describe('create_rules', () => { method: 'post', path: DETECTION_ENGINE_RULES_URL, body: { - ...typicalPayload(), + ...getCreateRulesSchemaMock(), type: 'query', }, }); @@ -163,7 +163,7 @@ describe('create_rules', () => { method: 'post', path: DETECTION_ENGINE_RULES_URL, body: { - ...typicalPayload(), + ...getCreateRulesSchemaMock(), type: 'unexpected_type', }, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts index 0762fbc7dd6e3..84148231431a1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts @@ -4,12 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - buildHapiStream, - ruleIdsToNdJsonString, - rulesToNdJsonString, - getSimpleRuleWithId, -} from '../__mocks__/utils'; +import { buildHapiStream } from '../__mocks__/utils'; import { getImportRulesRequest, getImportRulesRequestOverwriteTrue, @@ -25,6 +20,11 @@ import { buildMlAuthz } from '../../../machine_learning/authz'; import { importRulesRoute } from './import_rules_route'; import * as createRulesStreamFromNdJson from '../../rules/create_rules_stream_from_ndjson'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { + getImportRulesWithIdSchemaMock, + ruleIdsToNdJsonString, + rulesToNdJsonString, +} from '../../../../../common/detection_engine/schemas/request/import_rules_schema.mock'; jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); @@ -239,7 +239,11 @@ describe('import_rules_route', () => { }); test('returns 200 with errors if all rules are missing rule_ids and import fails on validation', async () => { - const rulesWithoutRuleIds = ['rule-1', 'rule-2'].map((ruleId) => getSimpleRuleWithId(ruleId)); + const rulesWithoutRuleIds = ['rule-1', 'rule-2'].map((ruleId) => + getImportRulesWithIdSchemaMock(ruleId) + ); + delete rulesWithoutRuleIds[0].rule_id; + delete rulesWithoutRuleIds[1].rule_id; const badPayload = buildHapiStream(rulesToNdJsonString(rulesWithoutRuleIds)); const badRequest = getImportRulesRequest(badPayload); @@ -251,7 +255,7 @@ describe('import_rules_route', () => { { error: { // TODO: Change the formatter to do better than output [object Object] - message: '[object Object],[object Object]', + message: '[object Object]', status_code: 400, }, rule_id: '(unknown id)', @@ -259,7 +263,7 @@ describe('import_rules_route', () => { { error: { // TODO: Change the formatter to do better than output [object Object] - message: '[object Object],[object Object]', + message: '[object Object]', status_code: 400, }, rule_id: '(unknown id)', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts index d5145e1dceae0..24fd5e151e485 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts @@ -9,7 +9,6 @@ import { mlServicesMock, mlAuthzMock as mockMlAuthzFactory } from '../../../mach import { buildMlAuthz } from '../../../machine_learning/authz'; import { getEmptyFindResult, - typicalPayload, getFindResultWithSingleHit, getPatchBulkRequest, getResult, @@ -18,6 +17,7 @@ import { import { serverMock, requestContextMock, requestMock } from '../__mocks__'; import { patchRulesBulkRoute } from './patch_rules_bulk_route'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { getCreateRulesSchemaMock } from '../../../../../common/detection_engine/schemas/request/create_rules_schema.mock'; jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); @@ -153,7 +153,7 @@ describe('patch_rules_bulk', () => { const request = requestMock.create({ method: 'patch', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, - body: [{ ...typicalPayload(), rule_id: undefined }], + body: [{ ...getCreateRulesSchemaMock(), rule_id: undefined }], }); const response = await server.inject(request, context); @@ -173,7 +173,7 @@ describe('patch_rules_bulk', () => { const request = requestMock.create({ method: 'patch', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, - body: [{ ...typicalPayload(), type: 'query' }], + body: [{ ...getCreateRulesSchemaMock(), type: 'query' }], }); const result = server.validate(request); @@ -184,7 +184,7 @@ describe('patch_rules_bulk', () => { const request = requestMock.create({ method: 'patch', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, - body: [{ ...typicalPayload(), type: 'unknown_type' }], + body: [{ ...getCreateRulesSchemaMock(), type: 'unknown_type' }], }); const result = server.validate(request); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts index 09230d45ee785..1b225f6dd93c3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts @@ -12,7 +12,6 @@ import { getFindResultStatus, getResult, getPatchRequest, - typicalPayload, getFindResultWithSingleHit, nonRuleFindResult, typicalMlRulePayload, @@ -20,6 +19,7 @@ import { import { requestContextMock, serverMock, requestMock } from '../__mocks__'; import { patchRulesRoute } from './patch_rules_route'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { getCreateRulesSchemaMock } from '../../../../../common/detection_engine/schemas/request/create_rules_schema.mock'; jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); @@ -165,7 +165,7 @@ describe('patch_rules', () => { const request = requestMock.create({ method: 'patch', path: DETECTION_ENGINE_RULES_URL, - body: { ...typicalPayload(), rule_id: undefined }, + body: { ...getCreateRulesSchemaMock(), rule_id: undefined }, }); const response = await server.inject(request, context); expect(response.body).toEqual({ @@ -178,7 +178,7 @@ describe('patch_rules', () => { const request = requestMock.create({ method: 'patch', path: DETECTION_ENGINE_RULES_URL, - body: { ...typicalPayload(), type: 'query' }, + body: { ...getCreateRulesSchemaMock(), type: 'query' }, }); const result = server.validate(request); @@ -189,7 +189,7 @@ describe('patch_rules', () => { const request = requestMock.create({ method: 'patch', path: DETECTION_ENGINE_RULES_URL, - body: { ...typicalPayload(), type: 'unknown_type' }, + body: { ...getCreateRulesSchemaMock(), type: 'unknown_type' }, }); const result = server.validate(request); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts index 2f331938e3ca8..582bf1a9aa22b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts @@ -10,7 +10,6 @@ import { buildMlAuthz } from '../../../machine_learning/authz'; import { getEmptyFindResult, getResult, - typicalPayload, getFindResultWithSingleHit, getUpdateBulkRequest, getFindResultStatus, @@ -20,6 +19,7 @@ import { serverMock, requestContextMock, requestMock } from '../__mocks__'; import { updateRulesBulkRoute } from './update_rules_bulk_route'; import { BulkError } from '../utils'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { getCreateRulesSchemaMock } from '../../../../../common/detection_engine/schemas/request/create_rules_schema.mock'; jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); @@ -129,7 +129,7 @@ describe('update_rules_bulk', () => { const noIdRequest = requestMock.create({ method: 'put', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, - body: [{ ...typicalPayload(), rule_id: undefined }], + body: [{ ...getCreateRulesSchemaMock(), rule_id: undefined }], }); const response = await server.inject(noIdRequest, context); expect(response.body).toEqual([ @@ -144,7 +144,7 @@ describe('update_rules_bulk', () => { const request = requestMock.create({ method: 'put', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, - body: [{ ...typicalPayload(), type: 'query' }], + body: [{ ...getCreateRulesSchemaMock(), type: 'query' }], }); const result = server.validate(request); @@ -155,7 +155,7 @@ describe('update_rules_bulk', () => { const request = requestMock.create({ method: 'put', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, - body: [{ ...typicalPayload(), type: 'unknown_type' }], + body: [{ ...getCreateRulesSchemaMock(), type: 'unknown_type' }], }); const result = server.validate(request); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts index f8b7636080b1b..bbe65ff36a3e5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts @@ -10,7 +10,6 @@ import { getEmptyFindResult, getResult, getUpdateRequest, - typicalPayload, getFindResultWithSingleHit, getFindResultStatusEmpty, nonRuleFindResult, @@ -21,6 +20,7 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { updateRulesRoute } from './update_rules_route'; +import { getCreateRulesSchemaMock } from '../../../../../common/detection_engine/schemas/request/create_rules_schema.mock'; jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); jest.mock('../../rules/update_rules_notifications'); @@ -139,7 +139,7 @@ describe('update_rules', () => { method: 'put', path: DETECTION_ENGINE_RULES_URL, body: { - ...typicalPayload(), + ...getCreateRulesSchemaMock(), rule_id: undefined, }, }); @@ -154,7 +154,7 @@ describe('update_rules', () => { const request = requestMock.create({ method: 'put', path: DETECTION_ENGINE_RULES_URL, - body: { ...typicalPayload(), type: 'query' }, + body: { ...getCreateRulesSchemaMock(), type: 'query' }, }); const result = await server.validate(request); @@ -165,7 +165,7 @@ describe('update_rules', () => { const request = requestMock.create({ method: 'put', path: DETECTION_ENGINE_RULES_URL, - body: { ...typicalPayload(), type: 'unknown type' }, + body: { ...getCreateRulesSchemaMock(), type: 'unknown type' }, }); const result = await server.validate(request); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts index 3b2750bbbf664..3b514b92e1479 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts @@ -21,7 +21,7 @@ import { getResult } from '../__mocks__/request_responses'; import { INTERNAL_IDENTIFIER } from '../../../../../common/constants'; import { RuleTypeParams } from '../../types'; import { BulkError, ImportSuccessError } from '../utils'; -import { getSimpleRule, getOutputRuleAlertForRest } from '../__mocks__/utils'; +import { getOutputRuleAlertForRest } from '../__mocks__/utils'; import { createPromiseFromStreams } from '../../../../../../../../src/legacy/utils/streams'; import { PartialAlert } from '../../../../../../alerts/server'; import { SanitizedAlert } from '../../../../../../alerts/server/types'; @@ -30,6 +30,7 @@ import { RuleAlertType } from '../../rules/types'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; import { CreateRulesBulkSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/create_rules_bulk_schema'; import { ImportRulesSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/import_rules_schema'; +import { getCreateRulesSchemaMock } from '../../../../../common/detection_engine/schemas/request/create_rules_schema.mock'; type PromiseFromStreams = ImportRulesSchemaDecoded | Error; @@ -62,14 +63,6 @@ describe('utils', () => { expect(rule).toEqual(expectedWithoutFromWithoutLanguage); }); - test('should omit query if query is null', () => { - const fullRule = getResult(); - fullRule.params.query = null; - const rule = transformAlertToRule(fullRule); - const { query, ...expectedWithoutQuery } = getOutputRuleAlertForRest(); - expect(rule).toEqual(expectedWithoutQuery); - }); - test('should omit query if query is undefined', () => { const fullRule = getResult(); fullRule.params.query = undefined; @@ -81,7 +74,7 @@ describe('utils', () => { test('should omit a mix of undefined, null, and missing fields', () => { const fullRule = getResult(); fullRule.params.query = undefined; - fullRule.params.language = null; + fullRule.params.language = undefined; const { from, ...omitParams } = fullRule.params; fullRule.params = omitParams as RuleTypeParams; const { enabled, ...omitEnabled } = fullRule; @@ -532,8 +525,8 @@ describe('utils', () => { }); test('returns tuple of duplicate conflict error and single rule when rules with matching rule-ids passed in and `overwrite` is false', async () => { - const rule = getSimpleRule('rule-1'); - const rule2 = getSimpleRule('rule-1'); + const rule = getCreateRulesSchemaMock('rule-1'); + const rule2 = getCreateRulesSchemaMock('rule-1'); const ndJsonStream = new Readable({ read() { this.push(`${JSON.stringify(rule)}\n`); @@ -561,9 +554,9 @@ describe('utils', () => { }); test('returns tuple of duplicate conflict error and single rule when rules with matching ids passed in and `overwrite` is false', async () => { - const rule = getSimpleRule('rule-1'); + const rule = getCreateRulesSchemaMock('rule-1'); delete rule.rule_id; - const rule2 = getSimpleRule('rule-1'); + const rule2 = getCreateRulesSchemaMock('rule-1'); delete rule2.rule_id; const ndJsonStream = new Readable({ read() { @@ -585,8 +578,8 @@ describe('utils', () => { }); test('returns tuple of empty duplicate errors array and single rule when rules with matching rule-ids passed in and `overwrite` is true', async () => { - const rule = getSimpleRule('rule-1'); - const rule2 = getSimpleRule('rule-1'); + const rule = getCreateRulesSchemaMock('rule-1'); + const rule2 = getCreateRulesSchemaMock('rule-1'); const ndJsonStream = new Readable({ read() { this.push(`${JSON.stringify(rule)}\n`); @@ -606,7 +599,7 @@ describe('utils', () => { }); test('returns tuple of empty duplicate errors array and single rule when rules without a rule-id is passed in', async () => { - const simpleRule = getSimpleRule(); + const simpleRule = getCreateRulesSchemaMock(); delete simpleRule.rule_id; const multipartPayload = `${JSON.stringify(simpleRule)}\n`; const ndJsonStream = new Readable({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts index 3ed45bd8367fc..9320eba26df0b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts @@ -8,6 +8,7 @@ import { pickBy, countBy } from 'lodash/fp'; import { SavedObject, SavedObjectsFindResponse } from 'kibana/server'; import uuid from 'uuid'; +import { RulesSchema } from '../../../../../common/detection_engine/schemas/response/rules_schema'; import { ImportRulesSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/import_rules_schema'; import { CreateRulesBulkSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/create_rules_bulk_schema'; import { PartialAlert, FindResult } from '../../../../../../alerts/server'; @@ -21,7 +22,6 @@ import { isRuleStatusFindTypes, isRuleStatusSavedObjectType, } from '../../rules/types'; -import { OutputRuleAlertRest } from '../../types'; import { createBulkErrorObject, BulkError, @@ -30,7 +30,6 @@ import { createImportErrorObject, OutputError, } from '../utils'; -import { hasListsFeature } from '../../feature_flags'; import { RuleActions } from '../../rule_actions/types'; type PromiseFromStreams = ImportRulesSchemaDecoded | Error; @@ -104,12 +103,12 @@ export const transformAlertToRule = ( alert: RuleAlertType, ruleActions?: RuleActions | null, ruleStatus?: SavedObject -): Partial => { - return pickBy((value: unknown) => value != null, { +): Partial => { + return pickBy((value: unknown) => value != null, { actions: ruleActions?.actions ?? [], created_at: alert.createdAt.toISOString(), updated_at: alert.updatedAt.toISOString(), - created_by: alert.createdBy, + created_by: alert.createdBy ?? 'elastic', description: alert.params.description, enabled: alert.enabled, anomaly_threshold: alert.params.anomalyThreshold, @@ -134,28 +133,25 @@ export const transformAlertToRule = ( timeline_title: alert.params.timelineTitle, meta: alert.params.meta, severity: alert.params.severity, - updated_by: alert.updatedBy, + updated_by: alert.updatedBy ?? 'elastic', tags: transformTags(alert.tags), to: alert.params.to, type: alert.params.type, - threat: alert.params.threat, + threat: alert.params.threat ?? [], throttle: ruleActions?.ruleThrottle || 'no_actions', note: alert.params.note, version: alert.params.version, - status: ruleStatus?.attributes.status, + status: ruleStatus?.attributes.status ?? undefined, status_date: ruleStatus?.attributes.statusDate, - last_failure_at: ruleStatus?.attributes.lastFailureAt, - last_success_at: ruleStatus?.attributes.lastSuccessAt, - last_failure_message: ruleStatus?.attributes.lastFailureMessage, - last_success_message: ruleStatus?.attributes.lastSuccessMessage, - // TODO: (LIST-FEATURE) Remove hasListsFeature() check once we have lists available for a release - exceptions_list: hasListsFeature() ? alert.params.exceptionsList : null, + last_failure_at: ruleStatus?.attributes.lastFailureAt ?? undefined, + last_success_at: ruleStatus?.attributes.lastSuccessAt ?? undefined, + last_failure_message: ruleStatus?.attributes.lastFailureMessage ?? undefined, + last_success_message: ruleStatus?.attributes.lastSuccessMessage ?? undefined, + exceptions_list: alert.params.exceptionsList ?? [], }); }; -export const transformAlertsToRules = ( - alerts: RuleAlertType[] -): Array> => { +export const transformAlertsToRules = (alerts: RuleAlertType[]): Array> => { return alerts.map((alert) => transformAlertToRule(alert)); }; @@ -167,7 +163,7 @@ export const transformFindAlerts = ( page: number; perPage: number; total: number; - data: Array>; + data: Array>; } | null => { if (!ruleStatuses && isAlertTypes(findResults.data)) { return { @@ -194,7 +190,7 @@ export const transform = ( alert: PartialAlert, ruleActions?: RuleActions | null, ruleStatus?: SavedObject -): Partial | null => { +): Partial | null => { if (isAlertType(alert)) { return transformAlertToRule( alert, @@ -211,7 +207,7 @@ export const transformOrBulkError = ( alert: PartialAlert, ruleActions: RuleActions, ruleStatus?: unknown -): Partial | BulkError => { +): Partial | BulkError => { if (isAlertType(alert)) { if (isRuleStatusFindType(ruleStatus) && ruleStatus?.saved_objects.length > 0) { return transformAlertToRule(alert, ruleActions, ruleStatus?.saved_objects[0] ?? ruleStatus); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/validate.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/validate.ts index 5fc239ed48263..7b0bf5997d12f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/validate.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/validate.ts @@ -22,7 +22,6 @@ import { IRuleSavedAttributesSavedObjectAttributes, isRuleStatusFindType, } from '../../rules/types'; -import { OutputRuleAlertRest } from '../../types'; import { createBulkErrorObject, BulkError } from '../utils'; import { transformFindAlerts, transform, transformAlertToRule } from './utils'; import { RuleActions } from '../../rule_actions/types'; @@ -36,7 +35,7 @@ export const transformValidateFindAlerts = ( page: number; perPage: number; total: number; - data: Array>; + data: Array>; } | null, string | null ] => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts index 1a965842348ac..747cf82510460 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts @@ -4,17 +4,17 @@ * you may not use this file except in compliance with the Elastic License. */ +import { RulesSchema } from '../../../../common/detection_engine/schemas/response/rules_schema'; import { AlertsClient } from '../../../../../alerts/server'; import { getExportDetailsNdjson } from './get_export_details_ndjson'; import { isAlertType } from '../rules/types'; import { readRules } from './read_rules'; import { transformAlertToRule } from '../routes/rules/utils'; -import { OutputRuleAlertRest } from '../types'; import { transformDataToNdjson } from '../../../utils/read_stream/create_stream_from_ndjson'; -interface ExportSuccesRule { +interface ExportSuccessRule { statusCode: 200; - rule: Partial; + rule: Partial; } interface ExportFailedRule { @@ -22,12 +22,12 @@ interface ExportFailedRule { missingRuleId: { rule_id: string }; } -type ExportRules = ExportSuccesRule | ExportFailedRule; +type ExportRules = ExportSuccessRule | ExportFailedRule; export interface RulesErrors { exportedCount: number; missingRules: Array<{ rule_id: string }>; - rules: Array>; + rules: Array>; } export const getExportByObjectIds = async ( @@ -80,7 +80,7 @@ export const getRulesFromObjects = async ( ) as ExportFailedRule[]; const exportedRules = alertsAndErrors.filter( (resp) => resp.statusCode === 200 - ) as ExportSuccesRule[]; + ) as ExportSuccessRule[]; return { exportedCount: exportedRules.length, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_details_ndjson.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_details_ndjson.test.ts index 431b3776fd9e2..848abc3febf35 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_details_ndjson.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_details_ndjson.test.ts @@ -4,18 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import { sampleRule } from '../signals/__mocks__/es_results'; import { getExportDetailsNdjson } from './get_export_details_ndjson'; +import { getRulesSchemaMock } from '../../../../common/detection_engine/schemas/response/rules_schema.mocks'; describe('getExportDetailsNdjson', () => { test('it ends with a new line character', () => { - const rule = sampleRule(); + const rule = getRulesSchemaMock(); const details = getExportDetailsNdjson([rule]); expect(details.endsWith('\n')).toEqual(true); }); test('it exports a correct count given a single rule and no missing rules', () => { - const rule = sampleRule(); + const rule = getRulesSchemaMock(); const details = getExportDetailsNdjson([rule]); const reParsed = JSON.parse(details); expect(reParsed).toEqual({ @@ -37,8 +37,8 @@ describe('getExportDetailsNdjson', () => { }); test('it exports a correct count given multiple rules and multiple missing rules', () => { - const rule1 = sampleRule(); - const rule2 = sampleRule(); + const rule1 = getRulesSchemaMock(); + const rule2 = getRulesSchemaMock(); rule2.rule_id = 'some other id'; rule2.id = 'some other id'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_details_ndjson.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_details_ndjson.ts index a39541d044bc3..0a685cab9b450 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_details_ndjson.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_details_ndjson.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { OutputRuleAlertRest } from '../types'; +import { RulesSchema } from '../../../../common/detection_engine/schemas/response/rules_schema'; export const getExportDetailsNdjson = ( - rules: Array>, + rules: Array>, missingRules: Array<{ rule_id: string }> = [] ): string => { const stringified = JSON.stringify({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts index 3796df353abb8..0c103b7176db4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts @@ -11,7 +11,6 @@ import { PatchRulesOptions } from './types'; import { addTags } from './add_tags'; import { calculateVersion, calculateName, calculateInterval } from './utils'; import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; -import { Meta } from '../types'; export const patchRules = async ({ alertsClient, @@ -60,7 +59,7 @@ export const patchRules = async ({ savedId, timelineId, timelineTitle, - meta: meta as Meta | undefined, // TODO: Remove this cast once we fix the types for calculate version and patch, + meta, filters, from, index, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts index 8bdb1287c6df2..4b84057f6d795 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts @@ -69,11 +69,17 @@ import { QueryFilterOrUndefined, FieldsOrUndefined, SortOrderOrUndefined, + JobStatus, + LastSuccessAt, + StatusDate, + LastSuccessMessage, + LastFailureAt, + LastFailureMessage, } from '../../../../common/detection_engine/schemas/common/schemas'; import { AlertsClient, PartialAlert } from '../../../../../alerts/server'; import { Alert, SanitizedAlert } from '../../../../../alerts/common'; import { SIGNALS_ID } from '../../../../common/constants'; -import { RuleAlertParams, RuleTypeParams, PartialFilter } from '../types'; +import { RuleTypeParams, PartialFilter } from '../types'; export interface RuleAlertType extends Alert { params: RuleTypeParams; @@ -82,12 +88,12 @@ export interface RuleAlertType extends Alert { // eslint-disable-next-line @typescript-eslint/no-explicit-any export interface IRuleStatusAttributes extends Record { alertId: string; // created alert id. - statusDate: string; - lastFailureAt: string | null | undefined; - lastFailureMessage: string | null | undefined; - lastSuccessAt: string | null | undefined; - lastSuccessMessage: string | null | undefined; - status: RuleStatusString | null | undefined; + statusDate: StatusDate; + lastFailureAt: LastFailureAt | null | undefined; + lastFailureMessage: LastFailureMessage | null | undefined; + lastSuccessAt: LastSuccessAt | null | undefined; + lastSuccessMessage: LastSuccessMessage | null | undefined; + status: JobStatus | null | undefined; lastLookBackDate: string | null | undefined; gap: string | null | undefined; bulkCreateTimeDurations: string[] | null | undefined; @@ -121,8 +127,6 @@ export interface IRuleStatusFindType { saved_objects: IRuleStatusSavedObject[]; } -export type RuleStatusString = 'succeeded' | 'failed' | 'going to run'; - export interface HapiReadableStream extends Readable { hapi: { filename: string; @@ -133,12 +137,6 @@ export interface Clients { alertsClient: AlertsClient; } -// TODO: Try and remove this patch -export type PatchRuleParams = Partial> & { - rule: SanitizedAlert | null; - savedObjectsClient: SavedObjectsClientContract; -} & Clients; - export const isAlertTypes = (partialAlert: PartialAlert[]): partialAlert is RuleAlertType[] => { return partialAlert.every((rule) => isAlertType(rule)); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts index 0236c357988d5..b3f327857dbb3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts @@ -12,7 +12,6 @@ import { addTags } from './add_tags'; import { calculateVersion } from './utils'; import { hasListsFeature } from '../feature_flags'; import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; -import { Meta } from '../types'; export const updateRules = async ({ alertsClient, @@ -63,7 +62,7 @@ export const updateRules = async ({ savedId, timelineId, timelineTitle, - meta: meta as Meta, // TODO: Remove this cast once we fix the types for calculate version and patch + meta, filters, from, index, @@ -81,6 +80,7 @@ export const updateRules = async ({ note, anomalyThreshold, machineLearningJobId, + exceptionsList, }); // TODO: Remove this and use regular exceptions_list once the feature is stable for a release diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.test.ts index b7c36b20f44be..0f65b2a78ec4c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.test.ts @@ -5,7 +5,6 @@ */ import { calculateInterval, calculateVersion, calculateName } from './utils'; -import { PatchRuleParams } from './types'; describe('utils', () => { describe('#calculateInterval', () => { @@ -27,24 +26,104 @@ describe('utils', () => { describe('#calculateVersion', () => { test('returning the same version number if given an immutable but no updated version number', () => { - expect(calculateVersion(true, 1, { description: 'some description change' })).toEqual(1); + expect( + calculateVersion(true, 1, { + description: 'some description change', + falsePositives: undefined, + query: undefined, + language: undefined, + outputIndex: undefined, + savedId: undefined, + timelineId: undefined, + timelineTitle: undefined, + meta: undefined, + filters: [], + from: undefined, + index: undefined, + interval: undefined, + maxSignals: undefined, + riskScore: undefined, + name: undefined, + severity: undefined, + tags: undefined, + threat: undefined, + to: undefined, + type: undefined, + references: undefined, + version: undefined, + note: undefined, + anomalyThreshold: undefined, + machineLearningJobId: undefined, + exceptionsList: [], + }) + ).toEqual(1); }); test('returning an updated version number if given an immutable and an updated version number', () => { - expect(calculateVersion(true, 2, { description: 'some description change' })).toEqual(2); + expect( + calculateVersion(true, 2, { + description: 'some description change', + falsePositives: undefined, + query: undefined, + language: undefined, + outputIndex: undefined, + savedId: undefined, + timelineId: undefined, + timelineTitle: undefined, + meta: undefined, + filters: [], + from: undefined, + index: undefined, + interval: undefined, + maxSignals: undefined, + riskScore: undefined, + name: undefined, + severity: undefined, + tags: undefined, + threat: undefined, + to: undefined, + type: undefined, + references: undefined, + version: undefined, + note: undefined, + anomalyThreshold: undefined, + machineLearningJobId: undefined, + exceptionsList: [], + }) + ).toEqual(2); }); test('returning an updated version number if not given an immutable but but an updated description', () => { - expect(calculateVersion(false, 1, { description: 'some description change' })).toEqual(2); - }); - - test('returning the same version number but a undefined description', () => { - expect(calculateVersion(false, 1, { description: undefined })).toEqual(1); - }); - - test('returning an updated version number if not given an immutable but an updated falsy value', () => { expect( - calculateVersion(false, 1, ({ description: false } as unknown) as PatchRuleParams) + calculateVersion(false, 1, { + description: 'some description change', + falsePositives: undefined, + query: undefined, + language: undefined, + outputIndex: undefined, + savedId: undefined, + timelineId: undefined, + timelineTitle: undefined, + meta: undefined, + filters: [], + from: undefined, + index: undefined, + interval: undefined, + maxSignals: undefined, + riskScore: undefined, + name: undefined, + severity: undefined, + tags: undefined, + threat: undefined, + to: undefined, + type: undefined, + references: undefined, + version: undefined, + note: undefined, + anomalyThreshold: undefined, + machineLearningJobId: undefined, + exceptionsList: [], + }) ).toEqual(2); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.ts index 7d6091f6b97fa..d40cb5d96669b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.ts @@ -5,7 +5,35 @@ */ import { pickBy, isEmpty } from 'lodash/fp'; -import { PatchRuleParams } from './types'; +import { + DescriptionOrUndefined, + AnomalyThresholdOrUndefined, + QueryOrUndefined, + LanguageOrUndefined, + SavedIdOrUndefined, + TimelineIdOrUndefined, + TimelineTitleOrUndefined, + MachineLearningJobIdOrUndefined, + IndexOrUndefined, + NoteOrUndefined, + MetaOrUndefined, + VersionOrUndefined, + FalsePositivesOrUndefined, + FromOrUndefined, + OutputIndexOrUndefined, + IntervalOrUndefined, + MaxSignalsOrUndefined, + RiskScoreOrUndefined, + NameOrUndefined, + SeverityOrUndefined, + TagsOrUndefined, + ToOrUndefined, + ThreatOrUndefined, + TypeOrUndefined, + ReferencesOrUndefined, + ListAndOrUndefined, +} from '../../../../common/detection_engine/schemas/common/schemas'; +import { PartialFilter } from '../types'; export const calculateInterval = ( interval: string | undefined, @@ -20,10 +48,40 @@ export const calculateInterval = ( } }; +export interface UpdateProperties { + description: DescriptionOrUndefined; + falsePositives: FalsePositivesOrUndefined; + from: FromOrUndefined; + query: QueryOrUndefined; + language: LanguageOrUndefined; + savedId: SavedIdOrUndefined; + timelineId: TimelineIdOrUndefined; + timelineTitle: TimelineTitleOrUndefined; + meta: MetaOrUndefined; + machineLearningJobId: MachineLearningJobIdOrUndefined; + filters: PartialFilter[]; + index: IndexOrUndefined; + interval: IntervalOrUndefined; + maxSignals: MaxSignalsOrUndefined; + riskScore: RiskScoreOrUndefined; + outputIndex: OutputIndexOrUndefined; + name: NameOrUndefined; + severity: SeverityOrUndefined; + tags: TagsOrUndefined; + threat: ThreatOrUndefined; + to: ToOrUndefined; + type: TypeOrUndefined; + references: ReferencesOrUndefined; + note: NoteOrUndefined; + version: VersionOrUndefined; + exceptionsList: ListAndOrUndefined; + anomalyThreshold: AnomalyThresholdOrUndefined; +} + export const calculateVersion = ( immutable: boolean, currentVersion: number, - updateProperties: Partial> + updateProperties: UpdateProperties ): number => { // early return if we are pre-packaged/immutable rule to be safe. We are never responsible // for changing the version number of an immutable. Immutables are only responsible for changing @@ -44,7 +102,7 @@ export const calculateVersion = ( // the version number if only the enabled/disabled flag is being set. Likewise if we get other // properties we are not expecting such as updatedAt we do not to cause a version number bump // on that either. - const removedNullValues = pickBy( + const removedNullValues = pickBy( (value: unknown) => value != null, updateProperties ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts index 46a16e7dca153..6056e692854af 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts @@ -11,7 +11,7 @@ import { SavedObjectsFindResponse, } from '../../../../../../../../src/core/server'; import { loggingServiceMock } from '../../../../../../../../src/core/server/mocks'; -import { RuleTypeParams, OutputRuleAlertRest } from '../../types'; +import { RuleTypeParams } from '../../types'; import { IRuleStatusAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; @@ -364,34 +364,6 @@ export const sampleDocSearchResultsWithSortId = ( export const sampleRuleGuid = '04128c15-0d1b-4716-a4c5-46997ac7f3bd'; export const sampleIdGuid = 'e1e08ddc-5e37-49ff-a258-5393aa44435a'; -export const sampleRule = (): Partial => { - return { - created_by: 'elastic', - description: 'Detecting root and admin users', - enabled: true, - false_positives: [], - from: 'now-6m', - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - immutable: false, - index: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], - interval: '5m', - risk_score: 50, - rule_id: 'rule-1', - language: 'kuery', - max_signals: 100, - name: 'Detect Root/Admin Users', - output_index: '.siem-signals', - query: 'user.name: root or user.name: admin', - references: ['http://www.example.com', 'https://ww.example.com'], - severity: 'high', - updated_by: 'elastic', - tags: ['some fake tag 1', 'some fake tag 2'], - to: 'now', - type: 'query', - note: '', - }; -}; - export const exampleRuleStatus: () => SavedObject = () => ({ type: ruleStatusSavedObjectType, id: '042e6d90-7069-11ea-af8b-0f8ae4fa817e', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.test.ts index df9d282b71e5e..80c2441193a0c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.test.ts @@ -18,7 +18,7 @@ describe('buildBulkBody', () => { jest.clearAllMocks(); }); - test('if bulk body builds well-defined body', () => { + test('bulk body builds well-defined body', () => { const sampleParams = sampleRuleAlertParams(); const fakeSignalSourceHit = buildBulkBody({ doc: sampleDocNoSortId(), @@ -80,6 +80,7 @@ describe('buildBulkBody', () => { references: ['http://google.com'], severity: 'high', tags: ['some fake tag 1', 'some fake tag 2'], + threat: [], throttle: 'no_actions', type: 'query', to: 'now', @@ -128,7 +129,7 @@ describe('buildBulkBody', () => { expect(fakeSignalSourceHit).toEqual(expected); }); - test('if bulk body builds original_event if it exists on the event to begin with', () => { + test('bulk body builds original_event if it exists on the event to begin with', () => { const sampleParams = sampleRuleAlertParams(); const doc = sampleDocNoSortId(); doc._source.event = { @@ -216,6 +217,7 @@ describe('buildBulkBody', () => { created_at: fakeSignalSourceHit.signal.rule?.created_at, updated_at: fakeSignalSourceHit.signal.rule?.updated_at, throttle: 'no_actions', + threat: [], exceptions_list: [ { field: 'source.ip', @@ -254,7 +256,7 @@ describe('buildBulkBody', () => { expect(fakeSignalSourceHit).toEqual(expected); }); - test('if bulk body builds original_event if it exists on the event to begin with but no kind information', () => { + test('bulk body builds original_event if it exists on the event to begin with but no kind information', () => { const sampleParams = sampleRuleAlertParams(); const doc = sampleDocNoSortId(); doc._source.event = { @@ -329,6 +331,7 @@ describe('buildBulkBody', () => { query: 'user.name: root or user.name: admin', references: ['http://google.com'], severity: 'high', + threat: [], tags: ['some fake tag 1', 'some fake tag 2'], type: 'query', to: 'now', @@ -378,7 +381,7 @@ describe('buildBulkBody', () => { expect(fakeSignalSourceHit).toEqual(expected); }); - test('if bulk body builds original_event if it exists on the event to begin with with only kind information', () => { + test('bulk body builds original_event if it exists on the event to begin with with only kind information', () => { const sampleParams = sampleRuleAlertParams(); const doc = sampleDocNoSortId(); doc._source.event = { @@ -447,6 +450,7 @@ describe('buildBulkBody', () => { references: ['http://google.com'], severity: 'high', tags: ['some fake tag 1', 'some fake tag 2'], + threat: [], type: 'query', to: 'now', note: '', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.test.ts index 772ebd932698b..07adfde71c1a9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.test.ts @@ -1147,17 +1147,6 @@ describe('build_exceptions_query', () => { }); describe('buildQueryExceptions', () => { - test('it returns original query if no lists exist', () => { - const query = buildQueryExceptions({ - query: 'host.name: *', - language: 'kuery', - lists: undefined, - }); - const expectedQuery = 'host.name: *'; - - expect(query).toEqual([{ query: expectedQuery, language: 'kuery' }]); - }); - test('it returns original query if lists is empty array', () => { const query = buildQueryExceptions({ query: 'host.name: *', language: 'kuery', lists: [] }); const expectedQuery = 'host.name: *'; @@ -1165,24 +1154,6 @@ describe('build_exceptions_query', () => { expect(query).toEqual([{ query: expectedQuery, language: 'kuery' }]); }); - test('it returns original query if lists is null', () => { - const query = buildQueryExceptions({ query: 'host.name: *', language: 'kuery', lists: null }); - const expectedQuery = 'host.name: *'; - - expect(query).toEqual([{ query: expectedQuery, language: 'kuery' }]); - }); - - test('it returns original query if lists is undefined', () => { - const query = buildQueryExceptions({ - query: 'host.name: *', - language: 'kuery', - lists: undefined, - }); - const expectedQuery = 'host.name: *'; - - expect(query).toEqual([{ query: expectedQuery, language: 'kuery' }]); - }); - test('it returns expected query when lists exist and language is "kuery"', () => { // Equal to query && !((b || !c || d) && e) -> ((query AND NOT b AND c AND NOT d) OR (query AND NOT e) // https://www.dcode.fr/boolean-expressions-calculator diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts index d4efd9a2e8a1a..233b20792299b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts @@ -3,13 +3,17 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { + ListAndOrUndefined, + Language, + Query, +} from '../../../../common/detection_engine/schemas/common/schemas'; import { ListOperator, ListValues, List, } from '../../../../common/detection_engine/schemas/types/lists_default_array'; -import { Query } from '../../../../../../../src/plugins/data/server'; -import { RuleAlertParams, Language } from '../types'; +import { Query as DataQuery } from '../../../../../../../src/plugins/data/server'; type Operators = 'and' | 'or' | 'not'; type LuceneOperators = 'AND' | 'OR' | 'NOT'; @@ -187,10 +191,10 @@ export const buildQueryExceptions = ({ language, lists, }: { - query: string; + query: Query; language: Language; - lists: RuleAlertParams['exceptionsList']; -}): Query[] => { + lists: ListAndOrUndefined; +}): DataQuery[] => { if (lists && lists !== null) { const exceptions = buildExceptions({ lists, language, query }); const formattedQuery = formatQuery({ exceptions, language, query }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.test.ts index b3586c884d0c7..eb87976a6fbab 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.test.ts @@ -6,7 +6,7 @@ import { buildRule } from './build_rule'; import { sampleRuleAlertParams, sampleRuleGuid } from './__mocks__/es_results'; -import { OutputRuleAlertRest } from '../types'; +import { RulesSchema } from '../../../../common/detection_engine/schemas/response/rules_schema'; describe('buildRule', () => { beforeEach(() => { @@ -40,7 +40,7 @@ describe('buildRule', () => { tags: ['some fake tag 1', 'some fake tag 2'], throttle: 'no_actions', }); - const expected: Partial = { + const expected: Partial = { actions: [], created_by: 'elastic', description: 'Detecting root and admin users', @@ -61,6 +61,7 @@ describe('buildRule', () => { rule_id: 'rule-1', severity: 'high', tags: ['some fake tag 1', 'some fake tag 2'], + threat: [], to: 'now', type: 'query', note: '', @@ -133,7 +134,7 @@ describe('buildRule', () => { tags: ['some fake tag 1', 'some fake tag 2'], throttle: 'no_actions', }); - const expected: Partial = { + const expected: Partial = { actions: [], created_by: 'elastic', description: 'Detecting root and admin users', @@ -154,6 +155,7 @@ describe('buildRule', () => { rule_id: 'rule-1', severity: 'high', tags: ['some fake tag 1', 'some fake tag 2'], + threat: [], to: 'now', type: 'query', note: '', @@ -215,7 +217,7 @@ describe('buildRule', () => { tags: ['some fake tag 1', 'some fake tag 2'], throttle: 'no_actions', }); - const expected: Partial = { + const expected: Partial = { actions: [], created_by: 'elastic', description: 'Detecting root and admin users', @@ -237,6 +239,7 @@ describe('buildRule', () => { rule_id: 'rule-1', severity: 'high', tags: ['some fake tag 1', 'some fake tag 2'], + threat: [], to: 'now', type: 'query', updated_by: 'elastic', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts index de8de1bc513e3..bde9c970b0c8c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts @@ -5,8 +5,9 @@ */ import { pickBy } from 'lodash/fp'; +import { RulesSchema } from '../../../../common/detection_engine/schemas/response/rules_schema'; import { RuleAlertAction } from '../../../../common/detection_engine/types'; -import { RuleTypeParams, OutputRuleAlertRest } from '../types'; +import { RuleTypeParams } from '../types'; interface BuildRuleParams { ruleParams: RuleTypeParams; @@ -36,10 +37,10 @@ export const buildRule = ({ interval, tags, throttle, -}: BuildRuleParams): Partial => { - return pickBy((value: unknown) => value != null, { +}: BuildRuleParams): Partial => { + return pickBy((value: unknown) => value != null, { id, - rule_id: ruleParams.ruleId, + rule_id: ruleParams.ruleId ?? '(unknown rule_id)', actions, false_positives: ruleParams.falsePositives, saved_id: ruleParams.savedId, @@ -67,12 +68,12 @@ export const buildRule = ({ filters: ruleParams.filters, created_by: createdBy, updated_by: updatedBy, - threat: ruleParams.threat, + threat: ruleParams.threat ?? [], throttle, version: ruleParams.version, created_at: createdAt, updated_at: updatedAt, - exceptions_list: ruleParams.exceptionsList, + exceptions_list: ruleParams.exceptionsList ?? [], machine_learning_job_id: ruleParams.machineLearningJobId, anomaly_threshold: ruleParams.anomalyThreshold, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_signal.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_signal.test.ts index f3f4ab60e4db6..6aebf8815659a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_signal.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_signal.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { sampleDocNoSortId, sampleRule } from './__mocks__/es_results'; +import { sampleDocNoSortId } from './__mocks__/es_results'; import { buildSignal, buildAncestor, @@ -13,6 +13,7 @@ import { } from './build_signal'; import { Signal, Ancestor } from './types'; import { INTERNAL_RULE_ID_KEY, INTERNAL_IMMUTABLE_KEY } from '../../../../common/constants'; +import { getPartialRulesSchemaMock } from '../../../../common/detection_engine/schemas/response/rules_schema.mocks'; describe('buildSignal', () => { beforeEach(() => { @@ -22,7 +23,7 @@ describe('buildSignal', () => { test('it builds a signal as expected without original_event if event does not exist', () => { const doc = sampleDocNoSortId('d5e8eb51-a6a0-456d-8a15-4b79bfec3d71'); delete doc._source.event; - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); const signal = buildSignal(doc, rule); const expected: Signal = { parent: { @@ -82,7 +83,7 @@ describe('buildSignal', () => { kind: 'event', module: 'system', }; - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); const signal = buildSignal(doc, rule); const expected: Signal = { parent: { @@ -148,7 +149,7 @@ describe('buildSignal', () => { kind: 'event', module: 'system', }; - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); rule.tags = [ 'some fake tag 1', 'some fake tag 2', @@ -220,7 +221,7 @@ describe('buildSignal', () => { kind: 'event', module: 'system', }; - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); const signal = buildAncestor(doc, rule); const expected: Ancestor = { rule: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', @@ -258,7 +259,7 @@ describe('buildSignal', () => { }, ], }; - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); const signal = buildAncestor(doc, rule); const expected: Ancestor = { rule: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', @@ -296,7 +297,7 @@ describe('buildSignal', () => { }, ], }; - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); rule.tags = [ 'some fake tag 1', 'some fake tag 2', @@ -323,7 +324,7 @@ describe('buildSignal', () => { kind: 'event', module: 'system', }; - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); const signal = buildAncestorsSignal(doc, rule); const expected: Ancestor[] = [ { @@ -363,7 +364,7 @@ describe('buildSignal', () => { }, ], }; - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); const signal = buildAncestorsSignal(doc, rule); const expected: Ancestor[] = [ { @@ -385,7 +386,7 @@ describe('buildSignal', () => { }); test('it removes internal tags from a typical rule', () => { - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); rule.tags = [ 'some fake tag 1', 'some fake tag 2', @@ -393,29 +394,29 @@ describe('buildSignal', () => { `${INTERNAL_IMMUTABLE_KEY}:true`, ]; const noInternals = removeInternalTagsFromRule(rule); - expect(noInternals).toEqual(sampleRule()); + expect(noInternals).toEqual(getPartialRulesSchemaMock()); }); test('it works with an empty array', () => { - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); rule.tags = []; const noInternals = removeInternalTagsFromRule(rule); - const expected = sampleRule(); + const expected = getPartialRulesSchemaMock(); expected.tags = []; expect(noInternals).toEqual(expected); }); test('it works if tags does not exist', () => { - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); delete rule.tags; const noInternals = removeInternalTagsFromRule(rule); - const expected = sampleRule(); + const expected = getPartialRulesSchemaMock(); delete expected.tags; expect(noInternals).toEqual(expected); }); test('it works if tags contains normal values and no internal values', () => { - const rule = sampleRule(); + const rule = getPartialRulesSchemaMock(); const noInternals = removeInternalTagsFromRule(rule); expect(noInternals).toEqual(rule); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_signal.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_signal.ts index a0551d75d2750..77a63c63ff97a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_signal.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_signal.ts @@ -4,14 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ +import { RulesSchema } from '../../../../common/detection_engine/schemas/response/rules_schema'; import { INTERNAL_IDENTIFIER } from '../../../../common/constants'; import { SignalSourceHit, Signal, Ancestor } from './types'; -import { OutputRuleAlertRest } from '../types'; -export const buildAncestor = ( - doc: SignalSourceHit, - rule: Partial -): Ancestor => { +export const buildAncestor = (doc: SignalSourceHit, rule: Partial): Ancestor => { const existingSignal = doc._source.signal?.parent; if (existingSignal != null) { return { @@ -34,7 +31,7 @@ export const buildAncestor = ( export const buildAncestorsSignal = ( doc: SignalSourceHit, - rule: Partial + rule: Partial ): Signal['ancestors'] => { const newAncestor = buildAncestor(doc, rule); const existingAncestors = doc._source.signal?.ancestors; @@ -45,7 +42,7 @@ export const buildAncestorsSignal = ( } }; -export const buildSignal = (doc: SignalSourceHit, rule: Partial): Signal => { +export const buildSignal = (doc: SignalSourceHit, rule: Partial): Signal => { const ruleWithoutInternalTags = removeInternalTagsFromRule(rule); const parent = buildAncestor(doc, rule); const ancestors = buildAncestorsSignal(doc, rule); @@ -62,13 +59,11 @@ export const buildSignal = (doc: SignalSourceHit, rule: Partial -): Partial => { +export const removeInternalTagsFromRule = (rule: Partial): Partial => { if (rule.tags == null) { return rule; } else { - const ruleWithoutInternalTags: Partial = { + const ruleWithoutInternalTags: Partial = { ...rule, tags: rule.tags.filter((tag) => !tag.startsWith(INTERNAL_IDENTIFIER)), }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.test.ts index d56e167f59e4c..4e9eb8587484f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.test.ts @@ -21,11 +21,11 @@ describe('filterEventsAgainstList', () => { listClient.getListItemByValues = jest.fn().mockResolvedValue([]); }); - it('should respond with eventSearchResult if exceptionList is empty', async () => { + it('should respond with eventSearchResult if exceptionList is empty array', async () => { const res = await filterEventsAgainstList({ logger: mockLogger, listClient, - exceptionsList: undefined, + exceptionsList: [], eventSearchResult: repeatedSearchResultsWithSortId(4, 4, someGuids.slice(0, 3), [ '1.1.1.1', '2.2.2.2', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts index 29b8b54d162df..48b120d1b5806 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts @@ -6,15 +6,15 @@ import { get } from 'lodash/fp'; import { Logger } from 'src/core/server'; +import { ListAndOrUndefined } from '../../../../common/detection_engine/schemas/common/schemas'; import { List } from '../../../../common/detection_engine/schemas/types/lists_default_array'; import { type } from '../../../../../lists/common/schemas/common'; import { ListClient } from '../../../../../lists/server'; import { SignalSearchResponse, SearchTypes } from './types'; -import { RuleAlertParams } from '../types'; interface FilterEventsAgainstList { listClient: ListClient; - exceptionsList: RuleAlertParams['exceptionsList']; + exceptionsList: ListAndOrUndefined; logger: Logger; eventSearchResult: SignalSearchResponse; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.test.ts index 0930fbdb534f5..b1500e47db843 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.test.ts @@ -449,20 +449,6 @@ describe('get_filter', () => { }); }); - test('it should work when lists has value null', () => { - const esQuery = getQueryFilter('host.name: linux', 'kuery', [], ['auditbeat-*'], null); - expect(esQuery).toEqual({ - bool: { - filter: [ - { bool: { minimum_should_match: 1, should: [{ match: { 'host.name': 'linux' } }] } }, - ], - must: [], - must_not: [], - should: [], - }, - }); - }); - test('it should work when lists has value undefined', () => { const esQuery = getQueryFilter('host.name: linux', 'kuery', [], ['auditbeat-*'], undefined); expect(esQuery).toEqual({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts index c464238715afd..3e9f79c67d8ca 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts @@ -4,32 +4,43 @@ * you may not use this file except in compliance with the Elastic License. */ +import { + LanguageOrUndefined, + QueryOrUndefined, + Type, + SavedIdOrUndefined, + IndexOrUndefined, + ListAndOrUndefined, + Language, + Index, + Query, +} from '../../../../common/detection_engine/schemas/common/schemas'; import { AlertServices } from '../../../../../alerts/server'; import { assertUnreachable } from '../../../utils/build_query'; import { Filter, - Query, + Query as DataQuery, esQuery, esFilters, IIndexPattern, } from '../../../../../../../src/plugins/data/server'; -import { PartialFilter, RuleAlertParams, Language } from '../types'; +import { PartialFilter } from '../types'; import { BadRequestError } from '../errors/bad_request_error'; import { buildQueryExceptions } from './build_exceptions_query'; export const getQueryFilter = ( - query: string, + query: Query, language: Language, filters: PartialFilter[], - index: string[], - lists: RuleAlertParams['exceptionsList'] + index: Index, + lists: ListAndOrUndefined ) => { const indexPattern = { fields: [], title: index.join(), } as IIndexPattern; - const queries: Query[] = buildQueryExceptions({ query, language, lists }); + const queries: DataQuery[] = buildQueryExceptions({ query, language, lists }); const config = { allowLeadingWildcards: true, @@ -46,14 +57,14 @@ export const getQueryFilter = ( }; interface GetFilterArgs { - type: RuleAlertParams['type']; - filters: PartialFilter[] | undefined | null; - language: Language | undefined | null; - query: string | undefined | null; - savedId: string | undefined | null; + type: Type; + filters: PartialFilter[] | undefined; + language: LanguageOrUndefined; + query: QueryOrUndefined; + savedId: SavedIdOrUndefined; services: AlertServices; - index: string[] | undefined | null; - lists: RuleAlertParams['exceptionsList']; + index: IndexOrUndefined; + lists: ListAndOrUndefined; } interface QueryAttributes { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/rule_status_service.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/rule_status_service.ts index 9430dfe7bfe23..0f4b8d1472b3f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/rule_status_service.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/rule_status_service.ts @@ -4,8 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ +import { JobStatus } from '../../../../common/detection_engine/schemas/common/schemas'; import { assertUnreachable } from '../../../utils/build_query'; -import { IRuleStatusAttributes, RuleStatusString } from '../rules/types'; +import { IRuleStatusAttributes } from '../rules/types'; import { getOrCreateRuleStatuses } from './get_or_create_rule_statuses'; import { RuleStatusSavedObjectsClient } from './rule_status_saved_objects_client'; @@ -26,7 +27,7 @@ export interface RuleStatusService { } export const buildRuleStatusAttributes: ( - status: RuleStatusString, + status: JobStatus, message?: string, attributes?: Attributes ) => Partial = (status, message, attributes = {}) => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts index b7bea906475db..42893a199a8f1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts @@ -4,10 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ +import { ListAndOrUndefined } from '../../../../common/detection_engine/schemas/common/schemas'; import { AlertServices } from '../../../../../alerts/server'; import { ListClient } from '../../../../../lists/server'; import { RuleAlertAction } from '../../../../common/detection_engine/types'; -import { RuleTypeParams, RefreshTypes, RuleAlertParams } from '../types'; +import { RuleTypeParams, RefreshTypes } from '../types'; import { Logger } from '../../../../../../../src/core/server'; import { singleSearchAfter } from './single_search_after'; import { singleBulkCreate } from './single_bulk_create'; @@ -18,7 +19,7 @@ interface SearchAfterAndBulkCreateParams { ruleParams: RuleTypeParams; services: AlertServices; listClient: ListClient | undefined; // TODO: undefined is for temporary development, remove before merged - exceptionsList: RuleAlertParams['exceptionsList']; + exceptionsList: ListAndOrUndefined; logger: Logger; id: string; inputIndexPattern: string[]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts index d42ba8fe57005..461b2589babcc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts @@ -4,40 +4,43 @@ * you may not use this file except in compliance with the Elastic License. */ -import { schema } from '@kbn/config-schema'; +import { schema, TypeOf } from '@kbn/config-schema'; import { DEFAULT_MAX_SIGNALS } from '../../../../common/constants'; +const signalSchema = schema.object({ + anomalyThreshold: schema.maybe(schema.number()), + description: schema.string(), + note: schema.nullable(schema.string()), + falsePositives: schema.arrayOf(schema.string(), { defaultValue: [] }), + from: schema.string(), + ruleId: schema.string(), + immutable: schema.boolean({ defaultValue: false }), + index: schema.nullable(schema.arrayOf(schema.string())), + language: schema.nullable(schema.string()), + outputIndex: schema.nullable(schema.string()), + savedId: schema.nullable(schema.string()), + timelineId: schema.nullable(schema.string()), + timelineTitle: schema.nullable(schema.string()), + meta: schema.nullable(schema.object({}, { unknowns: 'allow' })), + machineLearningJobId: schema.maybe(schema.string()), + query: schema.nullable(schema.string()), + filters: schema.nullable(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), + maxSignals: schema.number({ defaultValue: DEFAULT_MAX_SIGNALS }), + riskScore: schema.number(), + severity: schema.string(), + threat: schema.nullable(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), + to: schema.string(), + type: schema.string(), + references: schema.arrayOf(schema.string(), { defaultValue: [] }), + version: schema.number({ defaultValue: 1 }), + exceptionsList: schema.maybe(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), +}); + /** * This is the schema for the Alert Rule that represents the SIEM alert for signals * that index into the .siem-signals-${space-id} */ -export const signalParamsSchema = () => - schema.object({ - anomalyThreshold: schema.maybe(schema.number()), - description: schema.string(), - note: schema.nullable(schema.string()), - falsePositives: schema.arrayOf(schema.string(), { defaultValue: [] }), - from: schema.string(), - ruleId: schema.string(), - immutable: schema.boolean({ defaultValue: false }), - index: schema.nullable(schema.arrayOf(schema.string())), - language: schema.nullable(schema.string()), - outputIndex: schema.nullable(schema.string()), - savedId: schema.nullable(schema.string()), - timelineId: schema.nullable(schema.string()), - timelineTitle: schema.nullable(schema.string()), - meta: schema.nullable(schema.object({}, { unknowns: 'allow' })), - machineLearningJobId: schema.maybe(schema.string()), - query: schema.nullable(schema.string()), - filters: schema.nullable(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), - maxSignals: schema.number({ defaultValue: DEFAULT_MAX_SIGNALS }), - riskScore: schema.number(), - severity: schema.string(), - threat: schema.nullable(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), - to: schema.string(), - type: schema.string(), - references: schema.arrayOf(schema.string(), { defaultValue: [] }), - version: schema.number({ defaultValue: 1 }), - exceptionsList: schema.maybe(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), - }); +export const signalParamsSchema = () => signalSchema; + +export type SignalParamsSchema = TypeOf; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.test.ts index f94eb7006829e..a2dc33ba1c2bf 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.test.ts @@ -39,8 +39,6 @@ const getPayload = (ruleAlert: RuleAlertType, services: AlertServicesMock) => ({ name: ruleAlert.name, tags: ruleAlert.tags, throttle: ruleAlert.throttle, - scrollSize: 10, - scrollLock: '0', }, state: {}, spaceId: '', @@ -105,7 +103,7 @@ describe('rules_notification_alert_type', () => { attributes: ruleAlert, }); - payload = getPayload(ruleAlert, alertServices); + payload = getPayload(ruleAlert, alertServices) as jest.Mocked; alert = signalRulesAlertType({ logger, @@ -196,7 +194,7 @@ describe('rules_notification_alert_type', () => { describe('ML rule', () => { it('should throw an error if ML plugin was not available', async () => { const ruleAlert = getMlResult(); - payload = getPayload(ruleAlert, alertServices); + payload = getPayload(ruleAlert, alertServices) as jest.Mocked; alert = signalRulesAlertType({ logger, version, @@ -213,7 +211,7 @@ describe('rules_notification_alert_type', () => { it('should throw an error if machineLearningJobId or anomalyThreshold was not null', async () => { const ruleAlert = getMlResult(); ruleAlert.params.anomalyThreshold = undefined; - payload = getPayload(ruleAlert, alertServices); + payload = getPayload(ruleAlert, alertServices) as jest.Mocked; await alert.executor(payload); expect(logger.error).toHaveBeenCalled(); expect(logger.error.mock.calls[0][0]).toContain( @@ -223,7 +221,7 @@ describe('rules_notification_alert_type', () => { it('should throw an error if Machine learning job summary was null', async () => { const ruleAlert = getMlResult(); - payload = getPayload(ruleAlert, alertServices); + payload = getPayload(ruleAlert, alertServices) as jest.Mocked; jobsSummaryMock.mockResolvedValue([]); await alert.executor(payload); expect(logger.warn).toHaveBeenCalled(); @@ -236,7 +234,7 @@ describe('rules_notification_alert_type', () => { it('should log an error if Machine learning job was not started', async () => { const ruleAlert = getMlResult(); - payload = getPayload(ruleAlert, alertServices); + payload = getPayload(ruleAlert, alertServices) as jest.Mocked; jobsSummaryMock.mockResolvedValue([ { id: 'some_job_id', @@ -260,7 +258,7 @@ describe('rules_notification_alert_type', () => { it('should not call ruleStatusService.success if no anomalies were found', async () => { const ruleAlert = getMlResult(); - payload = getPayload(ruleAlert, alertServices); + payload = getPayload(ruleAlert, alertServices) as jest.Mocked; jobsSummaryMock.mockResolvedValue([]); (findMlSignals as jest.Mock).mockResolvedValue({ hits: { @@ -278,7 +276,7 @@ describe('rules_notification_alert_type', () => { it('should call ruleStatusService.success if signals were created', async () => { const ruleAlert = getMlResult(); - payload = getPayload(ruleAlert, alertServices); + payload = getPayload(ruleAlert, alertServices) as jest.Mocked; jobsSummaryMock.mockResolvedValue([ { id: 'some_job_id', @@ -313,7 +311,7 @@ describe('rules_notification_alert_type', () => { id: '99403909-ca9b-49ba-9d7a-7e5320e68d05', }, ]; - payload = getPayload(ruleAlert, alertServices); + payload = getPayload(ruleAlert, alertServices) as jest.Mocked; alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', type: 'type', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts index 567274be6a9f8..091ee54e3174e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts @@ -275,7 +275,7 @@ export const signalRulesAlertType = ({ from: fromInMs, to: toInMs, id: savedObject.id, - kibanaSiemAppUrl: meta?.kibana_siem_app_url, + kibanaSiemAppUrl: (meta as { kibana_siem_app_url?: string }).kibana_siem_app_url, }); logger.info( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts index 869c81f640561..082211df28320 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts @@ -4,21 +4,23 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Status } from '../../../../common/detection_engine/schemas/common/schemas'; +import { RulesSchema } from '../../../../common/detection_engine/schemas/response/rules_schema'; import { AlertType, State, AlertExecutorOptions } from '../../../../../alerts/server'; import { RuleAlertAction } from '../../../../common/detection_engine/types'; -import { RuleAlertParams, OutputRuleAlertRest } from '../types'; +import { RuleTypeParams } from '../types'; import { SearchResponse } from '../../types'; export interface SignalsParams { signalIds: string[] | undefined | null; query: object | undefined | null; - status: 'open' | 'closed'; + status: Status; } export interface SignalsStatusParams { signalIds: string[] | undefined | null; query: object | undefined | null; - status: 'open' | 'closed'; + status: Status; } export type SearchTypes = @@ -91,10 +93,7 @@ export type SignalSearchResponse = SearchResponse; export type SignalSourceHit = SignalSearchResponse['hits']['hits'][number]; export type RuleExecutorOptions = Omit & { - params: RuleAlertParams & { - scrollSize: number; - scrollLock: string; - }; + params: RuleTypeParams; }; // This returns true because by default a RuleAlertTypeDefinition is an AlertType @@ -116,12 +115,12 @@ export interface Ancestor { } export interface Signal { - rule: Partial; + rule: Partial; parent: Ancestor; ancestors: Ancestor[]; original_time: string; original_event?: SearchTypes; - status: 'open' | 'closed'; + status: Status; } export interface SignalHit { @@ -145,12 +144,7 @@ export interface AlertAttributes { } export interface RuleAlertAttributes extends AlertAttributes { - params: Omit< - RuleAlertParams, - 'ruleId' | 'name' | 'enabled' | 'interval' | 'tags' | 'actions' | 'throttle' - > & { - ruleId: string; - }; + params: RuleTypeParams; } export type BulkResponseErrorAggregation = Record; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts index 9062de49fa6ce..6e284908e3358 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts @@ -4,131 +4,67 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ListsDefaultArraySchema } from '../../../common/detection_engine/schemas/types/lists_default_array'; +import { + AnomalyThresholdOrUndefined, + Description, + NoteOrUndefined, + ThreatOrUndefined, + FalsePositives, + From, + Immutable, + IndexOrUndefined, + LanguageOrUndefined, + MaxSignals, + MachineLearningJobIdOrUndefined, + RiskScore, + OutputIndex, + QueryOrUndefined, + References, + SavedIdOrUndefined, + Severity, + To, + TimelineIdOrUndefined, + TimelineTitleOrUndefined, + Version, + MetaOrUndefined, + RuleId, + ListAndOrUndefined, +} from '../../../common/detection_engine/schemas/common/schemas'; import { CallAPIOptions } from '../../../../../../src/core/server'; import { Filter } from '../../../../../../src/plugins/data/server'; -import { IRuleStatusAttributes } from './rules/types'; -import { RuleAlertAction, RuleType } from '../../../common/detection_engine/types'; +import { RuleType } from '../../../common/detection_engine/types'; export type PartialFilter = Partial; -export interface IMitreAttack { - id: string; - name: string; - reference: string; -} - -export interface ThreatParams { - framework: string; - tactic: IMitreAttack; - technique: IMitreAttack[]; -} - -// Notice below we are using lists: ListsAndArraySchema[]; which is coming directly from the response output section. -// TODO: Eventually this whole RuleAlertParams will be replaced with io-ts. For now we can slowly strangle it out and reduce duplicate types -// We don't have the input types defined through io-ts just yet but as we being introducing types from there we will more and more remove -// types and share them between input and output schema but have an input Rule Schema and an output Rule Schema. - -export interface Meta { - [key: string]: {} | string | undefined | null; - kibana_siem_app_url?: string | undefined; -} - -export type Language = 'kuery' | 'lucene'; - -export interface RuleAlertParams { - actions: RuleAlertAction[]; - anomalyThreshold: number | undefined; - description: string; - note: string | undefined | null; - enabled: boolean; - falsePositives: string[]; - filters: PartialFilter[] | undefined | null; - from: string; - immutable: boolean; - index: string[] | undefined | null; - interval: string; - ruleId: string | undefined | null; - language: Language | undefined | null; - maxSignals: number; - machineLearningJobId: string | undefined; - riskScore: number; - outputIndex: string; - name: string; - query: string | undefined | null; - references: string[]; - savedId?: string | undefined | null; - meta: Meta | undefined | null; - severity: string; - tags: string[]; - to: string; - timelineId: string | undefined | null; - timelineTitle: string | undefined | null; - threat: ThreatParams[] | undefined | null; +export interface RuleTypeParams { + anomalyThreshold: AnomalyThresholdOrUndefined; + description: Description; + note: NoteOrUndefined; + falsePositives: FalsePositives; + from: From; + ruleId: RuleId; + immutable: Immutable; + index: IndexOrUndefined; + language: LanguageOrUndefined; + outputIndex: OutputIndex; + savedId: SavedIdOrUndefined; + timelineId: TimelineIdOrUndefined; + timelineTitle: TimelineTitleOrUndefined; + meta: MetaOrUndefined; + machineLearningJobId: MachineLearningJobIdOrUndefined; + query: QueryOrUndefined; + filters: PartialFilter[] | undefined; + maxSignals: MaxSignals; + riskScore: RiskScore; + severity: Severity; + threat: ThreatOrUndefined; + to: To; type: RuleType; - version: number; - throttle: string | undefined | null; - exceptionsList: ListsDefaultArraySchema | null | undefined; + references: References; + version: Version; + exceptionsList: ListAndOrUndefined; } -export type RuleTypeParams = Omit< - RuleAlertParams, - 'name' | 'enabled' | 'interval' | 'tags' | 'actions' | 'throttle' ->; - -export type RuleAlertParamsRest = Omit< - RuleAlertParams, - | 'anomalyThreshold' - | 'ruleId' - | 'falsePositives' - | 'immutable' - | 'maxSignals' - | 'exceptionsList' - | 'machineLearningJobId' - | 'savedId' - | 'riskScore' - | 'timelineId' - | 'timelineTitle' - | 'outputIndex' -> & - Omit< - IRuleStatusAttributes, - | 'status' - | 'alertId' - | 'statusDate' - | 'lastFailureAt' - | 'lastSuccessAt' - | 'lastSuccessMessage' - | 'lastFailureMessage' - > & { - anomaly_threshold: RuleAlertParams['anomalyThreshold']; - exceptions_list: RuleAlertParams['exceptionsList']; - rule_id: RuleAlertParams['ruleId']; - false_positives: RuleAlertParams['falsePositives']; - saved_id?: RuleAlertParams['savedId']; - timeline_id: RuleAlertParams['timelineId']; - timeline_title: RuleAlertParams['timelineTitle']; - max_signals: RuleAlertParams['maxSignals']; - machine_learning_job_id: RuleAlertParams['machineLearningJobId']; - risk_score: RuleAlertParams['riskScore']; - output_index: RuleAlertParams['outputIndex']; - created_at: string; - updated_at: string; - status?: IRuleStatusAttributes['status'] | undefined; - status_date?: IRuleStatusAttributes['statusDate'] | undefined; - last_failure_at?: IRuleStatusAttributes['lastFailureAt'] | undefined; - last_success_at?: IRuleStatusAttributes['lastSuccessAt'] | undefined; - last_failure_message?: IRuleStatusAttributes['lastFailureMessage'] | undefined; - last_success_message?: IRuleStatusAttributes['lastSuccessMessage'] | undefined; - }; - -export type OutputRuleAlertRest = RuleAlertParamsRest & { - id: string; - created_by: string | undefined | null; - updated_by: string | undefined | null; - immutable: boolean; -}; - // eslint-disable-next-line @typescript-eslint/no-explicit-any export type CallWithRequest, V> = ( endpoint: string, diff --git a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts index ca2f881d6abd8..a1902202d983d 100644 --- a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts +++ b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ import { transformDataToNdjson } from './create_stream_from_ndjson'; -import { sampleRule } from '../../lib/detection_engine/signals/__mocks__/es_results'; import { ImportRulesSchemaDecoded } from '../../../common/detection_engine/schemas/request/import_rules_schema'; +import { getRulesSchemaMock } from '../../../common/detection_engine/schemas/response/rules_schema.mocks'; export const getOutputSample = (): Partial => ({ rule_id: 'rule-1', @@ -33,14 +33,14 @@ describe('create_rules_stream_from_ndjson', () => { }); test('single rule will transform with new line ending character for ndjson', () => { - const rule = sampleRule(); + const rule = getRulesSchemaMock(); const ruleNdjson = transformDataToNdjson([rule]); expect(ruleNdjson.endsWith('\n')).toBe(true); }); test('multiple rules will transform with two new line ending characters for ndjson', () => { - const result1 = sampleRule(); - const result2 = sampleRule(); + const result1 = getRulesSchemaMock(); + const result2 = getRulesSchemaMock(); result2.id = 'some other id'; result2.rule_id = 'some other id'; result2.name = 'Some other rule'; @@ -52,8 +52,8 @@ describe('create_rules_stream_from_ndjson', () => { }); test('you can parse two rules back out without errors', () => { - const result1 = sampleRule(); - const result2 = sampleRule(); + const result1 = getRulesSchemaMock(); + const result2 = getRulesSchemaMock(); result2.id = 'some other id'; result2.rule_id = 'some other id'; result2.name = 'Some other rule'; diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts index 127f688dfbc28..9cda6271d427f 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts @@ -12,12 +12,12 @@ import { createSignalsIndex, deleteAllAlerts, deleteSignalsIndex, - getSimpleRule, getSimpleRuleOutput, removeServerGeneratedProperties, removeServerGeneratedPropertiesIncludingRuleId, getSimpleRuleOutputWithoutRuleId, - getSimpleMlRule, + getSimpleRuleUpdate, + getSimpleMlRuleUpdate, } from '../../utils'; // eslint-disable-next-line import/no-default-export @@ -41,11 +41,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's name - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.rule_id = 'rule-1'; updatedRule.name = 'some other name'; delete updatedRule.id; @@ -68,11 +68,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's type to try to be a machine learning job type - const updatedRule = getSimpleMlRule('rule-1'); + const updatedRule = getSimpleMlRuleUpdate('rule-1'); updatedRule.rule_id = 'rule-1'; updatedRule.name = 'some other name'; delete updatedRule.id; @@ -90,7 +90,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should update a single rule property of name using an auto-generated rule_id', async () => { - const rule = getSimpleRule('rule-1'); + const rule = getSimpleRuleUpdate('rule-1'); delete rule.rule_id; // create a simple rule const { body: createRuleBody } = await supertest @@ -100,7 +100,7 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); // update a simple rule's name - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.rule_id = createRuleBody.rule_id; updatedRule.name = 'some other name'; delete updatedRule.id; @@ -123,11 +123,11 @@ export default ({ getService }: FtrProviderContext) => { const { body: createdBody } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's name - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.name = 'some other name'; updatedRule.id = createdBody.id; delete updatedRule.rule_id; @@ -150,11 +150,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's enabled to false and another property - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.severity = 'low'; updatedRule.enabled = false; @@ -178,10 +178,10 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.timeline_title = 'some title'; ruleUpdate.timeline_id = 'some id'; @@ -192,7 +192,7 @@ export default ({ getService }: FtrProviderContext) => { .send(ruleUpdate) .expect(200); - const ruleUpdate2 = getSimpleRule('rule-1'); + const ruleUpdate2 = getSimpleRuleUpdate('rule-1'); ruleUpdate2.name = 'some other name'; // update a simple rule's name @@ -211,7 +211,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should give a 404 if it is given a fake id', async () => { - const simpleRule = getSimpleRule(); + const simpleRule = getSimpleRuleUpdate(); simpleRule.id = '5096dec6-b6b9-4d8d-8f93-6c2602079d9d'; delete simpleRule.rule_id; @@ -228,7 +228,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should give a 404 if it is given a fake rule_id', async () => { - const simpleRule = getSimpleRule(); + const simpleRule = getSimpleRuleUpdate(); simpleRule.rule_id = 'fake_id'; delete simpleRule.id; diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts index 54f29939fb6b4..24eee8deaf3d4 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts @@ -12,11 +12,11 @@ import { createSignalsIndex, deleteAllAlerts, deleteSignalsIndex, - getSimpleRule, getSimpleRuleOutput, removeServerGeneratedProperties, getSimpleRuleOutputWithoutRuleId, removeServerGeneratedPropertiesIncludingRuleId, + getSimpleRuleUpdate, } from '../../utils'; // eslint-disable-next-line import/no-default-export @@ -40,10 +40,10 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.name = 'some other name'; // update a simple rule's name @@ -65,20 +65,20 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // create a second simple rule await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-2')) + .send(getSimpleRuleUpdate('rule-2')) .expect(200); - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.name = 'some other name'; - const updatedRule2 = getSimpleRule('rule-2'); + const updatedRule2 = getSimpleRuleUpdate('rule-2'); updatedRule2.name = 'some other name'; // update both rule names @@ -107,11 +107,11 @@ export default ({ getService }: FtrProviderContext) => { const { body: createRuleBody } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's name - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.id = createRuleBody.id; updatedRule1.name = 'some other name'; delete updatedRule1.rule_id; @@ -134,23 +134,23 @@ export default ({ getService }: FtrProviderContext) => { const { body: createRule1 } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // create a second simple rule const { body: createRule2 } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-2')) + .send(getSimpleRuleUpdate('rule-2')) .expect(200); // update both rule names - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.id = createRule1.id; updatedRule1.name = 'some other name'; delete updatedRule1.rule_id; - const updatedRule2 = getSimpleRule('rule-1'); + const updatedRule2 = getSimpleRuleUpdate('rule-1'); updatedRule2.id = createRule2.id; updatedRule2.name = 'some other name'; delete updatedRule2.rule_id; @@ -180,11 +180,11 @@ export default ({ getService }: FtrProviderContext) => { const { body: createdBody } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's name - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.id = createdBody.id; updatedRule1.name = 'some other name'; delete updatedRule1.rule_id; @@ -207,11 +207,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's enabled to false and another property - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.severity = 'low'; updatedRule1.enabled = false; @@ -235,11 +235,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's timeline_title - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.timeline_title = 'some title'; ruleUpdate.timeline_id = 'some id'; @@ -250,7 +250,7 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); // update a simple rule's name - const ruleUpdate2 = getSimpleRule('rule-1'); + const ruleUpdate2 = getSimpleRuleUpdate('rule-1'); ruleUpdate2.name = 'some other name'; const { body } = await supertest @@ -268,7 +268,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should return a 200 but give a 404 in the message if it is given a fake id', async () => { - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.id = '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5'; delete ruleUpdate.rule_id; @@ -290,7 +290,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should return a 200 but give a 404 in the message if it is given a fake rule_id', async () => { - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.rule_id = 'fake_id'; delete ruleUpdate.id; @@ -313,14 +313,14 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.name = 'some other name'; delete ruleUpdate.id; - const ruleUpdate2 = getSimpleRule('fake_id'); + const ruleUpdate2 = getSimpleRuleUpdate('fake_id'); ruleUpdate2.name = 'some other name'; delete ruleUpdate.id; @@ -353,16 +353,16 @@ export default ({ getService }: FtrProviderContext) => { const { body: createdBody } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update one rule name and give a fake id for the second - const rule1 = getSimpleRule(); + const rule1 = getSimpleRuleUpdate(); delete rule1.rule_id; rule1.id = createdBody.id; rule1.name = 'some other name'; - const rule2 = getSimpleRule(); + const rule2 = getSimpleRuleUpdate(); delete rule2.rule_id; rule2.id = 'b3aa019a-656c-4311-b13b-4d9852e24347'; rule2.name = 'some other name'; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts index 0b1b49e379d17..279158f09f273 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts @@ -12,13 +12,14 @@ import { createSignalsIndex, deleteAllAlerts, deleteSignalsIndex, - getSimpleRule, getSimpleRuleOutput, removeServerGeneratedProperties, removeServerGeneratedPropertiesIncludingRuleId, getSimpleRuleOutputWithoutRuleId, getSimpleMlRule, getSimpleMlRuleOutput, + getSimpleRuleUpdate, + getSimpleMlRuleUpdate, } from '../../utils'; // eslint-disable-next-line import/no-default-export @@ -42,11 +43,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's name - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.rule_id = 'rule-1'; updatedRule.name = 'some other name'; delete updatedRule.id; @@ -73,7 +74,7 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); // update a simple rule's name - const updatedRule = getSimpleMlRule('rule-1'); + const updatedRule = getSimpleMlRuleUpdate('rule-1'); updatedRule.rule_id = 'rule-1'; updatedRule.name = 'some other name'; delete updatedRule.id; @@ -92,7 +93,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should update a single rule property of name using an auto-generated rule_id', async () => { - const rule = getSimpleRule('rule-1'); + const rule = getSimpleRuleUpdate('rule-1'); delete rule.rule_id; // create a simple rule const { body: createRuleBody } = await supertest @@ -102,7 +103,7 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); // update a simple rule's name - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.rule_id = createRuleBody.rule_id; updatedRule.name = 'some other name'; delete updatedRule.id; @@ -125,11 +126,11 @@ export default ({ getService }: FtrProviderContext) => { const { body: createdBody } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's name - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.name = 'some other name'; updatedRule.id = createdBody.id; delete updatedRule.rule_id; @@ -152,11 +153,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's enabled to false and another property - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.severity = 'low'; updatedRule.enabled = false; @@ -180,10 +181,10 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.timeline_title = 'some title'; ruleUpdate.timeline_id = 'some id'; @@ -194,7 +195,7 @@ export default ({ getService }: FtrProviderContext) => { .send(ruleUpdate) .expect(200); - const ruleUpdate2 = getSimpleRule('rule-1'); + const ruleUpdate2 = getSimpleRuleUpdate('rule-1'); ruleUpdate2.name = 'some other name'; // update a simple rule's name @@ -213,7 +214,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should give a 404 if it is given a fake id', async () => { - const simpleRule = getSimpleRule(); + const simpleRule = getSimpleRuleUpdate(); simpleRule.id = '5096dec6-b6b9-4d8d-8f93-6c2602079d9d'; delete simpleRule.rule_id; @@ -230,7 +231,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should give a 404 if it is given a fake rule_id', async () => { - const simpleRule = getSimpleRule(); + const simpleRule = getSimpleRuleUpdate(); simpleRule.rule_id = 'fake_id'; delete simpleRule.id; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts index 54f29939fb6b4..24eee8deaf3d4 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts @@ -12,11 +12,11 @@ import { createSignalsIndex, deleteAllAlerts, deleteSignalsIndex, - getSimpleRule, getSimpleRuleOutput, removeServerGeneratedProperties, getSimpleRuleOutputWithoutRuleId, removeServerGeneratedPropertiesIncludingRuleId, + getSimpleRuleUpdate, } from '../../utils'; // eslint-disable-next-line import/no-default-export @@ -40,10 +40,10 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); - const updatedRule = getSimpleRule('rule-1'); + const updatedRule = getSimpleRuleUpdate('rule-1'); updatedRule.name = 'some other name'; // update a simple rule's name @@ -65,20 +65,20 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // create a second simple rule await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-2')) + .send(getSimpleRuleUpdate('rule-2')) .expect(200); - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.name = 'some other name'; - const updatedRule2 = getSimpleRule('rule-2'); + const updatedRule2 = getSimpleRuleUpdate('rule-2'); updatedRule2.name = 'some other name'; // update both rule names @@ -107,11 +107,11 @@ export default ({ getService }: FtrProviderContext) => { const { body: createRuleBody } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's name - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.id = createRuleBody.id; updatedRule1.name = 'some other name'; delete updatedRule1.rule_id; @@ -134,23 +134,23 @@ export default ({ getService }: FtrProviderContext) => { const { body: createRule1 } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // create a second simple rule const { body: createRule2 } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-2')) + .send(getSimpleRuleUpdate('rule-2')) .expect(200); // update both rule names - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.id = createRule1.id; updatedRule1.name = 'some other name'; delete updatedRule1.rule_id; - const updatedRule2 = getSimpleRule('rule-1'); + const updatedRule2 = getSimpleRuleUpdate('rule-1'); updatedRule2.id = createRule2.id; updatedRule2.name = 'some other name'; delete updatedRule2.rule_id; @@ -180,11 +180,11 @@ export default ({ getService }: FtrProviderContext) => { const { body: createdBody } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's name - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.id = createdBody.id; updatedRule1.name = 'some other name'; delete updatedRule1.rule_id; @@ -207,11 +207,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's enabled to false and another property - const updatedRule1 = getSimpleRule('rule-1'); + const updatedRule1 = getSimpleRuleUpdate('rule-1'); updatedRule1.severity = 'low'; updatedRule1.enabled = false; @@ -235,11 +235,11 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update a simple rule's timeline_title - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.timeline_title = 'some title'; ruleUpdate.timeline_id = 'some id'; @@ -250,7 +250,7 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); // update a simple rule's name - const ruleUpdate2 = getSimpleRule('rule-1'); + const ruleUpdate2 = getSimpleRuleUpdate('rule-1'); ruleUpdate2.name = 'some other name'; const { body } = await supertest @@ -268,7 +268,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should return a 200 but give a 404 in the message if it is given a fake id', async () => { - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.id = '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5'; delete ruleUpdate.rule_id; @@ -290,7 +290,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should return a 200 but give a 404 in the message if it is given a fake rule_id', async () => { - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.rule_id = 'fake_id'; delete ruleUpdate.id; @@ -313,14 +313,14 @@ export default ({ getService }: FtrProviderContext) => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); - const ruleUpdate = getSimpleRule('rule-1'); + const ruleUpdate = getSimpleRuleUpdate('rule-1'); ruleUpdate.name = 'some other name'; delete ruleUpdate.id; - const ruleUpdate2 = getSimpleRule('fake_id'); + const ruleUpdate2 = getSimpleRuleUpdate('fake_id'); ruleUpdate2.name = 'some other name'; delete ruleUpdate.id; @@ -353,16 +353,16 @@ export default ({ getService }: FtrProviderContext) => { const { body: createdBody } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(getSimpleRule('rule-1')) + .send(getSimpleRuleUpdate('rule-1')) .expect(200); // update one rule name and give a fake id for the second - const rule1 = getSimpleRule(); + const rule1 = getSimpleRuleUpdate(); delete rule1.rule_id; rule1.id = createdBody.id; rule1.name = 'some other name'; - const rule2 = getSimpleRule(); + const rule2 = getSimpleRuleUpdate(); delete rule2.rule_id; rule2.id = 'b3aa019a-656c-4311-b13b-4d9852e24347'; rule2.name = 'some other name'; diff --git a/x-pack/test/detection_engine_api_integration/utils.ts b/x-pack/test/detection_engine_api_integration/utils.ts index b4330ce5d3912..5f0a8cd938408 100644 --- a/x-pack/test/detection_engine_api_integration/utils.ts +++ b/x-pack/test/detection_engine_api_integration/utils.ts @@ -7,7 +7,9 @@ import { Client } from '@elastic/elasticsearch'; import { SuperTest } from 'supertest'; import supertestAsPromised from 'supertest-as-promised'; -import { OutputRuleAlertRest } from '../../plugins/security_solution/server/lib/detection_engine/types'; +import { CreateRulesSchema } from '../../plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema'; +import { UpdateRulesSchema } from '../../plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema'; +import { RulesSchema } from '../../plugins/security_solution/common/detection_engine/schemas/response/rules_schema'; import { DETECTION_ENGINE_INDEX_URL } from '../../plugins/security_solution/common/constants'; /** @@ -15,8 +17,8 @@ import { DETECTION_ENGINE_INDEX_URL } from '../../plugins/security_solution/comm * @param rule Rule to pass in to remove typical server generated properties */ export const removeServerGeneratedProperties = ( - rule: Partial -): Partial => { + rule: Partial +): Partial => { const { created_at, updated_at, @@ -37,8 +39,8 @@ export const removeServerGeneratedProperties = ( * @param rule Rule to pass in to remove typical server generated properties */ export const removeServerGeneratedPropertiesIncludingRuleId = ( - rule: Partial -): Partial => { + rule: Partial +): Partial => { const ruleWithRemovedProperties = removeServerGeneratedProperties(rule); const { rule_id, ...additionalRuledIdRemoved } = ruleWithRemovedProperties; return additionalRuledIdRemoved; @@ -48,7 +50,22 @@ export const removeServerGeneratedPropertiesIncludingRuleId = ( * This is a typical simple rule for testing that is easy for most basic testing * @param ruleId */ -export const getSimpleRule = (ruleId = 'rule-1'): Partial => ({ +export const getSimpleRule = (ruleId = 'rule-1'): CreateRulesSchema => ({ + name: 'Simple Rule Query', + description: 'Simple Rule Query', + risk_score: 1, + rule_id: ruleId, + severity: 'high', + index: ['auditbeat-*'], + type: 'query', + query: 'user.name: root or user.name: admin', +}); + +/** + * This is a typical simple rule for testing that is easy for most basic testing + * @param ruleId + */ +export const getSimpleRuleUpdate = (ruleId = 'rule-1'): UpdateRulesSchema => ({ name: 'Simple Rule Query', description: 'Simple Rule Query', risk_score: 1, @@ -63,7 +80,18 @@ export const getSimpleRule = (ruleId = 'rule-1'): Partial = * This is a representative ML rule payload as expected by the server * @param ruleId */ -export const getSimpleMlRule = (ruleId = 'rule-1'): Partial => ({ +export const getSimpleMlRule = (ruleId = 'rule-1'): CreateRulesSchema => ({ + name: 'Simple ML Rule', + description: 'Simple Machine Learning Rule', + anomaly_threshold: 44, + risk_score: 1, + rule_id: ruleId, + severity: 'high', + machine_learning_job_id: 'some_job_id', + type: 'machine_learning', +}); + +export const getSimpleMlRuleUpdate = (ruleId = 'rule-1'): UpdateRulesSchema => ({ name: 'Simple ML Rule', description: 'Simple Machine Learning Rule', anomaly_threshold: 44, @@ -107,7 +135,7 @@ export const getSignalStatusEmptyResponse = () => ({ /** * This is a typical simple rule for testing that is easy for most basic testing */ -export const getSimpleRuleWithoutRuleId = (): Partial => { +export const getSimpleRuleWithoutRuleId = (): CreateRulesSchema => { const simpleRule = getSimpleRule(); const { rule_id, ...ruleWithoutId } = simpleRule; return ruleWithoutId; @@ -130,9 +158,10 @@ export const binaryToString = (res: any, callback: any): void => { }; /** - * This is the typical output of a simple rule that Kibana will output with all the defaults. + * This is the typical output of a simple rule that Kibana will output with all the defaults + * except for the server generated properties. Useful for testing end to end tests. */ -export const getSimpleRuleOutput = (ruleId = 'rule-1'): Partial => ({ +export const getSimpleRuleOutput = (ruleId = 'rule-1'): Partial => ({ actions: [], created_by: 'elastic', description: 'Simple Rule Query', @@ -162,17 +191,16 @@ export const getSimpleRuleOutput = (ruleId = 'rule-1'): Partial => { +export const getSimpleRuleOutputWithoutRuleId = (ruleId = 'rule-1'): Partial => { const rule = getSimpleRuleOutput(ruleId); const { rule_id, ...ruleWithoutRuleId } = rule; return ruleWithoutRuleId; }; -export const getSimpleMlRuleOutput = (ruleId = 'rule-1'): Partial => { +export const getSimpleMlRuleOutput = (ruleId = 'rule-1'): Partial => { const rule = getSimpleRuleOutput(ruleId); const { query, language, index, ...rest } = rule; @@ -252,7 +280,7 @@ export const getSimpleRuleAsNdjson = (ruleIds: string[]): Buffer => { * testing upload features. * @param rule The rule to convert to ndjson */ -export const ruleToNdjson = (rule: Partial): Buffer => { +export const ruleToNdjson = (rule: Partial): Buffer => { const stringified = JSON.stringify(rule); return Buffer.from(`${stringified}\n`); }; @@ -261,7 +289,7 @@ export const ruleToNdjson = (rule: Partial): Buffer => { * This will return a complex rule with all the outputs possible * @param ruleId The ruleId to set which is optional and defaults to rule-1 */ -export const getComplexRule = (ruleId = 'rule-1'): Partial => ({ +export const getComplexRule = (ruleId = 'rule-1'): Partial => ({ actions: [], name: 'Complex Rule Query', description: 'Complex Rule Query', @@ -345,7 +373,7 @@ export const getComplexRule = (ruleId = 'rule-1'): Partial * This will return a complex rule with all the outputs possible * @param ruleId The ruleId to set which is optional and defaults to rule-1 */ -export const getComplexRuleOutput = (ruleId = 'rule-1'): Partial => ({ +export const getComplexRuleOutput = (ruleId = 'rule-1'): Partial => ({ actions: [], created_by: 'elastic', name: 'Complex Rule Query', From 9bc093631143a647b3c3346aadc195c38e9caf89 Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Wed, 10 Jun 2020 10:11:46 -0500 Subject: [PATCH 82/91] [ML] Transforms: Add ability to delete dest index & index pattern when deleting transform job (#67922) --- x-pack/plugins/ml/common/util/errors.test.ts | 78 +++++ x-pack/plugins/ml/common/util/errors.ts | 75 +++++ .../analytics_list/action_delete.tsx | 2 +- .../analytics_service/delete_analytics.ts | 2 +- .../ml/public/application/util/error_utils.ts | 32 -- x-pack/plugins/ml/public/shared.ts | 1 + x-pack/plugins/transform/common/index.ts | 17 + .../components/toast_notification_text.tsx | 12 +- .../transform/public/app/hooks/index.ts | 2 +- .../transform/public/app/hooks/use_api.ts | 15 +- .../public/app/hooks/use_delete_transform.tsx | 255 ++++++++++++-- .../transform_list/action_delete.tsx | 128 ++++++- .../public/app/services/es_index_service.ts | 33 ++ .../transform/public/shared_imports.ts | 1 + .../server/routes/api/error_utils.ts | 10 +- .../transform/server/routes/api/schema.ts | 14 + .../transform/server/routes/api/transforms.ts | 154 ++++++++- x-pack/test/api_integration/apis/index.js | 1 + .../apis/ml/data_frame_analytics/delete.ts | 2 +- .../apis/transform/delete_transforms.ts | 318 ++++++++++++++++++ .../api_integration/apis/transform/index.ts | 32 ++ x-pack/test/api_integration/services/index.ts | 2 + .../api_integration/services/transform.ts | 23 ++ .../test/functional/services/transform/api.ts | 63 +++- 24 files changed, 1165 insertions(+), 107 deletions(-) create mode 100644 x-pack/plugins/ml/common/util/errors.test.ts delete mode 100644 x-pack/plugins/ml/public/application/util/error_utils.ts create mode 100644 x-pack/plugins/transform/public/app/services/es_index_service.ts create mode 100644 x-pack/test/api_integration/apis/transform/delete_transforms.ts create mode 100644 x-pack/test/api_integration/apis/transform/index.ts create mode 100644 x-pack/test/api_integration/services/transform.ts diff --git a/x-pack/plugins/ml/common/util/errors.test.ts b/x-pack/plugins/ml/common/util/errors.test.ts new file mode 100644 index 0000000000000..00af27248ccce --- /dev/null +++ b/x-pack/plugins/ml/common/util/errors.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + BoomResponse, + extractErrorMessage, + MLCustomHttpResponseOptions, + MLResponseError, +} from './errors'; +import { ResponseError } from 'kibana/server'; + +describe('ML - error message utils', () => { + describe('extractErrorMessage', () => { + test('returns just the error message', () => { + const testMsg = 'Saved object [index-pattern/blahblahblah] not found'; + + const bodyWithNestedErrorMsg: MLCustomHttpResponseOptions = { + body: { + message: { + msg: testMsg, + }, + }, + statusCode: 404, + }; + expect(extractErrorMessage(bodyWithNestedErrorMsg)).toBe(testMsg); + + const bodyWithStringMsg: MLCustomHttpResponseOptions = { + body: { + msg: testMsg, + }, + statusCode: 404, + }; + expect(extractErrorMessage(bodyWithStringMsg)).toBe(testMsg); + + const bodyWithStringMessage: MLCustomHttpResponseOptions = { + body: { + message: testMsg, + }, + statusCode: 404, + }; + expect(extractErrorMessage(bodyWithStringMessage)).toBe(testMsg); + + const bodyWithString: MLCustomHttpResponseOptions = { + body: testMsg, + statusCode: 404, + }; + expect(extractErrorMessage(bodyWithString)).toBe(testMsg); + + const bodyWithError: MLCustomHttpResponseOptions = { + body: new Error(testMsg), + statusCode: 404, + }; + expect(extractErrorMessage(bodyWithError)).toBe(testMsg); + + const bodyWithBoomError: MLCustomHttpResponseOptions = { + statusCode: 404, + body: { + data: [], + isBoom: true, + isServer: false, + output: { + statusCode: 404, + payload: { + statusCode: 404, + error: testMsg, + message: testMsg, + }, + headers: {}, + }, + }, + }; + expect(extractErrorMessage(bodyWithBoomError)).toBe(testMsg); + }); + }); +}); diff --git a/x-pack/plugins/ml/common/util/errors.ts b/x-pack/plugins/ml/common/util/errors.ts index 4446624bf2e7f..e165e15d7c64e 100644 --- a/x-pack/plugins/ml/common/util/errors.ts +++ b/x-pack/plugins/ml/common/util/errors.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { ResponseError, ResponseHeaders } from 'kibana/server'; import { isErrorResponse } from '../types/errors'; export function getErrorMessage(error: any) { @@ -17,3 +18,77 @@ export function getErrorMessage(error: any) { return JSON.stringify(error); } + +// Adding temporary types until Kibana ResponseError is updated + +export interface BoomResponse { + data: any; + isBoom: boolean; + isServer: boolean; + output: { + statusCode: number; + payload: { + statusCode: number; + error: string; + message: string; + }; + headers: {}; + }; +} +export type MLResponseError = + | { + message: { + msg: string; + }; + } + | { msg: string }; + +export interface MLCustomHttpResponseOptions< + T extends ResponseError | MLResponseError | BoomResponse +> { + /** HTTP message to send to the client */ + body?: T; + /** HTTP Headers with additional information about response */ + headers?: ResponseHeaders; + statusCode: number; +} + +export const extractErrorMessage = ( + error: + | MLCustomHttpResponseOptions + | undefined + | string +): string => { + // extract only the error message within the response error coming from Kibana, Elasticsearch, and our own ML messages + + if (typeof error === 'string') { + return error; + } + if (error?.body === undefined) return ''; + + if (typeof error.body === 'string') { + return error.body; + } + if ( + typeof error.body === 'object' && + 'output' in error.body && + error.body.output.payload.message + ) { + return error.body.output.payload.message; + } + + if (typeof error.body === 'object' && 'msg' in error.body && typeof error.body.msg === 'string') { + return error.body.msg; + } + + if (typeof error.body === 'object' && 'message' in error.body) { + if (typeof error.body.message === 'string') { + return error.body.message; + } + if (!(error.body.message instanceof Error) && typeof (error.body.message.msg === 'string')) { + return error.body.message.msg; + } + } + // If all else fail return an empty message instead of JSON.stringify + return ''; +}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_delete.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_delete.tsx index 2d433f6b18484..38ef00914e8fb 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_delete.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_delete.tsx @@ -18,6 +18,7 @@ import { } from '@elastic/eui'; import { IIndexPattern } from 'src/plugins/data/common'; import { FormattedMessage } from '@kbn/i18n/react'; +import { extractErrorMessage } from '../../../../../../../common/util/errors'; import { deleteAnalytics, deleteAnalyticsAndDestIndex, @@ -29,7 +30,6 @@ import { } from '../../../../../capabilities/check_capabilities'; import { useMlKibana } from '../../../../../contexts/kibana'; import { isDataFrameAnalyticsRunning, DataFrameAnalyticsListRow } from './common'; -import { extractErrorMessage } from '../../../../../util/error_utils'; interface DeleteActionProps { item: DataFrameAnalyticsListRow; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts index 26cefff0a3f59..ebd3fa8982604 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; +import { extractErrorMessage } from '../../../../../../../common/util/errors'; import { getToastNotifications } from '../../../../../util/dependency_cache'; import { ml } from '../../../../../services/ml_api_service'; import { refreshAnalyticsList$, REFRESH_ANALYTICS_LIST_STATE } from '../../../../common'; @@ -11,7 +12,6 @@ import { isDataFrameAnalyticsFailed, DataFrameAnalyticsListRow, } from '../../components/analytics_list/common'; -import { extractErrorMessage } from '../../../../../util/error_utils'; export const deleteAnalytics = async (d: DataFrameAnalyticsListRow) => { const toastNotifications = getToastNotifications(); diff --git a/x-pack/plugins/ml/public/application/util/error_utils.ts b/x-pack/plugins/ml/public/application/util/error_utils.ts deleted file mode 100644 index 2ce8f4ffc583a..0000000000000 --- a/x-pack/plugins/ml/public/application/util/error_utils.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { CustomHttpResponseOptions, ResponseError } from 'kibana/server'; - -export const extractErrorMessage = ( - error: CustomHttpResponseOptions | undefined | string -): string | undefined => { - if (typeof error === 'string') { - return error; - } - - if (error?.body) { - if (typeof error.body === 'string') { - return error.body; - } - if (typeof error.body === 'object' && 'message' in error.body) { - if (typeof error.body.message === 'string') { - return error.body.message; - } - // @ts-ignore - if (typeof (error.body.message?.msg === 'string')) { - // @ts-ignore - return error.body.message?.msg; - } - } - } - return undefined; -}; diff --git a/x-pack/plugins/ml/public/shared.ts b/x-pack/plugins/ml/public/shared.ts index 6821cb7ef0f94..ff83d79adff67 100644 --- a/x-pack/plugins/ml/public/shared.ts +++ b/x-pack/plugins/ml/public/shared.ts @@ -14,6 +14,7 @@ export * from '../common/types/audit_message'; export * from '../common/util/anomaly_utils'; export * from '../common/util/errors'; + export * from '../common/util/validators'; export * from './application/formatters/metric_change_description'; diff --git a/x-pack/plugins/transform/common/index.ts b/x-pack/plugins/transform/common/index.ts index d7a791e78b3ab..79ff6298a2ca2 100644 --- a/x-pack/plugins/transform/common/index.ts +++ b/x-pack/plugins/transform/common/index.ts @@ -38,3 +38,20 @@ export interface ResultData { export interface TransformEndpointResult { [key: string]: ResultData; } + +export interface DeleteTransformEndpointRequest { + transformsInfo: TransformEndpointRequest[]; + deleteDestIndex?: boolean; + deleteDestIndexPattern?: boolean; +} + +export interface DeleteTransformStatus { + transformDeleted: ResultData; + destIndexDeleted?: ResultData; + destIndexPatternDeleted?: ResultData; + destinationIndex?: string | undefined; +} + +export interface DeleteTransformEndpointResult { + [key: string]: DeleteTransformStatus; +} diff --git a/x-pack/plugins/transform/public/app/components/toast_notification_text.tsx b/x-pack/plugins/transform/public/app/components/toast_notification_text.tsx index 1044081670523..3f664cf8bb09b 100644 --- a/x-pack/plugins/transform/public/app/components/toast_notification_text.tsx +++ b/x-pack/plugins/transform/public/app/components/toast_notification_text.tsx @@ -29,9 +29,14 @@ const MAX_SIMPLE_MESSAGE_LENGTH = 140; interface ToastNotificationTextProps { overlays: CoreStart['overlays']; text: any; + previewTextLength?: number; } -export const ToastNotificationText: FC = ({ overlays, text }) => { +export const ToastNotificationText: FC = ({ + overlays, + text, + previewTextLength, +}) => { if (typeof text === 'string' && text.length <= MAX_SIMPLE_MESSAGE_LENGTH) { return text; } @@ -46,8 +51,9 @@ export const ToastNotificationText: FC = ({ overlays const unformattedText = text.message ? text.message : text; const formattedText = typeof unformattedText === 'object' ? JSON.stringify(text, null, 2) : text; - const previewText = `${formattedText.substring(0, 140)}${ - formattedText.length > 140 ? ' ...' : '' + const textLength = previewTextLength ?? 140; + const previewText = `${formattedText.substring(0, textLength)}${ + formattedText.length > textLength ? ' ...' : '' }`; const openModal = () => { diff --git a/x-pack/plugins/transform/public/app/hooks/index.ts b/x-pack/plugins/transform/public/app/hooks/index.ts index a36550bcd8e57..b439afe2b2165 100644 --- a/x-pack/plugins/transform/public/app/hooks/index.ts +++ b/x-pack/plugins/transform/public/app/hooks/index.ts @@ -6,7 +6,7 @@ export { useApi } from './use_api'; export { useGetTransforms } from './use_get_transforms'; -export { useDeleteTransforms } from './use_delete_transform'; +export { useDeleteTransforms, useDeleteIndexAndTargetIndex } from './use_delete_transform'; export { useStartTransforms } from './use_start_transform'; export { useStopTransforms } from './use_stop_transform'; export { useRequest } from './use_request'; diff --git a/x-pack/plugins/transform/public/app/hooks/use_api.ts b/x-pack/plugins/transform/public/app/hooks/use_api.ts index f3c35d358f1f2..5d7839cf5fba7 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_api.ts +++ b/x-pack/plugins/transform/public/app/hooks/use_api.ts @@ -5,7 +5,12 @@ */ import { useMemo } from 'react'; -import { TransformEndpointRequest, TransformEndpointResult, TransformId } from '../../../common'; +import { + TransformId, + TransformEndpointRequest, + TransformEndpointResult, + DeleteTransformEndpointResult, +} from '../../../common'; import { API_BASE_PATH } from '../../../common/constants'; import { useAppDependencies } from '../app_dependencies'; @@ -40,10 +45,12 @@ export const useApi = () => { }); }, deleteTransforms( - transformsInfo: TransformEndpointRequest[] - ): Promise { + transformsInfo: TransformEndpointRequest[], + deleteDestIndex: boolean | undefined, + deleteDestIndexPattern: boolean | undefined + ): Promise { return http.post(`${API_BASE_PATH}delete_transforms`, { - body: JSON.stringify(transformsInfo), + body: JSON.stringify({ transformsInfo, deleteDestIndex, deleteDestIndexPattern }), }); }, getTransformsPreview(obj: PreviewRequestBody): Promise { diff --git a/x-pack/plugins/transform/public/app/hooks/use_delete_transform.tsx b/x-pack/plugins/transform/public/app/hooks/use_delete_transform.tsx index 0215d723188b1..1f395e67b7d31 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_delete_transform.tsx +++ b/x-pack/plugins/transform/public/app/hooks/use_delete_transform.tsx @@ -4,52 +4,257 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; - +import React, { useCallback, useEffect, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { toMountPoint } from '../../../../../../src/plugins/kibana_react/public'; - -import { TransformEndpointRequest, TransformEndpointResult } from '../../../common'; - -import { getErrorMessage } from '../../shared_imports'; - +import { + TransformEndpointRequest, + DeleteTransformEndpointResult, + DeleteTransformStatus, +} from '../../../common'; +import { getErrorMessage, extractErrorMessage } from '../../shared_imports'; import { useAppDependencies, useToastNotifications } from '../app_dependencies'; import { TransformListRow, refreshTransformList$, REFRESH_TRANSFORM_LIST_STATE } from '../common'; import { ToastNotificationText } from '../components'; - import { useApi } from './use_api'; +import { indexService } from '../services/es_index_service'; + +export const useDeleteIndexAndTargetIndex = (items: TransformListRow[]) => { + const { http, savedObjects } = useAppDependencies(); + const toastNotifications = useToastNotifications(); + + const [deleteDestIndex, setDeleteDestIndex] = useState(true); + const [deleteIndexPattern, setDeleteIndexPattern] = useState(true); + const [userCanDeleteIndex, setUserCanDeleteIndex] = useState(false); + const [indexPatternExists, setIndexPatternExists] = useState(false); + const toggleDeleteIndex = useCallback(() => setDeleteDestIndex(!deleteDestIndex), [ + deleteDestIndex, + ]); + const toggleDeleteIndexPattern = useCallback(() => setDeleteIndexPattern(!deleteIndexPattern), [ + deleteIndexPattern, + ]); + + const checkIndexPatternExists = useCallback( + async (indexName: string) => { + try { + if (await indexService.indexPatternExists(savedObjects.client, indexName)) { + setIndexPatternExists(true); + } + } catch (e) { + const error = extractErrorMessage(e); + + toastNotifications.addDanger( + i18n.translate( + 'xpack.transform.deleteTransform.errorWithCheckingIfIndexPatternExistsNotificationErrorMessage', + { + defaultMessage: + 'An error occurred checking if index pattern {indexPattern} exists: {error}', + values: { indexPattern: indexName, error }, + } + ) + ); + } + }, + [savedObjects.client, toastNotifications] + ); + + const checkUserIndexPermission = useCallback(async () => { + try { + const userCanDelete = await indexService.canDeleteIndex(http); + if (userCanDelete) { + setUserCanDeleteIndex(true); + } + } catch (e) { + toastNotifications.addDanger( + i18n.translate( + 'xpack.transform.transformList.errorWithCheckingIfUserCanDeleteIndexNotificationErrorMessage', + { + defaultMessage: 'An error occurred checking if user can delete destination index', + } + ) + ); + } + }, [http, toastNotifications]); + + useEffect(() => { + checkUserIndexPermission(); + + if (items.length === 1) { + const config = items[0].config; + const destinationIndex = Array.isArray(config.dest.index) + ? config.dest.index[0] + : config.dest.index; + checkIndexPatternExists(destinationIndex); + } else { + setIndexPatternExists(true); + } + }, [checkIndexPatternExists, checkUserIndexPermission, items]); + + return { + userCanDeleteIndex, + deleteDestIndex, + indexPatternExists, + deleteIndexPattern, + toggleDeleteIndex, + toggleDeleteIndexPattern, + }; +}; + +type SuccessCountField = keyof Omit; export const useDeleteTransforms = () => { const { overlays } = useAppDependencies(); const toastNotifications = useToastNotifications(); const api = useApi(); - return async (transforms: TransformListRow[]) => { + return async ( + transforms: TransformListRow[], + shouldDeleteDestIndex: boolean, + shouldDeleteDestIndexPattern: boolean + ) => { const transformsInfo: TransformEndpointRequest[] = transforms.map((tf) => ({ id: tf.config.id, state: tf.stats.state, })); try { - const results: TransformEndpointResult = await api.deleteTransforms(transformsInfo); + const results: DeleteTransformEndpointResult = await api.deleteTransforms( + transformsInfo, + shouldDeleteDestIndex, + shouldDeleteDestIndexPattern + ); + const isBulk = Object.keys(results).length > 1; + const successCount: Record = { + transformDeleted: 0, + destIndexDeleted: 0, + destIndexPatternDeleted: 0, + }; for (const transformId in results) { // hasOwnProperty check to ensure only properties on object itself, and not its prototypes if (results.hasOwnProperty(transformId)) { - if (results[transformId].success === true) { - toastNotifications.addSuccess( - i18n.translate('xpack.transform.transformList.deleteTransformSuccessMessage', { - defaultMessage: 'Request to delete transform {transformId} acknowledged.', - values: { transformId }, - }) - ); + const status = results[transformId]; + const destinationIndex = status.destinationIndex; + + // if we are only deleting one transform, show the success toast messages + if (!isBulk && status.transformDeleted) { + if (status.transformDeleted?.success) { + toastNotifications.addSuccess( + i18n.translate('xpack.transform.transformList.deleteTransformSuccessMessage', { + defaultMessage: 'Request to delete transform {transformId} acknowledged.', + values: { transformId }, + }) + ); + } + if (status.destIndexDeleted?.success) { + toastNotifications.addSuccess( + i18n.translate( + 'xpack.transform.deleteTransform.deleteAnalyticsWithIndexSuccessMessage', + { + defaultMessage: + 'Request to delete destination index {destinationIndex} acknowledged.', + values: { destinationIndex }, + } + ) + ); + } + if (status.destIndexPatternDeleted?.success) { + toastNotifications.addSuccess( + i18n.translate( + 'xpack.transform.deleteTransform.deleteAnalyticsWithIndexPatternSuccessMessage', + { + defaultMessage: + 'Request to delete index pattern {destinationIndex} acknowledged.', + values: { destinationIndex }, + } + ) + ); + } } else { - toastNotifications.addDanger( - i18n.translate('xpack.transform.transformList.deleteTransformErrorMessage', { + (Object.keys(successCount) as SuccessCountField[]).forEach((key) => { + if (status[key]?.success) { + successCount[key] = successCount[key] + 1; + } + }); + } + if (status.transformDeleted?.error) { + const error = extractErrorMessage(status.transformDeleted.error); + toastNotifications.addDanger({ + title: i18n.translate('xpack.transform.transformList.deleteTransformErrorMessage', { defaultMessage: 'An error occurred deleting the transform {transformId}', values: { transformId }, - }) - ); + }), + text: toMountPoint( + + ), + }); } + + if (status.destIndexDeleted?.error) { + const error = extractErrorMessage(status.destIndexDeleted.error); + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.transform.deleteTransform.deleteAnalyticsWithIndexErrorMessage', + { + defaultMessage: 'An error occurred deleting destination index {destinationIndex}', + values: { destinationIndex }, + } + ), + text: toMountPoint( + + ), + }); + } + + if (status.destIndexPatternDeleted?.error) { + const error = extractErrorMessage(status.destIndexPatternDeleted.error); + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.transform.deleteTransform.deleteAnalyticsWithIndexPatternErrorMessage', + { + defaultMessage: 'An error occurred deleting index pattern {destinationIndex}', + values: { destinationIndex }, + } + ), + text: toMountPoint( + + ), + }); + } + } + } + + // if we are deleting multiple transforms, combine the success messages + if (isBulk) { + if (successCount.transformDeleted > 0) { + toastNotifications.addSuccess( + i18n.translate('xpack.transform.transformList.bulkDeleteTransformSuccessMessage', { + defaultMessage: + 'Successfully deleted {count} {count, plural, one {transform} other {transforms}}.', + values: { count: successCount.transformDeleted }, + }) + ); + } + + if (successCount.destIndexDeleted > 0) { + toastNotifications.addSuccess( + i18n.translate('xpack.transform.transformList.bulkDeleteDestIndexSuccessMessage', { + defaultMessage: + 'Successfully deleted {count} destination {count, plural, one {index} other {indices}}.', + values: { count: successCount.destIndexDeleted }, + }) + ); + } + if (successCount.destIndexPatternDeleted > 0) { + toastNotifications.addSuccess( + i18n.translate( + 'xpack.transform.transformList.bulkDeleteDestIndexPatternSuccessMessage', + { + defaultMessage: + 'Successfully deleted {count} destination index {count, plural, one {pattern} other {patterns}}.', + values: { count: successCount.destIndexPatternDeleted }, + } + ) + ); } } @@ -59,7 +264,13 @@ export const useDeleteTransforms = () => { title: i18n.translate('xpack.transform.transformList.deleteTransformGenericErrorMessage', { defaultMessage: 'An error occurred calling the API endpoint to delete transforms.', }), - text: toMountPoint(), + text: toMountPoint( + + ), }); } }; diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/action_delete.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/action_delete.tsx index c20feba29f582..d7db55990d333 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/action_delete.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/action_delete.tsx @@ -12,11 +12,14 @@ import { EuiOverlayMask, EuiToolTip, EUI_MODAL_CONFIRM_BUTTON, + EuiFlexGroup, + EuiFlexItem, + EuiSwitch, + EuiSpacer, } from '@elastic/eui'; - +import { FormattedMessage } from '@kbn/i18n/react'; import { TRANSFORM_STATE } from '../../../../../../common'; - -import { useDeleteTransforms } from '../../../../hooks'; +import { useDeleteTransforms, useDeleteIndexAndTargetIndex } from '../../../../hooks'; import { createCapabilityFailureMessage, AuthorizationContext, @@ -35,13 +38,25 @@ export const DeleteAction: FC = ({ items, forceDisable }) => const { canDeleteTransform } = useContext(AuthorizationContext).capabilities; const deleteTransforms = useDeleteTransforms(); + const { + userCanDeleteIndex, + deleteDestIndex, + indexPatternExists, + deleteIndexPattern, + toggleDeleteIndex, + toggleDeleteIndexPattern, + } = useDeleteIndexAndTargetIndex(items); const [isModalVisible, setModalVisible] = useState(false); const closeModal = () => setModalVisible(false); const deleteAndCloseModal = () => { setModalVisible(false); - deleteTransforms(items); + + const shouldDeleteDestIndex = userCanDeleteIndex && deleteDestIndex; + const shouldDeleteDestIndexPattern = + userCanDeleteIndex && indexPatternExists && deleteIndexPattern; + deleteTransforms(items, shouldDeleteDestIndex, shouldDeleteDestIndexPattern); }; const openModal = () => setModalVisible(true); @@ -71,17 +86,96 @@ export const DeleteAction: FC = ({ items, forceDisable }) => defaultMessage: 'Delete {transformId}', values: { transformId: items[0] && items[0].config.id }, }); - const bulkDeleteModalMessage = i18n.translate( - 'xpack.transform.transformList.bulkDeleteModalBody', - { - defaultMessage: - "Are you sure you want to delete {count, plural, one {this} other {these}} {count} {count, plural, one {transform} other {transforms}}? The transform's destination index and optional Kibana index pattern will not be deleted.", - values: { count: items.length }, - } + const bulkDeleteModalContent = ( + <> +

+ +

+ + + { + + } + + + + { + + } + + + + ); + + const deleteModalContent = ( + <> +

+ +

+ + + {userCanDeleteIndex && ( + + )} + + {userCanDeleteIndex && indexPatternExists && ( + + + + + )} + + ); - const deleteModalMessage = i18n.translate('xpack.transform.transformList.deleteModalBody', { - defaultMessage: `Are you sure you want to delete this transform? The transform's destination index and optional Kibana index pattern will not be deleted.`, - }); let deleteButton = ( = ({ items, forceDisable }) => if (disabled || !canDeleteTransform) { let content; if (disabled) { - content = isBulkAction === true ? bulkDeleteButtonDisabledText : deleteButtonDisabledText; + content = isBulkAction ? bulkDeleteButtonDisabledText : deleteButtonDisabledText; } else { content = createCapabilityFailureMessage('canDeleteTransform'); } @@ -117,7 +211,7 @@ export const DeleteAction: FC = ({ items, forceDisable }) => {isModalVisible && ( = ({ items, forceDisable }) => defaultFocusedButton={EUI_MODAL_CONFIRM_BUTTON} buttonColor="danger" > -

{isBulkAction === true ? bulkDeleteModalMessage : deleteModalMessage}

+ {isBulkAction ? bulkDeleteModalContent : deleteModalContent}
)} diff --git a/x-pack/plugins/transform/public/app/services/es_index_service.ts b/x-pack/plugins/transform/public/app/services/es_index_service.ts new file mode 100644 index 0000000000000..491213d0ddbe7 --- /dev/null +++ b/x-pack/plugins/transform/public/app/services/es_index_service.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { HttpSetup, SavedObjectsClientContract } from 'kibana/public'; +import { API_BASE_PATH } from '../../../common/constants'; +import { IIndexPattern } from '../../../../../../src/plugins/data/common/index_patterns'; + +export class IndexService { + async canDeleteIndex(http: HttpSetup) { + const privilege = await http.get(`${API_BASE_PATH}privileges`); + if (!privilege) { + return false; + } + return privilege.hasAllPrivileges; + } + + async indexPatternExists(savedObjectsClient: SavedObjectsClientContract, indexName: string) { + const response = await savedObjectsClient.find({ + type: 'index-pattern', + perPage: 1, + search: `"${indexName}"`, + searchFields: ['title'], + fields: ['title'], + }); + const ip = response.savedObjects.find((obj) => obj.attributes.title === indexName); + return ip !== undefined; + } +} + +export const indexService = new IndexService(); diff --git a/x-pack/plugins/transform/public/shared_imports.ts b/x-pack/plugins/transform/public/shared_imports.ts index 56be8d7bb7de7..ca3fb52cc02c3 100644 --- a/x-pack/plugins/transform/public/shared_imports.ts +++ b/x-pack/plugins/transform/public/shared_imports.ts @@ -15,6 +15,7 @@ export { export { getErrorMessage, + extractErrorMessage, getDataGridSchemaFromKibanaFieldType, getFieldsFromKibanaIndexPattern, multiColumnSortFactory, diff --git a/x-pack/plugins/transform/server/routes/api/error_utils.ts b/x-pack/plugins/transform/server/routes/api/error_utils.ts index 295375794c04e..5a479e4f429f6 100644 --- a/x-pack/plugins/transform/server/routes/api/error_utils.ts +++ b/x-pack/plugins/transform/server/routes/api/error_utils.ts @@ -10,7 +10,11 @@ import { i18n } from '@kbn/i18n'; import { ResponseError, CustomHttpResponseOptions } from 'src/core/server'; -import { TransformEndpointRequest, TransformEndpointResult } from '../../../common'; +import { + TransformEndpointRequest, + TransformEndpointResult, + DeleteTransformEndpointResult, +} from '../../../common'; const REQUEST_TIMEOUT = 'RequestTimeout'; @@ -19,7 +23,7 @@ export function isRequestTimeout(error: any) { } interface Params { - results: TransformEndpointResult; + results: TransformEndpointResult | DeleteTransformEndpointResult; id: string; items: TransformEndpointRequest[]; action: string; @@ -59,7 +63,7 @@ export function fillResultsWithTimeouts({ results, id, items, action }: Params) }, }; - const newResults: TransformEndpointResult = {}; + const newResults: TransformEndpointResult | DeleteTransformEndpointResult = {}; return items.reduce((accumResults, currentVal) => { if (results[currentVal.id] === undefined) { diff --git a/x-pack/plugins/transform/server/routes/api/schema.ts b/x-pack/plugins/transform/server/routes/api/schema.ts index 0b994406d324d..cf39f2e3829ea 100644 --- a/x-pack/plugins/transform/server/routes/api/schema.ts +++ b/x-pack/plugins/transform/server/routes/api/schema.ts @@ -14,3 +14,17 @@ export const schemaTransformId = { export interface SchemaTransformId { transformId: string; } + +export const deleteTransformSchema = schema.object({ + /** + * Delete Transform & Destination Index + */ + transformsInfo: schema.arrayOf( + schema.object({ + id: schema.string(), + state: schema.maybe(schema.string()), + }) + ), + deleteDestIndex: schema.maybe(schema.boolean()), + deleteDestIndexPattern: schema.maybe(schema.boolean()), +}); diff --git a/x-pack/plugins/transform/server/routes/api/transforms.ts b/x-pack/plugins/transform/server/routes/api/transforms.ts index 55b2469a7f3a7..93fda56d319ad 100644 --- a/x-pack/plugins/transform/server/routes/api/transforms.ts +++ b/x-pack/plugins/transform/server/routes/api/transforms.ts @@ -5,7 +5,12 @@ */ import { schema } from '@kbn/config-schema'; -import { RequestHandler } from 'kibana/server'; +import { + KibanaResponseFactory, + RequestHandler, + RequestHandlerContext, + SavedObjectsClientContract, +} from 'kibana/server'; import { CallCluster } from 'src/legacy/core_plugins/elasticsearch'; import { wrapEsError } from '../../../../../legacy/server/lib/create_router/error_wrappers'; @@ -14,6 +19,9 @@ import { TransformEndpointResult, TransformId, TRANSFORM_STATE, + DeleteTransformEndpointRequest, + DeleteTransformStatus, + ResultData, } from '../../../common'; import { RouteDependencies } from '../../types'; @@ -21,8 +29,9 @@ import { RouteDependencies } from '../../types'; import { addBasePath } from '../index'; import { isRequestTimeout, fillResultsWithTimeouts, wrapError } from './error_utils'; -import { schemaTransformId, SchemaTransformId } from './schema'; +import { deleteTransformSchema, schemaTransformId, SchemaTransformId } from './schema'; import { registerTransformsAuditMessagesRoutes } from './transforms_audit_messages'; +import { IIndexPattern } from '../../../../../../src/plugins/data/common/index_patterns'; enum TRANSFORM_ACTIONS { STOP = 'stop', @@ -173,15 +182,37 @@ export function registerTransformsRoutes(routeDependencies: RouteDependencies) { { path: addBasePath('delete_transforms'), validate: { - body: schema.maybe(schema.any()), + body: deleteTransformSchema, }, }, license.guardApiRoute(async (ctx, req, res) => { - const transformsInfo = req.body as TransformEndpointRequest[]; + const { + transformsInfo, + deleteDestIndex, + deleteDestIndexPattern, + } = req.body as DeleteTransformEndpointRequest; try { + const body = await deleteTransforms( + transformsInfo, + deleteDestIndex, + deleteDestIndexPattern, + ctx, + license, + res + ); + + if (body && body.status) { + if (body.status === 404) { + return res.notFound(); + } + if (body.status === 403) { + return res.forbidden(); + } + } + return res.ok({ - body: await deleteTransforms(transformsInfo, ctx.transform!.dataClient.callAsCurrentUser), + body, }); } catch (e) { return res.customError(wrapError(wrapEsError(e))); @@ -238,18 +269,51 @@ const getTransforms = async (options: { transformId?: string }, callAsCurrentUse return await callAsCurrentUser('transform.getTransforms', options); }; +async function getIndexPatternId( + indexName: string, + savedObjectsClient: SavedObjectsClientContract +) { + const response = await savedObjectsClient.find({ + type: 'index-pattern', + perPage: 1, + search: `"${indexName}"`, + searchFields: ['title'], + fields: ['title'], + }); + const ip = response.saved_objects.find((obj) => obj.attributes.title === indexName); + return ip?.id; +} + +async function deleteDestIndexPatternById( + indexPatternId: string, + savedObjectsClient: SavedObjectsClientContract +) { + return await savedObjectsClient.delete('index-pattern', indexPatternId); +} + async function deleteTransforms( transformsInfo: TransformEndpointRequest[], - callAsCurrentUser: CallCluster + deleteDestIndex: boolean | undefined, + deleteDestIndexPattern: boolean | undefined, + ctx: RequestHandlerContext, + license: RouteDependencies['license'], + response: KibanaResponseFactory ) { - const results: TransformEndpointResult = {}; + const tempResults: TransformEndpointResult = {}; + const results: Record = {}; for (const transformInfo of transformsInfo) { + let destinationIndex: string | undefined; + const transformDeleted: ResultData = { success: false }; + const destIndexDeleted: ResultData = { success: false }; + const destIndexPatternDeleted: ResultData = { + success: false, + }; const transformId = transformInfo.id; try { if (transformInfo.state === TRANSFORM_STATE.FAILED) { try { - await callAsCurrentUser('transform.stopTransform', { + await ctx.transform!.dataClient.callAsCurrentUser('transform.stopTransform', { transformId, force: true, waitForCompletion: true, @@ -257,7 +321,7 @@ async function deleteTransforms( } catch (e) { if (isRequestTimeout(e)) { return fillResultsWithTimeouts({ - results, + results: tempResults, id: transformId, items: transformsInfo, action: TRANSFORM_ACTIONS.DELETE, @@ -265,9 +329,75 @@ async function deleteTransforms( } } } + // Grab destination index info to delete + try { + const transformConfigs = await getTransforms( + { transformId }, + ctx.transform!.dataClient.callAsCurrentUser + ); + const transformConfig = transformConfigs.transforms[0]; + destinationIndex = Array.isArray(transformConfig.dest.index) + ? transformConfig.dest.index[0] + : transformConfig.dest.index; + } catch (getTransformConfigError) { + transformDeleted.error = wrapError(getTransformConfigError); + results[transformId] = { + transformDeleted, + destIndexDeleted, + destIndexPatternDeleted, + destinationIndex, + }; + continue; + } + + // If user checks box to delete the destinationIndex associated with the job + if (destinationIndex && deleteDestIndex) { + try { + // If user does have privilege to delete the index, then delete the index + // if no permission then return 403 forbidden + await ctx.transform!.dataClient.callAsCurrentUser('indices.delete', { + index: destinationIndex, + }); + destIndexDeleted.success = true; + } catch (deleteIndexError) { + destIndexDeleted.error = wrapError(deleteIndexError); + } + } + + // Delete the index pattern if there's an index pattern that matches the name of dest index + if (destinationIndex && deleteDestIndexPattern) { + try { + const indexPatternId = await getIndexPatternId( + destinationIndex, + ctx.core.savedObjects.client + ); + if (indexPatternId) { + await deleteDestIndexPatternById(indexPatternId, ctx.core.savedObjects.client); + destIndexPatternDeleted.success = true; + } + } catch (deleteDestIndexPatternError) { + destIndexPatternDeleted.error = wrapError(deleteDestIndexPatternError); + } + } - await callAsCurrentUser('transform.deleteTransform', { transformId }); - results[transformId] = { success: true }; + try { + await ctx.transform!.dataClient.callAsCurrentUser('transform.deleteTransform', { + transformId, + }); + transformDeleted.success = true; + } catch (deleteTransformJobError) { + transformDeleted.error = wrapError(deleteTransformJobError); + if (transformDeleted.error.statusCode === 403) { + return response.forbidden(); + } + } + + results[transformId] = { + transformDeleted, + destIndexDeleted, + destIndexPatternDeleted, + destinationIndex, + }; } catch (e) { if (isRequestTimeout(e)) { return fillResultsWithTimeouts({ @@ -277,7 +407,7 @@ async function deleteTransforms( action: TRANSFORM_ACTIONS.DELETE, }); } - results[transformId] = { success: false, error: JSON.stringify(e) }; + results[transformId] = { transformDeleted: { success: false, error: JSON.stringify(e) } }; } } return results; diff --git a/x-pack/test/api_integration/apis/index.js b/x-pack/test/api_integration/apis/index.js index 2719486d0c502..b79dc3f3ffe59 100644 --- a/x-pack/test/api_integration/apis/index.js +++ b/x-pack/test/api_integration/apis/index.js @@ -30,5 +30,6 @@ export default function ({ loadTestFile }) { loadTestFile(require.resolve('./ingest_manager')); loadTestFile(require.resolve('./endpoint')); loadTestFile(require.resolve('./ml')); + loadTestFile(require.resolve('./transform')); }); } diff --git a/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts b/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts index 23bff0d0c2855..dc0ccfdc53a18 100644 --- a/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts +++ b/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts @@ -197,7 +197,7 @@ export default ({ getService }: FtrProviderContext) => { await ml.testResources.deleteIndexPattern(destinationIndex); }); - it('deletes job, target index, and index pattern by id', async () => { + it('should delete job, target index, and index pattern by id', async () => { const { body } = await supertest .delete(`/api/ml/data_frame/analytics/${analyticsId}`) .query({ deleteDestIndex: true, deleteDestIndexPattern: true }) diff --git a/x-pack/test/api_integration/apis/transform/delete_transforms.ts b/x-pack/test/api_integration/apis/transform/delete_transforms.ts new file mode 100644 index 0000000000000..40300c981ee2e --- /dev/null +++ b/x-pack/test/api_integration/apis/transform/delete_transforms.ts @@ -0,0 +1,318 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; +import { TransformEndpointRequest } from '../../../../plugins/transform/common'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { COMMON_REQUEST_HEADERS } from '../../../functional/services/ml/common'; +import { USER } from '../../../functional/services/transform/security_common'; + +async function asyncForEach(array: any[], callback: Function) { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index, array); + } +} + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertestWithoutAuth'); + const transform = getService('transform'); + + function generateDestIndex(transformId: string): string { + return `user-${transformId}`; + } + + async function createTransform(transformId: string, destinationIndex: string) { + const config = { + id: transformId, + source: { index: ['farequote-*'] }, + pivot: { + group_by: { airline: { terms: { field: 'airline' } } }, + aggregations: { '@timestamp.value_count': { value_count: { field: '@timestamp' } } }, + }, + dest: { index: destinationIndex }, + }; + + await transform.api.createTransform(config); + } + + describe('delete_transforms', function () { + before(async () => { + await esArchiver.loadIfNeeded('ml/farequote'); + await transform.testResources.setKibanaTimeZoneToUTC(); + }); + + after(async () => { + await transform.api.cleanTransformIndices(); + }); + + describe('single transform deletion', function () { + const transformId = 'test1'; + const destinationIndex = generateDestIndex(transformId); + + beforeEach(async () => { + await createTransform(transformId, destinationIndex); + await transform.api.createIndices(destinationIndex); + }); + + afterEach(async () => { + await transform.api.deleteIndices(destinationIndex); + }); + + it('should delete transform by transformId', async () => { + const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; + const { body } = await supertest + .post(`/api/transform/delete_transforms`) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(COMMON_REQUEST_HEADERS) + .send({ + transformsInfo, + }) + .expect(200); + + expect(body[transformId].transformDeleted.success).to.eql(true); + expect(body[transformId].destIndexDeleted.success).to.eql(false); + expect(body[transformId].destIndexPatternDeleted.success).to.eql(false); + await transform.api.waitForTransformNotToExist(transformId); + await transform.api.waitForIndicesToExist(destinationIndex); + }); + + it('should return 403 for unauthorized user', async () => { + const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; + await supertest + .post(`/api/transform/delete_transforms`) + .auth( + USER.TRANSFORM_VIEWER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_VIEWER) + ) + .set(COMMON_REQUEST_HEADERS) + .send({ + transformsInfo, + }) + .expect(403); + await transform.api.waitForTransformToExist(transformId); + await transform.api.waitForIndicesToExist(destinationIndex); + }); + }); + + describe('single transform deletion with invalid transformId', function () { + it('should return 200 with error in response if invalid transformId', async () => { + const transformsInfo: TransformEndpointRequest[] = [{ id: 'invalid_transform_id' }]; + const { body } = await supertest + .post(`/api/transform/delete_transforms`) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(COMMON_REQUEST_HEADERS) + .send({ + transformsInfo, + }) + .expect(200); + expect(body.invalid_transform_id.transformDeleted.success).to.eql(false); + expect(body.invalid_transform_id.transformDeleted).to.have.property('error'); + }); + }); + + describe('bulk deletion', function () { + const transformsInfo: TransformEndpointRequest[] = [ + { id: 'bulk_delete_test_1' }, + { id: 'bulk_delete_test_2' }, + ]; + const destinationIndices = transformsInfo.map((d) => generateDestIndex(d.id)); + + beforeEach(async () => { + await asyncForEach(transformsInfo, async ({ id }: { id: string }, idx: number) => { + await createTransform(id, destinationIndices[idx]); + await transform.api.createIndices(destinationIndices[idx]); + }); + }); + + afterEach(async () => { + await asyncForEach(destinationIndices, async (destinationIndex: string) => { + await transform.api.deleteIndices(destinationIndex); + }); + }); + + it('should delete multiple transforms by transformIds', async () => { + const { body } = await supertest + .post(`/api/transform/delete_transforms`) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(COMMON_REQUEST_HEADERS) + .send({ + transformsInfo, + }) + .expect(200); + + await asyncForEach( + transformsInfo, + async ({ id: transformId }: { id: string }, idx: number) => { + expect(body[transformId].transformDeleted.success).to.eql(true); + expect(body[transformId].destIndexDeleted.success).to.eql(false); + expect(body[transformId].destIndexPatternDeleted.success).to.eql(false); + await transform.api.waitForTransformNotToExist(transformId); + await transform.api.waitForIndicesToExist(destinationIndices[idx]); + } + ); + }); + + it('should delete multiple transforms by transformIds, even if one of the transformIds is invalid', async () => { + const invalidTransformId = 'invalid_transform_id'; + const { body } = await supertest + .post(`/api/transform/delete_transforms`) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(COMMON_REQUEST_HEADERS) + .send({ + transformsInfo: [ + { id: transformsInfo[0].id }, + { id: invalidTransformId }, + { id: transformsInfo[1].id }, + ], + }) + .expect(200); + + await asyncForEach( + transformsInfo, + async ({ id: transformId }: { id: string }, idx: number) => { + expect(body[transformId].transformDeleted.success).to.eql(true); + expect(body[transformId].destIndexDeleted.success).to.eql(false); + expect(body[transformId].destIndexPatternDeleted.success).to.eql(false); + await transform.api.waitForTransformNotToExist(transformId); + await transform.api.waitForIndicesToExist(destinationIndices[idx]); + } + ); + + expect(body[invalidTransformId].transformDeleted.success).to.eql(false); + expect(body[invalidTransformId].transformDeleted).to.have.property('error'); + }); + }); + + describe('with deleteDestIndex setting', function () { + const transformId = 'test2'; + const destinationIndex = generateDestIndex(transformId); + + before(async () => { + await createTransform(transformId, destinationIndex); + await transform.api.createIndices(destinationIndex); + }); + + after(async () => { + await transform.api.deleteIndices(destinationIndex); + }); + + it('should delete transform and destination index', async () => { + const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; + const { body } = await supertest + .post(`/api/transform/delete_transforms`) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(COMMON_REQUEST_HEADERS) + .send({ + transformsInfo, + deleteDestIndex: true, + }) + .expect(200); + + expect(body[transformId].transformDeleted.success).to.eql(true); + expect(body[transformId].destIndexDeleted.success).to.eql(true); + expect(body[transformId].destIndexPatternDeleted.success).to.eql(false); + await transform.api.waitForTransformNotToExist(transformId); + await transform.api.waitForIndicesNotToExist(destinationIndex); + }); + }); + + describe('with deleteDestIndexPattern setting', function () { + const transformId = 'test3'; + const destinationIndex = generateDestIndex(transformId); + + before(async () => { + await createTransform(transformId, destinationIndex); + await transform.api.createIndices(destinationIndex); + await transform.testResources.createIndexPatternIfNeeded(destinationIndex); + }); + + after(async () => { + await transform.api.deleteIndices(destinationIndex); + await transform.testResources.deleteIndexPattern(destinationIndex); + }); + + it('should delete transform and destination index pattern', async () => { + const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; + const { body } = await supertest + .post(`/api/transform/delete_transforms`) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(COMMON_REQUEST_HEADERS) + .send({ + transformsInfo, + deleteDestIndex: false, + deleteDestIndexPattern: true, + }) + .expect(200); + + expect(body[transformId].transformDeleted.success).to.eql(true); + expect(body[transformId].destIndexDeleted.success).to.eql(false); + expect(body[transformId].destIndexPatternDeleted.success).to.eql(true); + await transform.api.waitForTransformNotToExist(transformId); + await transform.api.waitForIndicesToExist(destinationIndex); + await transform.testResources.assertIndexPatternNotExist(destinationIndex); + }); + }); + + describe('with deleteDestIndex & deleteDestIndexPattern setting', function () { + const transformId = 'test4'; + const destinationIndex = generateDestIndex(transformId); + + before(async () => { + await createTransform(transformId, destinationIndex); + await transform.api.createIndices(destinationIndex); + await transform.testResources.createIndexPatternIfNeeded(destinationIndex); + }); + + after(async () => { + await transform.api.deleteIndices(destinationIndex); + await transform.testResources.deleteIndexPattern(destinationIndex); + }); + + it('should delete transform, destination index, & destination index pattern', async () => { + const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; + const { body } = await supertest + .post(`/api/transform/delete_transforms`) + .auth( + USER.TRANSFORM_POWERUSER, + transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) + ) + .set(COMMON_REQUEST_HEADERS) + .send({ + transformsInfo, + deleteDestIndex: true, + deleteDestIndexPattern: true, + }) + .expect(200); + + expect(body[transformId].transformDeleted.success).to.eql(true); + expect(body[transformId].destIndexDeleted.success).to.eql(true); + expect(body[transformId].destIndexPatternDeleted.success).to.eql(true); + await transform.api.waitForTransformNotToExist(transformId); + await transform.api.waitForIndicesNotToExist(destinationIndex); + await transform.testResources.assertIndexPatternNotExist(destinationIndex); + }); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/transform/index.ts b/x-pack/test/api_integration/apis/transform/index.ts new file mode 100644 index 0000000000000..93a951a55ece1 --- /dev/null +++ b/x-pack/test/api_integration/apis/transform/index.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const transform = getService('transform'); + + describe('Machine Learning', function () { + this.tags(['transform']); + + before(async () => { + await transform.securityCommon.createTransformRoles(); + await transform.securityCommon.createTransformUsers(); + }); + + after(async () => { + await transform.securityCommon.cleanTransformUsers(); + await transform.securityCommon.cleanTransformRoles(); + + await esArchiver.unload('ml/farequote'); + + await transform.testResources.resetKibanaTimeZone(); + }); + + loadTestFile(require.resolve('./delete_transforms')); + }); +} diff --git a/x-pack/test/api_integration/services/index.ts b/x-pack/test/api_integration/services/index.ts index e7e166237c602..2a0327ff57104 100644 --- a/x-pack/test/api_integration/services/index.ts +++ b/x-pack/test/api_integration/services/index.ts @@ -28,6 +28,7 @@ import { InfraLogSourceConfigurationProvider } from './infra_log_source_configur import { MachineLearningProvider } from './ml'; import { IngestManagerProvider } from './ingest_manager'; import { ResolverGeneratorProvider } from './resolver'; +import { TransformProvider } from './transform'; export const services = { ...commonServices, @@ -48,4 +49,5 @@ export const services = { ml: MachineLearningProvider, ingestManager: IngestManagerProvider, resolverGenerator: ResolverGeneratorProvider, + transform: TransformProvider, }; diff --git a/x-pack/test/api_integration/services/transform.ts b/x-pack/test/api_integration/services/transform.ts new file mode 100644 index 0000000000000..1403d5d2d67f0 --- /dev/null +++ b/x-pack/test/api_integration/services/transform.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrProviderContext } from '../../functional/ftr_provider_context'; + +import { TransformAPIProvider } from '../../functional/services/transform/api'; +import { TransformSecurityCommonProvider } from '../../functional/services/transform/security_common'; +import { MachineLearningTestResourcesProvider } from '../../functional/services/ml/test_resources'; + +export function TransformProvider(context: FtrProviderContext) { + const api = TransformAPIProvider(context); + const securityCommon = TransformSecurityCommonProvider(context); + const testResources = MachineLearningTestResourcesProvider(context); + + return { + api, + securityCommon, + testResources, + }; +} diff --git a/x-pack/test/functional/services/transform/api.ts b/x-pack/test/functional/services/transform/api.ts index a805f5a3b6013..697020fafb196 100644 --- a/x-pack/test/functional/services/transform/api.ts +++ b/x-pack/test/functional/services/transform/api.ts @@ -20,6 +20,21 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { const esSupertest = getService('esSupertest'); return { + async createIndices(indices: string) { + log.debug(`Creating indices: '${indices}'...`); + if ((await es.indices.exists({ index: indices, allowNoIndices: false })) === true) { + log.debug(`Indices '${indices}' already exist. Nothing to create.`); + return; + } + + const createResponse = await es.indices.create({ index: indices }); + expect(createResponse) + .to.have.property('acknowledged') + .eql(true, 'Response for create request indices should be acknowledged.'); + + await this.waitForIndicesToExist(indices, `expected ${indices} to be created`); + }, + async deleteIndices(indices: string) { log.debug(`Deleting indices: '${indices}'...`); if ((await es.indices.exists({ index: indices, allowNoIndices: false })) === false) { @@ -34,11 +49,25 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { .to.have.property('acknowledged') .eql(true, 'Response for delete request should be acknowledged'); - await retry.waitForWithTimeout(`'${indices}' indices to be deleted`, 30 * 1000, async () => { + await this.waitForIndicesNotToExist(indices, `expected indices '${indices}' to be deleted`); + }, + + async waitForIndicesToExist(indices: string, errorMsg?: string) { + await retry.tryForTime(30 * 1000, async () => { + if ((await es.indices.exists({ index: indices, allowNoIndices: false })) === true) { + return true; + } else { + throw new Error(errorMsg || `indices '${indices}' should exist`); + } + }); + }, + + async waitForIndicesNotToExist(indices: string, errorMsg?: string) { + await retry.tryForTime(30 * 1000, async () => { if ((await es.indices.exists({ index: indices, allowNoIndices: false })) === false) { return true; } else { - throw new Error(`expected indices '${indices}' to be deleted`); + throw new Error(errorMsg || `indices '${indices}' should not exist`); } }); }, @@ -63,9 +92,7 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { async getTransformState(transformId: string): Promise { const stats = await this.getTransformStats(transformId); - const state: TRANSFORM_STATE = stats.state; - - return state; + return stats.state; }, async waitForTransformState(transformId: string, expectedState: TRANSFORM_STATE) { @@ -96,8 +123,8 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { }); }, - async getTransform(transformId: string) { - return await esSupertest.get(`/_transform/${transformId}`).expect(200); + async getTransform(transformId: string, expectedCode = 200) { + return await esSupertest.get(`/_transform/${transformId}`).expect(expectedCode); }, async createTransform(transformConfig: TransformPivotConfig) { @@ -105,11 +132,27 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { log.debug(`Creating transform with id '${transformId}'...`); await esSupertest.put(`/_transform/${transformId}`).send(transformConfig).expect(200); - await retry.waitForWithTimeout(`'${transformId}' to be created`, 5 * 1000, async () => { - if (await this.getTransform(transformId)) { + await this.waitForTransformToExist( + transformId, + `expected transform '${transformId}' to be created` + ); + }, + + async waitForTransformToExist(transformId: string, errorMsg?: string) { + await retry.waitForWithTimeout(`'${transformId}' to exist`, 5 * 1000, async () => { + if (await this.getTransform(transformId, 200)) { + return true; + } else { + throw new Error(errorMsg || `expected transform '${transformId}' to exist`); + } + }); + }, + async waitForTransformNotToExist(transformId: string, errorMsg?: string) { + await retry.waitForWithTimeout(`'${transformId}' to exist`, 5 * 1000, async () => { + if (await this.getTransform(transformId, 404)) { return true; } else { - throw new Error(`expected transform '${transformId}' to be created`); + throw new Error(errorMsg || `expected transform '${transformId}' to not exist`); } }); }, From 3c6aabcf354cd83942a02b4eba89894a4912d944 Mon Sep 17 00:00:00 2001 From: EamonnTP Date: Wed, 10 Jun 2020 16:14:46 +0100 Subject: [PATCH 83/91] [DOCS] Move Logs app content to Logs monitoring guide (#68644) * Move content to Logs guide * Add redirects to Logs monitoring guide * Update urls --- docs/infrastructure/infra-ui.asciidoc | 2 +- docs/logs/configuring.asciidoc | 46 -------- docs/logs/getting-started.asciidoc | 11 -- docs/logs/images/alert-actions-menu.png | Bin 32575 -> 0 bytes docs/logs/images/alert-flyout.png | Bin 171358 -> 0 bytes .../images/analysis-tab-create-ml-job.png | Bin 241031 -> 0 bytes docs/logs/images/log-rate-anomalies.png | Bin 305676 -> 0 bytes docs/logs/images/log-rate-entries.png | Bin 235595 -> 0 bytes docs/logs/images/log-time-filter.png | Bin 51802 -> 0 bytes docs/logs/images/logs-action-menu.png | Bin 531 -> 0 bytes docs/logs/images/logs-add-data.png | Bin 399007 -> 0 bytes ...ure-source-dialog-remove-column-button.png | Bin 378 -> 0 bytes docs/logs/images/logs-time-selector.png | Bin 5793 -> 0 bytes .../images/logs-view-event-with-filter.png | Bin 929 -> 0 bytes docs/logs/images/logs-view-event.png | Bin 555 -> 0 bytes docs/logs/images/logs-view-in-context.png | Bin 388396 -> 0 bytes docs/logs/index.asciidoc | 24 +---- docs/logs/log-rate.asciidoc | 94 ---------------- docs/logs/logs-alerting.asciidoc | 27 ----- docs/logs/using.asciidoc | 100 ------------------ docs/redirects.asciidoc | 27 ++++- 21 files changed, 32 insertions(+), 299 deletions(-) delete mode 100644 docs/logs/configuring.asciidoc delete mode 100644 docs/logs/getting-started.asciidoc delete mode 100644 docs/logs/images/alert-actions-menu.png delete mode 100644 docs/logs/images/alert-flyout.png delete mode 100644 docs/logs/images/analysis-tab-create-ml-job.png delete mode 100644 docs/logs/images/log-rate-anomalies.png delete mode 100644 docs/logs/images/log-rate-entries.png delete mode 100644 docs/logs/images/log-time-filter.png delete mode 100644 docs/logs/images/logs-action-menu.png delete mode 100644 docs/logs/images/logs-add-data.png delete mode 100644 docs/logs/images/logs-configure-source-dialog-remove-column-button.png delete mode 100644 docs/logs/images/logs-time-selector.png delete mode 100644 docs/logs/images/logs-view-event-with-filter.png delete mode 100644 docs/logs/images/logs-view-event.png delete mode 100644 docs/logs/images/logs-view-in-context.png delete mode 100644 docs/logs/log-rate.asciidoc delete mode 100644 docs/logs/logs-alerting.asciidoc delete mode 100644 docs/logs/using.asciidoc diff --git a/docs/infrastructure/infra-ui.asciidoc b/docs/infrastructure/infra-ui.asciidoc index 96550b4ed5758..9e7459da743a4 100644 --- a/docs/infrastructure/infra-ui.asciidoc +++ b/docs/infrastructure/infra-ui.asciidoc @@ -103,7 +103,7 @@ You can: * Select *View Metrics* to <>. -* Select *View Logs* to <> in the *Logs* app. +* Select *View Logs* to {logs-guide}/inspect-log-events.html[view the logs] in the *Logs* app. Depending on the features you have installed and configured, you may also be able to: diff --git a/docs/logs/configuring.asciidoc b/docs/logs/configuring.asciidoc deleted file mode 100644 index 6b54721f92e89..0000000000000 --- a/docs/logs/configuring.asciidoc +++ /dev/null @@ -1,46 +0,0 @@ -[role="xpack"] -[[xpack-logs-configuring]] - -:ecs-base-link: {ecs-ref}/ecs-base.html[base] - -== Configuring the Logs data - -The default source configuration for logs is specified in the {kibana-ref}/logs-ui-settings-kb.html[Logs app settings] in the {kibana-ref}/settings.html[Kibana configuration file]. -The default configuration uses the `filebeat-*` index pattern to query the data. -The default configuration also defines field settings for things like timestamps and container names, and the default columns to show in the logs stream. - -If your logs have custom index patterns, use non-default field settings, or contain parsed fields which you want to expose as individual columns, you can override the default configuration settings. - -To change the configuration settings, click the *Settings* tab. - -NOTE: These settings are shared with metrics. Changes you make here may also affect the settings used by the *Metrics* app. - -In the *Settings* tab, you can change the values in these sections: - -* *Name*: the name of the source configuration -* *Indices*: the index pattern or patterns in the Elasticsearch indices to read metrics data and log data from -* *Fields*: the names of specific fields in the indices that are used to query and interpret the data correctly -* *Log columns*: the columns that are shown in the logs stream - -By default the logs stream shows following columns: - -* *Timestamp*: The timestamp of the log entry from the `timestamp` field. -* *Message*: The message extracted from the document. -The content of this field depends on the type of log message. -If no special log message type is detected, the Elastic Common Schema (ECS) {ecs-base-link} field, `message`, is used. - -To add a new column to the logs stream, in the *Settings* tab, click *Add column*. -In the list of available fields, select the field you want to add. -You can start typing a field name in the search box to filter the field list by that name. - -To remove an existing column, click the *Remove this column* icon -image:logs/images/logs-configure-source-dialog-remove-column-button.png[Remove column]. - -When you have completed your changes, click *Apply*. - -If the fields are greyed out and cannot be edited, you may not have sufficient privileges to change the source configuration. -For more information see <>. - -TIP: If <> are enabled in your Kibana instance, any configuration changes you make here are specific to the current space. -You can make different subsets of data available by creating multiple spaces with different data source configurations. - diff --git a/docs/logs/getting-started.asciidoc b/docs/logs/getting-started.asciidoc deleted file mode 100644 index ca09bb34c0e56..0000000000000 --- a/docs/logs/getting-started.asciidoc +++ /dev/null @@ -1,11 +0,0 @@ -[role="xpack"] -[[xpack-logs-getting-started]] -== Getting started with logs monitoring - -To get started with the Logs app in Kibana, you need to start collecting logs data for your infrastructure. - -Kibana provides step-by-step instructions to help you add logs data. -The {logs-guide}[Logs Monitoring Guide] is a good source for more detailed information and instructions. - -[role="screenshot"] -image::logs/images/logs-add-data.png[Screenshot showing Add logging data in Kibana] diff --git a/docs/logs/images/alert-actions-menu.png b/docs/logs/images/alert-actions-menu.png deleted file mode 100644 index 3f96a700a0ac129d60f1bd3548ddb4b554e2f5b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32575 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 Au>b%7 diff --git a/docs/logs/images/alert-flyout.png b/docs/logs/images/alert-flyout.png deleted file mode 100644 index 30c8857758a8b4d39b448e5f4fd892b02270cfc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171358 zcmbSzby!u~);A#Ch=8Po2nZVlq&uZSK)R$G>23k(E=fs|?hXSs-CbMh-qH=<;+%8O z<-B*Fe?FgwaIZDz9CP#-^EU}qQh0@hPJ#{x2ZtpsC9Vtyhd2!fha!cF41Ds7+a(7M z4pYiPOiW2yOpH>=!Oqme+5`?xDl}0YMMI^BFjHGu+T0&i3avGiS}OUWXgDS1n+m)* zVbM@lst?n6ufNuYqfQUM!IPLm=+>%CmZ&@pK}t+?t~3x^l}F#$I$gY6Ja20}9ZGe) zQDHk>B!+YP;;w9g{RKm~?5QFl5k)^qT3j!+06Z!s{PV{Mm~LK;3FM@tNZCh_TL!4D zuob=6eQ)pN|NNG!Z*RhY}ne%+C%Y0OV4)| zpI70}klbifQ`KkP+I*s?(#&9&93Y~T5G%oARmmiOQdIZV8eJlN!-q7LS|PO^>qncY zv|Gi;Cuu2E7~x~neGaSF$A%aZhPE}x>T977sbBK*o%6rBk;LUfquu%8L-EPWTGbbX z@K)+`lgmz(QrzbvBCF&zB(Q~-zO17m#|ihF6#TMrZ4v9|L(x-bOYrXRM82Hwn_K8v z2k;G#MFvIF8p}%m~4*GpxOtrDfGJAu`FD2ng+g<7 zC+`d2bAF@w<}Awh>*T3@>`sV>hQUko5WH_MISPIC*=vw_`*2e5>h-7y0*23?sveK z<0Iet_DdTM>fsfa?ua+smCD7%1-AE?#MgDFTSvIhx)7%mXSm^LxOXms`c!@D+wWF` z;Mx^JfkX0U_1DU#vHVK#H~stw_R044WDp>nKI)KA^T= ztysvXMS9Xmar|L4^JlzBAo1`KT5}|=z&&x&;pGjaBi`AlHet^feim=#`X4%eZDGYG z49qtqPQgqIN;F*6z*39m_L{CIzjqfI zqcwieQCJia6m1jrk=)DQP_|}hOL!dS#}-+YP!%*P*C@W3eWZN+`9#&%5`iO}H(5)h zv@kPgF}H1GbhK*pV1y)>cJgEHn@_c`wo4|(N~2$Tf5eXzBUMxxP8zNoi5jsTTO8hW z;`6{2NX&etFIt|Tl`WL*J8Wu>GqGlgQDbJMZoy@)KjKp)Hc~n9c3Wkw&eT}v5g#s%t<_F{xWSu~!K(;_#);%wkL&(mHn50`mC2 z{EK(_{23 z7B8kQUQjzNEt*`MB%UlT(JpDWVX~H->#r!PZZwjuJgy^{DXSDPx?CJwWS+70*UepU z^rZ1D^Zw+WaV>z-B$oaCQ3y$hRh0NEJFqp_IVw3ri4KP@RwZ$a)@*!cOmnAYu+awf z?S~=Uo|unRT)O7W*2!MUyvZSAsbaaogjhCY7Y-={72|LFLNbU?CMLdffStp)7k*uQ ze}%+i?Al^waA%i)E|h5glw z)nk2Kj0459+XeOht|h02&}u=%EQ72W!4NOO3y+Jn^S$HixuH&$IlB>_6LeYUPg)#kjn8KX68>0lx>ya_}Q`A|Kqln$^K|`oYiB7{#8v*9V(rUIfpAzq#glPyE7yKit zh~)64t=oJ=1N(l≠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∈*P`=OiFq!S}$wF0)W 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 z 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

9o*Y+=KPU`rI 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 VCJhtj8HxY^002ovPDHLkV1j5E_D28! diff --git a/docs/logs/images/logs-add-data.png b/docs/logs/images/logs-add-data.png deleted file mode 100644 index 176c71466aa38585c24af0869bbd0ab413af2d46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 399007 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%0DnTph*pZ-%^DxiLJBQQb-q#Oc1ba&4T0`+M5U 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

6HOH2Iec#%8Zs?dBw$@(5kob%H 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�lCb(bsAC05jNSS;1Ih@vq{=OKJ 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

(C9w)Tq)KV5=O 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

NP`3$v4a;K6%=GV+GN7#hLP1BZz*!g&i`1dG z!(Y%W71JM?pmx9MoWJ?9hg-T>FAyJl(!$N?Ni3b$l{#!^H+`treZEegh;|FR)q10~ z?CXMGXrVo;!(^q|bt#MOkKurWjxp`mOV?}C!!U01_ICE{gmL!Kb_Ss+kfSTvku^c$ zj_EX6x#562tu_-j@r1z0gw)jn>vh}Ebx3mixK~!@!ncw)up8}Y1gE?m0eD!0w#;$P zw*r9tQ2E|GiJcHmMCrX_LNUDAZi+4Pn{FDioZ4-uYUCLRWc=q;((n@Gu}!KOIs7L^CO(=D0EmkWaP_Hg8r!h zXJRHRk^!K+ge3xI^La(f`9C8MHlnvZcKYLXP}<_Wv2)f06lLdBp#3$b8%4is4h- VU)#cWWEb#r(_WRH1TM}mrXgOWxrz!f$vWrb4bgQ zX(+Fz)`wFkFvUNdI)NuWG2jo=A5Wj0iw*nn>?xW!hm^F@;#C~vMHJa!=u{`8h7J)! Y0co`V&!KW7xc~qF07*qoM6N<$f@bik5dZ)H diff --git a/docs/logs/images/logs-time-selector.png b/docs/logs/images/logs-time-selector.png deleted file mode 100644 index 5e6a9b7222c541184425c9f49d421a32e2686e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5793 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 y?B%NyF3K9xaG_)s458A=`}V;@ui diff --git a/docs/logs/images/logs-view-event-with-filter.png b/docs/logs/images/logs-view-event-with-filter.png deleted file mode 100644 index 4e378af39ab0574d0d718649b5f986b17167b90c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 zcmV;S177@zP)Px&TS-JgR5%f}R9j0_Q562>mO5S%O3=x%iBd}(?GFT&m(sTgwT!U53zil{Pd#;c z3GpEl>MbXtWs!XxqB~5m*9POqiUSh3EAf%*}nl6wS?a ziZdw@iH-!E$j*X`<|-vD#MY!uo3FxbHbYevw0Cr&yZaSVQ&Zq}ry=>!K?2Y)=9|F4 z;3s%TMp00Zhmv!Juvje6IE7$gVEt3*c)wp2w{G7PRW%L5>-AAE8=}#`pDx2AW1_OU zUfj9cC=^8%(l-bTIw+4Ut!&MFFl~qwzQ776vo=e+cECZMx zLQG7~h{EEFf}{EASHw30U*6_pou6zz4|%1})byNS3?1BfJbsw&7d<$7)Q!}XgJ^7O zfv2|*yKJ`Ln=|GFirkzmT&=G~Mn*dMzCv|nDF|EI7{E-Y4V}1Pxaaf@P zHhh>_Hp(I*B3y!VfC&llSX^8pUI&QhR=ICPEZsKokt2K1@(6uz-%BvI;X^pWYYla@ z;?L33 zGh?xASkuHtrJ9-H#_Qg9QlbCsb~|EYchiy_2!!W$dxWl*V=wt+X1XPYt}uYPa`N-@ z(BD4*@921l5l7kBbRW&l4^V(t67!Ba|E76=zpTYDET4ITR!5pxvWP|g;gfzz3Y>o;z~=bMy~b7WDG;fS<{ z8|%@r32EbUC84PBwDi?8;c?q0)YjICmpvXFNjr>;^fVkwrY1z!z)fh7n$Xbj2=Y(n zpoF+?wc6+!eqYfaf#oLmU22=-lhg2cxNXj3W@c6vi_^Ie4u=Cd*;zQ?a{hhWWMEzN zM$bi{ssXuewOVBJ=e?a8{g$iHLH~6OdAxrG3-w00000NkvXXu0mjf DTn4r^ diff --git a/docs/logs/images/logs-view-event.png b/docs/logs/images/logs-view-event.png deleted file mode 100644 index 29dff68e3fdba9f2392e0251208de80ca0a3f3b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 555 zcmV+`0@VG9P)Px$q zb#ieL1Q&M)Clv}Jf>5RYYin&A&yA^#Nn6`e2f<6yyu93Z&bjBlS4Dq0)$xm={vx&k z{ZEi_*rfox?BTXg6!cE8qw@&n_rgZH_&n0-!{Sga0zST3wvAHKE~3)sXbM+P31}pX z#C1&Xgs?PRgR$NK@Sb5Pt;t*;@Vn4at0DZDKu^0DZ4DakV;SJI6Qx;1S<$x?X0}79 zqa_2~e!L}gt21eQ6kmaW(~>z_qH(-B)&Qh{zGe?vs$Adv7nb6BkOrr67ss0uP4H-J z2nlrFvWpbkPGVYt!OR$&H=6}q5EP2HgUftw0;>{ci7m5RA^50xb26h`K#Xwq*O<;q zpfg!dnhQUjwR)Zx)$-9vK%mQq zB#y7+hJg#aw@{e1!G?OxhFaGDILvwuq*;ayd`|TT(AVmP#%hqvVRRlEX9dKl@u~>k z#Bp*FLw&Uy!SFj?UfC2978}lUK#(W?&#WBWVLurCI-TpI^%(4`EV>FOfk+gkDt}6_ t#9pD(BFPY|%K$D=*$L!Jnd0vgd;ok4noWRiK|ufj002ovPDHLkV1f>!_bLDY diff --git a/docs/logs/images/logs-view-in-context.png b/docs/logs/images/logs-view-in-context.png deleted file mode 100644 index 09a9e89fc30429072106b73b6e15fa84aef38325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388396 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 z 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�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

`>Vhgy3Vv1HBeu8p$*{vpJ!>?JJ3sC2Mlf~G z;ex=cIy2hPMY%rN)Y2I-Y|B`A6Q&QYw&|uc;Ui6!HUU92)a}^EuU~#38g0I`@D=@> z^*9gt#49YZUHNeqME%KIQDj4yrbv(etMQt)Ha93m}j3FSeejc(R|&A>1t=dEGwR0}$hajHrmm=BT*f+y^B2T1$fUf=DK2~OCv z)}@Cps1!MA1>bnDUp)Pxy8_RtkKS@9t6XBXtX?%$YW5ECb+C$VqA)f4fjDZn1oM46 zXU-ccCqeoVPexbn>NFY4{rvdB?BwaaG}6xDjO@T?M6pbq>wF$DraQTRji%%j8T7Pcn{=?GcmkuXcxipj4fhJpN$>S+l-!g@VWc*6 zo+b0qsiJpFpB(ZMSnm}0l#1subvivSWqOWwn%)U8`N~?|aFnr`@v)I7@?y9A|GoU!Cvb z#@I>~rhjY%;f&ncsHyJn8scATkHM`Iw1uJW+HO;cCV!liP(*@g=h2I1PTlx3@f#MAn67IG z>^apsE2TchNR$CAR(kSDu)=Z!5;OtVD@$d2Ul>d|-@vStH0Fg$^?;3vPz>hP83x=h zY0(R6OfqLYqDzWCj5P5@SUGJPM3g*J#J_EY@E-qh{2pA{Uut?S>#^7)36H_2S@g&` z^5*$5*8@)`Hcs#EVXd0uZ%hdyft$R3NKtJ0p1f;cFndz?Ct0Gr6I(S*&023>&pOL{ z$V*S7&T7eY5UMJ?NI9@V-8KPHSr0;p;+ZncC0#F2wB7KQ{_)0(5}mBGANuW=V@caa znu7gg6@?D=3y1ABCu4gGPY8lMzDd;eqj29NyW&1!k;!k@_hg=|^Kf+qzFU@a#Y7+8 zGsv)6)0^TVq2-arl^&#rIJvi#7glBfk))d&bVtOyZ|;VOGNZD3?3V|A>b%NgJIv5C zx%&$L=6f(gFSTiz9rV>x>b9WWhtKws4*_Ja=^sv5TFF`0lwZoZLH5r^+CB^B9F(Y{ zkUZY>g4uWu7~aR3HiUHkBE{<6S@(nKG0@RI0K%u0SP?Aq-*}k$n{RVeiy>TIXBq9u zm)o}@rv6m!(3`UaZm@r_eama*g)56FkD;aF*zod5{V#x(kGPMG2WW} zc$+KwEljA!C>0zo?)v7NB7RZ)SlwQ)kh=;hAc_z>^MIy4iuGqoG>-Y(PP{?M-zUds! zPi)we>X0ej8hH|2dpvb7$OhJSY4Rp{y5+!b?YWhE%L{>`a{+hDf$nDzs7~xGLlf{1 z*+7>qopZBqjxZE|K2cWT%asEOEW2-ac6!(-j{RH=dcU-7FzHkAbDQ#}?L07|HF^Gb z%C)J-L;HtY%EoD#byMpWEEoR8mq4IuG0^wu*15#{1?6qY=^#{=mp%fMqothShYLMX zF>gdWp8nq;-2Y9o1}0D*k_qQ{!64LS(3gl#_d%7;kO2UW!Kt18_aXdUCy08E>wJZE Tym;5uzgLC^X8MGiPEr2{zfWU{ diff --git a/docs/logs/index.asciidoc b/docs/logs/index.asciidoc index 0d225e5e89c17..45d4321f40556 100644 --- a/docs/logs/index.asciidoc +++ b/docs/logs/index.asciidoc @@ -1,9 +1,8 @@ +[chapter] [role="xpack"] [[xpack-logs]] = Logs -[partintro] --- The Logs app in Kibana enables you to explore logs for common servers, containers, and services. The Logs app has a compact, console-like display that you can customize. @@ -13,23 +12,10 @@ You can open the Logs app from the *Logs* tab in Kibana. You can also open the Logs app directly from a component in the Metrics app. In this case, you will only see the logs for the selected component. -* <> -* <> -* <> -* <> -* <> - [role="screenshot"] -image::logs/images/logs-console.png[Log Console in Kibana] - --- - -include::getting-started.asciidoc[] - -include::using.asciidoc[] - -include::configuring.asciidoc[] +image::logs/images/logs-console.png[Logs Console in Kibana] -include::log-rate.asciidoc[] +[float] +=== Get started -include::logs-alerting.asciidoc[] +To get started with Elastic Logs, refer to {logs-guide}/install-logs-monitoring.html[Install Logs]. diff --git a/docs/logs/log-rate.asciidoc b/docs/logs/log-rate.asciidoc deleted file mode 100644 index 56284a1c76219..0000000000000 --- a/docs/logs/log-rate.asciidoc +++ /dev/null @@ -1,94 +0,0 @@ -[role="xpack"] -[[xpack-logs-analysis]] -== Detecting and inspecting log anomalies - -beta::[] - -When the {ml} {anomaly-detect} features are enabled, -you can use the **Log rate** page in the Logs app. -**Log rate** helps you to detect and inspect log anomalies and the log partitions where the log anomalies occur. -This means you can easily spot anomalous behavior without significant human intervention -- -no more manually sampling log data, calculating rates, and determining if rates are normal. - -*Log rate* automatically highlights periods of time where the log rate is outside expected bounds, -and therefore may be anomalous. -You can use this information as a basis for further investigations. -For example: - -* A significant drop in the log rate might suggest that a piece of infrastructure stopped responding, -and thus we're serving less requests. -* A spike in the log rate could denote a DDoS attack. -This may lead to an investigation of IP addresses from incoming requests. - -You can also view log anomalies directly in the <>. - -[float] -[[logs-analysis-create-ml-job]] -=== Enable log rate analysis and anomaly detection - -Create a machine learning job to enable log rate analysis and anomaly detection. - -[role="screenshot"] -image::logs/images/analysis-tab-create-ml-job.png[Create machine learning job] - -1. To enable log rate analysis and anomaly detection, -you must first create your own {kibana-ref}/xpack-spaces.html[space]. -2. Within a space, navigate to the Logs app and select *Log rate*. -Here, you'll be prompted to create a machine learning job which will carry out the log rate analysis. -3. Choose a time range for the machine learning analysis. -4. Add the Indices that contain the logs you want to analyze. -5. Click *Create ML job*. -6. You're now ready to analyze your log partitions. - -Even though the machine learning job's time range is fixed, -you can still use the time filter to adjust the results that are shown in your analysis. - -[role="screenshot"] -image::logs/images/log-time-filter.png[Log rate time filter] - -[float] -[[logs-analysis-entries-chart]] -=== Log entries chart - -The log entries chart shows an overall, color-coded visualization of the log entry rate, -partitioned according to the value of the Elastic Common Schema (ECS) -{ecs-ref}/ecs-event.html[`event.dataset`] field. -This chart helps you quickly spot increases or decreases in each partition's log rate. - -[role="screenshot"] -image::logs/images/log-rate-entries.png[Log rate entries chart] - -If you have a lot of log partitions, use the following to filter your data: - -* Hover over a time range to see the log rate for each partition. -* Click or hover on a partition name to show, hide, or highlight the partition values. - -[float] -[[logs-analysis-anomalies-chart]] -=== Anomalies charts - -The Anomalies chart shows the time range where anomalies were detected. -The typical rate values are shown in grey, while the anomalous regions are color-coded and superimposed on top. - -[role="screenshot"] -image::logs/images/log-rate-anomalies.png[Log rate entries chart] - -When a time range is flagged as anomalous, -the machine learning algorithms have detected unusual log rate activity. -This might be because: - -* The log rate is significantly higher than usual. -* The log rate is significantly lower than usual. -* Other anomalous behavior has been detected. -For example, the log rate is within bounds, but not fluctuating when it is expected to. - -The level of anomaly detected in a time period is color-coded, from red, orange, yellow, to blue. -Red indicates a critical anomaly level, while blue is a warning level. - -To help you further drill down into a potential anomaly, -you can view an anomaly chart for each individual partition: - -Anomaly scores range from 0 (no anomalies) to 100 (critical). - -To analyze the anomalies in more detail, click *Analyze in ML*, which opens the -{kibana-ref}/xpack-ml.html[Anomaly Explorer in Machine Learning]. diff --git a/docs/logs/logs-alerting.asciidoc b/docs/logs/logs-alerting.asciidoc deleted file mode 100644 index f08a09187a0c8..0000000000000 --- a/docs/logs/logs-alerting.asciidoc +++ /dev/null @@ -1,27 +0,0 @@ -[role="xpack"] -[[xpack-logs-alerting]] -== Logs alerting - -[float] -=== Overview - -To use the alerting functionality you need to {kibana-ref}/alerting-getting-started.html#alerting-setup-prerequisites[set up alerting]. - -You can then select the *Create alert* option, from the *Alerts* actions dropdown. - -[role="screenshot"] -image::logs/images/alert-actions-menu.png[Screenshot showing alerts menu] - -Within the alert flyout you can configure your logs alert: - -[role="screenshot"] -image::logs/images/alert-flyout.png[Screenshot showing alerts flyout] - -[float] -=== Fields and comparators - -The comparators available for conditions depend on the chosen field. The combinations available are: - -- Numeric fields: *more than*, *more than or equals*, *less than*, *less than or equals*, *equals*, and *does not equal*. -- Aggregatable fields: *is* and *is not*. -- Non-aggregatable fields: *matches*, *does not match*, *matches phrase*, *does not match phrase*. diff --git a/docs/logs/using.asciidoc b/docs/logs/using.asciidoc deleted file mode 100644 index eb3025f88ce1b..0000000000000 --- a/docs/logs/using.asciidoc +++ /dev/null @@ -1,100 +0,0 @@ -[role="xpack"] -[[xpack-logs-using]] -== Using the Logs app -Use the Logs app in {kib} to explore and filter your logs in real time. - -You can customize the output to focus on the data you want to see and to control how you see it. -You can also view related application traces or uptime information where available. - -[role="screenshot"] -image::logs/images/logs-console.png[Logs Console in Kibana] - -[float] -[[logs-search]] -=== Use the power of search - -Use the search bar to perform ad hoc searches for specific text. -You can also create structured queries using {kibana-ref}/kuery-query.html[Kibana Query Language]. -For example, enter `host.hostname : "host1"` to see only the information for `host1`. -// ++ this isn't quite the same as the corresponding metrics description now. - -[float] -[[logs-configure-source]] -=== Configure the data to use for your logs -Are you using a custom index pattern to store the log entries? -Do you want to limit the entries shown or change the fields displayed in the columns? -If so, <> to change the index pattern and other settings. - -[float] -[[logs-time]] -=== Specify the time and date - -Click image:images/time-filter-calendar.png[time filter calendar], then choose the time range for the logs. - -Log entries for the specified time appear in the middle of the page. To quickly jump to a nearby point in time, click the minimap timeline to the right. -// ++ what's this thing called? It's minimap in the UI. Would timeline be better? - -[float] -[[logs-customize]] -=== Customize your view -Click *Customize* to customize the view. -Here, you can choose whether to wrap long lines, and choose your preferred text size. - -[float] -=== Configuring the data to use for your logs - -If your logs have custom index patterns, use non-default field settings, or contain parsed fields which you want to expose as individual columns, you can <>. - -[float] -[[logs-stream]] -=== Stream or pause logs -Click *Stream live* to start streaming live log data, or click *Stop streaming* to focus on historical data. - -When you are viewing historical data, you can scroll back through the entries as far as there is data available. - -When you are streaming live data, the most recent log appears at the bottom of the page. -In live streaming mode, you are not able to choose a different time in the time selector or use the minimap timeline. -To do either of these things, you need to stop live streaming first. -// ++ Not sure whether this is correct or not. And what about just scrolling through the display? -// ++ There may be a bug here, (I managed to get future logs) see https://github.com/elastic/kibana/issues/43361 - -[float] -[[logs-highlight]] -=== Highlight a phrase in the logs stream -To highlight a word or phrase in the logs stream, click *Highlights* and enter your search phrase. -// ++ Is search case sensitive? -// ++ Can you search for multiple phrases together, if so, what's the separator? -// ++ What about special characters? For example, I notice that when searching for "Mozilla/4.0" which appears as written in my logs, "Mozilla" is highlighted, as is "4.0" but "/" isn't. The string "-" (which appears in the logs as written, quotes and all, isn't found at all. Any significance? - -[float] -[[logs-event-inspector]] -=== Inspect a log event -To inspect a log event, hover over it, then click the *View actions for line* icon image:logs/images/logs-action-menu.png[View actions for line icon]. On the menu that opens, select *View details*. This opens the *Log event document details* fly-out that shows the fields associated with the log event. - -To quickly filter the logs stream by one of the field values, in the log event details, click the *View event with filter* icon image:logs/images/logs-view-event-with-filter.png[View event icon] beside the field. -This automatically adds a search filter to the logs stream to filter the entries by this field and value. - -[float] -[[log-view-in-context]] -=== View log line in context -To view a certain line in its context (for example, with other log lines from the same file, or the same cloud container), hover over it, then click the *View actions for line* image:logs/images/logs-action-menu.png[View actions for line icon]. On the menu that opens, select *View in context*. This opens the *View log in context* modal, that shows the log line in its context. - -[role="screenshot"] -image::logs/images/logs-view-in-context.png[View a log line in context] - -[float] -[[view-log-anomalies]] -=== View log anomalies - -When the machine learning anomaly detection features are enabled, click *Log rate*, which allows you to -<> in your log data. - -[float] -[[logs-integrations]] -=== Logs app integrations - -To see other actions related to the event, click *Actions* in the log event details. -Depending on the event and the features you have configured, you may also be able to: - -* Select *View status in Uptime* to {uptime-guide}/uptime-app-overview.html[view related uptime information] in the *Uptime* app. -* Select *View in APM* to <> in the *APM* app. diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc index 85d580de9475f..04959b2627a78 100644 --- a/docs/redirects.asciidoc +++ b/docs/redirects.asciidoc @@ -33,7 +33,7 @@ This page has moved. Please see <>. [role="exclude",id="logs-read-only-access"] == Configure source read-only access -This page has moved. Please see <>. +This page has moved. Please see {logs-guide}/configure-logs-source.html[logs configuration]. [role="exclude",id="extend"] == Extend your use case @@ -80,3 +80,28 @@ This page was deleted. See <>. == Developing Visualizations This page was deleted. See <>. + +[role="exclude",id="xpack-logs-getting-started"] +== Getting started with logs monitoring + +This page has moved. Please see the new section in the {logs-guide}/install-logs-monitoring.html[Logs Monitoring Guide]. + +[role="exclude",id="xpack-logs-using"] +== Using the Logs app + +This page has moved. Please see the new section in the {logs-guide}/logs-app-overview.html[Logs Monitoring Guide]. + +[role="exclude",id="xpack-logs-configuring"] +== Configuring the Logs data + +This page has moved. Please see the new section in the {logs-guide}/configure-logs-source.html[Logs Monitoring Guide]. + +[role="exclude",id="xpack-logs-analysis"] +== Detecting and inspecting log anomalies + +This page has moved. Please see the new section in the {logs-guide}/detect-log-anomalies.html[Logs Monitoring Guide] + +[role="exclude",id="xpack-logs-alerting"] +== Logs alerting + +This page has moved. Please see the new section in the {logs-guide}/create-log-alert.html[Logs Monitoring Guide] From 3b4fa6ade648d2aae22280713a809483e7fe55c9 Mon Sep 17 00:00:00 2001 From: Garrett Spong Date: Wed, 10 Jun 2020 09:19:32 -0600 Subject: [PATCH 84/91] [Security] Updates Cypress README.md to show how to run-as-ci with Cypress UI [skip ci] (#68728) ## Summary Updates Cypress README.md to show how to `run-as-ci` with the Cypress UI. ##### Updates: > Note: To `run-as-ci` with the Cypress UI, update [x-pack/test/security_solution_cypress/runner.ts](https://github.com/elastic/kibana/blob/master/x-pack/test/security_solution_cypress/runner.ts#L25) from > ``` ts >args: ['cypress:run'], >``` >to >``` ts >args: ['cypress:open'], >``` >This is helpful for debugging specific failed tests from CI without having to run the entire suite. --- x-pack/plugins/security_solution/cypress/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/x-pack/plugins/security_solution/cypress/README.md b/x-pack/plugins/security_solution/cypress/README.md index ad3af2aaa4e8a..1a2ae696373b1 100644 --- a/x-pack/plugins/security_solution/cypress/README.md +++ b/x-pack/plugins/security_solution/cypress/README.md @@ -135,6 +135,17 @@ Note that with this type of execution you don't need to have running a kibana an As in this case we want to mimic a CI execution we want to execute the tests with the same set of data, this is why in this case does not make sense to override Cypress environment variables. +Note: To `run-as-ci` with the Cypress UI, update [x-pack/test/security_solution_cypress/runner.ts](https://github.com/elastic/kibana/blob/master/x-pack/test/security_solution_cypress/runner.ts#L25) from +``` ts +args: ['cypress:run'], +``` +to +``` ts +args: ['cypress:open'], +``` +This is helpful for debugging specific failed tests from CI without having to run the entire suite. + +Note: Please don't commit this change. ### Test data As mentioned above, when running the tests as Jenkins the tests are populated with data ("archives") found in: `x-pack/test/security_solution_cypress/es_archives`. From 8a5a7c303238a6190ddec5fb993b3dce9dc81a0b Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Wed, 10 Jun 2020 08:39:52 -0700 Subject: [PATCH 85/91] [eslint] Prevents importing of public code into server (#67149) We should not be allowing importing of public into server. Any shared code should reside in a common directory. After #66506, this will not even be possible as we will no longer be transpiling public code into commonjs. Blocks #66506 Signed-off-by: Tyler Smalley --- .eslintrc.js | 9 +++++--- .../public/lib/autocomplete/autocomplete.ts | 2 +- src/plugins/es_ui_shared/common/index.ts | 20 ++++++++++++++++++ .../public/authorization/index.ts | 12 ++++++++++- .../server/report/store_report.test.ts | 2 +- .../server/alerts_client_factory.test.ts | 2 +- .../create_static_index_pattern.ts | 6 ++++-- .../embeddable_enhanced/public/plugin.ts | 14 +++++++------ .../ingest_pipelines/public/shared_imports.ts | 21 ++++++++----------- .../server/routes/api/privileges.ts | 2 +- .../application/store/actions/start_basic.js | 3 ++- x-pack/plugins/maps/server/plugin.ts | 3 ++- .../components/open_timeline/helpers.ts | 2 +- .../endpoint/alerts/handlers/lib/index.ts | 2 +- .../endpoint/routes/resolver/queries/base.ts | 2 +- .../routes/resolver/queries/children.ts | 2 +- .../routes/resolver/queries/events.ts | 2 +- .../routes/resolver/queries/lifecycle.ts | 2 +- .../routes/resolver/queries/multi_searcher.ts | 2 +- .../endpoint/routes/resolver/queries/stats.ts | 2 +- .../routes/resolver/utils/pagination.ts | 2 +- .../security_solution/server/lib/types.ts | 2 +- .../server/utils/serialized_query.ts | 2 +- .../snapshot_restore/public/shared_imports.ts | 18 ++++++++-------- .../snapshot_restore/server/routes/api/app.ts | 2 +- .../public/custom_time_range_action.test.ts | 4 +--- 26 files changed, 88 insertions(+), 54 deletions(-) create mode 100644 src/plugins/es_ui_shared/common/index.ts diff --git a/.eslintrc.js b/.eslintrc.js index b5f8d106392d5..9657719f0f526 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -197,9 +197,12 @@ module.exports = { errorMessage: `Plugins may only import from src/core/server and src/core/public.`, }, { - target: ['(src|x-pack)/plugins/*/public/**/*'], - from: ['(src|x-pack)/plugins/*/server/**/*'], - errorMessage: `Public code can not import from server, use a common directory.`, + target: [ + '(src|x-pack)/plugins/*/server/**/*', + '!x-pack/plugins/apm/**/*', // https://github.com/elastic/kibana/issues/67210 + ], + from: ['(src|x-pack)/plugins/*/public/**/*'], + errorMessage: `Server code can not import from public, use a common directory.`, }, { target: ['(src|x-pack)/plugins/*/common/**/*'], diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts index b05c7ddbb020d..3959f2ed8cf46 100644 --- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts +++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts @@ -308,7 +308,7 @@ export function getCurrentMethodAndTokenPaths( } // eslint-disable-next-line -export default function({ coreEditor: editor, parser }: { coreEditor: CoreEditor; parser: any }) { +export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEditor; parser: any }) { function isUrlPathToken(token: Token | null) { switch ((token || ({} as any)).type) { case 'url.slash': diff --git a/src/plugins/es_ui_shared/common/index.ts b/src/plugins/es_ui_shared/common/index.ts new file mode 100644 index 0000000000000..c13dff5cf1fa1 --- /dev/null +++ b/src/plugins/es_ui_shared/common/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ + +export { Privileges, MissingPrivileges } from '../__packages_do_not_import__/authorization'; diff --git a/src/plugins/es_ui_shared/public/authorization/index.ts b/src/plugins/es_ui_shared/public/authorization/index.ts index 3a02c0d2694f3..e18ab32ffdfa8 100644 --- a/src/plugins/es_ui_shared/public/authorization/index.ts +++ b/src/plugins/es_ui_shared/public/authorization/index.ts @@ -17,4 +17,14 @@ * under the License. */ -export * from '../../__packages_do_not_import__/authorization'; +export { + AuthorizationContext, + AuthorizationProvider, + Error, + MissingPrivileges, + NotAuthorizedSection, + Privileges, + SectionError, + useAuthorizationContext, + WithPrivileges, +} from '../../__packages_do_not_import__/authorization'; diff --git a/src/plugins/usage_collection/server/report/store_report.test.ts b/src/plugins/usage_collection/server/report/store_report.test.ts index 29b6d79cc139a..d8327eb834e12 100644 --- a/src/plugins/usage_collection/server/report/store_report.test.ts +++ b/src/plugins/usage_collection/server/report/store_report.test.ts @@ -20,7 +20,7 @@ import { savedObjectsRepositoryMock } from '../../../../core/server/mocks'; import { storeReport } from './store_report'; import { ReportSchemaType } from './schema'; -import { METRIC_TYPE } from '../../public'; +import { METRIC_TYPE } from '@kbn/analytics'; describe('store_report', () => { test('stores report for all types of data', async () => { diff --git a/x-pack/plugins/alerts/server/alerts_client_factory.test.ts b/x-pack/plugins/alerts/server/alerts_client_factory.test.ts index 50dafba00a7e4..a2d64c94ce007 100644 --- a/x-pack/plugins/alerts/server/alerts_client_factory.test.ts +++ b/x-pack/plugins/alerts/server/alerts_client_factory.test.ts @@ -11,7 +11,7 @@ import { taskManagerMock } from '../../task_manager/server/task_manager.mock'; import { KibanaRequest } from '../../../../src/core/server'; import { loggingServiceMock, savedObjectsClientMock } from '../../../../src/core/server/mocks'; import { encryptedSavedObjectsMock } from '../../encrypted_saved_objects/server/mocks'; -import { AuthenticatedUser } from '../../security/public'; +import { AuthenticatedUser } from '../../../plugins/security/common/model'; import { securityMock } from '../../security/server/mocks'; import { actionsMock } from '../../actions/server/mocks'; diff --git a/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.ts b/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.ts index d788ae81a7db8..ea7cc9b145696 100644 --- a/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.ts +++ b/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.ts @@ -4,8 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ import { SavedObjectsErrorHelpers } from '../../../../../../src/core/server'; -import { apmIndexPattern } from '../../../../../../src/plugins/apm_oss/server'; -import { APM_STATIC_INDEX_PATTERN_ID } from '../../../../../../src/plugins/apm_oss/server'; +import { + apmIndexPattern, + APM_STATIC_INDEX_PATTERN_ID, +} from '../../../../../../src/plugins/apm_oss/server'; import { hasHistoricalAgentData } from '../services/get_services/has_historical_agent_data'; import { Setup } from '../helpers/setup_request'; import { APMRequestHandlerContext } from '../../routes/typings'; diff --git a/x-pack/plugins/embeddable_enhanced/public/plugin.ts b/x-pack/plugins/embeddable_enhanced/public/plugin.ts index e6413ac03aeae..a14cdfd035d2e 100644 --- a/x-pack/plugins/embeddable_enhanced/public/plugin.ts +++ b/x-pack/plugins/embeddable_enhanced/public/plugin.ts @@ -127,17 +127,19 @@ export class EmbeddableEnhancedPlugin }); dynamicActions.start().catch((error) => { - /* eslint-disable */ - console.log('Failed to start embeddable dynamic actions', embeddable); - console.error(error); + /* eslint-disable */ + + console.log('Failed to start embeddable dynamic actions', embeddable); + console.error(error); /* eslint-enable */ }); const stop = () => { dynamicActions.stop().catch((error) => { - /* eslint-disable */ - console.log('Failed to stop embeddable dynamic actions', embeddable); - console.error(error); + /* eslint-disable */ + + console.log('Failed to stop embeddable dynamic actions', embeddable); + console.error(error); /* eslint-enable */ }); }; diff --git a/x-pack/plugins/ingest_pipelines/public/shared_imports.ts b/x-pack/plugins/ingest_pipelines/public/shared_imports.ts index a2ee321526052..ab56ae427120b 100644 --- a/x-pack/plugins/ingest_pipelines/public/shared_imports.ts +++ b/x-pack/plugins/ingest_pipelines/public/shared_imports.ts @@ -7,11 +7,18 @@ import { useKibana as _useKibana } from '../../../../src/plugins/kibana_react/pu import { AppServices } from './application'; export { + AuthorizationProvider, + Error, + NotAuthorizedSection, + SectionError, + SectionLoading, + sendRequest, SendRequestConfig, SendRequestResponse, - UseRequestConfig, - sendRequest, + useAuthorizationContext, useRequest, + UseRequestConfig, + WithPrivileges, } from '../../../../src/plugins/es_ui_shared/public/'; export { @@ -41,14 +48,4 @@ export { isEmptyString, } from '../../../../src/plugins/es_ui_shared/static/validators/string'; -export { - SectionLoading, - WithPrivileges, - AuthorizationProvider, - SectionError, - Error, - useAuthorizationContext, - NotAuthorizedSection, -} from '../../../../src/plugins/es_ui_shared/public'; - export const useKibana = () => _useKibana(); diff --git a/x-pack/plugins/ingest_pipelines/server/routes/api/privileges.ts b/x-pack/plugins/ingest_pipelines/server/routes/api/privileges.ts index 69cba215beafd..e82e05323e644 100644 --- a/x-pack/plugins/ingest_pipelines/server/routes/api/privileges.ts +++ b/x-pack/plugins/ingest_pipelines/server/routes/api/privileges.ts @@ -5,7 +5,7 @@ */ import { RouteDependencies } from '../../types'; import { API_BASE_PATH, APP_CLUSTER_REQUIRED_PRIVILEGES } from '../../../common/constants'; -import { Privileges } from '../../../../../../src/plugins/es_ui_shared/public'; +import { Privileges } from '../../../../../../src/plugins/es_ui_shared/common'; const extractMissingPrivileges = (privilegesObject: { [key: string]: boolean } = {}): string[] => Object.keys(privilegesObject).reduce((privileges: string[], privilegeName: string): string[] => { diff --git a/x-pack/plugins/license_management/public/application/store/actions/start_basic.js b/x-pack/plugins/license_management/public/application/store/actions/start_basic.js index 5ae93bf84c2f8..bce6195caecf0 100644 --- a/x-pack/plugins/license_management/public/application/store/actions/start_basic.js +++ b/x-pack/plugins/license_management/public/application/store/actions/start_basic.js @@ -45,7 +45,8 @@ export const startBasicLicense = (currentLicenseType, ack) => async ( 'xpack.licenseMgmt.replacingCurrentLicenseWithBasicLicenseWarningMessage', { //eslint-disable-next-line - defaultMessage: 'Some functionality will be lost if you replace your {currentLicenseType} license with a BASIC license. Review the list of features below.', + defaultMessage: + 'Some functionality will be lost if you replace your {currentLicenseType} license with a BASIC license. Review the list of features below.', values: { currentLicenseType: currentLicenseType.toUpperCase(), }, diff --git a/x-pack/plugins/maps/server/plugin.ts b/x-pack/plugins/maps/server/plugin.ts index a265cf80c73cd..f2331b9a1a960 100644 --- a/x-pack/plugins/maps/server/plugin.ts +++ b/x-pack/plugins/maps/server/plugin.ts @@ -23,7 +23,8 @@ import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/s import { emsBoundariesSpecProvider } from './tutorials/ems'; // @ts-ignore import { initRoutes } from './routes'; -import { ILicense, LicensingPluginSetup } from '../../licensing/public'; +import { ILicense } from '../../licensing/common/types'; +import { LicensingPluginSetup } from '../../licensing/server'; import { HomeServerPluginSetup } from '../../../../src/plugins/home/server'; interface SetupDeps { diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts index f521ffa9b6b5d..c8a47798f169c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts @@ -221,7 +221,7 @@ export const queryTimelineById = ({ variables: { id: timelineId }, }) // eslint-disable-next-line - .then(result => { + .then((result) => { const timelineToOpen: TimelineResult = omitTypenameInTimeline( getOr({}, 'data.getOneTimeline', result) ); diff --git a/x-pack/plugins/security_solution/server/endpoint/alerts/handlers/lib/index.ts b/x-pack/plugins/security_solution/server/endpoint/alerts/handlers/lib/index.ts index 4f0a7ba2450dc..e398e70f1d7b7 100644 --- a/x-pack/plugins/security_solution/server/endpoint/alerts/handlers/lib/index.ts +++ b/x-pack/plugins/security_solution/server/endpoint/alerts/handlers/lib/index.ts @@ -6,7 +6,7 @@ import { SearchResponse } from 'elasticsearch'; import { IScopedClusterClient } from 'kibana/server'; import { AlertEvent } from '../../../../../common/endpoint/types'; -import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; import { esQuery } from '../../../../../../../../src/plugins/data/server'; import { AlertAPIOrdering, diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/base.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/base.ts index 440b578bde413..debb455ac728f 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/base.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/base.ts @@ -7,7 +7,7 @@ import { SearchResponse } from 'elasticsearch'; import { IScopedClusterClient } from 'kibana/server'; import { ResolverEvent } from '../../../../../common/endpoint/types'; -import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; import { legacyEventIndexPattern } from './legacy_event_index_pattern'; import { MSearchQuery } from './multi_searcher'; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts index e4b2559a1780c..f357ac1a43d72 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts @@ -7,7 +7,7 @@ import { SearchResponse } from 'elasticsearch'; import { ResolverEvent } from '../../../../../common/endpoint/types'; import { ResolverQuery } from './base'; import { PaginationBuilder, PaginatedResults } from '../utils/pagination'; -import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; /** * Builds a query for retrieving descendants of a node. diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/events.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/events.ts index e14b222500d7c..04202cfd007f9 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/events.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/events.ts @@ -7,7 +7,7 @@ import { SearchResponse } from 'elasticsearch'; import { ResolverEvent } from '../../../../../common/endpoint/types'; import { ResolverQuery } from './base'; import { PaginationBuilder, PaginatedResults } from '../utils/pagination'; -import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; /** * Builds a query for retrieving related events for a node. diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/lifecycle.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/lifecycle.ts index 74fe44f39615c..93910293b00af 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/lifecycle.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/lifecycle.ts @@ -5,7 +5,7 @@ */ import { SearchResponse } from 'elasticsearch'; import { ResolverQuery } from './base'; -import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; import { ResolverEvent } from '../../../../../common/endpoint/types'; /** diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/multi_searcher.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/multi_searcher.ts index 7f55fafeafb59..4c0e1a5126e7c 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/multi_searcher.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/multi_searcher.ts @@ -7,7 +7,7 @@ import { IScopedClusterClient } from 'kibana/server'; import { MSearchResponse } from 'elasticsearch'; import { ResolverEvent } from '../../../../../common/endpoint/types'; -import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; /** * Contract for queries to be compatible with ES multi search api diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/stats.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/stats.ts index 359445f514b77..a728054bef219 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/stats.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/stats.ts @@ -6,7 +6,7 @@ import { SearchResponse } from 'elasticsearch'; import { ResolverQuery } from './base'; import { ResolverEvent, EventStats } from '../../../../../common/endpoint/types'; -import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; import { AggBucket } from '../utils/pagination'; export interface StatsResult { diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/pagination.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/pagination.ts index 9a852d47e0e85..61cb5bdb8f146 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/pagination.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/pagination.ts @@ -6,7 +6,7 @@ import { ResolverEvent } from '../../../../../common/endpoint/types'; import { eventId } from '../../../../../common/endpoint/models/event'; -import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; /** * Represents a single result bucket of an aggregation diff --git a/x-pack/plugins/security_solution/server/lib/types.ts b/x-pack/plugins/security_solution/server/lib/types.ts index 2a897806dc628..ff89512124b66 100644 --- a/x-pack/plugins/security_solution/server/lib/types.ts +++ b/x-pack/plugins/security_solution/server/lib/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AuthenticatedUser } from '../../../security/public'; +import { AuthenticatedUser } from '../../../security/common/model'; import { RequestHandlerContext } from '../../../../../src/core/server'; export { ConfigType as Configuration } from '../config'; diff --git a/x-pack/plugins/security_solution/server/utils/serialized_query.ts b/x-pack/plugins/security_solution/server/utils/serialized_query.ts index 09b227d8c5a32..357aec1db480b 100644 --- a/x-pack/plugins/security_solution/server/utils/serialized_query.ts +++ b/x-pack/plugins/security_solution/server/utils/serialized_query.ts @@ -7,7 +7,7 @@ import { UserInputError } from 'apollo-server-errors'; import { isEmpty, isPlainObject, isString } from 'lodash/fp'; -import { JsonObject } from '../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../src/plugins/kibana_utils/common'; export const parseFilterQuery = (filterQuery: string): JsonObject => { try { diff --git a/x-pack/plugins/snapshot_restore/public/shared_imports.ts b/x-pack/plugins/snapshot_restore/public/shared_imports.ts index e0024ea8e0c12..cad8ce147bd25 100644 --- a/x-pack/plugins/snapshot_restore/public/shared_imports.ts +++ b/x-pack/plugins/snapshot_restore/public/shared_imports.ts @@ -5,17 +5,17 @@ */ export { - SendRequestConfig, - SendRequestResponse, - UseRequestConfig, - sendRequest, - useRequest, + AuthorizationProvider, CronEditor, DAY, - SectionError, Error, - WithPrivileges, - useAuthorizationContext, NotAuthorizedSection, - AuthorizationProvider, + SectionError, + sendRequest, + SendRequestConfig, + SendRequestResponse, + useAuthorizationContext, + useRequest, + UseRequestConfig, + WithPrivileges, } from '../../../../src/plugins/es_ui_shared/public'; diff --git a/x-pack/plugins/snapshot_restore/server/routes/api/app.ts b/x-pack/plugins/snapshot_restore/server/routes/api/app.ts index f9714bcc02e47..e978fae0af5bc 100644 --- a/x-pack/plugins/snapshot_restore/server/routes/api/app.ts +++ b/x-pack/plugins/snapshot_restore/server/routes/api/app.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { Privileges } from '../../../../../../src/plugins/es_ui_shared/public'; +import { Privileges } from '../../../../../../src/plugins/es_ui_shared/common'; import { APP_REQUIRED_CLUSTER_PRIVILEGES, diff --git a/x-pack/plugins/ui_actions_enhanced/public/custom_time_range_action.test.ts b/x-pack/plugins/ui_actions_enhanced/public/custom_time_range_action.test.ts index e82ebd9a5a4ad..0d6e9743f0f4b 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/custom_time_range_action.test.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/custom_time_range_action.test.ts @@ -13,9 +13,7 @@ import { mount } from 'enzyme'; import { TimeRangeEmbeddable, TimeRangeContainer, TIME_RANGE_EMBEDDABLE } from './test_helpers'; import { CustomTimeRangeAction } from './custom_time_range_action'; /* eslint-disable */ -import { - HelloWorldContainer, -} from '../../../../src/plugins/embeddable/public/lib/test_samples'; +import { HelloWorldContainer } from '../../../../src/plugins/embeddable/public/lib/test_samples'; /* eslint-enable */ import { From 497ecf8164215493e59e3df5557605aa14b6d5be Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 10 Jun 2020 18:28:00 +0200 Subject: [PATCH 86/91] [Lens] Add description property and check duplicate title on save (#68219) --- .../helpers/check_for_duplicate_title.ts | 7 ++- .../display_duplicate_title_confirm_modal.ts | 2 +- .../vis_types/vis_type_alias_registry.ts | 1 + .../lens/public/app_plugin/app.test.tsx | 58 ++++++++++++++++++- x-pack/plugins/lens/public/app_plugin/app.tsx | 26 ++++++++- .../editor_frame_service/editor_frame/save.ts | 1 + .../editor_frame/state_management.test.ts | 2 + .../editor_frame/state_management.ts | 2 + .../persistence/saved_object_store.test.ts | 3 + .../public/persistence/saved_object_store.ts | 1 + x-pack/plugins/lens/public/vis_type_alias.ts | 3 +- x-pack/plugins/lens/server/saved_objects.ts | 3 + 12 files changed, 102 insertions(+), 7 deletions(-) diff --git a/src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts b/src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts index 8895336aa9ffa..0313b7978c5ab 100644 --- a/src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/check_for_duplicate_title.ts @@ -31,10 +31,13 @@ import { displayDuplicateTitleConfirmModal } from './display_duplicate_title_con * @param services */ export async function checkForDuplicateTitle( - savedObject: SavedObject, + savedObject: Pick< + SavedObject, + 'id' | 'title' | 'getDisplayName' | 'lastSavedTitle' | 'copyOnSave' | 'getEsType' + >, isTitleDuplicateConfirmed: boolean, onTitleDuplicate: (() => void) | undefined, - services: SavedObjectKibanaServices + services: Pick ): Promise { const { savedObjectsClient, overlays } = services; // Don't check for duplicates if user has already confirmed save with duplicate title diff --git a/src/plugins/saved_objects/public/saved_object/helpers/display_duplicate_title_confirm_modal.ts b/src/plugins/saved_objects/public/saved_object/helpers/display_duplicate_title_confirm_modal.ts index 0b02977830fda..1b9e6fb6e996f 100644 --- a/src/plugins/saved_objects/public/saved_object/helpers/display_duplicate_title_confirm_modal.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/display_duplicate_title_confirm_modal.ts @@ -23,7 +23,7 @@ import { confirmModalPromise } from './confirm_modal_promise'; import { SavedObject } from '../../types'; export function displayDuplicateTitleConfirmModal( - savedObject: SavedObject, + savedObject: Pick, overlays: OverlayStart ): Promise { const confirmMessage = i18n.translate( diff --git a/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts b/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts index 6f18cbc5026ec..73e3360004e5a 100644 --- a/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts +++ b/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts @@ -25,6 +25,7 @@ export interface VisualizationListItem { stage: 'experimental' | 'beta' | 'production'; savedObjectType: string; title: string; + description?: string; typeTitle: string; } diff --git a/x-pack/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx index 811f42590f07b..53498a8e5afa1 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -5,6 +5,7 @@ */ import React from 'react'; +import { Observable } from 'rxjs'; import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { App } from './app'; @@ -13,8 +14,11 @@ import { AppMountParameters } from 'kibana/public'; import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { Document, SavedObjectStore } from '../persistence'; import { mount } from 'enzyme'; +import { + SavedObjectSaveModal, + checkForDuplicateTitle, +} from '../../../../../src/plugins/saved_objects/public'; import { createMemoryHistory, History } from 'history'; -import { SavedObjectSaveModal } from '../../../../../src/plugins/saved_objects/public'; import { esFilters, FilterManager, @@ -28,10 +32,20 @@ const dataStartMock = dataPluginMock.createStartContract(); import { navigationPluginMock } from '../../../../../src/plugins/navigation/public/mocks'; import { TopNavMenuData } from '../../../../../src/plugins/navigation/public'; import { coreMock } from 'src/core/public/mocks'; -import { Observable } from 'rxjs'; jest.mock('../persistence'); jest.mock('src/core/public'); +jest.mock('../../../../../src/plugins/saved_objects/public', () => { + // eslint-disable-next-line no-shadow + const { SavedObjectSaveModal, SavedObjectSaveModalOrigin } = jest.requireActual( + '../../../../../src/plugins/saved_objects/public' + ); + return { + SavedObjectSaveModal, + SavedObjectSaveModalOrigin, + checkForDuplicateTitle: jest.fn(), + }; +}); const navigationStartMock = navigationPluginMock.createStartContract(); @@ -644,6 +658,46 @@ describe('Lens App', () => { }); }); + it('checks for duplicate title before saving', async () => { + const args = defaultArgs; + args.editorFrame = frame; + (args.docStorage.save as jest.Mock).mockReturnValue(Promise.resolve({ id: '123' })); + + instance = mount(); + + const onChange = frame.mount.mock.calls[0][1].onChange; + await act(async () => + onChange({ + filterableIndexPatterns: [], + doc: ({ id: '123', expression: 'valid expression' } as unknown) as Document, + }) + ); + instance.update(); + await act(async () => { + getButton(instance).run(instance.getDOMNode()); + }); + instance.update(); + + const onTitleDuplicate = jest.fn(); + + await act(async () => { + instance.find(SavedObjectSaveModal).prop('onSave')({ + onTitleDuplicate, + isTitleDuplicateConfirmed: false, + newCopyOnSave: false, + newDescription: '', + newTitle: 'test', + }); + }); + + expect(checkForDuplicateTitle).toHaveBeenCalledWith( + expect.objectContaining({ id: '123' }), + false, + onTitleDuplicate, + expect.anything() + ); + }); + it('does not show the copy button on first save', async () => { const args = defaultArgs; args.editorFrame = frame; diff --git a/x-pack/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx index f88c1c5aca31d..fc8d5dd9eb395 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -24,6 +24,7 @@ import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/p import { SavedObjectSaveModalOrigin, OnSaveProps, + checkForDuplicateTitle, } from '../../../../../src/plugins/saved_objects/public'; import { Document, SavedObjectStore } from '../persistence'; import { EditorFrameInstance } from '../types'; @@ -252,9 +253,11 @@ export function App({ // state.persistedDoc, ]); - const runSave = ( + const runSave = async ( saveProps: Omit & { returnToOrigin: boolean; + onTitleDuplicate?: OnSaveProps['onTitleDuplicate']; + newDescription?: string; } ) => { if (!lastKnownDoc) { @@ -276,10 +279,30 @@ export function App({ const doc = { ...lastDocWithoutPinned, + description: saveProps.newDescription, id: saveProps.newCopyOnSave ? undefined : lastKnownDoc.id, title: saveProps.newTitle, }; + await checkForDuplicateTitle( + { + ...doc, + copyOnSave: saveProps.newCopyOnSave, + lastSavedTitle: lastKnownDoc?.title, + getEsType: () => 'lens', + getDisplayName: () => + i18n.translate('xpack.lens.app.saveModalType', { + defaultMessage: 'Lens visualization', + }), + }, + saveProps.isTitleDuplicateConfirmed, + saveProps.onTitleDuplicate, + { + savedObjectsClient: core.savedObjects.client, + overlays: core.overlays, + } + ); + const newlyCreated: boolean = saveProps.newCopyOnSave || !lastKnownDoc?.id; docStorage .save(doc) @@ -492,6 +515,7 @@ export function App({ documentInfo={{ id: lastKnownDoc.id, title: lastKnownDoc.title || '', + description: lastKnownDoc.description || '', }} objectType={i18n.translate('xpack.lens.app.saveModalType', { defaultMessage: 'Lens visualization', diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.ts index b292299c569af..d62f3dbcf029a 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.ts @@ -48,6 +48,7 @@ export function getSavedObjectFormat({ return { id: state.persistedId, title: state.title, + description: state.description, type: 'lens', visualizationType: state.visualization.activeId, expression: expression ? toExpression(expression) : '', diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts index 71aabaae3c65c..e1151b92aac51 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts @@ -388,6 +388,7 @@ describe('editor_frame state management', () => { filters: [], }, title: 'heyo!', + description: 'My lens', type: 'lens', visualizationType: 'line', }, @@ -406,6 +407,7 @@ describe('editor_frame state management', () => { }, persistedId: 'b', title: 'heyo!', + description: 'My lens', visualization: { activeId: 'line', state: { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts index bb6daf5641a64..09674ebf2ade2 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts @@ -18,6 +18,7 @@ export interface PreviewState { export interface EditorFrameState extends PreviewState { persistedId?: string; title: string; + description?: string; stagedPreview?: PreviewState; activeDatasourceId: string | null; } @@ -157,6 +158,7 @@ export const reducer = (state: EditorFrameState, action: Action): EditorFrameSta ...state, persistedId: action.doc.id, title: action.doc.title, + description: action.doc.description, datasourceStates: Object.entries(action.doc.state.datasourceStates).reduce( (stateMap, [datasourceId, datasourceState]) => ({ ...stateMap, diff --git a/x-pack/plugins/lens/public/persistence/saved_object_store.test.ts b/x-pack/plugins/lens/public/persistence/saved_object_store.test.ts index 515d008d82586..f7caac6549389 100644 --- a/x-pack/plugins/lens/public/persistence/saved_object_store.test.ts +++ b/x-pack/plugins/lens/public/persistence/saved_object_store.test.ts @@ -25,6 +25,7 @@ describe('LensStore', () => { const { client, store } = testStore('FOO'); const doc = await store.save({ title: 'Hello', + description: 'My doc', visualizationType: 'bar', expression: '', state: { @@ -43,6 +44,7 @@ describe('LensStore', () => { expect(doc).toEqual({ id: 'FOO', title: 'Hello', + description: 'My doc', visualizationType: 'bar', expression: '', state: { @@ -61,6 +63,7 @@ describe('LensStore', () => { expect(client.create).toHaveBeenCalledTimes(1); expect(client.create).toHaveBeenCalledWith('lens', { title: 'Hello', + description: 'My doc', visualizationType: 'bar', expression: '', state: { diff --git a/x-pack/plugins/lens/public/persistence/saved_object_store.ts b/x-pack/plugins/lens/public/persistence/saved_object_store.ts index 015f4b9b825f4..7632be3d82046 100644 --- a/x-pack/plugins/lens/public/persistence/saved_object_store.ts +++ b/x-pack/plugins/lens/public/persistence/saved_object_store.ts @@ -13,6 +13,7 @@ export interface Document { type?: string; visualizationType: string | null; title: string; + description?: string; expression: string | null; state: { datasourceMetaData: { diff --git a/x-pack/plugins/lens/public/vis_type_alias.ts b/x-pack/plugins/lens/public/vis_type_alias.ts index a58288191325c..3bb2dbbae1f9c 100644 --- a/x-pack/plugins/lens/public/vis_type_alias.ts +++ b/x-pack/plugins/lens/public/vis_type_alias.ts @@ -34,10 +34,11 @@ export const getLensAliasConfig = (): VisTypeAlias => ({ searchFields: ['title^3'], toListItem(savedObject) { const { id, type, attributes } = savedObject; - const { title } = attributes as { title: string }; + const { title, description } = attributes as { title: string; description?: string }; return { id, title, + description, editUrl: getEditPath(id), editApp: 'lens', icon: 'lensApp', diff --git a/x-pack/plugins/lens/server/saved_objects.ts b/x-pack/plugins/lens/server/saved_objects.ts index 1f7d22e2b5642..a16cc3dab7967 100644 --- a/x-pack/plugins/lens/server/saved_objects.ts +++ b/x-pack/plugins/lens/server/saved_objects.ts @@ -29,6 +29,9 @@ export function setupSavedObjects(core: CoreSetup) { title: { type: 'text', }, + description: { + type: 'text', + }, visualizationType: { type: 'keyword', }, From 8d1a3194721a66cc04732a08734dcc743acfd740 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 10 Jun 2020 18:29:22 +0200 Subject: [PATCH 87/91] keep custom labels (#68498) --- .../dimension_panel/dimension_panel.test.tsx | 101 +++++++++++++++++- .../dimension_panel/popover_editor.tsx | 26 +++-- .../operations/definitions/column_types.ts | 1 + .../state_helpers.test.ts | 55 ++++++++++ .../indexpattern_datasource/state_helpers.ts | 5 + 5 files changed, 177 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx index a9e9efa8d1039..4397ad65d63a5 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx @@ -467,7 +467,7 @@ describe('IndexPatternDimensionEditorPanel', () => { expect(setState).not.toHaveBeenCalled(); }); - it('should update label on label input changes', () => { + it('should update label and custom label flag on label input changes', () => { wrapper = mount(); act(() => { @@ -485,6 +485,7 @@ describe('IndexPatternDimensionEditorPanel', () => { ...state.layers.first.columns, col1: expect.objectContaining({ label: 'New Label', + customLabel: true, // Other parts of this don't matter for this test }), }, @@ -493,6 +494,104 @@ describe('IndexPatternDimensionEditorPanel', () => { }); }); + it('should not keep the label as long as it is the default label', () => { + wrapper = mount( + + ); + + act(() => { + wrapper.find('button[data-test-subj="lns-indexPatternDimension-min"]').simulate('click'); + }); + + expect(setState).toHaveBeenCalledWith({ + ...state, + layers: { + first: { + ...state.layers.first, + columns: { + ...state.layers.first.columns, + col1: expect.objectContaining({ + label: 'Minimum of bytes', + }), + }, + }, + }, + }); + }); + + it('should keep the label on operation change if it is custom', () => { + wrapper = mount( + + ); + + act(() => { + wrapper.find('button[data-test-subj="lns-indexPatternDimension-min"]').simulate('click'); + }); + + expect(setState).toHaveBeenCalledWith({ + ...state, + layers: { + first: { + ...state.layers.first, + columns: { + ...state.layers.first.columns, + col1: expect.objectContaining({ + label: 'Custom label', + customLabel: true, + }), + }, + }, + }, + }); + }); + describe('transient invalid state', () => { it('should not set the state if selecting an operation incompatible with the current field', () => { wrapper = mount(); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/popover_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/popover_editor.tsx index 6bd4263014b13..7bed770e63fd2 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/popover_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/popover_editor.tsx @@ -314,17 +314,23 @@ export function PopoverEditor(props: PopoverEditorProps) { data-test-subj="indexPattern-label-edit" value={selectedColumn.label} onChange={(e) => { - setState( - changeColumn({ - state, - layerId, - columnId, - newColumn: { - ...selectedColumn, - label: e.target.value, + setState({ + ...state, + layers: { + ...state.layers, + [layerId]: { + ...state.layers[layerId], + columns: { + ...state.layers[layerId].columns, + [columnId]: { + ...selectedColumn, + label: e.target.value, + customLabel: true, + }, + }, }, - }) - ); + }, + }); }} /> diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts index 639e982142f57..3244eeb94d1e2 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts @@ -16,6 +16,7 @@ export interface BaseIndexPatternColumn extends Operation { operationType: string; sourceField: string; suggestedPriority?: DimensionPriority; + customLabel?: boolean; } // Formatting can optionally be added to any column diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts index 1e3251a8dedd8..074cb8f5bde17 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts @@ -331,6 +331,61 @@ describe('state_helpers', () => { ); }); + it('should carry over label if customLabel flag is set', () => { + const state: IndexPatternPrivateState = { + indexPatternRefs: [], + existingFields: {}, + indexPatterns: {}, + currentIndexPatternId: '1', + showEmptyFields: false, + layers: { + first: { + indexPatternId: '1', + columnOrder: ['col1'], + columns: { + col1: { + label: 'My custom label', + customLabel: true, + dataType: 'date', + isBucketed: true, + + // Private + operationType: 'date_histogram', + sourceField: 'timestamp', + params: { + interval: 'h', + }, + }, + }, + }, + }, + }; + expect( + changeColumn({ + state, + layerId: 'first', + columnId: 'col2', + newColumn: { + label: 'Date histogram of order_date', + dataType: 'date', + isBucketed: true, + + // Private + operationType: 'date_histogram', + sourceField: 'order_date', + params: { + interval: 'w', + }, + }, + }).layers.first.columns.col1 + ).toEqual( + expect.objectContaining({ + label: 'My custom label', + customLabel: true, + }) + ); + }); + it('should execute adjustments for other columns', () => { const termsColumn: TermsIndexPatternColumn = { label: 'Top values of source', diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.ts b/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.ts index a34d0c4187485..3a1aaaa819dc0 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.ts @@ -87,6 +87,11 @@ export function changeColumn({ ? { ...newColumn, params: oldColumn.params } : newColumn; + if (oldColumn && oldColumn.customLabel) { + updatedColumn.customLabel = true; + updatedColumn.label = oldColumn.label; + } + const newColumns = adjustColumnReferencesForChangedColumn( { ...state.layers[layerId].columns, From 713f323447218269b6757d3468bb3dd97f8ef0d5 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Wed, 10 Jun 2020 11:30:36 -0500 Subject: [PATCH 88/91] [Canvas] Fixes for expected prop-types, Shape Arg UI, and i18n strings (#68304) Co-authored-by: Elastic Machine --- .../canvas_plugin_src/uis/arguments/toggle.js | 8 +++++-- .../canvas_plugin_src/uis/views/markdown.js | 2 +- .../canvas/canvas_plugin_src/uis/views/pie.js | 3 +++ .../canvas_plugin_src/uis/views/shape.js | 3 +++ .../canvas_plugin_src/uis/views/table.js | 6 +++++ x-pack/plugins/canvas/i18n/ui.ts | 22 ++++++++++++++++--- .../saved_elements_modal.tsx | 4 ++-- .../__examples__/edit_menu.examples.tsx | 14 ++++++++---- .../workpad_header/edit_menu/edit_menu.tsx | 5 +++-- .../workpad_header/edit_menu/index.ts | 12 ++++++++-- ...{clone_subgraphs.js => clone_subgraphs.ts} | 9 +++++--- .../public/lib/element_handler_creators.ts | 2 +- 12 files changed, 70 insertions(+), 20 deletions(-) rename x-pack/plugins/canvas/public/lib/{clone_subgraphs.js => clone_subgraphs.ts} (83%) diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/toggle.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/toggle.js index 299f96ff1b4e8..b3e735d202220 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/toggle.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/toggle.js @@ -41,8 +41,12 @@ ToggleArgInput.propTypes = { onValueChange: PropTypes.func.isRequired, argValue: PropTypes.oneOfType([PropTypes.bool, PropTypes.string, PropTypes.object]).isRequired, argId: PropTypes.string.isRequired, - labelValue: PropTypes.string, - showLabelValue: PropTypes.bool, + typeInstance: PropTypes.shape({ + displayName: PropTypes.string.isRequired, + options: PropTypes.shape({ + labelValue: PropTypes.string.isRequired, + }), + }).isRequired, renderError: PropTypes.func.isRequired, }; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/markdown.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/markdown.js index edae739ee0d3d..bebcc290a313d 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/markdown.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/markdown.js @@ -37,7 +37,7 @@ export const markdown = () => ({ argType: 'toggle', default: false, options: { - labelValue: 'Open all links in a new tab', + labelValue: strings.getOpenLinksInNewTabLabelName(), }, }, ], diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/pie.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/pie.js index f1b6a48d1e7b0..6a32da2c3c0e9 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/pie.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/pie.js @@ -75,6 +75,9 @@ export const pie = () => ({ help: strings.getLabelsHelp(), argType: 'toggle', default: true, + options: { + labelValue: strings.getLabelsToggleSwitch(), + }, }, { name: 'seriesStyle', diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/shape.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/shape.js index c3e97b4bd5dea..5eb8b1deb219b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/shape.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/shape.js @@ -46,6 +46,9 @@ export const shape = () => ({ displayName: strings.getMaintainAspectDisplayName(), argType: 'toggle', help: strings.getMaintainAspectHelp(), + options: { + labelValue: strings.getMaintainAspectLabelName(), + }, }, ], }); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/table.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/table.js index 73324feddcab0..126559269f95a 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/table.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/table.js @@ -33,6 +33,9 @@ export const table = () => ({ help: strings.getPaginateHelp(), argType: 'toggle', default: true, + options: { + labelValue: strings.getPaginateToggleSwitch(), + }, }, { name: 'showHeader', @@ -40,6 +43,9 @@ export const table = () => ({ help: strings.getShowHeaderHelp(), argType: 'toggle', default: true, + options: { + labelValue: strings.getShowHeaderToggleSwitch(), + }, }, ], }); diff --git a/x-pack/plugins/canvas/i18n/ui.ts b/x-pack/plugins/canvas/i18n/ui.ts index 1abe56c99dc89..f69f9e747ab90 100644 --- a/x-pack/plugins/canvas/i18n/ui.ts +++ b/x-pack/plugins/canvas/i18n/ui.ts @@ -791,8 +791,12 @@ export const ViewStrings = { i18n.translate('xpack.canvas.uis.views.pie.args.labelsTitle', { defaultMessage: 'Labels', }), - getLabelsHelp: () => + getLabelsToggleSwitch: () => i18n.translate('xpack.canvas.uis.views.pie.args.labelsToggleSwitch', { + defaultMessage: 'Show labels', + }), + getLabelsHelp: () => + i18n.translate('xpack.canvas.uis.views.pie.args.labelsLabel', { defaultMessage: 'Show/hide labels', }), getLegendDisplayName: () => @@ -1075,10 +1079,14 @@ export const ViewStrings = { }), getMaintainAspectDisplayName: () => i18n.translate('xpack.canvas.uis.views.shape.args.maintainAspectTitle', { - defaultMessage: 'Fixed ratio', + defaultMessage: 'Aspect ratio settings', }), - getMaintainAspectHelp: () => + getMaintainAspectLabelName: () => i18n.translate('xpack.canvas.uis.views.shape.args.maintainAspectLabel', { + defaultMessage: 'Use a fixed ratio', + }), + getMaintainAspectHelp: () => + i18n.translate('xpack.canvas.uis.views.shape.args.maintainAspectHelpLabel', { defaultMessage: `Enable to maintain aspect ratio`, }), getShapeDisplayName: () => @@ -1099,6 +1107,10 @@ export const ViewStrings = { i18n.translate('xpack.canvas.uis.views.table.args.paginateTitle', { defaultMessage: 'Pagination', }), + getPaginateToggleSwitch: () => + i18n.translate('xpack.canvas.uis.views.table.args.paginateToggleSwitch', { + defaultMessage: 'Show pagination controls', + }), getPaginateHelp: () => i18n.translate('xpack.canvas.uis.views.table.args.paginateLabel', { defaultMessage: @@ -1116,6 +1128,10 @@ export const ViewStrings = { i18n.translate('xpack.canvas.uis.views.table.args.showHeaderTitle', { defaultMessage: 'Header', }), + getShowHeaderToggleSwitch: () => + i18n.translate('xpack.canvas.uis.views.table.args.showHeaderToggleSwitch', { + defaultMessage: 'Show the header row', + }), getShowHeaderHelp: () => i18n.translate('xpack.canvas.uis.views.table.args.showHeaderLabel', { defaultMessage: 'Show or hide the header row with titles for each column', diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/saved_elements_modal.tsx b/x-pack/plugins/canvas/public/components/saved_elements_modal/saved_elements_modal.tsx index dba97a15fee5c..474b8f3494917 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/saved_elements_modal.tsx +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/saved_elements_modal.tsx @@ -84,7 +84,7 @@ export const SavedElementsModal: FunctionComponent = ({ const handleEdit = async (name: string, description: string, image: string) => { if (elementToEdit) { - await updateCustomElement(elementToEdit.id, name, description, image); + updateCustomElement(elementToEdit.id, name, description, image); } hideEditModal(); }; @@ -94,7 +94,7 @@ export const SavedElementsModal: FunctionComponent = ({ const handleDelete = async () => { if (elementToDelete) { - await removeCustomElement(elementToDelete.id); + removeCustomElement(elementToDelete.id); } hideDeleteModal(); }; diff --git a/x-pack/plugins/canvas/public/components/workpad_header/edit_menu/__examples__/edit_menu.examples.tsx b/x-pack/plugins/canvas/public/components/workpad_header/edit_menu/__examples__/edit_menu.examples.tsx index a0ab8d53485f5..8bbc3e09af4bf 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/edit_menu/__examples__/edit_menu.examples.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/edit_menu/__examples__/edit_menu.examples.tsx @@ -7,6 +7,7 @@ import { storiesOf } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import React from 'react'; import { EditMenu } from '../edit_menu'; +import { PositionedElement } from '../../../../../types'; const handlers = { cutNodes: action('cutNodes'), @@ -41,11 +42,16 @@ storiesOf('components/WorkpadHeader/EditMenu', module) )) .add('single element selected', () => ( - + )) .add('single grouped element selected', () => ( ( ( { const pageId = getSelectedPage(state); const nodes = getNodes(state, pageId) as PositionedElement[]; const selectedToplevelNodes = getSelectedToplevelNodes(state); + const selectedPrimaryShapeObjects = selectedToplevelNodes .map((id: string) => nodes.find((s: PositionedElement) => s.id === id)) .filter((shape?: PositionedElement) => shape) as PositionedElement[]; + const selectedPersistentPrimaryNodes = flatten( selectedPrimaryShapeObjects.map((shape: PositionedElement) => nodes.find((n: PositionedElement) => n.id === shape.id) // is it a leaf or a persisted group? @@ -70,12 +72,18 @@ const mapStateToProps = (state: State) => { : nodes.filter((s: PositionedElement) => s.position.parent === shape.id).map((s) => s.id) ) ); - const selectedNodeIds = flatten(selectedPersistentPrimaryNodes.map(crawlTree(nodes))); + + const selectedNodeIds: string[] = flatten(selectedPersistentPrimaryNodes.map(crawlTree(nodes))); + const selectedNodes = selectedNodeIds + .map((id: string) => nodes.find((s) => s.id === id)) + .filter((node: PositionedElement | undefined): node is PositionedElement => { + return !!node; + }); return { pageId, selectedToplevelNodes, - selectedNodes: selectedNodeIds.map((id: string) => nodes.find((s) => s.id === id)), + selectedNodes, state, }; }; diff --git a/x-pack/plugins/canvas/public/lib/clone_subgraphs.js b/x-pack/plugins/canvas/public/lib/clone_subgraphs.ts similarity index 83% rename from x-pack/plugins/canvas/public/lib/clone_subgraphs.js rename to x-pack/plugins/canvas/public/lib/clone_subgraphs.ts index e4dfa1cefcaba..c3a3933e06a6d 100644 --- a/x-pack/plugins/canvas/public/lib/clone_subgraphs.js +++ b/x-pack/plugins/canvas/public/lib/clone_subgraphs.ts @@ -4,16 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ +// @ts-ignore Untyped local import { arrayToMap } from './aeroelastic/functional'; import { getId } from './get_id'; +import { PositionedElement } from '../../types'; -export const cloneSubgraphs = (nodes) => { +export const cloneSubgraphs = (nodes: PositionedElement[]) => { const idMap = arrayToMap(nodes.map((n) => n.id)); + // We simultaneously provide unique id values for all elements (across all pages) // AND ensure that parent-child relationships are retained (via matching id values within page) Object.keys(idMap).forEach((key) => (idMap[key] = getId(key.split('-')[0]))); // new group names to which we can map + // must return elements in the same order, for several reasons - const newNodes = nodes.map((element) => ({ + return nodes.map((element) => ({ ...element, id: idMap[element.id], position: { @@ -21,5 +25,4 @@ export const cloneSubgraphs = (nodes) => { parent: element.position.parent ? idMap[element.position.parent] : null, }, })); - return newNodes; }; diff --git a/x-pack/plugins/canvas/public/lib/element_handler_creators.ts b/x-pack/plugins/canvas/public/lib/element_handler_creators.ts index d280c62888df0..a2bf5a62ec1f7 100644 --- a/x-pack/plugins/canvas/public/lib/element_handler_creators.ts +++ b/x-pack/plugins/canvas/public/lib/element_handler_creators.ts @@ -37,7 +37,7 @@ export interface Props { /** * selects elements on the page */ - selectToplevelNodes: (elements: PositionedElement) => void; + selectToplevelNodes: (elements: PositionedElement[]) => void; /** * deletes elements from the page */ From e616935d0bc79bf5fb323404399a274195602c23 Mon Sep 17 00:00:00 2001 From: Brandon Kobel Date: Wed, 10 Jun 2020 09:55:42 -0700 Subject: [PATCH 89/91] Using re2 for Timelion regular expressions (#67416) * Revert "Revert "Using re2 for Timelion regular expressions (#55208)"" This reverts commit c90293d03f3b8beabb2ae523e861dde67b00016c. * Updating re2 to 1.14.0. Still need to update build patching * Extract the gzip to the destination, supporting multiple extract methods * Adding 'node' to jest's moduleFileExtensions 'node' is in the defaults, not sure why we aren't using the defaults... https://jestjs.io/docs/en/configuration#modulefileextensions-arraystring Co-authored-by: Elastic Machine --- .gitignore | 1 + package.json | 1 + src/dev/build/build_distributables.js | 2 + .../nodejs => lib}/__tests__/download.js | 0 .../build/lib/__tests__/fixtures/foo.txt.gz | Bin 0 -> 32 bytes src/dev/build/lib/__tests__/fs.js | 38 ++++++- .../build/{tasks/nodejs => lib}/download.js | 2 +- src/dev/build/lib/fs.js | 13 +++ src/dev/build/lib/index.js | 2 + src/dev/build/tasks/index.js | 1 + .../__tests__/download_node_builds_task.js | 2 +- .../tasks/nodejs/download_node_builds_task.js | 2 +- .../build/tasks/patch_native_modules_task.js | 103 ++++++++++++++++++ src/dev/jest/config.js | 2 +- .../server/series_functions/label.js | 5 +- x-pack/dev-tools/jest/create_jest_config.js | 2 +- x-pack/test_utils/jest/config.js | 2 +- yarn.lock | 47 +++++++- 18 files changed, 215 insertions(+), 10 deletions(-) rename src/dev/build/{tasks/nodejs => lib}/__tests__/download.js (100%) create mode 100644 src/dev/build/lib/__tests__/fixtures/foo.txt.gz rename src/dev/build/{tasks/nodejs => lib}/download.js (98%) create mode 100644 src/dev/build/tasks/patch_native_modules_task.js diff --git a/.gitignore b/.gitignore index b3911d0f8d0c2..b8adcf4508db2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /.es .DS_Store .node_binaries +.native_modules node_modules !/src/dev/npm/integration_tests/__fixtures__/fixture1/node_modules !/src/dev/notice/__fixtures__/node_modules diff --git a/package.json b/package.json index 419edcf268356..0bf173d9603e7 100644 --- a/package.json +++ b/package.json @@ -236,6 +236,7 @@ "pug": "^2.0.4", "query-string": "5.1.1", "raw-loader": "3.1.0", + "re2": "1.14.0", "react": "^16.12.0", "react-color": "^2.13.8", "react-dom": "^16.12.0", diff --git a/src/dev/build/build_distributables.js b/src/dev/build/build_distributables.js index 66f0c0355c2d9..2ea71fa2c1d33 100644 --- a/src/dev/build/build_distributables.js +++ b/src/dev/build/build_distributables.js @@ -47,6 +47,7 @@ import { InstallDependenciesTask, BuildKibanaPlatformPluginsTask, OptimizeBuildTask, + PatchNativeModulesTask, RemovePackageJsonDepsTask, RemoveWorkspacesTask, TranspileBabelTask, @@ -136,6 +137,7 @@ export async function buildDistributables(options) { * directories and perform platform-specific steps */ await run(CreateArchivesSourcesTask); + await run(PatchNativeModulesTask); await run(CleanExtraBinScriptsTask); await run(CleanExtraBrowsersTask); await run(CleanNodeBuildsTask); diff --git a/src/dev/build/tasks/nodejs/__tests__/download.js b/src/dev/build/lib/__tests__/download.js similarity index 100% rename from src/dev/build/tasks/nodejs/__tests__/download.js rename to src/dev/build/lib/__tests__/download.js diff --git a/src/dev/build/lib/__tests__/fixtures/foo.txt.gz b/src/dev/build/lib/__tests__/fixtures/foo.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..46fef5a6af78cbc805d40977495a9abf2f6b9653 GIT binary patch literal 32 ncmb2|=HTdWI2*^noR*)jS5i^J;C=f1b0&rrsYZ1y3=9kawLS`2 literal 0 HcmV?d00001 diff --git a/src/dev/build/lib/__tests__/fs.js b/src/dev/build/lib/__tests__/fs.js index 0b2db4c538fb8..bf7596b012f79 100644 --- a/src/dev/build/lib/__tests__/fs.js +++ b/src/dev/build/lib/__tests__/fs.js @@ -23,11 +23,12 @@ import { chmodSync, statSync } from 'fs'; import del from 'del'; import expect from '@kbn/expect'; -import { mkdirp, write, read, getChildPaths, copyAll, getFileHash, untar } from '../fs'; +import { mkdirp, write, read, getChildPaths, copyAll, getFileHash, untar, gunzip } from '../fs'; const TMP = resolve(__dirname, '__tmp__'); const FIXTURES = resolve(__dirname, 'fixtures'); const FOO_TAR_PATH = resolve(FIXTURES, 'foo_dir.tar.gz'); +const FOO_GZIP_PATH = resolve(FIXTURES, 'foo.txt.gz'); const BAR_TXT_PATH = resolve(FIXTURES, 'foo_dir/bar.txt'); const WORLD_EXECUTABLE = resolve(FIXTURES, 'bin/world_executable'); @@ -323,4 +324,39 @@ describe('dev/build/lib/fs', () => { expect(await read(resolve(destination, 'foo/foo.txt'))).to.be('foo\n'); }); }); + + describe('gunzip()', () => { + it('rejects if source path is not absolute', async () => { + try { + await gunzip('foo/bar', '**/*', __dirname); + throw new Error('Expected gunzip() to reject'); + } catch (error) { + assertNonAbsoluteError(error); + } + }); + + it('rejects if destination path is not absolute', async () => { + try { + await gunzip(__dirname, '**/*', 'foo/bar'); + throw new Error('Expected gunzip() to reject'); + } catch (error) { + assertNonAbsoluteError(error); + } + }); + + it('rejects if neither path is not absolute', async () => { + try { + await gunzip('foo/bar', '**/*', 'foo/bar'); + throw new Error('Expected gunzip() to reject'); + } catch (error) { + assertNonAbsoluteError(error); + } + }); + + it('extracts gzip from source into destination, creating destination if necessary', async () => { + const destination = resolve(TMP, 'z/y/x/v/u/t/foo.txt'); + await gunzip(FOO_GZIP_PATH, destination); + expect(await read(resolve(destination))).to.be('foo\n'); + }); + }); }); diff --git a/src/dev/build/tasks/nodejs/download.js b/src/dev/build/lib/download.js similarity index 98% rename from src/dev/build/tasks/nodejs/download.js rename to src/dev/build/lib/download.js index fb3294e2d1221..fbd2d47ff7b06 100644 --- a/src/dev/build/tasks/nodejs/download.js +++ b/src/dev/build/lib/download.js @@ -24,7 +24,7 @@ import chalk from 'chalk'; import { createHash } from 'crypto'; import Axios from 'axios'; -import { mkdirp } from '../../lib'; +import { mkdirp } from './fs'; function tryUnlink(path) { try { diff --git a/src/dev/build/lib/fs.js b/src/dev/build/lib/fs.js index 864a07e837c3f..b905f40d0de1e 100644 --- a/src/dev/build/lib/fs.js +++ b/src/dev/build/lib/fs.js @@ -195,6 +195,19 @@ export async function untar(source, destination, extractOptions = {}) { ]); } +export async function gunzip(source, destination) { + assertAbsolute(source); + assertAbsolute(destination); + + await mkdirAsync(dirname(destination), { recursive: true }); + + await createPromiseFromStreams([ + fs.createReadStream(source), + createGunzip(), + fs.createWriteStream(destination), + ]); +} + export async function compress(type, options = {}, source, destination) { const output = fs.createWriteStream(destination); const archive = archiver(type, options.archiverOptions); diff --git a/src/dev/build/lib/index.js b/src/dev/build/lib/index.js index afebd090d797d..6540db6f37a72 100644 --- a/src/dev/build/lib/index.js +++ b/src/dev/build/lib/index.js @@ -28,10 +28,12 @@ export { copyAll, getFileHash, untar, + gunzip, deleteAll, deleteEmptyFolders, compress, isFileAccessible, } from './fs'; +export { download } from './download'; export { scanDelete } from './scan_delete'; export { scanCopy } from './scan_copy'; diff --git a/src/dev/build/tasks/index.js b/src/dev/build/tasks/index.js index bafb5a2fe115e..be675b4aa6ca4 100644 --- a/src/dev/build/tasks/index.js +++ b/src/dev/build/tasks/index.js @@ -33,6 +33,7 @@ export * from './nodejs_modules'; export * from './notice_file_task'; export * from './optimize_task'; export * from './os_packages'; +export * from './patch_native_modules_task'; export * from './transpile_babel_task'; export * from './transpile_scss_task'; export * from './verify_env_task'; diff --git a/src/dev/build/tasks/nodejs/__tests__/download_node_builds_task.js b/src/dev/build/tasks/nodejs/__tests__/download_node_builds_task.js index 9357735e3f5a3..c1764d06b43b3 100644 --- a/src/dev/build/tasks/nodejs/__tests__/download_node_builds_task.js +++ b/src/dev/build/tasks/nodejs/__tests__/download_node_builds_task.js @@ -22,7 +22,7 @@ import expect from '@kbn/expect'; import * as NodeShasumsNS from '../node_shasums'; import * as NodeDownloadInfoNS from '../node_download_info'; -import * as DownloadNS from '../download'; +import * as DownloadNS from '../../../lib/download'; // sinon can't stub '../../../lib' properly import { DownloadNodeBuildsTask } from '../download_node_builds_task'; describe('src/dev/build/tasks/nodejs/download_node_builds_task', () => { diff --git a/src/dev/build/tasks/nodejs/download_node_builds_task.js b/src/dev/build/tasks/nodejs/download_node_builds_task.js index 86ddb0506f972..c0907e6c42a97 100644 --- a/src/dev/build/tasks/nodejs/download_node_builds_task.js +++ b/src/dev/build/tasks/nodejs/download_node_builds_task.js @@ -17,7 +17,7 @@ * under the License. */ -import { download } from './download'; +import { download } from '../../lib'; import { getNodeShasums } from './node_shasums'; import { getNodeDownloadInfo } from './node_download_info'; diff --git a/src/dev/build/tasks/patch_native_modules_task.js b/src/dev/build/tasks/patch_native_modules_task.js new file mode 100644 index 0000000000000..fba33442fad10 --- /dev/null +++ b/src/dev/build/tasks/patch_native_modules_task.js @@ -0,0 +1,103 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 + * + * 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. + */ +import fs from 'fs'; +import path from 'path'; +import util from 'util'; +import { deleteAll, download, gunzip, untar } from '../lib'; + +const DOWNLOAD_DIRECTORY = '.native_modules'; + +const packages = [ + { + name: 're2', + version: '1.14.0', + destinationPath: 'node_modules/re2/build/Release/re2.node', + extractMethod: 'gunzip', + archives: { + darwin: { + url: 'https://github.com/uhop/node-re2/releases/download/1.14.0/darwin-x64-64.gz', + sha256: '54c8386cb7cd53895cf379522114bfe82378e300e127e58d392ddd40a77e396f', + }, + linux: { + url: 'https://github.com/uhop/node-re2/releases/download/1.14.0/linux-x64-64.gz', + sha256: 'f54f059035e71a7ccb3fa201080e260c41d228d13a8247974b4bb157691b6757', + }, + windows: { + url: 'https://github.com/uhop/node-re2/releases/download/1.14.0/win32-x64-64.gz', + sha256: 'de708446a8b802f4634c2cfef097c2625a2811fdcd8133dfd7b7c485f966caa9', + }, + }, + }, +]; + +async function getInstalledVersion(config, packageName) { + const packageJSONPath = config.resolveFromRepo( + path.join('node_modules', packageName, 'package.json') + ); + const buffer = await util.promisify(fs.readFile)(packageJSONPath); + const packageJSON = JSON.parse(buffer); + return packageJSON.version; +} + +async function patchModule(config, log, build, platform, pkg) { + const installedVersion = await getInstalledVersion(config, pkg.name); + if (installedVersion !== pkg.version) { + throw new Error( + `Can't patch ${pkg.name}'s native module, we were expecting version ${pkg.version} and found ${installedVersion}` + ); + } + const platformName = platform.getName(); + const archive = pkg.archives[platformName]; + const archiveName = path.basename(archive.url); + const downloadPath = config.resolveFromRepo(DOWNLOAD_DIRECTORY, pkg.name, archiveName); + const extractPath = build.resolvePathForPlatform(platform, pkg.destinationPath); + log.debug(`Patching ${pkg.name} binaries from ${archive.url} to ${extractPath}`); + + await deleteAll([extractPath], log); + await download({ + log, + url: archive.url, + destination: downloadPath, + sha256: archive.sha256, + retries: 3, + }); + switch (pkg.extractMethod) { + case 'gunzip': + await gunzip(downloadPath, extractPath); + break; + case 'untar': + await untar(downloadPath, extractPath); + break; + default: + throw new Error(`Extract method of ${pkg.extractMethod} is not supported`); + } +} + +export const PatchNativeModulesTask = { + description: 'Patching platform-specific native modules', + async run(config, log, build) { + for (const pkg of packages) { + await Promise.all( + config.getTargetPlatforms().map(async (platform) => { + await patchModule(config, log, build, platform, pkg); + }) + ); + } + }, +}; diff --git a/src/dev/jest/config.js b/src/dev/jest/config.js index 64db131f5219a..04b07748c4052 100644 --- a/src/dev/jest/config.js +++ b/src/dev/jest/config.js @@ -79,7 +79,7 @@ export default { ], coverageDirectory: '/target/kibana-coverage/jest', coverageReporters: !!process.env.CODE_COVERAGE ? ['json'] : ['html', 'text'], - moduleFileExtensions: ['js', 'json', 'ts', 'tsx'], + moduleFileExtensions: ['js', 'json', 'ts', 'tsx', 'node'], modulePathIgnorePatterns: ['__fixtures__/', 'target/'], testMatch: ['**/*.test.{js,ts,tsx}'], testPathIgnorePatterns: [ diff --git a/src/plugins/vis_type_timelion/server/series_functions/label.js b/src/plugins/vis_type_timelion/server/series_functions/label.js index 4d9a26c46aaaf..b5282967a62e0 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/label.js +++ b/src/plugins/vis_type_timelion/server/series_functions/label.js @@ -51,7 +51,10 @@ export default new Chainable('label', { const config = args.byName; return alter(args, function (eachSeries) { if (config.regex) { - eachSeries.label = eachSeries.label.replace(new RegExp(config.regex), config.label); + // not using a standard `import` so that if there's an issue with the re2 native module + // that it doesn't prevent Kibana from starting up and we only have an issue using Timelion labels + const RE2 = require('re2'); + eachSeries.label = eachSeries.label.replace(new RE2(config.regex), config.label); } else { eachSeries.label = config.label; } diff --git a/x-pack/dev-tools/jest/create_jest_config.js b/x-pack/dev-tools/jest/create_jest_config.js index 74553bbde0cd6..4bf03828bb461 100644 --- a/x-pack/dev-tools/jest/create_jest_config.js +++ b/x-pack/dev-tools/jest/create_jest_config.js @@ -9,7 +9,7 @@ export function createJestConfig({ kibanaDirectory, rootDir, xPackKibanaDirector return { rootDir, roots: ['/plugins', '/legacy/plugins', '/legacy/server'], - moduleFileExtensions: ['js', 'json', 'ts', 'tsx'], + moduleFileExtensions: ['js', 'json', 'ts', 'tsx', 'node'], moduleNameMapper: { '@elastic/eui$': `${kibanaDirectory}/node_modules/@elastic/eui/test-env`, '@elastic/eui/lib/(.*)?': `${kibanaDirectory}/node_modules/@elastic/eui/test-env/$1`, diff --git a/x-pack/test_utils/jest/config.js b/x-pack/test_utils/jest/config.js index deee585b91fe4..f36099bd1f347 100644 --- a/x-pack/test_utils/jest/config.js +++ b/x-pack/test_utils/jest/config.js @@ -29,7 +29,7 @@ export default { ], coverageDirectory: '/../target/kibana-coverage/jest', coverageReporters: ['html'], - moduleFileExtensions: ['js', 'json', 'ts', 'tsx'], + moduleFileExtensions: ['js', 'json', 'ts', 'tsx', 'node'], modulePathIgnorePatterns: ['__fixtures__/', 'target/'], testMatch: ['**/*.test.{js,ts,tsx}'], testPathIgnorePatterns: [ diff --git a/yarn.lock b/yarn.lock index cf9126b668e51..f9f15ab79310d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12158,6 +12158,11 @@ env-paths@^1.0.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + env-variable@0.0.x: version "0.0.5" resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88" @@ -21160,6 +21165,11 @@ nan@^2.12.1, nan@^2.13.2: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== +nan@^2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + nano-css@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.2.1.tgz#73b8470fa40b028a134d3393ae36bbb34b9fa332" @@ -21421,6 +21431,23 @@ node-gyp@^3.8.0: tar "^2.0.0" which "1" +node-gyp@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-6.1.0.tgz#64e31c61a4695ad304c1d5b82cf6b7c79cc79f3f" + integrity sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -21620,6 +21647,14 @@ nopt@^2.2.0: dependencies: abbrev "1" +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + nopt@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -22329,7 +22364,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.0: +osenv@0, osenv@^0.1.0, osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -24205,6 +24240,14 @@ re-resizable@^6.1.1: dependencies: fast-memoize "^2.5.1" +re2@1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/re2/-/re2-1.14.0.tgz#727076590acfe868cf04e115a3a3f6c373ddd63b" + integrity sha512-TYogJmzni8zNVaw4gNOVORRTUaggLZwnMhJoTD0POKeACEoCxTWa9BAYehRnh3S1JUXIMEfcEUa7piiGEn71Zg== + dependencies: + nan "^2.14.1" + node-gyp "^6.1.0" + react-ace@^5.5.0: version "5.10.0" resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-5.10.0.tgz#e328b37ac52759f700be5afdb86ada2f5ec84c5e" @@ -28673,7 +28716,7 @@ tar-stream@^2.1.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@4.4.13: +tar@4.4.13, tar@^4.4.12: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== From 332a1386d02b18c35133dc5eb3f6ce0321a721e9 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 10 Jun 2020 10:57:23 -0600 Subject: [PATCH 90/91] [Maps] bump @elastic/ems-client and incorporate types (#68444) * [Maps] bump @elastic/ems-client and incorporate types * tslint * update to ems-client 7.9.2 * bump to 7.9.3 Co-authored-by: Elastic Machine --- package.json | 2 +- x-pack/package.json | 2 +- .../public/classes/fields/ems_file_field.ts | 8 +- .../ems_file_source/create_source_editor.tsx | 11 +- .../ems_file_source/ems_file_source.test.tsx | 13 +- .../ems_file_source/ems_file_source.tsx | 33 +++--- .../ems_file_source/update_source_editor.tsx | 23 ++-- .../sources/ems_tms_source/ems_tms_source.js | 5 +- .../ems_tms_source/ems_tms_source.test.js | 26 ++-- .../ems_tms_source/tile_service_select.js | 5 +- .../kibana_regionmap_layer_wizard.tsx | 5 +- .../kibana_base_map_layer_wizard.tsx | 2 +- x-pack/plugins/maps/public/meta.js | 111 ------------------ x-pack/plugins/maps/public/meta.ts | 111 ++++++++++++++++++ yarn.lock | 8 +- 15 files changed, 165 insertions(+), 200 deletions(-) delete mode 100644 x-pack/plugins/maps/public/meta.js create mode 100644 x-pack/plugins/maps/public/meta.ts diff --git a/package.json b/package.json index 0bf173d9603e7..d5f738fad0400 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ "@elastic/apm-rum": "^5.1.1", "@elastic/charts": "19.2.0", "@elastic/datemath": "5.0.3", - "@elastic/ems-client": "7.8.0", + "@elastic/ems-client": "7.9.3", "@elastic/eui": "24.1.0", "@elastic/filesaver": "1.1.2", "@elastic/good": "8.1.1-kibana2", diff --git a/x-pack/package.json b/x-pack/package.json index fb708ab09d841..6a84bcf449455 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -189,7 +189,7 @@ "@babel/runtime": "^7.9.2", "@elastic/apm-rum-react": "^1.1.1", "@elastic/datemath": "5.0.3", - "@elastic/ems-client": "7.8.0", + "@elastic/ems-client": "7.9.3", "@elastic/eui": "24.1.0", "@elastic/filesaver": "1.1.2", "@elastic/maki": "6.3.0", diff --git a/x-pack/plugins/maps/public/classes/fields/ems_file_field.ts b/x-pack/plugins/maps/public/classes/fields/ems_file_field.ts index 73d6c1ef9f790..2e9c5c9fe60c2 100644 --- a/x-pack/plugins/maps/public/classes/fields/ems_file_field.ts +++ b/x-pack/plugins/maps/public/classes/fields/ems_file_field.ts @@ -30,12 +30,6 @@ export class EMSFileField extends AbstractField implements IField { } async getLabel(): Promise { - const emsFileLayer = await this._source.getEMSFileLayer(); - // TODO remove any and @ts-ignore when emsFileLayer type defined - // @ts-ignore - const emsFields: any[] = emsFileLayer.getFieldsInLanguage(); - // Map EMS field name to language specific label - const emsField = emsFields.find((field) => field.name === this.getName()); - return emsField ? emsField.description : this.getName(); + return this._source.getEmsFieldLabel(this.getName()); } } diff --git a/x-pack/plugins/maps/public/classes/sources/ems_file_source/create_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/ems_file_source/create_source_editor.tsx index e398af4acea3b..a78a49032503b 100644 --- a/x-pack/plugins/maps/public/classes/sources/ems_file_source/create_source_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/ems_file_source/create_source_editor.tsx @@ -8,8 +8,8 @@ import React, { Component } from 'react'; import { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -// @ts-ignore -import { getEMSClient } from '../../../meta'; +import { FileLayer } from '@elastic/ems-client'; +import { getEmsFileLayers } from '../../../meta'; import { getEmsUnavailableMessage } from '../ems_unavailable_message'; import { EMSFileSourceDescriptor } from '../../../../common/descriptor_types'; @@ -33,15 +33,10 @@ export class EMSFileCreateSourceEditor extends Component { }; _loadFileOptions = async () => { - // @ts-ignore - const emsClient = getEMSClient(); - // @ts-ignore - const fileLayers: unknown[] = await emsClient.getFileLayers(); + const fileLayers: FileLayer[] = await getEmsFileLayers(); const options = fileLayers.map((fileLayer) => { return { - // @ts-ignore value: fileLayer.getId(), - // @ts-ignore label: fileLayer.getDisplayName(), }; }); diff --git a/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.test.tsx b/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.test.tsx index 24c111a72ac05..52524d0c9a5fa 100644 --- a/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.test.tsx +++ b/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.test.tsx @@ -11,17 +11,8 @@ jest.mock('../../layers/vector_layer/vector_layer', () => {}); function makeEMSFileSource(tooltipProperties: string[]) { const emsFileSource = new EMSFileSource({ tooltipProperties }); - emsFileSource.getEMSFileLayer = async () => { - return { - getFieldsInLanguage() { - return [ - { - name: 'iso2', - description: 'ISO 2 CODE', - }, - ]; - }, - }; + emsFileSource.getEmsFieldLabel = async (name: string) => { + return name === 'iso2' ? 'ISO 2 CODE' : name; }; return emsFileSource; } diff --git a/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.tsx b/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.tsx index 94f5bb0d2ba07..f7fb0078764c4 100644 --- a/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.tsx @@ -8,12 +8,12 @@ import React, { ReactElement } from 'react'; import { i18n } from '@kbn/i18n'; import { Feature } from 'geojson'; import { Adapters } from 'src/plugins/inspector/public'; +import { FileLayer } from '@elastic/ems-client'; import { Attribution, ImmutableSourceProperty, SourceEditorArgs } from '../source'; import { AbstractVectorSource, GeoJsonWithMeta, IVectorSource } from '../vector_source'; import { VECTOR_SHAPE_TYPES } from '../vector_feature_types'; import { SOURCE_TYPES, FIELD_ORIGIN } from '../../../../common/constants'; -// @ts-ignore -import { getEMSClient } from '../../../meta'; +import { getEmsFileLayers } from '../../../meta'; import { getDataSourceLabel } from '../../../../common/i18n_getters'; import { UpdateSourceEditor } from './update_source_editor'; import { EMSFileField } from '../../fields/ems_file_field'; @@ -23,7 +23,7 @@ import { EMSFileSourceDescriptor } from '../../../../common/descriptor_types'; import { ITooltipProperty } from '../../tooltips/tooltip_property'; export interface IEmsFileSource extends IVectorSource { - getEMSFileLayer(): Promise; + getEmsFieldLabel(emsFieldName: string): Promise; createField({ fieldName }: { fieldName: string }): IField; } @@ -72,13 +72,9 @@ export class EMSFileSource extends AbstractVectorSource implements IEmsFileSourc ); } - async getEMSFileLayer(): Promise { - // @ts-ignore - const emsClient = getEMSClient(); - // @ts-ignore - const emsFileLayers = await emsClient.getFileLayers(); + async getEMSFileLayer(): Promise { + const emsFileLayers = await getEmsFileLayers(); const emsFileLayer = emsFileLayers.find( - // @ts-ignore (fileLayer) => fileLayer.getId() === this._descriptor.id ); if (!emsFileLayer) { @@ -94,19 +90,25 @@ export class EMSFileSource extends AbstractVectorSource implements IEmsFileSourc return emsFileLayer; } + // Map EMS field name to language specific label + async getEmsFieldLabel(emsFieldName: string): Promise { + const emsFileLayer = await this.getEMSFileLayer(); + const emsFields = emsFileLayer.getFieldsInLanguage(); + + const emsField = emsFields.find((field) => field.name === emsFieldName); + return emsField ? emsField.description : emsFieldName; + } + async getGeoJsonWithMeta(): Promise { const emsFileLayer = await this.getEMSFileLayer(); // @ts-ignore const featureCollection = await AbstractVectorSource.getGeoJson({ - // @ts-ignore format: emsFileLayer.getDefaultFormatType(), featureCollectionPath: 'data', - // @ts-ignore fetchUrl: emsFileLayer.getDefaultFormatUrl(), }); - // @ts-ignore - const emsIdField = emsFileLayer._config.fields.find((field) => { + const emsIdField = emsFileLayer.getFields().find((field) => { return field.type === 'id'; }); featureCollection.features.forEach((feature: Feature, index: number) => { @@ -123,7 +125,6 @@ export class EMSFileSource extends AbstractVectorSource implements IEmsFileSourc let emsLink; try { const emsFileLayer = await this.getEMSFileLayer(); - // @ts-ignore emsLink = emsFileLayer.getEMSHotLink(); } catch (error) { // ignore error if EMS layer id could not be found @@ -147,7 +148,6 @@ export class EMSFileSource extends AbstractVectorSource implements IEmsFileSourc async getDisplayName(): Promise { try { const emsFileLayer = await this.getEMSFileLayer(); - // @ts-ignore return emsFileLayer.getDisplayName(); } catch (error) { return this._descriptor.id; @@ -156,15 +156,12 @@ export class EMSFileSource extends AbstractVectorSource implements IEmsFileSourc async getAttributions(): Promise { const emsFileLayer = await this.getEMSFileLayer(); - // @ts-ignore return emsFileLayer.getAttributions(); } async getLeftJoinFields() { const emsFileLayer = await this.getEMSFileLayer(); - // @ts-ignore const fields = emsFileLayer.getFieldsInLanguage(); - // @ts-ignore return fields.map((f) => this.createField({ fieldName: f.name })); } diff --git a/x-pack/plugins/maps/public/classes/sources/ems_file_source/update_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/ems_file_source/update_source_editor.tsx index daeb1f8bc6b2b..ac69505a9bed5 100644 --- a/x-pack/plugins/maps/public/classes/sources/ems_file_source/update_source_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/ems_file_source/update_source_editor.tsx @@ -8,8 +8,7 @@ import React, { Component, Fragment } from 'react'; import { EuiTitle, EuiPanel, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { TooltipSelector } from '../../../components/tooltip_selector'; -// @ts-ignore -import { getEMSClient } from '../../../meta'; +import { getEmsFileLayers } from '../../../meta'; import { IEmsFileSource } from './ems_file_source'; import { IField } from '../../fields/field'; import { OnSourceChangeArgs } from '../../../connected_components/layer_panel/view'; @@ -42,22 +41,18 @@ export class UpdateSourceEditor extends Component { } async loadFields() { - let fields; + let fields: IField[] = []; try { - // @ts-ignore - const emsClient = getEMSClient(); - // @ts-ignore - const emsFiles = await emsClient.getFileLayers(); - // @ts-ignore - const taregetEmsFile = emsFiles.find((emsFile) => emsFile.getId() === this.props.layerId); - // @ts-ignore - const emsFields = taregetEmsFile.getFieldsInLanguage(); - // @ts-ignore - fields = emsFields.map((field) => this.props.source.createField({ fieldName: field.name })); + const emsFiles = await getEmsFileLayers(); + const targetEmsFile = emsFiles.find((emsFile) => emsFile.getId() === this.props.layerId); + if (targetEmsFile) { + fields = targetEmsFile + .getFieldsInLanguage() + .map((field) => this.props.source.createField({ fieldName: field.name })); + } } catch (e) { // When a matching EMS-config cannot be found, the source already will have thrown errors during the data request. // This will propagate to the vector-layer and be displayed in the UX - fields = []; } if (this._isMounted) { diff --git a/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.js b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.js index 36c9e424a8b22..83c87eb53d4fe 100644 --- a/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.js +++ b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.js @@ -7,7 +7,7 @@ import _ from 'lodash'; import React from 'react'; import { AbstractTMSSource } from '../tms_source'; -import { getEMSClient } from '../../../meta'; +import { getEmsTmsServices } from '../../../meta'; import { UpdateSourceEditor } from './update_source_editor'; import { i18n } from '@kbn/i18n'; import { getDataSourceLabel } from '../../../../common/i18n_getters'; @@ -66,8 +66,7 @@ export class EMSTMSSource extends AbstractTMSSource { } async _getEMSTMSService() { - const emsClient = getEMSClient(); - const emsTMSServices = await emsClient.getTMSServices(); + const emsTMSServices = await getEmsTmsServices(); const emsTileLayerId = this.getTileLayerId(); const tmsService = emsTMSServices.find((tmsService) => tmsService.getId() === emsTileLayerId); if (!tmsService) { diff --git a/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.test.js b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.test.js index 08c54299d721b..2f466add28262 100644 --- a/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.test.js +++ b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.test.js @@ -6,7 +6,7 @@ jest.mock('../../../meta', () => { return { - getEMSClient: () => { + getEmsTmsServices: () => { class MockTMSService { constructor(config) { this._config = config; @@ -19,20 +19,16 @@ jest.mock('../../../meta', () => { } } - return { - async getTMSServices() { - return [ - new MockTMSService({ - id: 'road_map', - attributionMarkdown: '[foobar](http://foobar.org) | [foobaz](http://foobaz.org)', - }), - new MockTMSService({ - id: 'satellite', - attributionMarkdown: '[satellite](http://satellite.org)', - }), - ]; - }, - }; + return [ + new MockTMSService({ + id: 'road_map', + attributionMarkdown: '[foobar](http://foobar.org) | [foobaz](http://foobaz.org)', + }), + new MockTMSService({ + id: 'satellite', + attributionMarkdown: '[satellite](http://satellite.org)', + }), + ]; }, }; }); diff --git a/x-pack/plugins/maps/public/classes/sources/ems_tms_source/tile_service_select.js b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/tile_service_select.js index 4d5d6655609c1..3931e441ff254 100644 --- a/x-pack/plugins/maps/public/classes/sources/ems_tms_source/tile_service_select.js +++ b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/tile_service_select.js @@ -7,7 +7,7 @@ import React from 'react'; import { EuiSelect, EuiFormRow } from '@elastic/eui'; -import { getEMSClient } from '../../../meta'; +import { getEmsTmsServices } from '../../../meta'; import { getEmsUnavailableMessage } from '../ems_unavailable_message'; import { i18n } from '@kbn/i18n'; @@ -29,8 +29,7 @@ export class TileServiceSelect extends React.Component { } _loadTmsOptions = async () => { - const emsClient = getEMSClient(); - const emsTMSServices = await emsClient.getTMSServices(); + const emsTMSServices = await getEmsTmsServices(); if (!this._isMounted) { return; diff --git a/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx index b778dc0076459..ca78aaefe404f 100644 --- a/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx @@ -12,13 +12,12 @@ import { KibanaRegionmapSource, sourceTitle } from './kibana_regionmap_source'; import { VectorLayer } from '../../layers/vector_layer/vector_layer'; // @ts-ignore import { CreateSourceEditor } from './create_source_editor'; -// @ts-ignore import { getKibanaRegionList } from '../../../meta'; export const kibanaRegionMapLayerWizardConfig: LayerWizard = { - checkVisibility: () => { + checkVisibility: async () => { const regions = getKibanaRegionList(); - return regions.length; + return regions.length > 0; }, description: i18n.translate('xpack.maps.source.kbnRegionMapDescription', { defaultMessage: 'Vector data from hosted GeoJSON configured in kibana.yml', diff --git a/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx index 227c0182b98de..84d2e5e74fa9a 100644 --- a/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx @@ -12,12 +12,12 @@ import { CreateSourceEditor } from './create_source_editor'; // @ts-ignore import { KibanaTilemapSource, sourceTitle } from './kibana_tilemap_source'; import { TileLayer } from '../../layers/tile_layer/tile_layer'; -// @ts-ignore import { getKibanaTileMap } from '../../../meta'; export const kibanaBasemapLayerWizardConfig: LayerWizard = { checkVisibility: async () => { const tilemap = getKibanaTileMap(); + // @ts-ignore return !!tilemap.url; }, description: i18n.translate('xpack.maps.source.kbnTMSDescription', { diff --git a/x-pack/plugins/maps/public/meta.js b/x-pack/plugins/maps/public/meta.js deleted file mode 100644 index 46c5e5cda3617..0000000000000 --- a/x-pack/plugins/maps/public/meta.js +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - getHttp, - getLicenseId, - getIsEmsEnabled, - getRegionmapLayers, - getTilemap, - getEmsFileApiUrl, - getEmsTileApiUrl, - getEmsLandingPageUrl, - getEmsFontLibraryUrl, - getProxyElasticMapsServiceInMaps, - getKibanaVersion, -} from './kibana_services'; -import { - GIS_API_PATH, - EMS_FILES_CATALOGUE_PATH, - EMS_TILES_CATALOGUE_PATH, - EMS_GLYPHS_PATH, - EMS_APP_NAME, - FONTS_API_PATH, -} from '../common/constants'; -import { i18n } from '@kbn/i18n'; -import { EMSClient } from '@elastic/ems-client'; - -import fetch from 'node-fetch'; - -const GIS_API_RELATIVE = `../${GIS_API_PATH}`; - -export function getKibanaRegionList() { - return getRegionmapLayers(); -} - -export function getKibanaTileMap() { - return getTilemap(); -} - -function relativeToAbsolute(url) { - const a = document.createElement('a'); - a.setAttribute('href', url); - return a.href; -} - -function fetchFunction(...args) { - return fetch(...args); -} - -let emsClient = null; -let latestLicenseId = null; -export function getEMSClient() { - if (!emsClient) { - const isEmsEnabled = getIsEmsEnabled(); - if (isEmsEnabled) { - const proxyElasticMapsServiceInMaps = getProxyElasticMapsServiceInMaps(); - const proxyPath = ''; - const tileApiUrl = proxyElasticMapsServiceInMaps - ? relativeToAbsolute(`${GIS_API_RELATIVE}/${EMS_TILES_CATALOGUE_PATH}`) - : getEmsTileApiUrl(); - const fileApiUrl = proxyElasticMapsServiceInMaps - ? relativeToAbsolute(`${GIS_API_RELATIVE}/${EMS_FILES_CATALOGUE_PATH}`) - : getEmsFileApiUrl(); - - emsClient = new EMSClient({ - language: i18n.getLocale(), - appVersion: getKibanaVersion(), - appName: EMS_APP_NAME, - tileApiUrl, - fileApiUrl, - landingPageUrl: getEmsLandingPageUrl(), - fetchFunction: fetchFunction, //import this from client-side, so the right instance is returned (bootstrapped from common/* would not work - proxyPath, - }); - } else { - //EMS is turned off. Mock API. - emsClient = { - async getFileLayers() { - return []; - }, - async getTMSServices() { - return []; - }, - addQueryParams() {}, - }; - } - } - const licenseId = getLicenseId(); - if (latestLicenseId !== licenseId) { - latestLicenseId = licenseId; - emsClient.addQueryParams({ license: licenseId }); - } - return emsClient; -} - -export function getGlyphUrl() { - if (!getIsEmsEnabled()) { - return getHttp().basePath.prepend(`/${FONTS_API_PATH}/{fontstack}/{range}`); - } - return getProxyElasticMapsServiceInMaps() - ? relativeToAbsolute(`../${GIS_API_PATH}/${EMS_TILES_CATALOGUE_PATH}/${EMS_GLYPHS_PATH}`) + - `/{fontstack}/{range}` - : getEmsFontLibraryUrl(); -} - -export function isRetina() { - return window.devicePixelRatio === 2; -} diff --git a/x-pack/plugins/maps/public/meta.ts b/x-pack/plugins/maps/public/meta.ts new file mode 100644 index 0000000000000..54c5eac7fe1b0 --- /dev/null +++ b/x-pack/plugins/maps/public/meta.ts @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { EMSClient, FileLayer, TMSService } from '@elastic/ems-client'; + +import fetch from 'node-fetch'; +import { + GIS_API_PATH, + EMS_FILES_CATALOGUE_PATH, + EMS_TILES_CATALOGUE_PATH, + EMS_GLYPHS_PATH, + EMS_APP_NAME, + FONTS_API_PATH, +} from '../common/constants'; +import { + getHttp, + getLicenseId, + getIsEmsEnabled, + getRegionmapLayers, + getTilemap, + getEmsFileApiUrl, + getEmsTileApiUrl, + getEmsLandingPageUrl, + getEmsFontLibraryUrl, + getProxyElasticMapsServiceInMaps, + getKibanaVersion, +} from './kibana_services'; + +const GIS_API_RELATIVE = `../${GIS_API_PATH}`; + +export function getKibanaRegionList(): unknown[] { + return getRegionmapLayers(); +} + +export function getKibanaTileMap(): unknown { + return getTilemap(); +} + +export async function getEmsFileLayers(): Promise { + if (!getIsEmsEnabled()) { + return []; + } + + return getEMSClient().getFileLayers(); +} + +export async function getEmsTmsServices(): Promise { + if (!getIsEmsEnabled()) { + return []; + } + + return getEMSClient().getTMSServices(); +} + +function relativeToAbsolute(url: string): string { + const a = document.createElement('a'); + a.setAttribute('href', url); + return a.href; +} + +let emsClient: EMSClient | null = null; +let latestLicenseId: string | null = null; +export function getEMSClient(): EMSClient { + if (!emsClient) { + const proxyElasticMapsServiceInMaps = getProxyElasticMapsServiceInMaps(); + const proxyPath = ''; + const tileApiUrl = proxyElasticMapsServiceInMaps + ? relativeToAbsolute(`${GIS_API_RELATIVE}/${EMS_TILES_CATALOGUE_PATH}`) + : getEmsTileApiUrl(); + const fileApiUrl = proxyElasticMapsServiceInMaps + ? relativeToAbsolute(`${GIS_API_RELATIVE}/${EMS_FILES_CATALOGUE_PATH}`) + : getEmsFileApiUrl(); + + emsClient = new EMSClient({ + language: i18n.getLocale(), + appVersion: getKibanaVersion(), + appName: EMS_APP_NAME, + tileApiUrl, + fileApiUrl, + landingPageUrl: getEmsLandingPageUrl(), + fetchFunction(url: string) { + return fetch(url); + }, + proxyPath, + }); + } + const licenseId = getLicenseId(); + if (latestLicenseId !== licenseId) { + latestLicenseId = licenseId; + emsClient.addQueryParams({ license: licenseId }); + } + return emsClient; +} + +export function getGlyphUrl(): string { + if (!getIsEmsEnabled()) { + return getHttp().basePath.prepend(`/${FONTS_API_PATH}/{fontstack}/{range}`); + } + return getProxyElasticMapsServiceInMaps() + ? relativeToAbsolute(`../${GIS_API_PATH}/${EMS_TILES_CATALOGUE_PATH}/${EMS_GLYPHS_PATH}`) + + `/{fontstack}/{range}` + : getEmsFontLibraryUrl(); +} + +export function isRetina(): boolean { + return window.devicePixelRatio === 2; +} diff --git a/yarn.lock b/yarn.lock index f9f15ab79310d..df16cd891ea6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1297,10 +1297,10 @@ once "^1.4.0" pump "^3.0.0" -"@elastic/ems-client@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@elastic/ems-client/-/ems-client-7.8.0.tgz#8cc309bc8128c03a78e876b43bf04f4d2b4789c5" - integrity sha512-+6WjxZy/mhVWXTdSYjHd+ArsvH1s7GEummaGq9DlnCW6CyGIYkYxOISKpuytReeYhhMk7F06f/GKw+8ivi2zPQ== +"@elastic/ems-client@7.9.3": + version "7.9.3" + resolved "https://registry.yarnpkg.com/@elastic/ems-client/-/ems-client-7.9.3.tgz#71b79914f76e347f050ead8474ad65d761e94a8a" + integrity sha512-aun5rW9TQgWLVH77xBLLhempT3P+6AeQIEyK/CWYuVfCDpHfDxzMKWgQ076a7rSUqF059ayDGZbyOxf7l0M2Sw== dependencies: lodash "^4.17.15" semver "^6.3.0" From 3197a00e790ac630610b9dfae792f9dfcd6211c8 Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Wed, 10 Jun 2020 12:02:52 -0500 Subject: [PATCH 91/91] Revert "[ML] Transforms: Add ability to delete dest index & index pattern when deleting transform job" (#68793) --- x-pack/plugins/ml/common/util/errors.test.ts | 78 ----- x-pack/plugins/ml/common/util/errors.ts | 75 ----- .../analytics_list/action_delete.tsx | 2 +- .../analytics_service/delete_analytics.ts | 2 +- .../ml/public/application/util/error_utils.ts | 32 ++ x-pack/plugins/ml/public/shared.ts | 1 - x-pack/plugins/transform/common/index.ts | 17 - .../components/toast_notification_text.tsx | 12 +- .../transform/public/app/hooks/index.ts | 2 +- .../transform/public/app/hooks/use_api.ts | 15 +- .../public/app/hooks/use_delete_transform.tsx | 255 ++------------ .../transform_list/action_delete.tsx | 128 +------ .../public/app/services/es_index_service.ts | 33 -- .../transform/public/shared_imports.ts | 1 - .../server/routes/api/error_utils.ts | 10 +- .../transform/server/routes/api/schema.ts | 14 - .../transform/server/routes/api/transforms.ts | 154 +-------- x-pack/test/api_integration/apis/index.js | 1 - .../apis/ml/data_frame_analytics/delete.ts | 2 +- .../apis/transform/delete_transforms.ts | 318 ------------------ .../api_integration/apis/transform/index.ts | 32 -- x-pack/test/api_integration/services/index.ts | 2 - .../api_integration/services/transform.ts | 23 -- .../test/functional/services/transform/api.ts | 63 +--- 24 files changed, 107 insertions(+), 1165 deletions(-) delete mode 100644 x-pack/plugins/ml/common/util/errors.test.ts create mode 100644 x-pack/plugins/ml/public/application/util/error_utils.ts delete mode 100644 x-pack/plugins/transform/public/app/services/es_index_service.ts delete mode 100644 x-pack/test/api_integration/apis/transform/delete_transforms.ts delete mode 100644 x-pack/test/api_integration/apis/transform/index.ts delete mode 100644 x-pack/test/api_integration/services/transform.ts diff --git a/x-pack/plugins/ml/common/util/errors.test.ts b/x-pack/plugins/ml/common/util/errors.test.ts deleted file mode 100644 index 00af27248ccce..0000000000000 --- a/x-pack/plugins/ml/common/util/errors.test.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - BoomResponse, - extractErrorMessage, - MLCustomHttpResponseOptions, - MLResponseError, -} from './errors'; -import { ResponseError } from 'kibana/server'; - -describe('ML - error message utils', () => { - describe('extractErrorMessage', () => { - test('returns just the error message', () => { - const testMsg = 'Saved object [index-pattern/blahblahblah] not found'; - - const bodyWithNestedErrorMsg: MLCustomHttpResponseOptions = { - body: { - message: { - msg: testMsg, - }, - }, - statusCode: 404, - }; - expect(extractErrorMessage(bodyWithNestedErrorMsg)).toBe(testMsg); - - const bodyWithStringMsg: MLCustomHttpResponseOptions = { - body: { - msg: testMsg, - }, - statusCode: 404, - }; - expect(extractErrorMessage(bodyWithStringMsg)).toBe(testMsg); - - const bodyWithStringMessage: MLCustomHttpResponseOptions = { - body: { - message: testMsg, - }, - statusCode: 404, - }; - expect(extractErrorMessage(bodyWithStringMessage)).toBe(testMsg); - - const bodyWithString: MLCustomHttpResponseOptions = { - body: testMsg, - statusCode: 404, - }; - expect(extractErrorMessage(bodyWithString)).toBe(testMsg); - - const bodyWithError: MLCustomHttpResponseOptions = { - body: new Error(testMsg), - statusCode: 404, - }; - expect(extractErrorMessage(bodyWithError)).toBe(testMsg); - - const bodyWithBoomError: MLCustomHttpResponseOptions = { - statusCode: 404, - body: { - data: [], - isBoom: true, - isServer: false, - output: { - statusCode: 404, - payload: { - statusCode: 404, - error: testMsg, - message: testMsg, - }, - headers: {}, - }, - }, - }; - expect(extractErrorMessage(bodyWithBoomError)).toBe(testMsg); - }); - }); -}); diff --git a/x-pack/plugins/ml/common/util/errors.ts b/x-pack/plugins/ml/common/util/errors.ts index e165e15d7c64e..4446624bf2e7f 100644 --- a/x-pack/plugins/ml/common/util/errors.ts +++ b/x-pack/plugins/ml/common/util/errors.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ResponseError, ResponseHeaders } from 'kibana/server'; import { isErrorResponse } from '../types/errors'; export function getErrorMessage(error: any) { @@ -18,77 +17,3 @@ export function getErrorMessage(error: any) { return JSON.stringify(error); } - -// Adding temporary types until Kibana ResponseError is updated - -export interface BoomResponse { - data: any; - isBoom: boolean; - isServer: boolean; - output: { - statusCode: number; - payload: { - statusCode: number; - error: string; - message: string; - }; - headers: {}; - }; -} -export type MLResponseError = - | { - message: { - msg: string; - }; - } - | { msg: string }; - -export interface MLCustomHttpResponseOptions< - T extends ResponseError | MLResponseError | BoomResponse -> { - /** HTTP message to send to the client */ - body?: T; - /** HTTP Headers with additional information about response */ - headers?: ResponseHeaders; - statusCode: number; -} - -export const extractErrorMessage = ( - error: - | MLCustomHttpResponseOptions - | undefined - | string -): string => { - // extract only the error message within the response error coming from Kibana, Elasticsearch, and our own ML messages - - if (typeof error === 'string') { - return error; - } - if (error?.body === undefined) return ''; - - if (typeof error.body === 'string') { - return error.body; - } - if ( - typeof error.body === 'object' && - 'output' in error.body && - error.body.output.payload.message - ) { - return error.body.output.payload.message; - } - - if (typeof error.body === 'object' && 'msg' in error.body && typeof error.body.msg === 'string') { - return error.body.msg; - } - - if (typeof error.body === 'object' && 'message' in error.body) { - if (typeof error.body.message === 'string') { - return error.body.message; - } - if (!(error.body.message instanceof Error) && typeof (error.body.message.msg === 'string')) { - return error.body.message.msg; - } - } - // If all else fail return an empty message instead of JSON.stringify - return ''; -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_delete.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_delete.tsx index 38ef00914e8fb..2d433f6b18484 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_delete.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_delete.tsx @@ -18,7 +18,6 @@ import { } from '@elastic/eui'; import { IIndexPattern } from 'src/plugins/data/common'; import { FormattedMessage } from '@kbn/i18n/react'; -import { extractErrorMessage } from '../../../../../../../common/util/errors'; import { deleteAnalytics, deleteAnalyticsAndDestIndex, @@ -30,6 +29,7 @@ import { } from '../../../../../capabilities/check_capabilities'; import { useMlKibana } from '../../../../../contexts/kibana'; import { isDataFrameAnalyticsRunning, DataFrameAnalyticsListRow } from './common'; +import { extractErrorMessage } from '../../../../../util/error_utils'; interface DeleteActionProps { item: DataFrameAnalyticsListRow; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts index ebd3fa8982604..26cefff0a3f59 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; -import { extractErrorMessage } from '../../../../../../../common/util/errors'; import { getToastNotifications } from '../../../../../util/dependency_cache'; import { ml } from '../../../../../services/ml_api_service'; import { refreshAnalyticsList$, REFRESH_ANALYTICS_LIST_STATE } from '../../../../common'; @@ -12,6 +11,7 @@ import { isDataFrameAnalyticsFailed, DataFrameAnalyticsListRow, } from '../../components/analytics_list/common'; +import { extractErrorMessage } from '../../../../../util/error_utils'; export const deleteAnalytics = async (d: DataFrameAnalyticsListRow) => { const toastNotifications = getToastNotifications(); diff --git a/x-pack/plugins/ml/public/application/util/error_utils.ts b/x-pack/plugins/ml/public/application/util/error_utils.ts new file mode 100644 index 0000000000000..2ce8f4ffc583a --- /dev/null +++ b/x-pack/plugins/ml/public/application/util/error_utils.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CustomHttpResponseOptions, ResponseError } from 'kibana/server'; + +export const extractErrorMessage = ( + error: CustomHttpResponseOptions | undefined | string +): string | undefined => { + if (typeof error === 'string') { + return error; + } + + if (error?.body) { + if (typeof error.body === 'string') { + return error.body; + } + if (typeof error.body === 'object' && 'message' in error.body) { + if (typeof error.body.message === 'string') { + return error.body.message; + } + // @ts-ignore + if (typeof (error.body.message?.msg === 'string')) { + // @ts-ignore + return error.body.message?.msg; + } + } + } + return undefined; +}; diff --git a/x-pack/plugins/ml/public/shared.ts b/x-pack/plugins/ml/public/shared.ts index ff83d79adff67..6821cb7ef0f94 100644 --- a/x-pack/plugins/ml/public/shared.ts +++ b/x-pack/plugins/ml/public/shared.ts @@ -14,7 +14,6 @@ export * from '../common/types/audit_message'; export * from '../common/util/anomaly_utils'; export * from '../common/util/errors'; - export * from '../common/util/validators'; export * from './application/formatters/metric_change_description'; diff --git a/x-pack/plugins/transform/common/index.ts b/x-pack/plugins/transform/common/index.ts index 79ff6298a2ca2..d7a791e78b3ab 100644 --- a/x-pack/plugins/transform/common/index.ts +++ b/x-pack/plugins/transform/common/index.ts @@ -38,20 +38,3 @@ export interface ResultData { export interface TransformEndpointResult { [key: string]: ResultData; } - -export interface DeleteTransformEndpointRequest { - transformsInfo: TransformEndpointRequest[]; - deleteDestIndex?: boolean; - deleteDestIndexPattern?: boolean; -} - -export interface DeleteTransformStatus { - transformDeleted: ResultData; - destIndexDeleted?: ResultData; - destIndexPatternDeleted?: ResultData; - destinationIndex?: string | undefined; -} - -export interface DeleteTransformEndpointResult { - [key: string]: DeleteTransformStatus; -} diff --git a/x-pack/plugins/transform/public/app/components/toast_notification_text.tsx b/x-pack/plugins/transform/public/app/components/toast_notification_text.tsx index 3f664cf8bb09b..1044081670523 100644 --- a/x-pack/plugins/transform/public/app/components/toast_notification_text.tsx +++ b/x-pack/plugins/transform/public/app/components/toast_notification_text.tsx @@ -29,14 +29,9 @@ const MAX_SIMPLE_MESSAGE_LENGTH = 140; interface ToastNotificationTextProps { overlays: CoreStart['overlays']; text: any; - previewTextLength?: number; } -export const ToastNotificationText: FC = ({ - overlays, - text, - previewTextLength, -}) => { +export const ToastNotificationText: FC = ({ overlays, text }) => { if (typeof text === 'string' && text.length <= MAX_SIMPLE_MESSAGE_LENGTH) { return text; } @@ -51,9 +46,8 @@ export const ToastNotificationText: FC = ({ const unformattedText = text.message ? text.message : text; const formattedText = typeof unformattedText === 'object' ? JSON.stringify(text, null, 2) : text; - const textLength = previewTextLength ?? 140; - const previewText = `${formattedText.substring(0, textLength)}${ - formattedText.length > textLength ? ' ...' : '' + const previewText = `${formattedText.substring(0, 140)}${ + formattedText.length > 140 ? ' ...' : '' }`; const openModal = () => { diff --git a/x-pack/plugins/transform/public/app/hooks/index.ts b/x-pack/plugins/transform/public/app/hooks/index.ts index b439afe2b2165..a36550bcd8e57 100644 --- a/x-pack/plugins/transform/public/app/hooks/index.ts +++ b/x-pack/plugins/transform/public/app/hooks/index.ts @@ -6,7 +6,7 @@ export { useApi } from './use_api'; export { useGetTransforms } from './use_get_transforms'; -export { useDeleteTransforms, useDeleteIndexAndTargetIndex } from './use_delete_transform'; +export { useDeleteTransforms } from './use_delete_transform'; export { useStartTransforms } from './use_start_transform'; export { useStopTransforms } from './use_stop_transform'; export { useRequest } from './use_request'; diff --git a/x-pack/plugins/transform/public/app/hooks/use_api.ts b/x-pack/plugins/transform/public/app/hooks/use_api.ts index 5d7839cf5fba7..f3c35d358f1f2 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_api.ts +++ b/x-pack/plugins/transform/public/app/hooks/use_api.ts @@ -5,12 +5,7 @@ */ import { useMemo } from 'react'; -import { - TransformId, - TransformEndpointRequest, - TransformEndpointResult, - DeleteTransformEndpointResult, -} from '../../../common'; +import { TransformEndpointRequest, TransformEndpointResult, TransformId } from '../../../common'; import { API_BASE_PATH } from '../../../common/constants'; import { useAppDependencies } from '../app_dependencies'; @@ -45,12 +40,10 @@ export const useApi = () => { }); }, deleteTransforms( - transformsInfo: TransformEndpointRequest[], - deleteDestIndex: boolean | undefined, - deleteDestIndexPattern: boolean | undefined - ): Promise { + transformsInfo: TransformEndpointRequest[] + ): Promise { return http.post(`${API_BASE_PATH}delete_transforms`, { - body: JSON.stringify({ transformsInfo, deleteDestIndex, deleteDestIndexPattern }), + body: JSON.stringify(transformsInfo), }); }, getTransformsPreview(obj: PreviewRequestBody): Promise { diff --git a/x-pack/plugins/transform/public/app/hooks/use_delete_transform.tsx b/x-pack/plugins/transform/public/app/hooks/use_delete_transform.tsx index 1f395e67b7d31..0215d723188b1 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_delete_transform.tsx +++ b/x-pack/plugins/transform/public/app/hooks/use_delete_transform.tsx @@ -4,257 +4,52 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useEffect, useState } from 'react'; +import React from 'react'; + import { i18n } from '@kbn/i18n'; import { toMountPoint } from '../../../../../../src/plugins/kibana_react/public'; -import { - TransformEndpointRequest, - DeleteTransformEndpointResult, - DeleteTransformStatus, -} from '../../../common'; -import { getErrorMessage, extractErrorMessage } from '../../shared_imports'; -import { useAppDependencies, useToastNotifications } from '../app_dependencies'; -import { TransformListRow, refreshTransformList$, REFRESH_TRANSFORM_LIST_STATE } from '../common'; -import { ToastNotificationText } from '../components'; -import { useApi } from './use_api'; -import { indexService } from '../services/es_index_service'; -export const useDeleteIndexAndTargetIndex = (items: TransformListRow[]) => { - const { http, savedObjects } = useAppDependencies(); - const toastNotifications = useToastNotifications(); - - const [deleteDestIndex, setDeleteDestIndex] = useState(true); - const [deleteIndexPattern, setDeleteIndexPattern] = useState(true); - const [userCanDeleteIndex, setUserCanDeleteIndex] = useState(false); - const [indexPatternExists, setIndexPatternExists] = useState(false); - const toggleDeleteIndex = useCallback(() => setDeleteDestIndex(!deleteDestIndex), [ - deleteDestIndex, - ]); - const toggleDeleteIndexPattern = useCallback(() => setDeleteIndexPattern(!deleteIndexPattern), [ - deleteIndexPattern, - ]); +import { TransformEndpointRequest, TransformEndpointResult } from '../../../common'; - const checkIndexPatternExists = useCallback( - async (indexName: string) => { - try { - if (await indexService.indexPatternExists(savedObjects.client, indexName)) { - setIndexPatternExists(true); - } - } catch (e) { - const error = extractErrorMessage(e); - - toastNotifications.addDanger( - i18n.translate( - 'xpack.transform.deleteTransform.errorWithCheckingIfIndexPatternExistsNotificationErrorMessage', - { - defaultMessage: - 'An error occurred checking if index pattern {indexPattern} exists: {error}', - values: { indexPattern: indexName, error }, - } - ) - ); - } - }, - [savedObjects.client, toastNotifications] - ); - - const checkUserIndexPermission = useCallback(async () => { - try { - const userCanDelete = await indexService.canDeleteIndex(http); - if (userCanDelete) { - setUserCanDeleteIndex(true); - } - } catch (e) { - toastNotifications.addDanger( - i18n.translate( - 'xpack.transform.transformList.errorWithCheckingIfUserCanDeleteIndexNotificationErrorMessage', - { - defaultMessage: 'An error occurred checking if user can delete destination index', - } - ) - ); - } - }, [http, toastNotifications]); - - useEffect(() => { - checkUserIndexPermission(); - - if (items.length === 1) { - const config = items[0].config; - const destinationIndex = Array.isArray(config.dest.index) - ? config.dest.index[0] - : config.dest.index; - checkIndexPatternExists(destinationIndex); - } else { - setIndexPatternExists(true); - } - }, [checkIndexPatternExists, checkUserIndexPermission, items]); +import { getErrorMessage } from '../../shared_imports'; - return { - userCanDeleteIndex, - deleteDestIndex, - indexPatternExists, - deleteIndexPattern, - toggleDeleteIndex, - toggleDeleteIndexPattern, - }; -}; +import { useAppDependencies, useToastNotifications } from '../app_dependencies'; +import { TransformListRow, refreshTransformList$, REFRESH_TRANSFORM_LIST_STATE } from '../common'; +import { ToastNotificationText } from '../components'; -type SuccessCountField = keyof Omit; +import { useApi } from './use_api'; export const useDeleteTransforms = () => { const { overlays } = useAppDependencies(); const toastNotifications = useToastNotifications(); const api = useApi(); - return async ( - transforms: TransformListRow[], - shouldDeleteDestIndex: boolean, - shouldDeleteDestIndexPattern: boolean - ) => { + return async (transforms: TransformListRow[]) => { const transformsInfo: TransformEndpointRequest[] = transforms.map((tf) => ({ id: tf.config.id, state: tf.stats.state, })); try { - const results: DeleteTransformEndpointResult = await api.deleteTransforms( - transformsInfo, - shouldDeleteDestIndex, - shouldDeleteDestIndexPattern - ); - const isBulk = Object.keys(results).length > 1; - const successCount: Record = { - transformDeleted: 0, - destIndexDeleted: 0, - destIndexPatternDeleted: 0, - }; + const results: TransformEndpointResult = await api.deleteTransforms(transformsInfo); for (const transformId in results) { // hasOwnProperty check to ensure only properties on object itself, and not its prototypes if (results.hasOwnProperty(transformId)) { - const status = results[transformId]; - const destinationIndex = status.destinationIndex; - - // if we are only deleting one transform, show the success toast messages - if (!isBulk && status.transformDeleted) { - if (status.transformDeleted?.success) { - toastNotifications.addSuccess( - i18n.translate('xpack.transform.transformList.deleteTransformSuccessMessage', { - defaultMessage: 'Request to delete transform {transformId} acknowledged.', - values: { transformId }, - }) - ); - } - if (status.destIndexDeleted?.success) { - toastNotifications.addSuccess( - i18n.translate( - 'xpack.transform.deleteTransform.deleteAnalyticsWithIndexSuccessMessage', - { - defaultMessage: - 'Request to delete destination index {destinationIndex} acknowledged.', - values: { destinationIndex }, - } - ) - ); - } - if (status.destIndexPatternDeleted?.success) { - toastNotifications.addSuccess( - i18n.translate( - 'xpack.transform.deleteTransform.deleteAnalyticsWithIndexPatternSuccessMessage', - { - defaultMessage: - 'Request to delete index pattern {destinationIndex} acknowledged.', - values: { destinationIndex }, - } - ) - ); - } + if (results[transformId].success === true) { + toastNotifications.addSuccess( + i18n.translate('xpack.transform.transformList.deleteTransformSuccessMessage', { + defaultMessage: 'Request to delete transform {transformId} acknowledged.', + values: { transformId }, + }) + ); } else { - (Object.keys(successCount) as SuccessCountField[]).forEach((key) => { - if (status[key]?.success) { - successCount[key] = successCount[key] + 1; - } - }); - } - if (status.transformDeleted?.error) { - const error = extractErrorMessage(status.transformDeleted.error); - toastNotifications.addDanger({ - title: i18n.translate('xpack.transform.transformList.deleteTransformErrorMessage', { + toastNotifications.addDanger( + i18n.translate('xpack.transform.transformList.deleteTransformErrorMessage', { defaultMessage: 'An error occurred deleting the transform {transformId}', values: { transformId }, - }), - text: toMountPoint( - - ), - }); + }) + ); } - - if (status.destIndexDeleted?.error) { - const error = extractErrorMessage(status.destIndexDeleted.error); - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.transform.deleteTransform.deleteAnalyticsWithIndexErrorMessage', - { - defaultMessage: 'An error occurred deleting destination index {destinationIndex}', - values: { destinationIndex }, - } - ), - text: toMountPoint( - - ), - }); - } - - if (status.destIndexPatternDeleted?.error) { - const error = extractErrorMessage(status.destIndexPatternDeleted.error); - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.transform.deleteTransform.deleteAnalyticsWithIndexPatternErrorMessage', - { - defaultMessage: 'An error occurred deleting index pattern {destinationIndex}', - values: { destinationIndex }, - } - ), - text: toMountPoint( - - ), - }); - } - } - } - - // if we are deleting multiple transforms, combine the success messages - if (isBulk) { - if (successCount.transformDeleted > 0) { - toastNotifications.addSuccess( - i18n.translate('xpack.transform.transformList.bulkDeleteTransformSuccessMessage', { - defaultMessage: - 'Successfully deleted {count} {count, plural, one {transform} other {transforms}}.', - values: { count: successCount.transformDeleted }, - }) - ); - } - - if (successCount.destIndexDeleted > 0) { - toastNotifications.addSuccess( - i18n.translate('xpack.transform.transformList.bulkDeleteDestIndexSuccessMessage', { - defaultMessage: - 'Successfully deleted {count} destination {count, plural, one {index} other {indices}}.', - values: { count: successCount.destIndexDeleted }, - }) - ); - } - if (successCount.destIndexPatternDeleted > 0) { - toastNotifications.addSuccess( - i18n.translate( - 'xpack.transform.transformList.bulkDeleteDestIndexPatternSuccessMessage', - { - defaultMessage: - 'Successfully deleted {count} destination index {count, plural, one {pattern} other {patterns}}.', - values: { count: successCount.destIndexPatternDeleted }, - } - ) - ); } } @@ -264,13 +59,7 @@ export const useDeleteTransforms = () => { title: i18n.translate('xpack.transform.transformList.deleteTransformGenericErrorMessage', { defaultMessage: 'An error occurred calling the API endpoint to delete transforms.', }), - text: toMountPoint( - - ), + text: toMountPoint(), }); } }; diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/action_delete.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/action_delete.tsx index d7db55990d333..c20feba29f582 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/action_delete.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/action_delete.tsx @@ -12,14 +12,11 @@ import { EuiOverlayMask, EuiToolTip, EUI_MODAL_CONFIRM_BUTTON, - EuiFlexGroup, - EuiFlexItem, - EuiSwitch, - EuiSpacer, } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; + import { TRANSFORM_STATE } from '../../../../../../common'; -import { useDeleteTransforms, useDeleteIndexAndTargetIndex } from '../../../../hooks'; + +import { useDeleteTransforms } from '../../../../hooks'; import { createCapabilityFailureMessage, AuthorizationContext, @@ -38,25 +35,13 @@ export const DeleteAction: FC = ({ items, forceDisable }) => const { canDeleteTransform } = useContext(AuthorizationContext).capabilities; const deleteTransforms = useDeleteTransforms(); - const { - userCanDeleteIndex, - deleteDestIndex, - indexPatternExists, - deleteIndexPattern, - toggleDeleteIndex, - toggleDeleteIndexPattern, - } = useDeleteIndexAndTargetIndex(items); const [isModalVisible, setModalVisible] = useState(false); const closeModal = () => setModalVisible(false); const deleteAndCloseModal = () => { setModalVisible(false); - - const shouldDeleteDestIndex = userCanDeleteIndex && deleteDestIndex; - const shouldDeleteDestIndexPattern = - userCanDeleteIndex && indexPatternExists && deleteIndexPattern; - deleteTransforms(items, shouldDeleteDestIndex, shouldDeleteDestIndexPattern); + deleteTransforms(items); }; const openModal = () => setModalVisible(true); @@ -86,96 +71,17 @@ export const DeleteAction: FC = ({ items, forceDisable }) => defaultMessage: 'Delete {transformId}', values: { transformId: items[0] && items[0].config.id }, }); - const bulkDeleteModalContent = ( - <> -

- -

- - - { - - } - - - - { - - } - - - - ); - - const deleteModalContent = ( - <> -

- -

- - - {userCanDeleteIndex && ( - - )} - - {userCanDeleteIndex && indexPatternExists && ( - - - - - )} - - + const bulkDeleteModalMessage = i18n.translate( + 'xpack.transform.transformList.bulkDeleteModalBody', + { + defaultMessage: + "Are you sure you want to delete {count, plural, one {this} other {these}} {count} {count, plural, one {transform} other {transforms}}? The transform's destination index and optional Kibana index pattern will not be deleted.", + values: { count: items.length }, + } ); + const deleteModalMessage = i18n.translate('xpack.transform.transformList.deleteModalBody', { + defaultMessage: `Are you sure you want to delete this transform? The transform's destination index and optional Kibana index pattern will not be deleted.`, + }); let deleteButton = ( = ({ items, forceDisable }) => if (disabled || !canDeleteTransform) { let content; if (disabled) { - content = isBulkAction ? bulkDeleteButtonDisabledText : deleteButtonDisabledText; + content = isBulkAction === true ? bulkDeleteButtonDisabledText : deleteButtonDisabledText; } else { content = createCapabilityFailureMessage('canDeleteTransform'); } @@ -211,7 +117,7 @@ export const DeleteAction: FC = ({ items, forceDisable }) => {isModalVisible && ( = ({ items, forceDisable }) => defaultFocusedButton={EUI_MODAL_CONFIRM_BUTTON} buttonColor="danger" > - {isBulkAction ? bulkDeleteModalContent : deleteModalContent} +

{isBulkAction === true ? bulkDeleteModalMessage : deleteModalMessage}

)} diff --git a/x-pack/plugins/transform/public/app/services/es_index_service.ts b/x-pack/plugins/transform/public/app/services/es_index_service.ts deleted file mode 100644 index 491213d0ddbe7..0000000000000 --- a/x-pack/plugins/transform/public/app/services/es_index_service.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { HttpSetup, SavedObjectsClientContract } from 'kibana/public'; -import { API_BASE_PATH } from '../../../common/constants'; -import { IIndexPattern } from '../../../../../../src/plugins/data/common/index_patterns'; - -export class IndexService { - async canDeleteIndex(http: HttpSetup) { - const privilege = await http.get(`${API_BASE_PATH}privileges`); - if (!privilege) { - return false; - } - return privilege.hasAllPrivileges; - } - - async indexPatternExists(savedObjectsClient: SavedObjectsClientContract, indexName: string) { - const response = await savedObjectsClient.find({ - type: 'index-pattern', - perPage: 1, - search: `"${indexName}"`, - searchFields: ['title'], - fields: ['title'], - }); - const ip = response.savedObjects.find((obj) => obj.attributes.title === indexName); - return ip !== undefined; - } -} - -export const indexService = new IndexService(); diff --git a/x-pack/plugins/transform/public/shared_imports.ts b/x-pack/plugins/transform/public/shared_imports.ts index ca3fb52cc02c3..56be8d7bb7de7 100644 --- a/x-pack/plugins/transform/public/shared_imports.ts +++ b/x-pack/plugins/transform/public/shared_imports.ts @@ -15,7 +15,6 @@ export { export { getErrorMessage, - extractErrorMessage, getDataGridSchemaFromKibanaFieldType, getFieldsFromKibanaIndexPattern, multiColumnSortFactory, diff --git a/x-pack/plugins/transform/server/routes/api/error_utils.ts b/x-pack/plugins/transform/server/routes/api/error_utils.ts index 5a479e4f429f6..295375794c04e 100644 --- a/x-pack/plugins/transform/server/routes/api/error_utils.ts +++ b/x-pack/plugins/transform/server/routes/api/error_utils.ts @@ -10,11 +10,7 @@ import { i18n } from '@kbn/i18n'; import { ResponseError, CustomHttpResponseOptions } from 'src/core/server'; -import { - TransformEndpointRequest, - TransformEndpointResult, - DeleteTransformEndpointResult, -} from '../../../common'; +import { TransformEndpointRequest, TransformEndpointResult } from '../../../common'; const REQUEST_TIMEOUT = 'RequestTimeout'; @@ -23,7 +19,7 @@ export function isRequestTimeout(error: any) { } interface Params { - results: TransformEndpointResult | DeleteTransformEndpointResult; + results: TransformEndpointResult; id: string; items: TransformEndpointRequest[]; action: string; @@ -63,7 +59,7 @@ export function fillResultsWithTimeouts({ results, id, items, action }: Params) }, }; - const newResults: TransformEndpointResult | DeleteTransformEndpointResult = {}; + const newResults: TransformEndpointResult = {}; return items.reduce((accumResults, currentVal) => { if (results[currentVal.id] === undefined) { diff --git a/x-pack/plugins/transform/server/routes/api/schema.ts b/x-pack/plugins/transform/server/routes/api/schema.ts index cf39f2e3829ea..0b994406d324d 100644 --- a/x-pack/plugins/transform/server/routes/api/schema.ts +++ b/x-pack/plugins/transform/server/routes/api/schema.ts @@ -14,17 +14,3 @@ export const schemaTransformId = { export interface SchemaTransformId { transformId: string; } - -export const deleteTransformSchema = schema.object({ - /** - * Delete Transform & Destination Index - */ - transformsInfo: schema.arrayOf( - schema.object({ - id: schema.string(), - state: schema.maybe(schema.string()), - }) - ), - deleteDestIndex: schema.maybe(schema.boolean()), - deleteDestIndexPattern: schema.maybe(schema.boolean()), -}); diff --git a/x-pack/plugins/transform/server/routes/api/transforms.ts b/x-pack/plugins/transform/server/routes/api/transforms.ts index 93fda56d319ad..55b2469a7f3a7 100644 --- a/x-pack/plugins/transform/server/routes/api/transforms.ts +++ b/x-pack/plugins/transform/server/routes/api/transforms.ts @@ -5,12 +5,7 @@ */ import { schema } from '@kbn/config-schema'; -import { - KibanaResponseFactory, - RequestHandler, - RequestHandlerContext, - SavedObjectsClientContract, -} from 'kibana/server'; +import { RequestHandler } from 'kibana/server'; import { CallCluster } from 'src/legacy/core_plugins/elasticsearch'; import { wrapEsError } from '../../../../../legacy/server/lib/create_router/error_wrappers'; @@ -19,9 +14,6 @@ import { TransformEndpointResult, TransformId, TRANSFORM_STATE, - DeleteTransformEndpointRequest, - DeleteTransformStatus, - ResultData, } from '../../../common'; import { RouteDependencies } from '../../types'; @@ -29,9 +21,8 @@ import { RouteDependencies } from '../../types'; import { addBasePath } from '../index'; import { isRequestTimeout, fillResultsWithTimeouts, wrapError } from './error_utils'; -import { deleteTransformSchema, schemaTransformId, SchemaTransformId } from './schema'; +import { schemaTransformId, SchemaTransformId } from './schema'; import { registerTransformsAuditMessagesRoutes } from './transforms_audit_messages'; -import { IIndexPattern } from '../../../../../../src/plugins/data/common/index_patterns'; enum TRANSFORM_ACTIONS { STOP = 'stop', @@ -182,37 +173,15 @@ export function registerTransformsRoutes(routeDependencies: RouteDependencies) { { path: addBasePath('delete_transforms'), validate: { - body: deleteTransformSchema, + body: schema.maybe(schema.any()), }, }, license.guardApiRoute(async (ctx, req, res) => { - const { - transformsInfo, - deleteDestIndex, - deleteDestIndexPattern, - } = req.body as DeleteTransformEndpointRequest; + const transformsInfo = req.body as TransformEndpointRequest[]; try { - const body = await deleteTransforms( - transformsInfo, - deleteDestIndex, - deleteDestIndexPattern, - ctx, - license, - res - ); - - if (body && body.status) { - if (body.status === 404) { - return res.notFound(); - } - if (body.status === 403) { - return res.forbidden(); - } - } - return res.ok({ - body, + body: await deleteTransforms(transformsInfo, ctx.transform!.dataClient.callAsCurrentUser), }); } catch (e) { return res.customError(wrapError(wrapEsError(e))); @@ -269,51 +238,18 @@ const getTransforms = async (options: { transformId?: string }, callAsCurrentUse return await callAsCurrentUser('transform.getTransforms', options); }; -async function getIndexPatternId( - indexName: string, - savedObjectsClient: SavedObjectsClientContract -) { - const response = await savedObjectsClient.find({ - type: 'index-pattern', - perPage: 1, - search: `"${indexName}"`, - searchFields: ['title'], - fields: ['title'], - }); - const ip = response.saved_objects.find((obj) => obj.attributes.title === indexName); - return ip?.id; -} - -async function deleteDestIndexPatternById( - indexPatternId: string, - savedObjectsClient: SavedObjectsClientContract -) { - return await savedObjectsClient.delete('index-pattern', indexPatternId); -} - async function deleteTransforms( transformsInfo: TransformEndpointRequest[], - deleteDestIndex: boolean | undefined, - deleteDestIndexPattern: boolean | undefined, - ctx: RequestHandlerContext, - license: RouteDependencies['license'], - response: KibanaResponseFactory + callAsCurrentUser: CallCluster ) { - const tempResults: TransformEndpointResult = {}; - const results: Record = {}; + const results: TransformEndpointResult = {}; for (const transformInfo of transformsInfo) { - let destinationIndex: string | undefined; - const transformDeleted: ResultData = { success: false }; - const destIndexDeleted: ResultData = { success: false }; - const destIndexPatternDeleted: ResultData = { - success: false, - }; const transformId = transformInfo.id; try { if (transformInfo.state === TRANSFORM_STATE.FAILED) { try { - await ctx.transform!.dataClient.callAsCurrentUser('transform.stopTransform', { + await callAsCurrentUser('transform.stopTransform', { transformId, force: true, waitForCompletion: true, @@ -321,7 +257,7 @@ async function deleteTransforms( } catch (e) { if (isRequestTimeout(e)) { return fillResultsWithTimeouts({ - results: tempResults, + results, id: transformId, items: transformsInfo, action: TRANSFORM_ACTIONS.DELETE, @@ -329,75 +265,9 @@ async function deleteTransforms( } } } - // Grab destination index info to delete - try { - const transformConfigs = await getTransforms( - { transformId }, - ctx.transform!.dataClient.callAsCurrentUser - ); - const transformConfig = transformConfigs.transforms[0]; - destinationIndex = Array.isArray(transformConfig.dest.index) - ? transformConfig.dest.index[0] - : transformConfig.dest.index; - } catch (getTransformConfigError) { - transformDeleted.error = wrapError(getTransformConfigError); - results[transformId] = { - transformDeleted, - destIndexDeleted, - destIndexPatternDeleted, - destinationIndex, - }; - continue; - } - - // If user checks box to delete the destinationIndex associated with the job - if (destinationIndex && deleteDestIndex) { - try { - // If user does have privilege to delete the index, then delete the index - // if no permission then return 403 forbidden - await ctx.transform!.dataClient.callAsCurrentUser('indices.delete', { - index: destinationIndex, - }); - destIndexDeleted.success = true; - } catch (deleteIndexError) { - destIndexDeleted.error = wrapError(deleteIndexError); - } - } - - // Delete the index pattern if there's an index pattern that matches the name of dest index - if (destinationIndex && deleteDestIndexPattern) { - try { - const indexPatternId = await getIndexPatternId( - destinationIndex, - ctx.core.savedObjects.client - ); - if (indexPatternId) { - await deleteDestIndexPatternById(indexPatternId, ctx.core.savedObjects.client); - destIndexPatternDeleted.success = true; - } - } catch (deleteDestIndexPatternError) { - destIndexPatternDeleted.error = wrapError(deleteDestIndexPatternError); - } - } - try { - await ctx.transform!.dataClient.callAsCurrentUser('transform.deleteTransform', { - transformId, - }); - transformDeleted.success = true; - } catch (deleteTransformJobError) { - transformDeleted.error = wrapError(deleteTransformJobError); - if (transformDeleted.error.statusCode === 403) { - return response.forbidden(); - } - } - - results[transformId] = { - transformDeleted, - destIndexDeleted, - destIndexPatternDeleted, - destinationIndex, - }; + await callAsCurrentUser('transform.deleteTransform', { transformId }); + results[transformId] = { success: true }; } catch (e) { if (isRequestTimeout(e)) { return fillResultsWithTimeouts({ @@ -407,7 +277,7 @@ async function deleteTransforms( action: TRANSFORM_ACTIONS.DELETE, }); } - results[transformId] = { transformDeleted: { success: false, error: JSON.stringify(e) } }; + results[transformId] = { success: false, error: JSON.stringify(e) }; } } return results; diff --git a/x-pack/test/api_integration/apis/index.js b/x-pack/test/api_integration/apis/index.js index b79dc3f3ffe59..2719486d0c502 100644 --- a/x-pack/test/api_integration/apis/index.js +++ b/x-pack/test/api_integration/apis/index.js @@ -30,6 +30,5 @@ export default function ({ loadTestFile }) { loadTestFile(require.resolve('./ingest_manager')); loadTestFile(require.resolve('./endpoint')); loadTestFile(require.resolve('./ml')); - loadTestFile(require.resolve('./transform')); }); } diff --git a/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts b/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts index dc0ccfdc53a18..23bff0d0c2855 100644 --- a/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts +++ b/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts @@ -197,7 +197,7 @@ export default ({ getService }: FtrProviderContext) => { await ml.testResources.deleteIndexPattern(destinationIndex); }); - it('should delete job, target index, and index pattern by id', async () => { + it('deletes job, target index, and index pattern by id', async () => { const { body } = await supertest .delete(`/api/ml/data_frame/analytics/${analyticsId}`) .query({ deleteDestIndex: true, deleteDestIndexPattern: true }) diff --git a/x-pack/test/api_integration/apis/transform/delete_transforms.ts b/x-pack/test/api_integration/apis/transform/delete_transforms.ts deleted file mode 100644 index 40300c981ee2e..0000000000000 --- a/x-pack/test/api_integration/apis/transform/delete_transforms.ts +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import expect from '@kbn/expect'; -import { TransformEndpointRequest } from '../../../../plugins/transform/common'; -import { FtrProviderContext } from '../../ftr_provider_context'; -import { COMMON_REQUEST_HEADERS } from '../../../functional/services/ml/common'; -import { USER } from '../../../functional/services/transform/security_common'; - -async function asyncForEach(array: any[], callback: Function) { - for (let index = 0; index < array.length; index++) { - await callback(array[index], index, array); - } -} - -// eslint-disable-next-line import/no-default-export -export default ({ getService }: FtrProviderContext) => { - const esArchiver = getService('esArchiver'); - const supertest = getService('supertestWithoutAuth'); - const transform = getService('transform'); - - function generateDestIndex(transformId: string): string { - return `user-${transformId}`; - } - - async function createTransform(transformId: string, destinationIndex: string) { - const config = { - id: transformId, - source: { index: ['farequote-*'] }, - pivot: { - group_by: { airline: { terms: { field: 'airline' } } }, - aggregations: { '@timestamp.value_count': { value_count: { field: '@timestamp' } } }, - }, - dest: { index: destinationIndex }, - }; - - await transform.api.createTransform(config); - } - - describe('delete_transforms', function () { - before(async () => { - await esArchiver.loadIfNeeded('ml/farequote'); - await transform.testResources.setKibanaTimeZoneToUTC(); - }); - - after(async () => { - await transform.api.cleanTransformIndices(); - }); - - describe('single transform deletion', function () { - const transformId = 'test1'; - const destinationIndex = generateDestIndex(transformId); - - beforeEach(async () => { - await createTransform(transformId, destinationIndex); - await transform.api.createIndices(destinationIndex); - }); - - afterEach(async () => { - await transform.api.deleteIndices(destinationIndex); - }); - - it('should delete transform by transformId', async () => { - const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; - const { body } = await supertest - .post(`/api/transform/delete_transforms`) - .auth( - USER.TRANSFORM_POWERUSER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) - ) - .set(COMMON_REQUEST_HEADERS) - .send({ - transformsInfo, - }) - .expect(200); - - expect(body[transformId].transformDeleted.success).to.eql(true); - expect(body[transformId].destIndexDeleted.success).to.eql(false); - expect(body[transformId].destIndexPatternDeleted.success).to.eql(false); - await transform.api.waitForTransformNotToExist(transformId); - await transform.api.waitForIndicesToExist(destinationIndex); - }); - - it('should return 403 for unauthorized user', async () => { - const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; - await supertest - .post(`/api/transform/delete_transforms`) - .auth( - USER.TRANSFORM_VIEWER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_VIEWER) - ) - .set(COMMON_REQUEST_HEADERS) - .send({ - transformsInfo, - }) - .expect(403); - await transform.api.waitForTransformToExist(transformId); - await transform.api.waitForIndicesToExist(destinationIndex); - }); - }); - - describe('single transform deletion with invalid transformId', function () { - it('should return 200 with error in response if invalid transformId', async () => { - const transformsInfo: TransformEndpointRequest[] = [{ id: 'invalid_transform_id' }]; - const { body } = await supertest - .post(`/api/transform/delete_transforms`) - .auth( - USER.TRANSFORM_POWERUSER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) - ) - .set(COMMON_REQUEST_HEADERS) - .send({ - transformsInfo, - }) - .expect(200); - expect(body.invalid_transform_id.transformDeleted.success).to.eql(false); - expect(body.invalid_transform_id.transformDeleted).to.have.property('error'); - }); - }); - - describe('bulk deletion', function () { - const transformsInfo: TransformEndpointRequest[] = [ - { id: 'bulk_delete_test_1' }, - { id: 'bulk_delete_test_2' }, - ]; - const destinationIndices = transformsInfo.map((d) => generateDestIndex(d.id)); - - beforeEach(async () => { - await asyncForEach(transformsInfo, async ({ id }: { id: string }, idx: number) => { - await createTransform(id, destinationIndices[idx]); - await transform.api.createIndices(destinationIndices[idx]); - }); - }); - - afterEach(async () => { - await asyncForEach(destinationIndices, async (destinationIndex: string) => { - await transform.api.deleteIndices(destinationIndex); - }); - }); - - it('should delete multiple transforms by transformIds', async () => { - const { body } = await supertest - .post(`/api/transform/delete_transforms`) - .auth( - USER.TRANSFORM_POWERUSER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) - ) - .set(COMMON_REQUEST_HEADERS) - .send({ - transformsInfo, - }) - .expect(200); - - await asyncForEach( - transformsInfo, - async ({ id: transformId }: { id: string }, idx: number) => { - expect(body[transformId].transformDeleted.success).to.eql(true); - expect(body[transformId].destIndexDeleted.success).to.eql(false); - expect(body[transformId].destIndexPatternDeleted.success).to.eql(false); - await transform.api.waitForTransformNotToExist(transformId); - await transform.api.waitForIndicesToExist(destinationIndices[idx]); - } - ); - }); - - it('should delete multiple transforms by transformIds, even if one of the transformIds is invalid', async () => { - const invalidTransformId = 'invalid_transform_id'; - const { body } = await supertest - .post(`/api/transform/delete_transforms`) - .auth( - USER.TRANSFORM_POWERUSER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) - ) - .set(COMMON_REQUEST_HEADERS) - .send({ - transformsInfo: [ - { id: transformsInfo[0].id }, - { id: invalidTransformId }, - { id: transformsInfo[1].id }, - ], - }) - .expect(200); - - await asyncForEach( - transformsInfo, - async ({ id: transformId }: { id: string }, idx: number) => { - expect(body[transformId].transformDeleted.success).to.eql(true); - expect(body[transformId].destIndexDeleted.success).to.eql(false); - expect(body[transformId].destIndexPatternDeleted.success).to.eql(false); - await transform.api.waitForTransformNotToExist(transformId); - await transform.api.waitForIndicesToExist(destinationIndices[idx]); - } - ); - - expect(body[invalidTransformId].transformDeleted.success).to.eql(false); - expect(body[invalidTransformId].transformDeleted).to.have.property('error'); - }); - }); - - describe('with deleteDestIndex setting', function () { - const transformId = 'test2'; - const destinationIndex = generateDestIndex(transformId); - - before(async () => { - await createTransform(transformId, destinationIndex); - await transform.api.createIndices(destinationIndex); - }); - - after(async () => { - await transform.api.deleteIndices(destinationIndex); - }); - - it('should delete transform and destination index', async () => { - const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; - const { body } = await supertest - .post(`/api/transform/delete_transforms`) - .auth( - USER.TRANSFORM_POWERUSER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) - ) - .set(COMMON_REQUEST_HEADERS) - .send({ - transformsInfo, - deleteDestIndex: true, - }) - .expect(200); - - expect(body[transformId].transformDeleted.success).to.eql(true); - expect(body[transformId].destIndexDeleted.success).to.eql(true); - expect(body[transformId].destIndexPatternDeleted.success).to.eql(false); - await transform.api.waitForTransformNotToExist(transformId); - await transform.api.waitForIndicesNotToExist(destinationIndex); - }); - }); - - describe('with deleteDestIndexPattern setting', function () { - const transformId = 'test3'; - const destinationIndex = generateDestIndex(transformId); - - before(async () => { - await createTransform(transformId, destinationIndex); - await transform.api.createIndices(destinationIndex); - await transform.testResources.createIndexPatternIfNeeded(destinationIndex); - }); - - after(async () => { - await transform.api.deleteIndices(destinationIndex); - await transform.testResources.deleteIndexPattern(destinationIndex); - }); - - it('should delete transform and destination index pattern', async () => { - const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; - const { body } = await supertest - .post(`/api/transform/delete_transforms`) - .auth( - USER.TRANSFORM_POWERUSER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) - ) - .set(COMMON_REQUEST_HEADERS) - .send({ - transformsInfo, - deleteDestIndex: false, - deleteDestIndexPattern: true, - }) - .expect(200); - - expect(body[transformId].transformDeleted.success).to.eql(true); - expect(body[transformId].destIndexDeleted.success).to.eql(false); - expect(body[transformId].destIndexPatternDeleted.success).to.eql(true); - await transform.api.waitForTransformNotToExist(transformId); - await transform.api.waitForIndicesToExist(destinationIndex); - await transform.testResources.assertIndexPatternNotExist(destinationIndex); - }); - }); - - describe('with deleteDestIndex & deleteDestIndexPattern setting', function () { - const transformId = 'test4'; - const destinationIndex = generateDestIndex(transformId); - - before(async () => { - await createTransform(transformId, destinationIndex); - await transform.api.createIndices(destinationIndex); - await transform.testResources.createIndexPatternIfNeeded(destinationIndex); - }); - - after(async () => { - await transform.api.deleteIndices(destinationIndex); - await transform.testResources.deleteIndexPattern(destinationIndex); - }); - - it('should delete transform, destination index, & destination index pattern', async () => { - const transformsInfo: TransformEndpointRequest[] = [{ id: transformId }]; - const { body } = await supertest - .post(`/api/transform/delete_transforms`) - .auth( - USER.TRANSFORM_POWERUSER, - transform.securityCommon.getPasswordForUser(USER.TRANSFORM_POWERUSER) - ) - .set(COMMON_REQUEST_HEADERS) - .send({ - transformsInfo, - deleteDestIndex: true, - deleteDestIndexPattern: true, - }) - .expect(200); - - expect(body[transformId].transformDeleted.success).to.eql(true); - expect(body[transformId].destIndexDeleted.success).to.eql(true); - expect(body[transformId].destIndexPatternDeleted.success).to.eql(true); - await transform.api.waitForTransformNotToExist(transformId); - await transform.api.waitForIndicesNotToExist(destinationIndex); - await transform.testResources.assertIndexPatternNotExist(destinationIndex); - }); - }); - }); -}; diff --git a/x-pack/test/api_integration/apis/transform/index.ts b/x-pack/test/api_integration/apis/transform/index.ts deleted file mode 100644 index 93a951a55ece1..0000000000000 --- a/x-pack/test/api_integration/apis/transform/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default function ({ getService, loadTestFile }: FtrProviderContext) { - const esArchiver = getService('esArchiver'); - const transform = getService('transform'); - - describe('Machine Learning', function () { - this.tags(['transform']); - - before(async () => { - await transform.securityCommon.createTransformRoles(); - await transform.securityCommon.createTransformUsers(); - }); - - after(async () => { - await transform.securityCommon.cleanTransformUsers(); - await transform.securityCommon.cleanTransformRoles(); - - await esArchiver.unload('ml/farequote'); - - await transform.testResources.resetKibanaTimeZone(); - }); - - loadTestFile(require.resolve('./delete_transforms')); - }); -} diff --git a/x-pack/test/api_integration/services/index.ts b/x-pack/test/api_integration/services/index.ts index 2a0327ff57104..e7e166237c602 100644 --- a/x-pack/test/api_integration/services/index.ts +++ b/x-pack/test/api_integration/services/index.ts @@ -28,7 +28,6 @@ import { InfraLogSourceConfigurationProvider } from './infra_log_source_configur import { MachineLearningProvider } from './ml'; import { IngestManagerProvider } from './ingest_manager'; import { ResolverGeneratorProvider } from './resolver'; -import { TransformProvider } from './transform'; export const services = { ...commonServices, @@ -49,5 +48,4 @@ export const services = { ml: MachineLearningProvider, ingestManager: IngestManagerProvider, resolverGenerator: ResolverGeneratorProvider, - transform: TransformProvider, }; diff --git a/x-pack/test/api_integration/services/transform.ts b/x-pack/test/api_integration/services/transform.ts deleted file mode 100644 index 1403d5d2d67f0..0000000000000 --- a/x-pack/test/api_integration/services/transform.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { FtrProviderContext } from '../../functional/ftr_provider_context'; - -import { TransformAPIProvider } from '../../functional/services/transform/api'; -import { TransformSecurityCommonProvider } from '../../functional/services/transform/security_common'; -import { MachineLearningTestResourcesProvider } from '../../functional/services/ml/test_resources'; - -export function TransformProvider(context: FtrProviderContext) { - const api = TransformAPIProvider(context); - const securityCommon = TransformSecurityCommonProvider(context); - const testResources = MachineLearningTestResourcesProvider(context); - - return { - api, - securityCommon, - testResources, - }; -} diff --git a/x-pack/test/functional/services/transform/api.ts b/x-pack/test/functional/services/transform/api.ts index 697020fafb196..a805f5a3b6013 100644 --- a/x-pack/test/functional/services/transform/api.ts +++ b/x-pack/test/functional/services/transform/api.ts @@ -20,21 +20,6 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { const esSupertest = getService('esSupertest'); return { - async createIndices(indices: string) { - log.debug(`Creating indices: '${indices}'...`); - if ((await es.indices.exists({ index: indices, allowNoIndices: false })) === true) { - log.debug(`Indices '${indices}' already exist. Nothing to create.`); - return; - } - - const createResponse = await es.indices.create({ index: indices }); - expect(createResponse) - .to.have.property('acknowledged') - .eql(true, 'Response for create request indices should be acknowledged.'); - - await this.waitForIndicesToExist(indices, `expected ${indices} to be created`); - }, - async deleteIndices(indices: string) { log.debug(`Deleting indices: '${indices}'...`); if ((await es.indices.exists({ index: indices, allowNoIndices: false })) === false) { @@ -49,25 +34,11 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { .to.have.property('acknowledged') .eql(true, 'Response for delete request should be acknowledged'); - await this.waitForIndicesNotToExist(indices, `expected indices '${indices}' to be deleted`); - }, - - async waitForIndicesToExist(indices: string, errorMsg?: string) { - await retry.tryForTime(30 * 1000, async () => { - if ((await es.indices.exists({ index: indices, allowNoIndices: false })) === true) { - return true; - } else { - throw new Error(errorMsg || `indices '${indices}' should exist`); - } - }); - }, - - async waitForIndicesNotToExist(indices: string, errorMsg?: string) { - await retry.tryForTime(30 * 1000, async () => { + await retry.waitForWithTimeout(`'${indices}' indices to be deleted`, 30 * 1000, async () => { if ((await es.indices.exists({ index: indices, allowNoIndices: false })) === false) { return true; } else { - throw new Error(errorMsg || `indices '${indices}' should not exist`); + throw new Error(`expected indices '${indices}' to be deleted`); } }); }, @@ -92,7 +63,9 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { async getTransformState(transformId: string): Promise { const stats = await this.getTransformStats(transformId); - return stats.state; + const state: TRANSFORM_STATE = stats.state; + + return state; }, async waitForTransformState(transformId: string, expectedState: TRANSFORM_STATE) { @@ -123,8 +96,8 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { }); }, - async getTransform(transformId: string, expectedCode = 200) { - return await esSupertest.get(`/_transform/${transformId}`).expect(expectedCode); + async getTransform(transformId: string) { + return await esSupertest.get(`/_transform/${transformId}`).expect(200); }, async createTransform(transformConfig: TransformPivotConfig) { @@ -132,27 +105,11 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { log.debug(`Creating transform with id '${transformId}'...`); await esSupertest.put(`/_transform/${transformId}`).send(transformConfig).expect(200); - await this.waitForTransformToExist( - transformId, - `expected transform '${transformId}' to be created` - ); - }, - - async waitForTransformToExist(transformId: string, errorMsg?: string) { - await retry.waitForWithTimeout(`'${transformId}' to exist`, 5 * 1000, async () => { - if (await this.getTransform(transformId, 200)) { - return true; - } else { - throw new Error(errorMsg || `expected transform '${transformId}' to exist`); - } - }); - }, - async waitForTransformNotToExist(transformId: string, errorMsg?: string) { - await retry.waitForWithTimeout(`'${transformId}' to exist`, 5 * 1000, async () => { - if (await this.getTransform(transformId, 404)) { + await retry.waitForWithTimeout(`'${transformId}' to be created`, 5 * 1000, async () => { + if (await this.getTransform(transformId)) { return true; } else { - throw new Error(errorMsg || `expected transform '${transformId}' to not exist`); + throw new Error(`expected transform '${transformId}' to be created`); } }); },

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 aH+8OOgGZutwn`3x*EKaA)qLgOL;erfWa<(C diff --git a/docs/logs/images/log-rate-anomalies.png b/docs/logs/images/log-rate-anomalies.png deleted file mode 100644 index 74ce8d682e1cc8818aae03899b94567b3638bb68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305676 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ℑxo#KH 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 kKP^ej!9E zN-ktJO!drM3_Kd#Nn{HNwo8__{ZUwL##C?jLP@-C-0|ikF&bh))asxExcONy)l~bY zu?0w>s{E&`=<2vpbzC*165_N>l!HI1Cs{pP)cyF)NOR?Kg%LPUEe4M);KqXr_AXE~ zY;jnwNc^laE%DKi{9!i{nCXB+e3M%9>EU_>EuU4$^w>2gV&N7*4R-)RQNZv!wfx z;)<_`W-_K42dlk_qnEaFGC@xpK2|~4w{^B(-oe!G17mvr#E)U#KjKIx`R|`@#)>l= z9#qjwK9C2^>=o^)1ln}3YNt*0&0nn0L#4FJdzu0%I9b`4> zb|1p+f=xpzwd$bBxhxKQUa~9CJEkn9mOh1(igw2z4@%n;o9;H*UmbKQT_ei^));3k z9(?QP1N}06c?@*=fg9kv_of=p7i76rpR5?FxLutGNZ~{eUa-^~uInX#u`p6par32b z!$svZ55XN=dT+J%D(Wbmatkd#TxC_U5zOrt`F;qN96Fv3lw+edo4f7T#0Mh!9nv90 zBREvCgQ|9LrbhKXg~OtyEHg5tT5|;jqEV7Vn>5Vl3`Q%u{2SjTYiB!1B`HPi*i1KQ z)!oM_C|zyL){V18%?LNm-o`dIiC_x@0=Z2$o|MAMX4q0pr?d0dTM^26thuiF#|>Ff z#?<(L>2(iCweDHO^CLQq8w4~gsA(;_CCU3W@=`3`eX!_FNkD#dIjMW_63?<;@_C}h=I(|m~#=fT`Ou$XsCk|Wl zJgWA})c5CF$II%fqfg2L+fpk(#lUMVuUq!=hJ}Mj_P%oGi51Xy@jMH#6Y*DLOIPWU zeLCWam1-+QBX!XY(pB;^#t6gIfU)8&HmSaSD}s?Vyp}=lox8sNn79Re5r=L{gfZ>X z;h@_%60+1U1zI2}36LN^^`*fV0i%shxJ3;I#$(%ovM*_pyqxUsd;k8+wim%3kkQ1m zc6aHMfs0-_($!V)1AdbqT4xX&c)?=6$MAxx_h!2+jDUE4fQ(qctiT+$1s*}hIAovq zrMT^B;h$D>;Se1|mTz&R_2-xG7g@#=D}KN$7jC z{T9}nq95_fp7|;C6sS<=-@9VK!&&-E{_}9xP79gHtSdh}cKS?*q^JQCaxmKV^0Q?!ErFf^T<%GW>dN z1)hy!k2ZK#*=TKE>4$%A<&Q1#&#nBS(f)ZVf9M?kH>c9%rU$E6$>F-E{{O%M{k&dt z=yq%GS-ua9-jCDAfB2C9CSsn@2vyLivI@?&=dGs7b!LR{_owilK;U-Y67O+k4A78d z>J`o$;ni8ccmayQx>AU6ULD}MIY1^7A|xg3;??Ks=>eCU{R-3YZx-;!hh`Z>qzHF| zw#U52hhsox)9Pv~`Sy>U*1ui`F9!pbR%7LHp7%2}7U-VJScb;(7j<&4n6(RT z@^|TRZ>;Lf=E%uB`@g>Rp|AOiWGrjsH(PqTwxy~m`4M1PM;QINWbIK}XUg8fXpKWN zXi8BOae`o#Ubh$_W8bWR<%>cJ!uPfdXr2c28G=jl`AM@YQ9lK_X}y-Hg>}gt-D&){5ug2L^6tVyKTo1Q>U(jj<~+wo4&m7FeQ+a} zikmF@8o|9z6jV#@no)-+bjRdv4r*)(*%=z=aR(yxxyjLqCv{=G9Ozp!yO+JXUSFav zz6bzKUZnz>e}&|53xglyj96znXmC%r>(%qpiL=ad?9Wg66mOs{>f*YEPT)qEK<7l* zH5zhqqCGjD`XlfFq$u`2EK&}*#- zA_mMJlu{%V4C-+)r_XA;c*b2Q8;29;+z!OyF4l})0f|tYk!Hk%l$isH?Y7J)#=Aw8 zlDtW5YYUCZsemc6Lw5}qfKV)i$GMuGfN>4nv^@Ae<$6o7rA$@5i+CX~3vpG5d$aZ- z_etg&1gXG!tl2i`WlXw6&iI%6l%;4^ zoF@mZKfukN($?0+)Xa3;cz5ep<_+}c;1hrY5r3n`$7xXA=2~02rlzo6h+zgOyp+UP zf;Vi8XNv*Vq@@5xIlQU6ZHsGuq41|)w@}4{ri;xNYu;`Llq^s6#bx6;pu*SOmMH$) z4CAg&m{jHCFn*@ibOlBFN*%PkR^OW4oPWl1EWMj4jYt*Ne-*q}_m+BMgEJ=>GKI|- z!n<>_90Na%&NYa;J@bdTHTqY>sf@j?lEN08Wunno*EXY1=I%x@fZcUeu?Tg=rH*0Z z*`K)u;f+*wYg`CSEDv<~7&rGNpA!i4kwJIFdYgD*E&C{W@@sX&mYtI{6y#mz#!BH_0#xfC}}I8~3e-rFG) z1$shN3qz*-b&xo)IPC z0o;b__!pA2?f}w0XhZK6)MCx}l)I>}!_Syoyd)yY#-bqeD=p*YaP94;Vq~S&M3(dd(Qy z;o87)nYNVPJY$JR7HTKl#8gh@8p2NcwFS@JqPtpibmFl$H~lak{gbty`*joO9@q5r zNd|*0N<&!C=No&QhnLQsmaJlbkwn@lo@XnkHvhVXRni@m9@k`5*BM1(s~($CTB&|= zeNkU6;N(d_`utw$=~^1xVbh)6LcV`gQ^;d{uMi@Wk!_;|$`#=!aVqL6vCoz{_~I)y z3xRGKs<@Tl9;pUf0RQQ(zO1uQx^pA4dbPd;L$7P;TzXM1Zo z&h+&sMh%bfpAf(m!r?0~U0{f42`xmlD7RP$!081?!f07R(AD%vE(YrWH#{6TQRAz0 z$^V@YaFh$YSm+JL`fAi`Yt3(8mRIV7nkVtir{${Z50^60oMfT)7{@q!m$>#!ok4XU zEosRb4GF@mOB=JZwyK_}QA{)u5xf(EL~E)+qf>q{ce9XigV=KJN8WS^D|r5ap%o#h zgI?I8{Y!>n^wHBA%U>=zLL_d~zy81|*;MU#3+>oPe@3Ts>nf(!K@jhlh?3E%j#R_w zXhek!B`pMVWTi<5=h^!*{u7YC*h?u|WpqrnC>hlFYRd6tOTfeem+RkDl8@UB9Z{-E zyH)`TmOeAxXHash1vkZiOTVNHR2D+i>W(|9RX1$IQR3W_3ffqu8?IlyVd4QK0F^MfndW?yBolmElW~cnNB45@upur}1gizYuZ&m7qyC`jwPGjIoiE zxVcOHO(@q(RxQU$j^!cJbvxsPJ}^!{T+f5~-g>$HoBcHbwds+nZ?BO`YSO=Xz&i;&2iD|sKVpH#W6DBYiW)3e9j>;-7hhOdYtwVMrx zFbj9K%u0xhr&Dv&t_3s64s)O4b`y)6(<1pr4I`~Z=@HYub`R0&s}?D}q%}Id#(A?= z$pRGjT*QLl-8p2_|JC_5Fm}6k@~Q|2DmPG0OL+x{&4zle*a_L=O&8g?&{HSDSsVrx zp6Q|~FjH3z{CJ|$`9_abYc~CcA1p0x8KI0Myr(A}eWu~{?cKEWirogOn-FYbTtAl+P;lh~V_}u?WSx*j(oj@T zdfifF{$}f>p&WJpP!lk0IrxoOx~#NFL5Jv(lh)odU#m#No=(1vLyeM)g#m0cd+Z`V z!p9&V<)@-hYRi0rldk^2_%&W2G7QdWbuo7veP^%J2$XepaidoiC7M7|l&Y*PSe2oS z0igmer?YIWy_lSXq7EpBCaTYh%v54ayP=6xI(;f%I>P$E*P~J-w$G=TEca+_ zO!> zwtmfL_!p*Z#idS^GUD~y5hkd#Wi8z#s=etIchUZ|A(FGAj7q*S%k1ENN*>3+%; zuHgw9Fl{q7B^&XYO9qiyn{erR-B?Um7oP0^=A!?S#|zlA=h6s6X*hCG!q>1F59;Q` z+}qe!_>pDQW~}B4y;NDHbQhhg1Q89hr%^ozi* zbyVGEWa?Ys=uv0f%-@wq)VS?oB(5d4PC6%H5b#FsY zStW~Dpfwldwwt^6W_0VL{3xO_waQYbb`&AoSdw)(rI*(?{jJ#Rgp@>9Df0u(z*FIg z3Y4&AgM1=pG0R+ZKdh7d@|D2a^#wZqtmH4+?p^ZRq8B`z~t4eeEGFS{;LT+<&naU|6r!iYm!S(IFGHY=9zYL?tg1tNQw-*uA{4BV1g))kJxWE&@ zVmh`|;x%6F&5;RVPz0TZM%($LLWM%=j8}(O#a{FsBYfH)g7FO2wy4P_Xfg#nyW_X04Sj7z>lb+h?%d4%(Y+F%46WA9#-U!$fQMJWb z`crpc6y{((gpt4rQ4#*p4EStVmCYo+CzeMV@S0IPe0XZBE<2CPfDcPhLn}%wP38}T@UiWSwObRcC3}ggG^f{%U--6{j z>nEmH-<+yqgBXy-xu@SP*+IifM7!W>WAo8PP!6)At7Rf z%`3I)DY8_P-uJcA27A#fgG8@8$ey3}cEU?X`A26eS)`KDZdQb=c{iTVey4Tx1x9Tv z0#o!t&rFu=z@XbBWU9|{HK)sJhy3_#d!*1&jK2KTwD>w;TacB5kyR@c%TKLE?J%@+ zTmL>UmVwjt`44wNHf=^7DDy<}~C5RtG;}I_%7O7&*qCq}pR9Ii&8K>@VWx+H^Wn%?jAV!2Jy@>)>U5O8j7Um5^SH{_ z+e%g`8v>y@9{tZ6$pu_ybsFkXsQ zXD-F5rR=ms`Ly|=e0x$8Me#bhq$PsCP7bO`BFb(Z17xUAn{{`37g|JEm*3A-<PvT+Ju*TvR>m;RJ>oq!Z9`z zZ35kkCWU6&B}Z0O32WKk2^?SYiz0Ny0@YoOtTtjx_iX>C8`qEWiBOu>!EIR*ne=b_ zf;uN1`#mVNfrEkAI!_i~1BQ8YkiEJ~smVUMx07NzwYPedG3a2Ke1Y<$L0H7X=r{*( z?VHGu4!x)3Gr|4k#Xj(F8-Ds}XR_{Zzg}w=L*`(K`Ke+Jg=W z!!_eeEBGFtf^T-*`xszRw55?iGP^N9MtN-3ac~)NhJ^Mej>BtXS8_iO;l4t>t^fv_ zWDw_rDc_S-s(89a=OUhSf?7jd!a10OD*?{8&XiVv#&=5JiF34exWbk4#u{nGg#g7u z=yL&+nL3z?Z<;BeTrt~GC1_1=6MLOS%#m%K@uE*|GlUh!%CS~P`LQw^k2cTyl^dxA z@>I0Bk+Z%Pj4uzEZmIGZ8ONy{@az9Dmo-z-nr3R^*nNlQNRJaef8s(1SCH^i-0!#X2Pz{o_uq3eiiOjxpcGF(#f0=K2m{dW zZkF1svP*zjhJTYdr0PfI@>@T5AZ!lp_wJEWYOF|+3JCoxO9%mZVG6*1sp1S!jy0-)`AON)%%dU zC$XHd0C3sqzTTfR*KuZSB2)5!1sZsgevq$aaW=)D_Zz-mFT6R0I=4@TitqXI5N*Sf(Qf7)cJaDnv%ePfc z*Q>TYNvx#SZ9xCGj5lGFeEjl)O#NffTqntel322!tBtic>El>q1Tocrxcx!3W)zop zsEBtFEx!w^3tHLE_bxWIp29+d*40bz;Z6WfV{ zmtJiNb5><46|jLtN|-=os|@O0cgQJTOa{2O6I?-|G3%_@q){$jF9%H%m2(K$*HCg2i{G>6?gH^#kHX=g=q)c1>A*u^G(gO(lOt7+>^&UEtX6#?^&<=tj@k&_)1|? z2K375$GSY-KX#tT07cVvXZW=K$VB=t^3oNsQ!B^s{ue*_$MBeO5B%b$Px5(3eg@>8(%fJ3T%_H&{RF7ep1X8`*HZMo zbM;_9>YoVnkl_9$-S~4Of5f`@b0dFX?SG!gA1u!Q&56uEUB#YCE}f_4^6q<{YL6h) zT&m3`4p-HiB@FQbZ+;J!jS}ygwqPS-dU$5FoEur)dBaYv2re!_Oyk+v{>f7Mkq7&e srS!v0?oXD|k9-(N5&lnDO3NJBL;k?fB$aJHfq%MMhQAe^zjgor0aG)4jsO4v diff --git a/docs/logs/images/log-rate-entries.png b/docs/logs/images/log-rate-entries.png deleted file mode 100644 index efa693a2ac5292aa6cf15a1872268843ba3a6bfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235595 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≪*xwbfj!xtyHAReuu;;bep5< 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�wE}|eDiIqZ^#r} zl-+ZZQ3UyP+1jF5m}Py;|MRfFRpIWQleQY~WhBh7ushs_Vdle8+s)CsS^Q6?%c$MR zn>aMYkp45F-a>k7MFmS~<9>N_ba&;kcvmWeL9YMHbJRarN)fb?0$b4ZJ`1)G4sy;D zcuSFXmKtoiu_=NH`GympPI0BL91wPs;l+@=s8)Izsb9OKLMTvF5Q|=o+t-QO zNA7xD*mRY};wU)!7<{GqJa{>6dGihzE6H})XhR_IMs6L&+M0kx#Jzr5i-+0>%3O(? zgjy?V+~5OiW@{g(Wr;8`Ny8_)%Awg64`--yR?dEA61*4CFEp!2lTZpMg3^}!YU9?0 zkBdut1kR@eM4k#?8bST4IO8X}*%El3ep0HNw6k=^k(pBafswG5*#@$P9fD~%ke4V& z)G>>@clV-DLzjfEXdTDV3n&L89j~c5gcEtU$mV>X~+CCr26oRTv7{_zCtz z9|p)ksbpL>>|}1{y8~7mr#>3N4RR&SxpQ2mJqdqjHM`l2?WD8#rJ@A4R=~7 zcEIz?VB&1c&a-Z=>u*}N7FAqxMQ^FHZlrp#81xljXUyXg&<@!LR1ci@pR-$lO#4VY zIH@p+b40?1JSnR<5%RpuGoZe3F8!I6t3J`0N8LmO=e3A~RSXRAH!6y9x-f1m>V;Gz zi|M0sE?qZ#u*0Hl)gOsme_+7D1DU*B2)L;E^FynZL%5aElH)Kq5>F>lWuJF9bEtod z(?y;0&BUei*`&cbqURl{eof!Xu(dpRB_-`Vj)n9S{#WE~`h|&R;Y#(=8BhBuPe6os zh}e0Qg*xfK=L~n>y!$RoAzE#=t=}hM0 zVj6kI^#`A8zb2lGnz#MlZHX_%z8(@}+t6ShXFR|C>_5~+-GkS9^4Pb!BjxgKmK{ZL zJ$#)z*S~N0U+5)d?&6C#=rEZ2czf8z-BMfX;{N(z5lFRD$~+)k^EB&`PX>&;ebF+p zXhu9DO9{NNVA!z}uV@{Fxv(6_7<(zXX%Jgzk4?VX)YHq=8ohsIAfUF=vw4=<;Bs&J z8jGJgR>-#V%yCF)k2wN3Q2r0tM3@GvG2|Yjp7a$rBK(xsfs>awyhJK5+UK~NtY|VM z&xn&`SqI>459S1cs^cr#I7ugr-Ro{9yN;lLA= zQG40wJ@@5#I8Z6zPcFOte!G)XtTEKD%7bCF(4-$(-8}FpNYIg|f)s>o3HYKj@Hvrt z)nmxBkX;4lhZ}+|QJ=nMDKw}C0luq0JiRsy1A9{GH|!^cd<+>kDM#*lYuo)cpjVzz zFkarG{;d-BK$RAW$ocl$VJNTPX+}3~N3YlsA+r8FtVAm_fK*QGOn}xoUMmwy7viBK z56bmfWxL+mopusczQ?+A9YtgZ>*yICIvdRK;oex9?|et2f~6NRhs;LbA}; z#`2qsdWB4zg4T_G?Ps^9&;|qZ>mdVDR8X6mUq7P{v2}i}2{n}>z3@zhkpwhk&iYOj z3gDHp+P}qvIgA-q71EAG$y`mrzRtGWUI@4$+t~fW+L2ChQ`A&Q@UZ(45NyLyLf-}t zKp1~Fq12(oF;_~1jDAlr>&4j~tO9PX{ z^Zg~s)$379t?z+q{NpDO42ufhh+;3cVHh{F!#@)lh`H_u30OHE96KI|Q^`7aMm|A^WBYqlAs?L3QT6;YD@x7i{-TxXw8a=Y z_GyrLg^td5qcK%eI$CL8ASmlpO7_cpuu&FDO$}-qHm%Paxcdtj6hUWoj;Qd~(sDLT zvj@A$69pe-lYh|D#2&99t9q|+ z1JohADvaQ?$&(hSEC^8K z2^L7i6c5iOzuub`!R(f1)9v?Xq`Ikzy7uBfypNN0kX=FY=Rxrqn7cvoI6Y318ai`H z-e1n2tn{}6*=t&Qw9aa9Wy@c@+V476DJv+_q43rhmg3o0e3lG5zitq1hX%A2*n$K` zY#xPcAI0;!YU1GtC;S+b{u2PXxFh6Shs$vp2;rQ+O3zPp+deTz;&}Z2)yj#%5XR{Xoge$UJiF1<6 zh~51y!TZ?`bNHK9>rR18Sk#H3$=h|-cxMmbS24=zxTSJExH{jf%+r)f6dK`1)D(bR zuEHO=s4sk~Vf08BeCvGA2`$!_L(ApDxcNFElb@ovnrwwAp|R3%HzwpNW^tJm^?YZ> zeT4h<-KBA%2K{kN@NP`B_3;H?pK!4?CI&U!L$A;*M1(p~P+ylZ+;{=hKrl@R{qDzX zd5{A>wpbUnjw-WHYsBEatJkleoo>9Ob#;r8<-LL06G$z3&`~e2FC{vKcpmYr&=F+M zHZ}sqB}$5F(-0>r_sf&ro%le#Z=-XsYhAN`s|NOY`1)9eeYdj*upxQ0^wS`miPU@3 zjRw1uRck!JHwIi&ibFmYOAed>=%-P7=T_)(ccTYyn`@oxXgkn5y*L1xr;#=Ba86b$ zN9gO>*+SsBCJa{_7>cybdGcCqOK&mdf%;O<3k#;JcEfr(r#KW3tx?|-k}vxheOwN* z_ZMwe;_AM57S(#wehtO({?L)yemiGoy!kn|waN*q4}k*5sd<_P(TB`NpBI#6waoU- zs>ovDD*#%_}H(7|0_kyz>&u`t56KwD}j93#HvV6&uAVa79HR3A9=k(9k8 zXFs?^P&oNX72f#jgS#Z{ImzpqFa`Zp!;34# zlAq2=US;DH#^fYG?EWIQcFWIS>%wbLd+Xq`4JWlY#*6pY#Bj9=fSi4 z(S`+E;+dMazdfaK|Mci`Y-gv-dsHlb^YE!Y01In&M6fD zf2>Fpi(gnB>zHO?nHLp|B@bUPznUtLex_FAXo4fN>3Mtv^C2!Ljvw_Yx2_ZG^;hZgk z$67Vm70uQ#7Qbyf(77WH;{e7i!LQo()ZN~&!ip22+z>t9jMJhk)8H&7Z_qaI(h2mf z-1x|_>MGZyocta_=0~Lxgr-jE^w0nhMt@?z>wC)&;P3J5*A;pM}a(DdnwaJ`#U7bV%)pAzWH|GoPG*Ks6D&_LcapM(KO z3_OGWj^Wn&D;CG78JL(>z!%(75AO$!}DiWaS~9CW`a*#d7ivl zXT4?s{7c+++%XmlQCw`4KApTQXz%XwGKt(EsM(`BHa^zlNwCs2h#E5F?cc>Hzb9pW z`Z<-jzjWIls!WeV!BEa+(N~BE?Pz3+EdUMVeP48I4+2l?8IYWr*RYl-T*ZRH!Oeyo zE0Nssmqr$G3N}6v5MrvEIG%^i%pB-~4w6ndMky>UN;jYwOQNgSnXBT?J3fuHxe{OV zi|{Xq-j4Jtg)UNMoMjQUKhXtVF%DmbnT*LgyL2I2m~KyzUZF<7XDB79hcs#yW;i0> z+F6^oEtHFFk}yEH`3B(ZP6nNchMf7~Zw-4+(L`3=jvjs!gs&tFYcZ$c7a>r7l1|SZ zm)YWQsT+OLOS=PpC4%3joN-8E#zdk{?T8JzU{Iz_^0sn$?^R)4ia zAMQ<4FhUszP+!lw?X-Q`G~Q=n?8A6-!UW*MTidsE^gAoxd35apldINlzt(U-N3LfP zz{)~w<;JKK%`S7w9+BG~ShUB*i3{~g2=&CO;3MJ2#$TUP(PlY^fy&I5+WE4eVCXif&Gd=jMm~88up9O<|in^((tNNCFrAgv%Is!U(m6hQ?ADBGIP&`+WiYPDBd%gjNQhhVlMzE*la?e`K2^drzX!-D)4x0YJNJvd34?OOd47h4F@CNl$tBqe+B)jpgN)`PR`Q2 zNA-*UomwQ$o~l}FYPEZ~inJny*y*J7hqo0q0U|}O(mAO7YK+Na#+1`}bfL6{N7g4A zCX42(ffwQeoG9PyN$K~67$q-cP?IvCn%v6ZDXJW9-HJy7#Mx8+--CVJep9|8FeNAL zt+l3)a|`0!O1u9D^-AIbK@)O96BB^TQ)Eb11}9Z&EW&8yRjExj3fm2ZgI8}>M4it9Ul{sMEK_101056%AG7()jf6WJN+BE`8NWMv65jewa`d#L$1W`C4u*k?6wJbP_CLOqe^1 z9{LgOQdqlD^Ds8@DQDuXE;R?;NLY?JaMJZ>;kZlp+ZwG3LKP$mgeoLWphmt`Y&z6V z>!L0gH~BZw&sji1ELIwH0S;9(Z`wXGuD-@f8!yW4UV1<IXC!nJ<*@7sOtjG z<6D(B+1p!|^s3&PIi^g$RTaOI{wnxfybVf263grq!yQ`%%z#bnr1+*!q+s9JwpVty zK#?Ui+q{J79qqSq-%|W}XEnBdA!4L+6C)m4yA$;Tf$hX(ca?RFzxmj$YZ<=GOJ;RC zpGsc5hu#C$XSf5YUgsOf8kaMbn}u;FAqC{QKosfspry6+2|g{@k~yNFqpB~7_>iFg zaF$QV?#oH+K;OY>@XXPVYLCK2O-a;ldQ!_J?{WDhP40>~vdip}|B2R}C>QBN zf7l7*^Fl;ItKCCMkgx!lLrVUb|3~dp$YOmY8c5QT(+?zSrS>gannvh^dxVoLu32xv zT266su|ioO%PsF&xrF;}<_|1eS`P;>_xJ89X}&Olw^``A4#k&B@vi@2dhxMRnvXM6H`kMqzY#ST?WUEzVLx0wiZ7PlaIcV039rt zj~JEePbJlDvTyshD@ngYSKUR(0Fy~`O{vfvA|}V!xyiT!xl1FlAH6P!SpHaoO+d(2 z0+L9GepXseku&s6+N!hOXE=YL96su(x<_YFXp8#dbLgxJwg52`8pt9QVj(u|-y)6x zbC+^F5j*u7d!1)ooIN<)Gs;B<4yhxX>_(EPzpJuxO5iPcQcI^!%Df@BHyPQ5m>ZF8VA--nG%x&P!*)%C3MPyi|xth**h8Tukck z9aO$AG-1Ae(C=?!J>9wWJS#vM56HfL*ZB3zNv@rmn|5ugp`;KU8M%Nj(cN6DA6GJ~ zC7A7ayWXKEV~sN8Ctk(8QsfTvvPr3l!jR-V2q$vAf@6fl3=3U_yALaSlxFyqPX+aIJ?ItE{PgLAWWgf(k(en& zD4NBVoNJ!-$uip;#;^a)Iq%66ujmG~gERQaqfctr^e+@VSH1)unk)7b60VMk&Z6Au zmDRm0gz*-6K?;r|gi9`QPqz}!$`Rk!n!YvsY7)r(Z0$NzIl*Q6#h*Oq3K=}qz4U1* zYJ%7DbEmRbTufKXRKP&N_*qlPu`dov>RMJq5DjXZeZiB3v!+gIik$5w!#3v@B)1L& zL@+lC#(WlFW2yrsR5j+D8x#0gn;|E*9&EDc$kOcqlrl2tCUSfwsh%--`FI;laP}%Z z>&xgAU*}r-hGcN7Woj}hTC5W2V^X^AaO4mlVVsI8zSn-~ZFkC9x;A+5m)4Jd@qfGf z)DKxE7eeib2!CTU91iKSqq(A|&7^4iXR|P$06B+FTzxd~UdUO+QMw|qGfD!R@Aj42-h9c@W(P_O(!38F`Om3xWzD?5gT-XX?PBqQT=~F-|fQpFI z>Tvd4q^F=4Hq=SFU(}sX`jm3J#_2xGocJb{s~IOGzjhx=R)^=LT|HCQfB9{ibYyPg zMJM)KcFzD!WTSRW^N~GpE$LO%MpL>4gBBG?rLe()8T78VR&23Q8BKC9j6^~^RS|z z)^OGK;)jUsyslnCH%mYeUii`*WUHum_=DP2CAKeYTr|kA%sce5Hf4R$w|=|ESG``M z@%D~8u&@WO^P*7#AMYx~E`_EyzzlVG0*{>X35Fgx@zL!2R-Dk3Kk?_nH=8*d? zWoEm6cN@zkzJlv0-drBq;~ML?Xtn+$xIoi5b2YVj1suoU=6N_(9IQQt3L}Ag*n=&; zT_HT!(E_ea9~=Z()zb;}YG1VSy(=uljtGIBGf>oeqIF~`eO@~?%OpqlyP+0sWnEc3(8)OxS07G+-j zz@{e>(bkbA)o6U_(~d9T^0^x4;g1ab5JrQvXhG3A^>@ly~9z!>2vNL)RWZ;u>HB$U`mhD#7T3x2j5dX;X zqmxT`X^xjRwC*KZcai)IHY3r3VVoKfV<7}QSeO8>^K?iZ+ zg`AX~R(*AjiuoGfh&t2sUH?b+Of~N&V$$44g|)G_($Yn^Tlv*CI}+G5&dWpm`cbV(VW!D5qlzbm zD=V&-J#Q0=g>Lc3oFB)0LH=z7rSKAjyE1X%bNRzB0xy;9tj<>-NLc|p#JS$?M#(9T zO?Oh+`8IcAYd8JlaGUDX4ELA+pW$Hp*Ts;lJLXk~f*C%xM73s-Oc%JWLa zD*;yGe;RYm*YEJOA42!uo%C;SW9iroUt*oNtdf$p?GG{ak3?<-mO76)buz=yOx(%6 zK#j#Lb4FU8S1&^Tfa*P#BH>1HnJ{^MfsETKviCGO*bG=5F0h3qOuq3-i@Si@Akug{ zJN*qZ4u^$+MlYB(3z|?3R1wS()^L%Amj}I1ej)TVhP^R^^DU2$v>pc?@VI(b-u>N8 z!}}!O{=^i7R(^|@0yd|*A}j#u8B;~RSKl2P`Weylgo%QNO-YiCH)UcR4~|^_mCb8c z!F|Z#gWF+PtLl5CY#tgWR-Dj0$-e+zoXc?%=hpbsDIqyP1#RsalSgPxR<1xcrjcY9 zuAHXdzWLjN*$5%6^36KT`Ud>`xP59D=ri2D@oDwr7NxCgCQEXwBIV*s7OJ;qulAgu zK)y79axXZJvpE0inh%JA1<7B>z7K6THo9XAWt5HjI*S_9F>u9!}S>H0G z=ahf9(8hoU_KNg}9wbsR;r{0+W#+3FoLY~FCgj$OZ{B7^yepKTWZOuIeBusFJI8sA ze{DR6Txs(@dIher8DmtTR)5EKCyJlTYR-$!D}Req+G^)p{LVLKd(vRWyyKV});!0q z&HUsHs?(#imzU>dd{d*(7VjJw6VP9RR9e5n8<;+qVy>Ov?bmdG9VTC6j&5H?wrDE^ z!Dh|#>kXfaxN>Djs&H1HQ+}ABTD{9sONA#TMQ7#h#%1(eh=*v?2Nc&z9VPXZJW_maqab?uOE%p}_YvA(7 z!{)$&TJ+iKxdOtVhgt$l5=RkI_LbvEljwc&ulc7Gn4T7LfcvZbtXN|>i;!_o6oQk1 zWoN!K_+_i<h}nmwkY(vIl$A*J3q9>-5#f$f;ySX~(*NkI_T6AE=^#EYU? zz}urOwk=*y85JNv6paV$c@aeIWS$gl6X)o6su_{KBi--e2N^K|@u zP-{9!i&Yt5W((lrAK?F^C{I#(QIda$Ohr2Q7n_+U!ggwE$2EGRG_K46TWgv14mAYF z=7?_D%x1T*_xuC;IJbwh7AAW6!MxnKWW{s!duGqGg#rb@%x-Xi&J2ZB3|tse_28^# z;kenKHoeB>U5S3QoYI<2>f=MCK)kgtHLLCjcG-}_eLe&ddufE-jWgct4- z0;-{Qxv776V_vuVJkO<|YI?q$iFN)6qi<-(k(d*q6}1bld052sxr<3axxmMJB6dyV zAgs)`SG)+tl8@fL(i<1ZGD~%6QYf|M;7jG71|C1$8|Mjj%f+@ z2I<>LG7aX!96Y3r>KDohW>~-0b4iP>wBt}Cz}E*_=DIhd0DXqitWG-sDYA9Q<&2WM zFb;sBG_uPp<^?*N+!)nl{#Nk8)*fix6~{wnRu8WQAhl%vj?0 zHNViWMe5Oo-5i?JIsSwOZdT|}51rU#S&pKQ0m#wA#QQ>@4Bmp5|r3T^}q zhyi!<$y~Qpear7Pgd5D;zE*7{0qpdJ(uZh~uP*1W#@mPZ?K)?0)|-I;S! zh8mlA^i%WXkVd&PhRllB7=fuEvV63D`DhdIZrvrHua3#bY`ZR+b_)@gDB*KL$*2Y8 zbXQs>{Y0)43P-ZK_k(*F2}(l47h&Lzgg^ zg4T-hJ9q@Ex$Ud1)Ai3B_hS1cfbUufV)?!YxqoJ)K)=~<%Kf{R|45V=uPpLn5j}1j zaLZvTV1+Y{#H$21n0v?-5pN{0NtuXex0lXc+Z=F+cfO|PPTq5=olGbQS6E4W{PD$B zRc&oc&3kG(?Ht{{_Ky9_SIc z6+dd>MgLI<+yCFTa@=<#wziXrQ7#iD*1ZAalNU49Pn&84ZLQl~rm3>%6Ms}keUCmENZ1tfVrwed7HHkXN@BptzjoJvKd>IjcL%b{@{{)6XW2;83?I|q zRQ+oUM^#>_+#=s}tMy)0Jdq10D(s;vN(4YiGp*0&?O$E#^9Wd%kU^D%asB}OU;FZ} zh!1t;jO0Mftn6#7$=kYh9>wqM8pG)~cXL$5!UXer%Q4xyyn6Dfz8O5AC-D$UF}!}- zrEdCxM$hrlMAkqy*L+!^dkIquU;dLR|A3&+eMalyj`>3t zFzvP3r|cnT(@TLO1&x8U5XK4+GYb>^>wqkm@3R-#z?PR;&ODPicbzfLG$;Ogo@^^3 z>xA(}XMgIhD>5?{Se8R_GtRCMn%MX5&@iCxNFU=1WcjI=1jIQMC{IoJrOt6{n7{45 zP!vB8nHsp19%u4a-EJAR=leUC?Mz+;gpcD2#{*QFA@5=f39Or|r(HWoGdlRj{9smiY4@+BU z)b`vkMaPDr0Q>e{7V2{j^fb+93nuoCtz8&?^AvtDL2yMmy9FjnqHuP!4YIs|-i?JVkHmui@W6+UJ+h z1umnvbwSgD49xE{`!6ln`)GFf#yqMHdJ11EmVxEPqrzn z|NYrAOe~WcyK5RDNF#cWzMMe#6z5wE`VI>T)U>9D2q(USpOT&GzLP;k)hNl1=af$7 z?DWve^6mF|$Zi{;P&ZVS-n0K|7eLnooXnh$uxc4OwAxZo_uNh*d;PJ^a$v30x`j!+ zE*aRa5J*lAp(c|#el(uMS-ILSWnLqftLrVDCq|3YR8#lh42M`%eD(N{5eD2~!Wy*C zm|p;fd3X3HF4AO%Bx#0^dof*|TFP<-CPNXTMo#tNC9#@xM)o`l+%}zu5e&RT?)I(o zB7cbwzPBim0^f7Ip>QZq&Dg;_^V-?#+rVbG%K|Y$hiUq#EJJnR5ji!=W5lW2G8~a-5N)qo+t-QgzrVGS0j|;Ru(he3vtGI} z9I{K-mu;%qbGW-U$SQE5EHBNi&YxUnyImHh>)kvH!cn7vUejKV>|)j9wV|K7%b9&A z7QS;z&riCp%e>;eq)7+=|2YyxKXWA)s@CQxx}GA`LgSuLUI3M3&%*vbR^Z6e36iC0 z$b2!zj5ZA1nwqCUP1LaT-OBzRnyjMBGNY?9dHC8z?=VgJW2pituz15|HrdLv%^x@z zxN}16NW6T_u`qe(kCtmdWbQG?X8C!^UP8RbK7=*+Ft!k}ImL_qbN}x98Q{#KFcwj6 zThH4jjseb`=_KB^-nFQ_m2eZmP!;=~qPIKG3lWYFmB_#?v?wxTAu)iQw)B1k5 zZQI`LS2pw9z##O29O$R~&$j&wPH&2HT%$a_X!v|4OZQKkc&)lgSNaQ$#(V8%uL8<) z1*2yvpaCI3CF6ixxhMd*UDqsxY#!om_RS{V?fbYCC&Uy^ga^%f*A+}!ur5Z zEe66GP^!ON1uVWk?jLutZgPPd_2$m1sE_bf@Pm8hoM;D2fxKB(NGw7!G02^!Y=xDa ziJEi88st%rPY2a3@LIZSWo7Z@l ztWV~e7yCDop%)^WadU<{r|=!gL463XMu+VeCjGE|rZ$WNbPx<3Qp^48c(ac%{tldm zIF11wnA-Jh1BVYhm?=ozbPi*3LU8<9JOqZd}yGeB}F;K+J8dh{lz!w90-s zQn{|8R@|+yW)GG=sSU+QiUT?v;V2KjjGlk)o)`fZVHTtv+&b z9dJZf?<29_AR#AnF`gKLi2toF#*s_x0*6Y{&8n53M%$ouA6=!xUtNVlWUdF{c?9M|lIhZ?5Z5k&KMBA=J z%DfZ-hx$E_dfP8iv8?9*JUWRmr-5?NjA8S5VY0y<+EMPSqNb3m;1JF%%wrXG|40mc zXI^8Q2s@q}g!jq=5_Kxq`Dw_KMK!Qr8c3>CL%m0O zPmuoxI#6a7WzOqx0Qn*uZUWS&6(oo(adlD;fvk+|anMq0BuDlIYLnCTHq0wnNtIFY zqtkE%8Pnbmn`_)Ij`zmMTLW)yuwv$sinB3CuG=6_CA-gg9lLI1s6r@Ci4(F9Xaw~p z%GsB5Vbn`9+~*QUs&AZju0?nOf`yFUz)ySM+-Lg0F^1Tm@LiVvH`eZ#FlGoC^H}+eAaONy=Wx!K6(O8O6L`c|IPrZ~@SwX};HT2f_|eHfRi(E4HQ zfY@Hz{NIGwJTz27d(NueG}Y!tI8iblUiYHnZpC5j4tVa03V z4n&rD1=yp2bf*EEVSQ*XG`1l!vNLzM3U-QCn(J?zUTH%u%)+y92v@&e&xPQBf<`%` zJhWjEDE?Dq2uKv^+{w^S0Wt)!f>`XvGuvJesqn}buDkTf7RbBmOo@VFLzucV4!3Zs zz&~JI!ar~-mf_$ceTIV*HG*rCaw=b3s=QkgZ{}whK)g|(?P&Yew*0G8?3^oCM4n@J zbGlU8LO-^SK*?D!XurCE-JiGEsWMb~M2X&${{{vIS_bR^-g}D&n4{vBM?ym3^gDvm z)e+DauF)-}44Q={ri}XN6NH#(L(jxRHx#C`dp1gbq;o|w%xOom(d`m4!39}&Az%~? zDCu}uz%e*VB+kXEF|$RYAZaN}q99q$LkWJ&E5=|bdrJ92()WtYKgJlk7*KlLwWx;t z)Uje$?Q#YJtaofwJX{gwXd2+6olqDvMZrFx9by}t?UP2CSM?`434Ogw_nvXxsSZ+b zoD2SyA^D&nfZLuT&uS!HLZtOaM}LMn<05q7l{RY}trD{1lBm*3um*twcv#=>Kf+d! z0b7TKC;uDR8W*ou(`xS#2LbXre65k9lwR80@*p5Ko&s}BJWptgj@J)3hOZRq<=Sl} zCOTOMtahzzdf9r#ISDfSz%c;VT2Bv(ow|acZ45=iZ;%NT3llgM)ImU8Dclxi!$<2Q zdLG5VX>%?ACD8u&7N<8DdoV0s2enB(o=lragir_c^51e9-k_b*V0u_8jjspyiw|oIU{A z{j)i$Qk=WhP4$(PMC5{G$d!>Cddg|wDRy{}G^a6qDz==i@j+vmVUm&>WmixI0Zw ztA7JI1$Gv0i^D%;cv2+?7F(wL+IZ@_(kPULGxD}W|F<|NZ zKKc1C1OR3Nyx2Rp8lPn@a>3$uUHAk50^jszc0QF|<m=gV*#|ZHxv$jG)nrY&d=mP>?wkfbqS8j9RM$ipmM|Qrlwi zW9X}C=vK(kRxQ2MKY);yG`G;P-?smUN(O^7^YG94^b57U5=yB9cP9oF=gI@Od87Ha zEd!`7BO73sK~rE5G1>mjfDt5G#|KQIYG$%4D+I5l7A|~ig~x*OwyW;Ug3ksYN>M3& zK^fRf>ri0+H)*%n(Ne47i2XWtY?m fnZdB|@-EYA(@ggKBue`i;O~mAp-zFe-Gl!DB+K*S diff --git a/docs/logs/images/log-time-filter.png b/docs/logs/images/log-time-filter.png deleted file mode 100644 index ffba6f972aeb776d31758c41fce5716f9776cd47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51802 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≀(K2ickH+HI5`Jp&qKLkGzCs{Mi=gVj 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

*O} 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Μ@e%#Pih3`)v?Y~oIWp1?V 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